@fundar/data-chart-telling 1.1.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 (524) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +6 -6
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +165 -100
  5. package/dist/configuration/themes/index.d.ts +5 -1428
  6. package/dist/index.d.ts +23 -14
  7. package/dist/index.js +20 -11
  8. package/dist/layout/base/BasePlotLayout.svelte +115 -50
  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/legend/ContinuousSection.svelte +44 -9
  31. package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
  32. package/dist/layout/legend/DiscreteSection.svelte +2 -2
  33. package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
  34. package/dist/layout/legend/LegendChannels.js +36 -12
  35. package/dist/layout/legend/LegendLayout.svelte +9 -1
  36. package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
  37. package/dist/layout/legend/LegendState.svelte.js +20 -3
  38. package/dist/layout/legend/SizeSection.svelte +1 -1
  39. package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
  40. package/dist/layout/margins/PlotMargins.svelte.js +4 -8
  41. package/dist/layout/plot/Slice.d.ts +5 -1
  42. package/dist/layout/plot/Slice.js +14 -4
  43. package/dist/layout/scales/NiceTicks.d.ts +3 -0
  44. package/dist/layout/scales/NiceTicks.js +4 -0
  45. package/dist/layout/scales/ScalesLayout.svelte +72 -7
  46. package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
  47. package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
  48. package/dist/layout/scales/SveltePlotScale.js +13 -6
  49. package/dist/layout/scales/TickLabels.d.ts +32 -0
  50. package/dist/layout/scales/TickLabels.js +55 -0
  51. package/dist/layout/styles/StylesLayout.svelte +2 -2
  52. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  53. package/dist/layout/styles/ValueLabels.js +80 -21
  54. package/dist/layout/timeline/TimelineLayout.svelte +1 -1
  55. package/dist/layout/tooltip/Tooltip.svelte +4 -4
  56. package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
  57. package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
  58. package/dist/markers/MarkerKinds.d.ts +5 -0
  59. package/dist/markers/MarkerKinds.js +1 -0
  60. package/dist/markers/area/AreaMarker.svelte +15 -63
  61. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  62. package/dist/markers/bar/BarMarker.svelte +8 -4
  63. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  64. package/dist/markers/box/BoxMarker.svelte +40 -9
  65. package/dist/markers/delta/Delta.js +1 -1
  66. package/dist/markers/dot/DotMarker.svelte +24 -27
  67. package/dist/markers/image/ImageMarker.svelte +17 -12
  68. package/dist/markers/inset/InsetMarker.svelte +2 -2
  69. package/dist/markers/line/LineMarker.svelte +1 -0
  70. package/dist/markers/link/LinkMarker.svelte +174 -29
  71. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  72. package/dist/markers/rule/RuleMarker.svelte +9 -3
  73. package/dist/markers/text/Declutter.d.ts +4 -0
  74. package/dist/markers/text/Declutter.js +26 -11
  75. package/dist/markers/text/TextMarker.svelte +91 -48
  76. package/dist/markers/tick/TickMarker.svelte +27 -25
  77. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  78. package/dist/markers/utils/MarkerChannels.js +42 -7
  79. package/dist/markers/utils/RowOffset.d.ts +23 -0
  80. package/dist/markers/utils/RowOffset.js +23 -0
  81. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  82. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  83. package/dist/markers/utils/RowStroke.d.ts +31 -0
  84. package/dist/markers/utils/RowStroke.js +28 -0
  85. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  86. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  87. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  88. package/dist/markers/violin/ViolinProfiles.js +55 -0
  89. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  90. package/dist/phases/Pipeline.d.ts +5 -0
  91. package/dist/phases/Pipeline.js +5 -0
  92. package/dist/phases/data/DataPhase.js +3 -3
  93. package/dist/phases/data/PlotAxes.d.ts +10 -0
  94. package/dist/phases/data/PlotAxes.js +14 -1
  95. package/dist/phases/facet/FacetPanels.d.ts +1 -0
  96. package/dist/phases/facet/FacetPanels.js +1 -0
  97. package/dist/phases/mapping/MappingPhase.js +1 -1
  98. package/dist/phases/markers/MarkersPhase.js +2 -1
  99. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  100. package/dist/phases/scales/CategoryOrder.js +73 -0
  101. package/dist/phases/scales/ScalesPhase.js +21 -7
  102. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
  103. package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
  104. package/dist/phases/statistics/Statistics.d.ts +10 -6
  105. package/dist/phases/statistics/Statistics.js +20 -10
  106. package/dist/phases/statistics/StatisticsPhase.js +7 -2
  107. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  108. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  109. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  110. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  111. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  112. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  113. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  114. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  115. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  116. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  117. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  118. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  119. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  120. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  121. package/dist/phases/transforms/ProcessedPositions.js +1 -1
  122. package/dist/phases/transforms/TransformsPhase.js +49 -3
  123. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  124. package/dist/phases/transforms/ValueSelection.js +53 -0
  125. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  126. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  127. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  128. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  129. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  130. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
  131. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  132. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  133. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  134. package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
  135. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  136. package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
  137. package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
  138. package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
  139. package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
  140. package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
  141. package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
  142. package/dist/plots/{box → distribution/box}/defaults.js +1 -1
  143. package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
  144. package/dist/plots/distribution/density/Plot.svelte +45 -0
  145. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  146. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  147. package/dist/plots/distribution/density/defaults.js +29 -0
  148. package/dist/plots/distribution/density/markers.d.ts +9 -0
  149. package/dist/plots/distribution/density/markers.js +42 -0
  150. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  151. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  152. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  153. package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
  154. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  155. package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
  156. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  157. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  158. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  159. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
  160. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  161. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
  162. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  163. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  164. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  165. package/dist/plots/distribution/violin/defaults.js +58 -0
  166. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  167. package/dist/plots/distribution/violin/markers.js +71 -0
  168. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  169. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  170. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  171. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  172. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  173. package/dist/plots/{area → evolution/area}/markers.js +1 -1
  174. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  175. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  176. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  177. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  178. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  179. package/dist/plots/{line → evolution/line}/markers.js +6 -4
  180. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  181. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  182. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  183. package/dist/plots/evolution/slope/defaults.js +31 -0
  184. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  185. package/dist/plots/evolution/slope/markers.js +79 -0
  186. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  187. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  188. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  189. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  190. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  191. package/dist/plots/evolution/sparkline/markers.js +56 -0
  192. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  193. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  194. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  195. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  196. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  197. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  198. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  199. package/dist/plots/map/geo/GeoSegments.js +23 -0
  200. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  201. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  202. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  203. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  204. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  205. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  206. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  207. package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
  208. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  209. package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
  210. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  211. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  212. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  213. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  214. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  215. package/dist/plots/{geo → map/geo}/slices.js +2 -2
  216. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  217. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  218. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  219. package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
  220. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  221. package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
  222. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  223. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  224. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  225. package/dist/plots/ranking/bullet/defaults.js +24 -0
  226. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  227. package/dist/plots/ranking/bullet/markers.js +90 -0
  228. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  229. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  230. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  231. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  232. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  233. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  234. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  235. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  236. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  237. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  238. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  239. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  240. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  241. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  242. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  243. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  244. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  245. package/dist/plots/ranking/forest/defaults.js +20 -0
  246. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  247. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  248. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  249. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  250. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  251. package/dist/plots/utils/RowNumbers.js +24 -0
  252. package/dist/plots/utils/gaps.js +1 -1
  253. package/dist/plots/utils/segments.js +1 -1
  254. package/dist/types/configuration/styling.d.ts +276 -143
  255. package/dist/types/layout/coordinates.d.ts +5 -4
  256. package/dist/types/layout/legend.d.ts +21 -5
  257. package/dist/types/layout/plot.d.ts +44 -1
  258. package/dist/types/layout/scales.d.ts +39 -7
  259. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  260. package/dist/types/layout/statistics/index.d.ts +7 -2
  261. package/dist/types/layout/styles/base.d.ts +18 -0
  262. package/dist/types/layout/styles/bullet.d.ts +25 -0
  263. package/dist/types/layout/styles/connector.d.ts +98 -0
  264. package/dist/types/layout/styles/curve.d.ts +11 -0
  265. package/dist/types/layout/styles/frame.d.ts +17 -0
  266. package/dist/types/layout/styles/gaps.d.ts +12 -0
  267. package/dist/types/layout/styles/geo.d.ts +55 -0
  268. package/dist/types/layout/styles/index.d.ts +8 -0
  269. package/dist/types/layout/styles/index.js +8 -0
  270. package/dist/types/layout/styles/values.d.ts +47 -0
  271. package/dist/types/layout/timeline.d.ts +5 -2
  272. package/dist/types/layout/tooltip.d.ts +6 -2
  273. package/dist/types/markers/axis/area.d.ts +2 -2
  274. package/dist/types/markers/axis/arrow.d.ts +3 -0
  275. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  276. package/dist/types/markers/axis/bar.d.ts +1 -1
  277. package/dist/types/markers/axis/box.d.ts +5 -0
  278. package/dist/types/markers/axis/difference.d.ts +2 -2
  279. package/dist/types/markers/axis/image.d.ts +3 -2
  280. package/dist/types/markers/axis/line.d.ts +2 -0
  281. package/dist/types/markers/axis/rule.d.ts +9 -0
  282. package/dist/types/markers/axis/trail.d.ts +2 -3
  283. package/dist/types/markers/axis/violin.d.ts +25 -0
  284. package/dist/types/markers/basic/dot.d.ts +3 -2
  285. package/dist/types/markers/basic/text.d.ts +13 -3
  286. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  287. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  288. package/dist/types/markers/common.d.ts +1 -1
  289. package/dist/types/markers/common.js +1 -0
  290. package/dist/types/markers/geo/link.d.ts +5 -1
  291. package/dist/types/phases/index.d.ts +1 -1
  292. package/dist/types/phases/scales/phase.d.ts +5 -1
  293. package/dist/types/phases/state.d.ts +15 -2
  294. package/dist/types/phases/statistics/source.d.ts +3 -1
  295. package/dist/types/phases/transforms/phase.d.ts +22 -0
  296. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  297. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  298. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  299. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  300. package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
  301. package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
  302. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  303. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  304. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  305. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  306. package/dist/types/plots/distribution/histogram/state.js +1 -0
  307. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  308. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  309. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  310. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  311. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  312. package/dist/types/plots/distribution/violin/props.js +1 -0
  313. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  314. package/dist/types/plots/distribution/violin/state.js +1 -0
  315. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  316. package/dist/types/plots/evolution/area/props.js +1 -0
  317. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  318. package/dist/types/plots/evolution/area/state.js +1 -0
  319. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  320. package/dist/types/plots/evolution/line/props.js +1 -0
  321. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  322. package/dist/types/plots/evolution/line/state.js +1 -0
  323. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  324. package/dist/types/plots/evolution/slope/props.js +1 -0
  325. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  326. package/dist/types/plots/evolution/slope/state.js +1 -0
  327. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  328. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  329. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  330. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  331. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  332. package/dist/types/plots/map/geo/props.js +1 -0
  333. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  334. package/dist/types/plots/map/geo/state.js +1 -0
  335. package/dist/types/plots/props.d.ts +1 -1
  336. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  337. package/dist/types/plots/ranking/bar/props.js +1 -0
  338. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  339. package/dist/types/plots/ranking/bar/state.js +1 -0
  340. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  341. package/dist/types/plots/ranking/bullet/props.js +1 -0
  342. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  343. package/dist/types/plots/ranking/bullet/state.js +1 -0
  344. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  345. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  346. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  347. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  348. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  349. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  350. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  351. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  352. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  353. package/dist/types/plots/ranking/forest/props.js +1 -0
  354. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  355. package/dist/types/plots/ranking/forest/state.js +1 -0
  356. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  357. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  358. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  359. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  360. package/dist/types/plots/segments/common.d.ts +4 -1
  361. package/dist/utils/OpacityScale.d.ts +14 -0
  362. package/dist/utils/OpacityScale.js +43 -0
  363. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  364. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  365. package/dist/utils/SymbolScale.d.ts +18 -0
  366. package/dist/utils/SymbolScale.js +29 -0
  367. package/dist/utils/color/ColorRamp.d.ts +27 -0
  368. package/dist/utils/color/ColorRamp.js +120 -0
  369. package/dist/utils/color/CssColor.d.ts +19 -0
  370. package/dist/utils/color/CssColor.js +114 -0
  371. package/dist/utils/color/Palette.d.ts +21 -0
  372. package/dist/utils/color/Palette.js +52 -0
  373. package/dist/utils/color/index.d.ts +11 -3
  374. package/dist/utils/color/index.js +14 -3
  375. package/dist/utils/grouping.js +1 -1
  376. package/docs/architecture.md +1 -1
  377. package/docs/chrome.md +2 -2
  378. package/docs/composer.md +2 -2
  379. package/docs/concepts.md +1 -1
  380. package/docs/development.md +1 -1
  381. package/docs/facets.md +3 -3
  382. package/docs/getting-started.md +2 -2
  383. package/docs/legend.md +13 -11
  384. package/docs/markers.md +29 -27
  385. package/docs/plots/correlation/heatmap.md +26 -0
  386. package/docs/plots/correlation/scatter.md +35 -0
  387. package/docs/plots/distribution/box.md +28 -0
  388. package/docs/plots/distribution/density.md +26 -0
  389. package/docs/plots/distribution/histogram.md +33 -0
  390. package/docs/plots/distribution/pyramid.md +31 -0
  391. package/docs/plots/distribution/violin.md +35 -0
  392. package/docs/plots/evolution/area.md +32 -0
  393. package/docs/plots/evolution/line.md +93 -0
  394. package/docs/plots/evolution/slope.md +39 -0
  395. package/docs/plots/evolution/sparkline.md +34 -0
  396. package/docs/plots/ranking/bar.md +59 -0
  397. package/docs/plots/ranking/bullet.md +37 -0
  398. package/docs/plots/ranking/cleveland.md +54 -0
  399. package/docs/plots/ranking/dumbbell.md +39 -0
  400. package/docs/plots/ranking/forest.md +40 -0
  401. package/docs/plots/ranking/lollipop.md +39 -0
  402. package/docs/plots.md +22 -280
  403. package/docs/scales.md +30 -24
  404. package/docs/styles-and-segments.md +24 -21
  405. package/docs/theming.md +23 -20
  406. package/docs/timeline.md +3 -3
  407. package/docs/tooltip-and-hover.md +10 -10
  408. package/docs/transforms-and-statistics.md +13 -12
  409. package/examples/BarValues.svelte +1 -1
  410. package/examples/Box.svelte +1 -1
  411. package/examples/Bullet.svelte +17 -0
  412. package/examples/Chrome.svelte +1 -1
  413. package/examples/ChromeOrder.svelte +1 -1
  414. package/examples/Cleveland.svelte +15 -0
  415. package/examples/Composer.svelte +2 -2
  416. package/examples/CustomTooltip.svelte +1 -1
  417. package/examples/Density.svelte +7 -0
  418. package/examples/Dumbbell.svelte +16 -0
  419. package/examples/Facets.svelte +1 -1
  420. package/examples/FacetsCarousel.svelte +1 -1
  421. package/examples/FacetsRowsCols.svelte +1 -1
  422. package/examples/FirstPlot.svelte +1 -1
  423. package/examples/Forest.svelte +17 -0
  424. package/examples/Gaps.svelte +2 -2
  425. package/examples/GroupedBars.svelte +1 -1
  426. package/examples/Heatmap.svelte +3 -3
  427. package/examples/HeatmapSegments.svelte +8 -8
  428. package/examples/Histogram.svelte +1 -1
  429. package/examples/HorizontalBars.svelte +1 -1
  430. package/examples/LegendSections.svelte +1 -1
  431. package/examples/LegendToggle.svelte +1 -1
  432. package/examples/LineByRegion.svelte +1 -1
  433. package/examples/LineDates.svelte +1 -1
  434. package/examples/LineStep.svelte +16 -0
  435. package/examples/LineStepSegment.svelte +18 -0
  436. package/examples/Lollipop.svelte +17 -0
  437. package/examples/Markers.svelte +1 -1
  438. package/examples/MovingAverage.svelte +1 -1
  439. package/examples/Pyramid.svelte +9 -2
  440. package/examples/Regression.svelte +2 -2
  441. package/examples/ResponsiveLine.svelte +1 -1
  442. package/examples/Scales.svelte +1 -1
  443. package/examples/Scatter.svelte +2 -2
  444. package/examples/SegmentHighlight.svelte +1 -1
  445. package/examples/Segments.svelte +1 -1
  446. package/examples/SegmentsBySeries.svelte +1 -1
  447. package/examples/Slope.svelte +17 -0
  448. package/examples/Sparkline.svelte +14 -0
  449. package/examples/StackedArea.svelte +1 -1
  450. package/examples/StackedBars.svelte +1 -1
  451. package/examples/TimelinePlayer.svelte +1 -1
  452. package/examples/TimelineRule.svelte +1 -1
  453. package/examples/Tooltip.svelte +1 -1
  454. package/examples/ValueLabels.svelte +1 -1
  455. package/examples/Violin.svelte +14 -0
  456. package/examples/datasets/argentina-chile-trends.ts +34 -0
  457. package/examples/datasets/commodity-prices.ts +48 -0
  458. package/examples/datasets/countries-over-time.ts +368 -0
  459. package/examples/datasets/daily-temperature.ts +121 -0
  460. package/examples/datasets/earthquakes.ts +977 -0
  461. package/examples/datasets/flight-routes.ts +29 -0
  462. package/examples/datasets/height-density.ts +37 -0
  463. package/examples/datasets/heights.ts +370 -0
  464. package/examples/datasets/index.ts +24 -0
  465. package/examples/datasets/inflation-by-region.ts +44 -0
  466. package/examples/datasets/inflation-ranges.ts +34 -0
  467. package/examples/datasets/iris-flower.ts +207 -0
  468. package/examples/datasets/life-expectancy.ts +95 -0
  469. package/examples/datasets/napoleons-march.ts +182 -0
  470. package/examples/datasets/penguins.ts +54 -0
  471. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  472. package/examples/datasets/population-by-age.ts +890 -0
  473. package/examples/datasets/province-population.ts +521 -0
  474. package/examples/datasets/stock-prices.ts +63 -0
  475. package/examples/datasets/weather-stations-over-time.ts +31 -0
  476. package/examples/datasets/weather-stations.ts +22 -0
  477. package/examples/datasets/wind-vectors.ts +30 -0
  478. package/examples/datasets/world-temperature.ts +400 -0
  479. package/llms-full.txt +22 -11
  480. package/llms.txt +32 -4
  481. package/package.json +10 -1
  482. package/dist/plots/bar/defaults.d.ts +0 -9
  483. package/dist/plots/geo/features.svelte.d.ts +0 -5
  484. package/dist/plots/geo/features.svelte.js +0 -44
  485. package/dist/plots/geo/phases/tooltip.js +0 -5
  486. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  487. package/dist/plots/utils/geoAccessors.js +0 -220
  488. package/dist/plots/utils/geoSegments.d.ts +0 -29
  489. package/dist/plots/utils/geoSegments.js +0 -37
  490. package/dist/types/layout/styles.d.ts +0 -122
  491. package/dist/types/markers/axis/curveName.d.ts +0 -2
  492. package/dist/types/plots/line/props.d.ts +0 -10
  493. package/dist/utils/color/contrast.d.ts +0 -9
  494. package/dist/utils/color/contrast.js +0 -40
  495. package/dist/utils/color/cssColor.d.ts +0 -4
  496. package/dist/utils/color/cssColor.js +0 -77
  497. package/dist/utils/color/ramp.d.ts +0 -17
  498. package/dist/utils/color/ramp.js +0 -110
  499. package/dist/utils/opacity.d.ts +0 -9
  500. package/dist/utils/opacity.js +0 -38
  501. package/examples/data.ts +0 -324
  502. /package/dist/plots/{box → distribution/box}/markers.js +0 -0
  503. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  504. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  505. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  506. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  507. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  508. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  509. /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
  510. /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
  511. /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
  512. /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
  513. /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  514. /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
  515. /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
  516. /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
  517. /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
  518. /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
  519. /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
  520. /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
  521. /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
  522. /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
  523. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  524. /package/dist/{plots/utils → utils}/accessors.js +0 -0
@@ -1,13 +1,13 @@
1
1
  <script lang="ts" generics="TProps extends Record<string, unknown>">
2
- import { createGeoFeatures } from './features.svelte';
3
- import { getConfiguration } from '../../configuration/config.svelte';
4
- import { LegendState } from '../../layout/legend/LegendState.svelte';
5
- import { ChannelName } from '../utils/ChannelName';
6
- import { Margins } from '../../layout/margins/Margins';
7
- import BasePlotLayout from '../../layout/base/BasePlotLayout.svelte';
8
- import type { GeoPlotCoreProps } from '../../types/plots/geo/props';
9
- import type { CoordinatesConfig } from '../../types/layout/coordinates';
10
- import type { GeoPlotState, GeoPlotCtx } from '../../types/plots/geo/state';
2
+ import { GeoFeatures } from './GeoFeatures.svelte';
3
+ import { getConfiguration } from '../../../configuration/config.svelte';
4
+ import { LegendState } from '../../../layout/legend/LegendState.svelte';
5
+ import { ChannelName } from '../../utils/ChannelName';
6
+ import { Margins } from '../../../layout/margins/Margins';
7
+ import BasePlotLayout from '../../../layout/base/BasePlotLayout.svelte';
8
+ import type { GeoPlotCoreProps } from '../../../types/plots/map/geo/props';
9
+ import type { CoordinatesConfig } from '../../../types/layout/coordinates';
10
+ import type { GeoPlotState, GeoPlotCtx } from '../../../types/plots/map/geo/state';
11
11
 
12
12
  /**
13
13
  * A map from GeoJSON or TopoJSON. `segments` styles features by id,
@@ -39,7 +39,7 @@
39
39
  const cfg = $derived(getConfiguration());
40
40
 
41
41
  // ── Resolve data: GeoJSON is synchronous, TopoJSON is converted async ────
42
- const resolved = createGeoFeatures<TProps>(
42
+ const resolved = new GeoFeatures<TProps>(
43
43
  () => data,
44
44
  () => object
45
45
  );
@@ -134,6 +134,7 @@
134
134
  opacity: { source: ChannelName.of(opacity, 'opacity') }
135
135
  },
136
136
  colorDomain: plotState.colorDomain,
137
+ colorRamps: plotState.colorRamps,
137
138
  opacityDomain: plotState.opacityDomain,
138
139
  styles: resolvedStyles,
139
140
  marginEstimate: Margins.GEO_ESTIMATE
@@ -1,4 +1,4 @@
1
- import type { GeoPlotCoreProps } from '../../types/plots/geo/props';
1
+ import type { GeoPlotCoreProps } from '../../../types/plots/map/geo/props';
2
2
  declare function $$render<TProps extends Record<string, unknown>>(): {
3
3
  props: GeoPlotCoreProps<TProps>;
4
4
  exports: {};
@@ -0,0 +1,9 @@
1
+ import type { GeoFeature, GeoJsonInput, Topology } from '../../../types/plots/data/geo';
2
+ /** A GeoPlot's `data` as a feature list: GeoJSON as is, a TopoJSON `Topology` converted under `object`. Create it while a component initializes. */
3
+ export declare class GeoFeatures<TProps extends Record<string, unknown>> {
4
+ #private;
5
+ constructor(getData: () => GeoJsonInput<TProps> | Topology, getObject: () => string | undefined);
6
+ get features(): GeoFeature<TProps>[];
7
+ /** The default `featureId`: `feature.id`, else `properties.id`, else `properties.name`. */
8
+ static defaultId<TProps extends Record<string, unknown>>(feature: GeoFeature<TProps>): string;
9
+ }
@@ -0,0 +1,55 @@
1
+ import { isTopology, topologyToGeoJson } from '../../utils/topojson';
2
+ /** A GeoPlot's `data` as a feature list: GeoJSON as is, a TopoJSON `Topology` converted under `object`. Create it while a component initializes. */
3
+ export class GeoFeatures {
4
+ #getData;
5
+ #getObject;
6
+ #converted = $state(null);
7
+ #list = $derived.by(() => {
8
+ const data = this.#getData();
9
+ if (isTopology(data))
10
+ return this.#converted ?? [];
11
+ if (Array.isArray(data))
12
+ return data;
13
+ return data.features;
14
+ });
15
+ constructor(getData, getObject) {
16
+ this.#getData = getData;
17
+ this.#getObject = getObject;
18
+ $effect(() => this.#convert());
19
+ }
20
+ get features() {
21
+ return this.#list;
22
+ }
23
+ /** The default `featureId`: `feature.id`, else `properties.id`, else `properties.name`. */
24
+ static defaultId(feature) {
25
+ const props = feature.properties;
26
+ return String(feature.id ?? props?.id ?? props?.name ?? '');
27
+ }
28
+ /** Converts a TopoJSON `data` into features once, dropping the result if `data` changes meanwhile. */
29
+ #convert() {
30
+ const data = this.#getData();
31
+ const object = this.#getObject();
32
+ if (!isTopology(data))
33
+ return;
34
+ if (!object) {
35
+ console.warn('GeoPlot: `data` is a TopoJSON Topology but no `object` key was given - nothing will render.');
36
+ this.#converted = [];
37
+ return;
38
+ }
39
+ let cancelled = false;
40
+ topologyToGeoJson(data, object)
41
+ .then((features) => {
42
+ if (!cancelled)
43
+ this.#converted = features;
44
+ })
45
+ .catch((error) => {
46
+ if (!cancelled) {
47
+ console.warn(error instanceof Error ? error.message : String(error));
48
+ this.#converted = [];
49
+ }
50
+ });
51
+ return () => {
52
+ cancelled = true;
53
+ };
54
+ }
55
+ }
@@ -0,0 +1,27 @@
1
+ type LonLat = [number, number];
2
+ /** Operations on GeoJSON geometries: their centroids, bounds, disjoint parts and great-circle arcs. */
3
+ export declare class GeoGeometry {
4
+ #private;
5
+ /** Bounding-box center of a geometry's coordinates: a cheap point for a label, not an area centroid. */
6
+ static centroid(geometry: GeoJSON.Geometry): LonLat;
7
+ /** `[minLon, minLat, maxLon, maxLat]` of a geometry, or `null` when it has no coordinates. */
8
+ static lonLatBounds(geometry: GeoJSON.Geometry): [number, number, number, number] | null;
9
+ /** A multi-part geometry as its disjoint parts, one `Polygon` or `LineString` each; any other geometry as itself. */
10
+ static parts(geometry: GeoJSON.Geometry): GeoJSON.Geometry[];
11
+ /** One centroid per disjoint part, so a feature whose parts lie far apart matches a hover over any of them. */
12
+ static partCentroids(geometry: GeoJSON.Geometry): LonLat[];
13
+ /** The geometry without the parts `keep` rejects, or `null` when none stays. The same geometry when all do. */
14
+ static filterParts(geometry: GeoJSON.Geometry, keep: (part: {
15
+ centroid: LonLat;
16
+ geometry: GeoJSON.Geometry;
17
+ }) => boolean): GeoJSON.Geometry | null;
18
+ /** The path between two points that changes longitude and latitude at a steady rate, the short way around: it keeps near its parallels where a great circle bends toward a pole. */
19
+ static parallelPath(from: LonLat, to: LonLat, steps?: number): LonLat[];
20
+ /**
21
+ * The great-circle arc between two points, as `steps + 1` points. Drawn
22
+ * through `Geo` because svelteplot's `Link` cannot read `x1`/`y1`/`x2`/`y2`
23
+ * under a projection (0.14.2).
24
+ */
25
+ static greatCircle(from: LonLat, to: LonLat, steps?: number): LonLat[];
26
+ }
27
+ export {};
@@ -0,0 +1,142 @@
1
+ /** Operations on GeoJSON geometries: their centroids, bounds, disjoint parts and great-circle arcs. */
2
+ export class GeoGeometry {
3
+ /** Bounding-box center of a geometry's coordinates: a cheap point for a label, not an area centroid. */
4
+ static centroid(geometry) {
5
+ const coords = GeoGeometry.#coordinates(geometry);
6
+ if (coords.length === 0)
7
+ return [0, 0];
8
+ const [minLon, minLat, maxLon, maxLat] = GeoGeometry.#extent(coords);
9
+ return [(minLon + maxLon) / 2, (minLat + maxLat) / 2];
10
+ }
11
+ /** `[minLon, minLat, maxLon, maxLat]` of a geometry, or `null` when it has no coordinates. */
12
+ static lonLatBounds(geometry) {
13
+ const coords = GeoGeometry.#coordinates(geometry);
14
+ return coords.length === 0 ? null : GeoGeometry.#extent(coords);
15
+ }
16
+ /** A multi-part geometry as its disjoint parts, one `Polygon` or `LineString` each; any other geometry as itself. */
17
+ static parts(geometry) {
18
+ switch (geometry.type) {
19
+ case 'MultiPolygon':
20
+ return geometry.coordinates.map((polygon) => ({ type: 'Polygon', coordinates: polygon }));
21
+ case 'MultiLineString':
22
+ return geometry.coordinates.map((line) => ({ type: 'LineString', coordinates: line }));
23
+ case 'GeometryCollection':
24
+ return geometry.geometries.flatMap((part) => GeoGeometry.parts(part));
25
+ default:
26
+ return [geometry];
27
+ }
28
+ }
29
+ /** One centroid per disjoint part, so a feature whose parts lie far apart matches a hover over any of them. */
30
+ static partCentroids(geometry) {
31
+ return GeoGeometry.parts(geometry).map((part) => GeoGeometry.centroid(part));
32
+ }
33
+ /** The geometry without the parts `keep` rejects, or `null` when none stays. The same geometry when all do. */
34
+ static filterParts(geometry, keep) {
35
+ const parts = GeoGeometry.parts(geometry);
36
+ const kept = parts.filter((part) => keep({ centroid: GeoGeometry.centroid(part), geometry: part }));
37
+ if (kept.length === parts.length)
38
+ return geometry;
39
+ if (kept.length === 0)
40
+ return null;
41
+ if (parts.length === 1)
42
+ return kept[0];
43
+ switch (geometry.type) {
44
+ case 'MultiPolygon':
45
+ return {
46
+ type: 'MultiPolygon',
47
+ coordinates: kept.map((part) => part.coordinates)
48
+ };
49
+ case 'MultiLineString':
50
+ return {
51
+ type: 'MultiLineString',
52
+ coordinates: kept.map((part) => part.coordinates)
53
+ };
54
+ case 'GeometryCollection':
55
+ return { type: 'GeometryCollection', geometries: kept };
56
+ default:
57
+ return geometry;
58
+ }
59
+ }
60
+ /** The path between two points that changes longitude and latitude at a steady rate, the short way around: it keeps near its parallels where a great circle bends toward a pole. */
61
+ static parallelPath(from, to, steps = 64) {
62
+ const shift = ((((to[0] - from[0] + 180) % 360) + 360) % 360) - 180;
63
+ return Array.from({ length: steps + 1 }, (_, index) => {
64
+ const fraction = index / steps;
65
+ const lon = ((((from[0] + shift * fraction + 180) % 360) + 360) % 360) - 180;
66
+ return [lon, from[1] + (to[1] - from[1]) * fraction];
67
+ });
68
+ }
69
+ /**
70
+ * The great-circle arc between two points, as `steps + 1` points. Drawn
71
+ * through `Geo` because svelteplot's `Link` cannot read `x1`/`y1`/`x2`/`y2`
72
+ * under a projection (0.14.2).
73
+ */
74
+ static greatCircle(from, to, steps = 64) {
75
+ const [lambda1, phi1] = [GeoGeometry.#radians(from[0]), GeoGeometry.#radians(from[1])];
76
+ const [lambda2, phi2] = [GeoGeometry.#radians(to[0]), GeoGeometry.#radians(to[1])];
77
+ const distance = 2 *
78
+ Math.asin(Math.sqrt(Math.sin((phi2 - phi1) / 2) ** 2 +
79
+ Math.cos(phi1) * Math.cos(phi2) * Math.sin((lambda2 - lambda1) / 2) ** 2));
80
+ if (!Number.isFinite(distance) || distance === 0)
81
+ return [from, to];
82
+ return Array.from({ length: steps + 1 }, (_, index) => {
83
+ const fraction = index / steps;
84
+ const a = Math.sin((1 - fraction) * distance) / Math.sin(distance);
85
+ const b = Math.sin(fraction * distance) / Math.sin(distance);
86
+ const x = a * Math.cos(phi1) * Math.cos(lambda1) + b * Math.cos(phi2) * Math.cos(lambda2);
87
+ const y = a * Math.cos(phi1) * Math.sin(lambda1) + b * Math.cos(phi2) * Math.sin(lambda2);
88
+ const z = a * Math.sin(phi1) + b * Math.sin(phi2);
89
+ return [
90
+ GeoGeometry.#degrees(Math.atan2(y, x)),
91
+ GeoGeometry.#degrees(Math.atan2(z, Math.sqrt(x * x + y * y)))
92
+ ];
93
+ });
94
+ }
95
+ static #radians(degrees) {
96
+ return (degrees * Math.PI) / 180;
97
+ }
98
+ static #degrees(radians) {
99
+ return (radians * 180) / Math.PI;
100
+ }
101
+ static #extent(coords) {
102
+ let [minLon, minLat, maxLon, maxLat] = [Infinity, Infinity, -Infinity, -Infinity];
103
+ for (const [lon, lat] of coords) {
104
+ if (lon < minLon)
105
+ minLon = lon;
106
+ if (lon > maxLon)
107
+ maxLon = lon;
108
+ if (lat < minLat)
109
+ minLat = lat;
110
+ if (lat > maxLat)
111
+ maxLat = lat;
112
+ }
113
+ return [minLon, minLat, maxLon, maxLat];
114
+ }
115
+ static #coordinates(geometry, out = []) {
116
+ switch (geometry.type) {
117
+ case 'Point':
118
+ out.push(geometry.coordinates);
119
+ break;
120
+ case 'MultiPoint':
121
+ case 'LineString':
122
+ out.push(...geometry.coordinates);
123
+ break;
124
+ case 'MultiLineString':
125
+ case 'Polygon':
126
+ for (const line of geometry.coordinates)
127
+ out.push(...line);
128
+ break;
129
+ case 'MultiPolygon':
130
+ for (const polygon of geometry.coordinates) {
131
+ for (const ring of polygon)
132
+ out.push(...ring);
133
+ }
134
+ break;
135
+ case 'GeometryCollection':
136
+ for (const part of geometry.geometries)
137
+ GeoGeometry.#coordinates(part, out);
138
+ break;
139
+ }
140
+ return out;
141
+ }
142
+ }
@@ -0,0 +1,16 @@
1
+ import type { ChannelScalesConfig } from '../../../types/layout/scales';
2
+ import type { Segment } from '../../../types/plots/segments/config';
3
+ import type { SegmentsConfig } from '../../../types/plots/props';
4
+ /**
5
+ * The segments that apply to one geo feature. A feature is atomic, so a segment's
6
+ * `areas` do not apply: every entry is a plain patch, merged in order.
7
+ */
8
+ export declare class GeoSegments {
9
+ #private;
10
+ /** The feature's entries, least specific first: `default`, its grouping bucket, then itself. */
11
+ static forFeature<TStyle>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): Segment<TStyle>[];
12
+ /** Every matching entry's `styles` merged field by field, the most specific winning. */
13
+ static style<TStyle extends object>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): TStyle;
14
+ /** The `scales` of the most specific matching entry that sets one: a ramp config does not merge key by key. */
15
+ static scales<TStyle>(segments: SegmentsConfig<TStyle>, featureId: string, groupingValue?: string): ChannelScalesConfig | undefined;
16
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The segments that apply to one geo feature. A feature is atomic, so a segment's
3
+ * `areas` do not apply: every entry is a plain patch, merged in order.
4
+ */
5
+ export class GeoSegments {
6
+ static #DEFAULT_KEY = 'default';
7
+ /** The feature's entries, least specific first: `default`, its grouping bucket, then itself. */
8
+ static forFeature(segments, featureId, groupingValue) {
9
+ return [
10
+ ...(segments[GeoSegments.#DEFAULT_KEY] ?? []),
11
+ ...(groupingValue ? (segments[groupingValue] ?? []) : []),
12
+ ...(segments[featureId] ?? [])
13
+ ];
14
+ }
15
+ /** Every matching entry's `styles` merged field by field, the most specific winning. */
16
+ static style(segments, featureId, groupingValue) {
17
+ return GeoSegments.forFeature(segments, featureId, groupingValue).reduce((merged, segment) => ({ ...merged, ...(segment.styles ?? {}) }), {});
18
+ }
19
+ /** The `scales` of the most specific matching entry that sets one: a ramp config does not merge key by key. */
20
+ static scales(segments, featureId, groupingValue) {
21
+ return GeoSegments.forFeature(segments, featureId, groupingValue).reduce((found, segment) => segment.scales ?? found, undefined);
22
+ }
23
+ }
@@ -1,16 +1,16 @@
1
1
  <script lang="ts" generics="TProps extends Record<string, unknown>">
2
2
  import Core from './Core.svelte';
3
- import Plot from '../../layout/plot/Plot.svelte';
4
- import { merge } from '../../utils/merge';
3
+ import Plot from '../../../layout/plot/Plot.svelte';
4
+ import { merge } from '../../../utils/merge';
5
5
  import { buildGeoDefaults } from './defaults';
6
6
  import { buildGeoSlicing } from './slices';
7
- import { createGeoFeatures } from './features.svelte';
8
- import type { GeoPlotProps, GeoPlotCoreProps } from '../../types/plots/geo/props';
9
- import type { GeoFeature } from '../../types/plots/data/geo';
10
- import type { GeoScalesConfig } from '../../types/layout/coordinates';
11
- import type { PlotCellContext } from '../../types/layout/plot';
12
- import type { TooltipConfig } from '../../types/plots/props';
13
- import type { TooltipProp } from '../../types/layout/tooltip';
7
+ import { GeoFeatures } from './GeoFeatures.svelte';
8
+ import type { GeoPlotProps, GeoPlotCoreProps } from '../../../types/plots/map/geo/props';
9
+ import type { GeoFeature } from '../../../types/plots/data/geo';
10
+ import type { GeoScalesConfig } from '../../../types/layout/coordinates';
11
+ import type { PlotCellContext } from '../../../types/layout/plot';
12
+ import type { TooltipConfig } from '../../../types/plots/props';
13
+ import type { TooltipProp } from '../../../types/layout/tooltip';
14
14
 
15
15
  type Row = Record<string, unknown>;
16
16
 
@@ -40,7 +40,7 @@
40
40
 
41
41
  const sliced = $derived(timeline != null || facet != null);
42
42
  // Only resolved here when slicing; otherwise the core resolves `data` itself.
43
- const resolved = createGeoFeatures<TProps>(
43
+ const resolved = new GeoFeatures<TProps>(
44
44
  () => (sliced ? core.data : []),
45
45
  () => core.object
46
46
  );
@@ -1,5 +1,5 @@
1
- import Plot from '../../layout/plot/Plot.svelte';
2
- import type { GeoPlotProps } from '../../types/plots/geo/props';
1
+ import Plot from '../../../layout/plot/Plot.svelte';
2
+ import type { GeoPlotProps } from '../../../types/plots/map/geo/props';
3
3
  declare function $$render<TProps extends Record<string, unknown>>(): {
4
4
  props: GeoPlotProps<TProps>;
5
5
  exports: {};
@@ -1,4 +1,4 @@
1
- import type { GeoPlotState, GeoPlotCtx } from '../../types/plots/geo/state';
2
- import { Pipeline } from '../../phases/Pipeline';
1
+ import type { GeoPlotState, GeoPlotCtx } from '../../../types/plots/map/geo/state';
2
+ import { Pipeline } from '../../../phases/Pipeline';
3
3
  /** GeoPlot's own pipeline (data, scales, markers, tooltip, hover), run over the state its core seeds, hovering one feature at a time. */
4
4
  export declare function buildGeoDefaults<TProps extends Record<string, unknown>>(): Pipeline<GeoPlotState<TProps>, GeoPlotCtx<TProps>>;
@@ -3,7 +3,7 @@ import { buildScales } from './phases/scales';
3
3
  import { buildMarkers } from './phases/markers';
4
4
  import { buildTooltip } from './phases/tooltip';
5
5
  import { buildHover } from './phases/hover';
6
- import { Pipeline } from '../../phases/Pipeline';
6
+ import { Pipeline } from '../../../phases/Pipeline';
7
7
  /** GeoPlot's own pipeline (data, scales, markers, tooltip, hover), run over the state its core seeds, hovering one feature at a time. */
8
8
  export function buildGeoDefaults() {
9
9
  return new Pipeline([
@@ -1,4 +1,4 @@
1
- import type { GeoPlotState } from '../../../types/plots/geo/state';
1
+ import type { GeoPlotState } from '../../../../types/plots/map/geo/state';
2
2
  /**
3
3
  * GeoPlot's "data" phase: every feature tagged with its resolved id/centroid,
4
4
  * then reduced by `excludeParts`. Reads no ctx.
@@ -1,5 +1,6 @@
1
- import { resolveAccessor } from '../../utils/accessors';
2
- import { geometryCentroid, filterGeometryParts, defaultFeatureId } from '../../utils/geoAccessors';
1
+ import { resolveAccessor } from '../../../../utils/accessors';
2
+ import { GeoGeometry } from '../GeoGeometry';
3
+ import { GeoFeatures } from '../GeoFeatures.svelte';
3
4
  /**
4
5
  * GeoPlot's "data" phase: every feature tagged with its resolved id/centroid,
5
6
  * then reduced by `excludeParts`. Reads no ctx.
@@ -8,18 +9,18 @@ export function buildData(state) {
8
9
  const { rawFeatures, featureId, excludeParts } = state;
9
10
  const getFeatureId = featureId
10
11
  ? resolveAccessor(featureId)
11
- : defaultFeatureId;
12
+ : GeoFeatures.defaultId;
12
13
  const allFeatures = rawFeatures.map((f) => {
13
- const [cx, cy] = geometryCentroid(f.geometry);
14
+ const [cx, cy] = GeoGeometry.centroid(f.geometry);
14
15
  return { ...f, __id: getFeatureId(f), __cx: cx, __cy: cy };
15
16
  });
16
17
  const features = !excludeParts
17
18
  ? allFeatures
18
19
  : allFeatures.flatMap((f) => {
19
- const geometry = filterGeometryParts(f.geometry, (part) => !excludeParts(part, f));
20
+ const geometry = GeoGeometry.filterParts(f.geometry, (part) => !excludeParts(part, f));
20
21
  if (!geometry)
21
22
  return [];
22
- const [cx, cy] = geometryCentroid(geometry);
23
+ const [cx, cy] = GeoGeometry.centroid(geometry);
23
24
  return [{ ...f, geometry, __cx: cx, __cy: cy }];
24
25
  });
25
26
  return { ...state, allFeatures, features };
@@ -1,4 +1,4 @@
1
- import type { GeoPlotState, GeoPlotCtx } from '../../../types/plots/geo/state';
1
+ import type { GeoPlotState, GeoPlotCtx } from '../../../../types/plots/map/geo/state';
2
2
  /** Whether a pointer event is over an `inset` marker's panel, which has its own hover. */
3
3
  export declare function isOverInset(e: PointerEvent): boolean;
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { LegendState } from '../../../layout/legend/LegendState.svelte';
2
- import { HoverSettings } from '../../../layout/hover/HoverSettings';
1
+ import { LegendState } from '../../../../layout/legend/LegendState.svelte';
2
+ import { HoverSettings } from '../../../../layout/hover/HoverSettings';
3
3
  /** Whether a pointer event is over an `inset` marker's panel, which has its own hover. */
4
4
  export function isOverInset(e) {
5
5
  return e.target?.closest?.('.dct-geo-inset') != null;
@@ -1,4 +1,4 @@
1
- import type { GeoPlotState, GeoPlotCtx } from '../../../types/plots/geo/state';
1
+ import type { GeoPlotState, GeoPlotCtx } from '../../../../types/plots/map/geo/state';
2
2
  /**
3
3
  * GeoPlot's "markers" phase: per-feature style resolution/grouping, the base
4
4
  * `'geo'` marker(s), and the full draw order - any authored marker with
@@ -1,6 +1,7 @@
1
- import { LegendState } from '../../../layout/legend/LegendState.svelte';
2
- import { resolveFeatureStyle } from '../../utils/geoSegments';
3
- import { DisabledStyle } from '../../../layout/legend/DisabledStyle';
1
+ import { LegendState } from '../../../../layout/legend/LegendState.svelte';
2
+ import { GeoSegments } from '../GeoSegments';
3
+ import { MarkerChannels } from '../../../../markers/utils/MarkerChannels';
4
+ import { DisabledStyle } from '../../../../layout/legend/DisabledStyle';
4
5
  /**
5
6
  * `graticule`/`sphere`/`contour` opt into drawing underneath the base map's
6
7
  * own fill/stroke instead of on top of it - see each config's own `behind`
@@ -29,7 +30,7 @@ export function buildMarkers(state, ctx) {
29
30
  return { ...base, ...DisabledStyle.fill(range.disabledStyle) };
30
31
  }
31
32
  function getFeatureStyle(f) {
32
- return rangeFilteredStyle(resolveFeatureStyle(segments, f.__id, grouping?.(f)), f);
33
+ return rangeFilteredStyle(GeoSegments.style(segments, f.__id, grouping?.(f)), f);
33
34
  }
34
35
  const groups = new Map();
35
36
  for (const f of features) {
@@ -65,11 +66,6 @@ export function buildMarkers(state, ctx) {
65
66
  const behindMarkers = authoredMarkers.filter(isBehindMarker);
66
67
  const frontMarkers = authoredMarkers.filter((m) => !isBehindMarker(m) && m.type !== 'geo-hover');
67
68
  const hoverMarker = authoredMarkers.find((m) => m.type === 'geo-hover');
68
- const markers = [
69
- ...behindMarkers,
70
- ...featureMarkers,
71
- ...frontMarkers,
72
- ...(hoverMarker ? [hoverMarker] : [])
73
- ];
69
+ const markers = MarkerChannels.inheritAll([...behindMarkers, ...featureMarkers, ...frontMarkers, ...(hoverMarker ? [hoverMarker] : [])], state.scales);
74
70
  return { ...state, markers, styleGroups };
75
71
  }
@@ -1,9 +1,9 @@
1
- import type { GeoPlotState, GeoPlotCtx } from '../../../types/plots/geo/state';
1
+ import type { GeoPlotState, GeoPlotCtx } from '../../../../types/plots/map/geo/state';
2
2
  /**
3
3
  * GeoPlot's "scales" phase: each feature's own resolved color (mirrors
4
4
  * HeatmapPlot's own), with a per-feature override for whichever segment
5
5
  * (its `grouping` bucket, or itself by id) sets its own `scales.color` -
6
- * see `resolveFeatureScales`. A segment ramp's domain is built from just
6
+ * see `GeoSegments.scales`. A segment ramp's domain is built from just
7
7
  * the features that share its own key, so e.g. two grouping buckets each
8
8
  * get a ramp scaled to their own value range, not the whole dataset's.
9
9
  */
@@ -1,12 +1,12 @@
1
- import { resolveColorScale } from '../../../utils/color';
2
- import { resolveOpacityScale } from '../../../utils/opacity';
3
- import { ContinuousDomain } from '../../../utils/ContinuousDomain';
4
- import { resolveFeatureScales } from '../../utils/geoSegments';
1
+ import { ColorRamp } from '../../../../utils/color';
2
+ import { OpacityScale } from '../../../../utils/OpacityScale';
3
+ import { ContinuousDomain } from '../../../../utils/ContinuousDomain';
4
+ import { GeoSegments } from '../GeoSegments';
5
5
  /**
6
6
  * GeoPlot's "scales" phase: each feature's own resolved color (mirrors
7
7
  * HeatmapPlot's own), with a per-feature override for whichever segment
8
8
  * (its `grouping` bucket, or itself by id) sets its own `scales.color` -
9
- * see `resolveFeatureScales`. A segment ramp's domain is built from just
9
+ * see `GeoSegments.scales`. A segment ramp's domain is built from just
10
10
  * the features that share its own key, so e.g. two grouping buckets each
11
11
  * get a ramp scaled to their own value range, not the whole dataset's.
12
12
  */
@@ -19,14 +19,12 @@ export function buildScales(state, ctx) {
19
19
  const valueDomain = ContinuousDomain.build(scales.color?.domain, colorValues);
20
20
  const effectiveDomain = valueDomain ? ContinuousDomain.ramp(valueDomain, range) : null;
21
21
  const colorScale = effectiveDomain
22
- ? resolveColorScale({ ...scales.color, domain: effectiveDomain }, effectiveDomain, [
23
- cfg.continuous.min,
24
- cfg.continuous.max
25
- ])
22
+ ? ColorRamp.continuous(cfg, scales.color, effectiveDomain)
26
23
  : null;
27
24
  // Per-segment-key ramp cache - built lazily, once per distinct grouping
28
25
  // value/feature id that actually has its own `scales.color`.
29
26
  const segmentScaleCache = new Map();
27
+ const colorRamps = [];
30
28
  function segmentColorScaleFor(key, segScales) {
31
29
  if (segmentScaleCache.has(key))
32
30
  return segmentScaleCache.get(key);
@@ -35,9 +33,16 @@ export function buildScales(state, ctx) {
35
33
  : features.filter((g) => g.__id === key);
36
34
  const vals = peers.map((g) => color?.(g)).filter((v) => v != null);
37
35
  const scale = vals.length
38
- ? resolveColorScale({ ...segScales?.color, domain: [Math.min(...vals), Math.max(...vals)] }, [Math.min(...vals), Math.max(...vals)], [cfg.continuous.min, cfg.continuous.max])
36
+ ? ColorRamp.continuous(cfg, segScales?.color, [Math.min(...vals), Math.max(...vals)])
39
37
  : null;
40
38
  segmentScaleCache.set(key, scale);
39
+ if (vals.length && segScales?.color) {
40
+ colorRamps.push({
41
+ name: key,
42
+ domain: [Math.min(...vals), Math.max(...vals)],
43
+ scale: segScales.color
44
+ });
45
+ }
41
46
  return scale;
42
47
  }
43
48
  const resolveColor = colorScale
@@ -47,7 +52,7 @@ export function buildScales(state, ctx) {
47
52
  return undefined;
48
53
  const groupingValue = grouping?.(f);
49
54
  const featureId = f.__id ?? '';
50
- const segScales = resolveFeatureScales(segments, featureId, groupingValue);
55
+ const segScales = GeoSegments.scales(segments, featureId, groupingValue);
51
56
  if (segScales?.color) {
52
57
  const scale = segmentColorScaleFor(groupingValue ?? featureId, segScales);
53
58
  if (scale)
@@ -56,6 +61,16 @@ export function buildScales(state, ctx) {
56
61
  return colorScale ? colorScale(v) : undefined;
57
62
  }
58
63
  : undefined;
64
+ // Every segment ramp is built up front, so the legend can draw each one.
65
+ if (colorScale) {
66
+ for (const f of features) {
67
+ const featureId = f.__id ?? '';
68
+ const groupingValue = grouping?.(f);
69
+ const segScales = GeoSegments.scales(segments, featureId, groupingValue);
70
+ if (segScales?.color)
71
+ segmentColorScaleFor(groupingValue ?? featureId, segScales);
72
+ }
73
+ }
59
74
  // Plot-level only - no segment-scoped opacity ramp (unlike `resolveColor`
60
75
  // above), since there's no concrete use case yet driving that complexity.
61
76
  const opacityDomain = (() => {
@@ -65,7 +80,7 @@ export function buildScales(state, ctx) {
65
80
  return vals.length ? [Math.min(...vals), Math.max(...vals)] : null;
66
81
  })();
67
82
  const opacityScale = opacityDomain
68
- ? resolveOpacityScale(scales.opacity, opacityDomain, cfg.continuous.opacityRange)
83
+ ? OpacityScale.resolve(scales.opacity, opacityDomain, cfg.continuous.opacityRange)
69
84
  : null;
70
85
  const resolveOpacity = opacityScale
71
86
  ? (f) => {
@@ -76,6 +91,7 @@ export function buildScales(state, ctx) {
76
91
  return {
77
92
  ...state,
78
93
  colorDomain: valueDomain ?? undefined,
94
+ colorRamps: colorRamps.length ? colorRamps : undefined,
79
95
  opacityDomain: opacityDomain && typeof opacityDomain[0] === 'number'
80
96
  ? opacityDomain
81
97
  : undefined,
@@ -1,3 +1,3 @@
1
- import type { GeoPlotState } from '../../../types/plots/geo/state';
1
+ import type { GeoPlotState } from '../../../../types/plots/map/geo/state';
2
2
  /** GeoPlot's "tooltip" phase: a hovered feature reads as its id. */
3
3
  export declare function buildTooltip<TProps extends Record<string, unknown>>(state: GeoPlotState<TProps>): GeoPlotState<TProps>;
@@ -0,0 +1,5 @@
1
+ import { GeoFeatures } from '../GeoFeatures.svelte';
2
+ /** GeoPlot's "tooltip" phase: a hovered feature reads as its id. */
3
+ export function buildTooltip(state) {
4
+ return { ...state, tooltipFormat: (f) => GeoFeatures.defaultId(f) };
5
+ }
@@ -1,5 +1,5 @@
1
- import type { FacetConfig } from '../../types/layout/facet';
2
- import type { TimelineConfig } from '../../types/layout/timeline';
1
+ import type { FacetConfig } from '../../../types/layout/facet';
2
+ import type { TimelineConfig } from '../../../types/layout/timeline';
3
3
  type Row = Record<string, unknown>;
4
4
  /**
5
5
  * What a GeoPlot hands `Plot` to slice by: one stand-in row per value
@@ -1,5 +1,5 @@
1
- import { TimelineTime } from '../../layout/timeline/TimelineTime';
2
- import { isFacetWrap } from '../../layout/facet/config';
1
+ import { TimelineTime } from '../../../layout/timeline/TimelineTime';
2
+ import { isFacetWrap } from '../../../layout/facet/config';
3
3
  const SLICE = Symbol('dct-geo-slice');
4
4
  /** A slicing field's value on a feature (from its `properties`) or on a marker's own row. */
5
5
  function readField(field, row) {
@@ -1,7 +1,7 @@
1
1
  <script lang="ts" generics="TData extends Record<string, unknown>">
2
- import Plot from '../../layout/plot/Plot.svelte';
2
+ import Plot from '../../../layout/plot/Plot.svelte';
3
3
  import { buildBarDefaults } from './defaults';
4
- import type { BarPlotProps, BarPlotCoreProps } from '../../types/plots/bar/props';
4
+ import type { BarPlotProps, BarPlotCoreProps } from '../../../types/plots/ranking/bar/props';
5
5
 
6
6
  /**
7
7
  * A bar plot: vertical when its categories run along `x`, horizontal when they run along `y` (the value then on `x`, as in svelteplot's `BarX`). Draws from pre-built `series` or flat `data` rows.