@fundar/data-chart-telling 1.1.0 → 1.3.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 (539) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +8 -7
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +177 -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/facet/scope.d.ts +40 -0
  25. package/dist/layout/facet/scope.js +104 -0
  26. package/dist/layout/figure/Figure.svelte +2 -0
  27. package/dist/layout/geometry/GeometryLayout.svelte +14 -9
  28. package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
  29. package/dist/layout/geometry/MarkerOffset.svelte +28 -0
  30. package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
  31. package/dist/layout/grid/GridCell.svelte +6 -8
  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 +39 -15
  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 +4 -0
  39. package/dist/layout/legend/LegendState.svelte.js +23 -8
  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 +35 -8
  43. package/dist/layout/plot/Plot.svelte +22 -2
  44. package/dist/layout/plot/Slice.d.ts +5 -1
  45. package/dist/layout/plot/Slice.js +14 -4
  46. package/dist/layout/scales/NiceTicks.d.ts +3 -0
  47. package/dist/layout/scales/NiceTicks.js +4 -0
  48. package/dist/layout/scales/ScalesLayout.svelte +93 -7
  49. package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
  50. package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
  51. package/dist/layout/scales/SveltePlotScale.js +13 -6
  52. package/dist/layout/scales/TickLabels.d.ts +32 -0
  53. package/dist/layout/scales/TickLabels.js +55 -0
  54. package/dist/layout/styles/StylesLayout.svelte +2 -2
  55. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  56. package/dist/layout/styles/ValueLabels.js +80 -21
  57. package/dist/layout/timeline/TimelineLayout.svelte +1 -1
  58. package/dist/layout/tooltip/Tooltip.svelte +4 -4
  59. package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
  60. package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
  61. package/dist/markers/MarkerKinds.d.ts +5 -0
  62. package/dist/markers/MarkerKinds.js +1 -0
  63. package/dist/markers/area/AreaMarker.svelte +15 -63
  64. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  65. package/dist/markers/bar/BarMarker.svelte +8 -4
  66. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  67. package/dist/markers/box/BoxMarker.svelte +40 -9
  68. package/dist/markers/delta/Delta.d.ts +6 -1
  69. package/dist/markers/delta/Delta.js +16 -1
  70. package/dist/markers/delta/DeltaMarker.svelte +9 -87
  71. package/dist/markers/delta/DeltaPoint.svelte +97 -0
  72. package/dist/markers/delta/DeltaPoint.svelte.d.ts +29 -0
  73. package/dist/markers/dot/DotMarker.svelte +24 -27
  74. package/dist/markers/image/ImageMarker.svelte +17 -12
  75. package/dist/markers/inset/InsetMarker.svelte +2 -2
  76. package/dist/markers/line/LineMarker.svelte +1 -0
  77. package/dist/markers/link/LinkMarker.svelte +174 -29
  78. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  79. package/dist/markers/rule/RuleMarker.svelte +14 -5
  80. package/dist/markers/text/Declutter.d.ts +4 -0
  81. package/dist/markers/text/Declutter.js +26 -11
  82. package/dist/markers/text/TextMarker.svelte +91 -48
  83. package/dist/markers/tick/TickMarker.svelte +27 -25
  84. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  85. package/dist/markers/utils/MarkerChannels.js +42 -7
  86. package/dist/markers/utils/RowOffset.d.ts +23 -0
  87. package/dist/markers/utils/RowOffset.js +23 -0
  88. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  89. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  90. package/dist/markers/utils/RowStroke.d.ts +31 -0
  91. package/dist/markers/utils/RowStroke.js +28 -0
  92. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  93. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  94. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  95. package/dist/markers/violin/ViolinProfiles.js +55 -0
  96. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  97. package/dist/phases/Pipeline.d.ts +5 -0
  98. package/dist/phases/Pipeline.js +5 -0
  99. package/dist/phases/data/DataPhase.js +3 -3
  100. package/dist/phases/data/PlotAxes.d.ts +10 -0
  101. package/dist/phases/data/PlotAxes.js +14 -1
  102. package/dist/phases/facet/FacetPanels.d.ts +1 -0
  103. package/dist/phases/facet/FacetPanels.js +1 -0
  104. package/dist/phases/facet/FacetPhase.d.ts +2 -1
  105. package/dist/phases/facet/FacetPhase.js +19 -4
  106. package/dist/phases/mapping/MappingPhase.js +1 -1
  107. package/dist/phases/markers/MarkersPhase.js +2 -1
  108. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  109. package/dist/phases/scales/CategoryOrder.js +73 -0
  110. package/dist/phases/scales/ScalesPhase.js +21 -7
  111. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
  112. package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
  113. package/dist/phases/statistics/Statistics.d.ts +10 -6
  114. package/dist/phases/statistics/Statistics.js +20 -10
  115. package/dist/phases/statistics/StatisticsPhase.js +16 -3
  116. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  117. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  118. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  119. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  120. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  121. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  122. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  123. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  124. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  125. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  126. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  127. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  128. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  129. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  130. package/dist/phases/transforms/ProcessedPositions.js +1 -1
  131. package/dist/phases/transforms/TransformsPhase.js +49 -3
  132. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  133. package/dist/phases/transforms/ValueSelection.js +53 -0
  134. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  135. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  136. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  137. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  138. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  139. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
  140. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  141. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  142. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  143. package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
  144. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  145. package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
  146. package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
  147. package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
  148. package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
  149. package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
  150. package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
  151. package/dist/plots/{box → distribution/box}/defaults.js +1 -1
  152. package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
  153. package/dist/plots/distribution/density/Plot.svelte +45 -0
  154. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  155. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  156. package/dist/plots/distribution/density/defaults.js +29 -0
  157. package/dist/plots/distribution/density/markers.d.ts +9 -0
  158. package/dist/plots/distribution/density/markers.js +42 -0
  159. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  160. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  161. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  162. package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
  163. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  164. package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
  165. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  166. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  167. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  168. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
  169. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  170. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
  171. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  172. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  173. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  174. package/dist/plots/distribution/violin/defaults.js +58 -0
  175. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  176. package/dist/plots/distribution/violin/markers.js +71 -0
  177. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  178. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  179. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  180. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  181. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  182. package/dist/plots/{area → evolution/area}/markers.js +1 -1
  183. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  184. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  185. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  186. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  187. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  188. package/dist/plots/{line → evolution/line}/markers.js +6 -4
  189. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  190. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  191. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  192. package/dist/plots/evolution/slope/defaults.js +31 -0
  193. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  194. package/dist/plots/evolution/slope/markers.js +79 -0
  195. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  196. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  197. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  198. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  199. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  200. package/dist/plots/evolution/sparkline/markers.js +56 -0
  201. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  202. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  203. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  204. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  205. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  206. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  207. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  208. package/dist/plots/map/geo/GeoSegments.js +23 -0
  209. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  210. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  211. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  212. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  213. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  214. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  215. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  216. package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
  217. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  218. package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
  219. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  220. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  221. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  222. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  223. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  224. package/dist/plots/{geo → map/geo}/slices.js +2 -2
  225. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  226. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  227. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  228. package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
  229. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  230. package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
  231. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  232. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  233. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  234. package/dist/plots/ranking/bullet/defaults.js +24 -0
  235. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  236. package/dist/plots/ranking/bullet/markers.js +90 -0
  237. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  238. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  239. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  240. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  241. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  242. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  243. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  244. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  245. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  246. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  247. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  248. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  249. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  250. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  251. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  252. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  253. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  254. package/dist/plots/ranking/forest/defaults.js +20 -0
  255. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  256. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  257. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  258. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  259. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  260. package/dist/plots/utils/RowNumbers.js +24 -0
  261. package/dist/plots/utils/gaps.js +1 -1
  262. package/dist/plots/utils/segments.d.ts +4 -1
  263. package/dist/plots/utils/segments.js +20 -7
  264. package/dist/types/configuration/styling.d.ts +284 -143
  265. package/dist/types/layout/coordinates.d.ts +5 -4
  266. package/dist/types/layout/facet.d.ts +18 -0
  267. package/dist/types/layout/legend.d.ts +23 -5
  268. package/dist/types/layout/plot.d.ts +46 -1
  269. package/dist/types/layout/scales.d.ts +39 -7
  270. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  271. package/dist/types/layout/statistics/index.d.ts +7 -2
  272. package/dist/types/layout/styles/base.d.ts +18 -0
  273. package/dist/types/layout/styles/bullet.d.ts +25 -0
  274. package/dist/types/layout/styles/connector.d.ts +98 -0
  275. package/dist/types/layout/styles/curve.d.ts +11 -0
  276. package/dist/types/layout/styles/frame.d.ts +17 -0
  277. package/dist/types/layout/styles/gaps.d.ts +12 -0
  278. package/dist/types/layout/styles/geo.d.ts +55 -0
  279. package/dist/types/layout/styles/index.d.ts +8 -0
  280. package/dist/types/layout/styles/index.js +8 -0
  281. package/dist/types/layout/styles/values.d.ts +47 -0
  282. package/dist/types/layout/timeline.d.ts +5 -2
  283. package/dist/types/layout/tooltip.d.ts +6 -2
  284. package/dist/types/markers/axis/area.d.ts +2 -2
  285. package/dist/types/markers/axis/arrow.d.ts +3 -0
  286. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  287. package/dist/types/markers/axis/bar.d.ts +1 -1
  288. package/dist/types/markers/axis/box.d.ts +5 -0
  289. package/dist/types/markers/axis/delta.d.ts +15 -2
  290. package/dist/types/markers/axis/difference.d.ts +2 -2
  291. package/dist/types/markers/axis/image.d.ts +3 -2
  292. package/dist/types/markers/axis/line.d.ts +2 -0
  293. package/dist/types/markers/axis/rule.d.ts +18 -2
  294. package/dist/types/markers/axis/trail.d.ts +2 -3
  295. package/dist/types/markers/axis/violin.d.ts +25 -0
  296. package/dist/types/markers/basic/dot.d.ts +3 -2
  297. package/dist/types/markers/basic/text.d.ts +13 -3
  298. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  299. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  300. package/dist/types/markers/common.d.ts +1 -1
  301. package/dist/types/markers/common.js +1 -0
  302. package/dist/types/markers/geo/link.d.ts +5 -1
  303. package/dist/types/phases/facet/phase.d.ts +4 -0
  304. package/dist/types/phases/index.d.ts +1 -1
  305. package/dist/types/phases/scales/phase.d.ts +5 -1
  306. package/dist/types/phases/state.d.ts +15 -2
  307. package/dist/types/phases/statistics/source.d.ts +3 -1
  308. package/dist/types/phases/transforms/phase.d.ts +22 -0
  309. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  310. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  311. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  312. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  313. package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
  314. package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
  315. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  316. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  317. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  318. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  319. package/dist/types/plots/distribution/histogram/state.js +1 -0
  320. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  321. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  322. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  323. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  324. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  325. package/dist/types/plots/distribution/violin/props.js +1 -0
  326. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  327. package/dist/types/plots/distribution/violin/state.js +1 -0
  328. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  329. package/dist/types/plots/evolution/area/props.js +1 -0
  330. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  331. package/dist/types/plots/evolution/area/state.js +1 -0
  332. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  333. package/dist/types/plots/evolution/line/props.js +1 -0
  334. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  335. package/dist/types/plots/evolution/line/state.js +1 -0
  336. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  337. package/dist/types/plots/evolution/slope/props.js +1 -0
  338. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  339. package/dist/types/plots/evolution/slope/state.js +1 -0
  340. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  341. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  342. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  343. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  344. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  345. package/dist/types/plots/map/geo/props.js +1 -0
  346. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  347. package/dist/types/plots/map/geo/state.js +1 -0
  348. package/dist/types/plots/props.d.ts +7 -4
  349. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  350. package/dist/types/plots/ranking/bar/props.js +1 -0
  351. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  352. package/dist/types/plots/ranking/bar/state.js +1 -0
  353. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  354. package/dist/types/plots/ranking/bullet/props.js +1 -0
  355. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  356. package/dist/types/plots/ranking/bullet/state.js +1 -0
  357. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  358. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  359. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  360. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  361. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  362. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  363. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  364. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  365. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  366. package/dist/types/plots/ranking/forest/props.js +1 -0
  367. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  368. package/dist/types/plots/ranking/forest/state.js +1 -0
  369. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  370. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  371. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  372. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  373. package/dist/types/plots/segments/common.d.ts +4 -1
  374. package/dist/types/plots/segments/config.d.ts +4 -2
  375. package/dist/utils/OpacityScale.d.ts +14 -0
  376. package/dist/utils/OpacityScale.js +43 -0
  377. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  378. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  379. package/dist/utils/SymbolScale.d.ts +18 -0
  380. package/dist/utils/SymbolScale.js +29 -0
  381. package/dist/utils/color/ColorRamp.d.ts +27 -0
  382. package/dist/utils/color/ColorRamp.js +120 -0
  383. package/dist/utils/color/CssColor.d.ts +19 -0
  384. package/dist/utils/color/CssColor.js +114 -0
  385. package/dist/utils/color/Palette.d.ts +21 -0
  386. package/dist/utils/color/Palette.js +52 -0
  387. package/dist/utils/color/index.d.ts +11 -3
  388. package/dist/utils/color/index.js +14 -3
  389. package/dist/utils/grouping.js +1 -1
  390. package/docs/architecture.md +1 -1
  391. package/docs/chrome.md +2 -2
  392. package/docs/composer.md +2 -2
  393. package/docs/concepts.md +1 -1
  394. package/docs/development.md +1 -1
  395. package/docs/facets.md +50 -3
  396. package/docs/getting-started.md +2 -2
  397. package/docs/legend.md +13 -11
  398. package/docs/markers.md +57 -27
  399. package/docs/plots/correlation/heatmap.md +26 -0
  400. package/docs/plots/correlation/scatter.md +35 -0
  401. package/docs/plots/distribution/box.md +28 -0
  402. package/docs/plots/distribution/density.md +26 -0
  403. package/docs/plots/distribution/histogram.md +33 -0
  404. package/docs/plots/distribution/pyramid.md +31 -0
  405. package/docs/plots/distribution/violin.md +35 -0
  406. package/docs/plots/evolution/area.md +32 -0
  407. package/docs/plots/evolution/line.md +93 -0
  408. package/docs/plots/evolution/slope.md +39 -0
  409. package/docs/plots/evolution/sparkline.md +34 -0
  410. package/docs/plots/ranking/bar.md +59 -0
  411. package/docs/plots/ranking/bullet.md +37 -0
  412. package/docs/plots/ranking/cleveland.md +54 -0
  413. package/docs/plots/ranking/dumbbell.md +39 -0
  414. package/docs/plots/ranking/forest.md +40 -0
  415. package/docs/plots/ranking/lollipop.md +39 -0
  416. package/docs/plots.md +22 -280
  417. package/docs/scales.md +30 -24
  418. package/docs/styles-and-segments.md +25 -21
  419. package/docs/theming.md +23 -20
  420. package/docs/timeline.md +3 -3
  421. package/docs/tooltip-and-hover.md +10 -10
  422. package/docs/transforms-and-statistics.md +13 -12
  423. package/examples/BarValues.svelte +1 -1
  424. package/examples/Box.svelte +1 -1
  425. package/examples/Bullet.svelte +17 -0
  426. package/examples/Chrome.svelte +1 -1
  427. package/examples/ChromeOrder.svelte +1 -1
  428. package/examples/Cleveland.svelte +15 -0
  429. package/examples/Composer.svelte +2 -2
  430. package/examples/CustomTooltip.svelte +1 -1
  431. package/examples/Density.svelte +7 -0
  432. package/examples/Dumbbell.svelte +16 -0
  433. package/examples/Facets.svelte +1 -1
  434. package/examples/FacetsCarousel.svelte +1 -1
  435. package/examples/FacetsRowsCols.svelte +1 -1
  436. package/examples/FacetsScoped.svelte +26 -0
  437. package/examples/FirstPlot.svelte +1 -1
  438. package/examples/Forest.svelte +17 -0
  439. package/examples/Gaps.svelte +2 -2
  440. package/examples/GroupedBars.svelte +1 -1
  441. package/examples/Heatmap.svelte +3 -3
  442. package/examples/HeatmapSegments.svelte +8 -8
  443. package/examples/Histogram.svelte +1 -1
  444. package/examples/HorizontalBars.svelte +1 -1
  445. package/examples/LegendSections.svelte +1 -1
  446. package/examples/LegendToggle.svelte +1 -1
  447. package/examples/LineByRegion.svelte +1 -1
  448. package/examples/LineDates.svelte +1 -1
  449. package/examples/LineStep.svelte +16 -0
  450. package/examples/LineStepSegment.svelte +18 -0
  451. package/examples/Lollipop.svelte +17 -0
  452. package/examples/Markers.svelte +1 -1
  453. package/examples/MovingAverage.svelte +1 -1
  454. package/examples/Pyramid.svelte +9 -2
  455. package/examples/Regression.svelte +2 -2
  456. package/examples/ResponsiveLine.svelte +1 -1
  457. package/examples/Scales.svelte +1 -1
  458. package/examples/Scatter.svelte +2 -2
  459. package/examples/SegmentHighlight.svelte +1 -1
  460. package/examples/Segments.svelte +1 -1
  461. package/examples/SegmentsBySeries.svelte +1 -1
  462. package/examples/Slope.svelte +17 -0
  463. package/examples/Sparkline.svelte +14 -0
  464. package/examples/StackedArea.svelte +1 -1
  465. package/examples/StackedBars.svelte +1 -1
  466. package/examples/TimelinePlayer.svelte +1 -1
  467. package/examples/TimelineRule.svelte +1 -1
  468. package/examples/Tooltip.svelte +1 -1
  469. package/examples/ValueLabels.svelte +1 -1
  470. package/examples/Violin.svelte +14 -0
  471. package/examples/datasets/argentina-chile-trends.ts +34 -0
  472. package/examples/datasets/commodity-prices.ts +48 -0
  473. package/examples/datasets/countries-over-time.ts +368 -0
  474. package/examples/datasets/daily-temperature.ts +121 -0
  475. package/examples/datasets/earthquakes.ts +977 -0
  476. package/examples/datasets/flight-routes.ts +29 -0
  477. package/examples/datasets/height-density.ts +37 -0
  478. package/examples/datasets/heights.ts +370 -0
  479. package/examples/datasets/index.ts +24 -0
  480. package/examples/datasets/inflation-by-region.ts +44 -0
  481. package/examples/datasets/inflation-ranges.ts +34 -0
  482. package/examples/datasets/iris-flower.ts +207 -0
  483. package/examples/datasets/life-expectancy.ts +95 -0
  484. package/examples/datasets/napoleons-march.ts +182 -0
  485. package/examples/datasets/penguins.ts +54 -0
  486. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  487. package/examples/datasets/population-by-age.ts +890 -0
  488. package/examples/datasets/province-population.ts +521 -0
  489. package/examples/datasets/stock-prices.ts +63 -0
  490. package/examples/datasets/weather-stations-over-time.ts +31 -0
  491. package/examples/datasets/weather-stations.ts +22 -0
  492. package/examples/datasets/wind-vectors.ts +30 -0
  493. package/examples/datasets/world-temperature.ts +400 -0
  494. package/llms-full.txt +27 -14
  495. package/llms.txt +33 -4
  496. package/package.json +10 -1
  497. package/dist/plots/bar/defaults.d.ts +0 -9
  498. package/dist/plots/geo/features.svelte.d.ts +0 -5
  499. package/dist/plots/geo/features.svelte.js +0 -44
  500. package/dist/plots/geo/phases/tooltip.js +0 -5
  501. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  502. package/dist/plots/utils/geoAccessors.js +0 -220
  503. package/dist/plots/utils/geoSegments.d.ts +0 -29
  504. package/dist/plots/utils/geoSegments.js +0 -37
  505. package/dist/types/layout/styles.d.ts +0 -122
  506. package/dist/types/markers/axis/curveName.d.ts +0 -2
  507. package/dist/types/plots/line/props.d.ts +0 -10
  508. package/dist/utils/color/contrast.d.ts +0 -9
  509. package/dist/utils/color/contrast.js +0 -40
  510. package/dist/utils/color/cssColor.d.ts +0 -4
  511. package/dist/utils/color/cssColor.js +0 -77
  512. package/dist/utils/color/ramp.d.ts +0 -17
  513. package/dist/utils/color/ramp.js +0 -110
  514. package/dist/utils/opacity.d.ts +0 -9
  515. package/dist/utils/opacity.js +0 -38
  516. package/examples/data.ts +0 -324
  517. /package/dist/plots/{box → distribution/box}/markers.js +0 -0
  518. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  519. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  520. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  521. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  522. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  523. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  524. /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
  525. /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
  526. /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
  527. /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
  528. /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  529. /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
  530. /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
  531. /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
  532. /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
  533. /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
  534. /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
  535. /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
  536. /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
  537. /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
  538. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  539. /package/dist/{plots/utils → utils}/accessors.js +0 -0
@@ -6,6 +6,7 @@ import { Density2dStatistic } from './methods/Density2dStatistic';
6
6
  import { BoxStatistic } from './methods/BoxStatistic';
7
7
  import { RegressionStatistic } from './methods/RegressionStatistic';
8
8
  import { BollingerStatistic } from './methods/BollingerStatistic';
9
+ import { DeviationStatistic } from './methods/DeviationStatistic';
9
10
  /**
10
11
  * The statistics a plot or a marker asks for, as the markers they draw as.
11
12
  * Each statistic type is a class of its own under `methods/`; the same
@@ -13,10 +14,11 @@ import { BollingerStatistic } from './methods/BollingerStatistic';
13
14
  */
14
15
  export class Statistics {
15
16
  /**
16
- * Builds one {@link StatisticConfig} over a data source into the marker it
17
- * renders as - `regression`/`bollinger` construct their marker directly
18
- * (svelteplot resolves the curve/band itself, at render time); the others
19
- * compute their rows first.
17
+ * Builds one {@link StatisticConfig} over a data source into the markers it
18
+ * renders as. Every statistic's own `build` returns a list, since one can
19
+ * draw several markers (`deviation`'s band and rule); `regression`/`bollinger`
20
+ * construct their marker directly (svelteplot resolves the curve/band
21
+ * itself, at render time), the others compute their rows first.
20
22
  */
21
23
  static buildMarker(source, config) {
22
24
  switch (config.type) {
@@ -32,6 +34,8 @@ export class Statistics {
32
34
  return RegressionStatistic.build(source, config);
33
35
  case 'bollinger':
34
36
  return BollingerStatistic.build(source, config);
37
+ case 'deviation':
38
+ return DeviationStatistic.build(source, config);
35
39
  }
36
40
  }
37
41
  /** Narrows a `Series`'s own `Accessor<T,AxisValue>` to a source's field-key-or-function shape - safe in practice, since a real row's field key is always a string. */
@@ -52,7 +56,7 @@ export class Statistics {
52
56
  * accessor). Named `series`: one statistic per listed series.
53
57
  */
54
58
  static buildForPlot(args) {
55
- const { series, statistics, colorFor } = args;
59
+ const { series, statistics, valueAxis, colorFor } = args;
56
60
  if (!statistics?.length || !series.length)
57
61
  return [];
58
62
  return statistics.flatMap((stat) => {
@@ -62,9 +66,10 @@ export class Statistics {
62
66
  data: pooled,
63
67
  x: Statistics.#accessor(series[0].x),
64
68
  y: Statistics.#accessor(series[0].y),
69
+ axis: valueAxis,
65
70
  color: colorFor?.(series[0].name)
66
71
  };
67
- return [Statistics.buildMarker(source, stat)];
72
+ return Statistics.buildMarker(source, stat);
68
73
  }
69
74
  const names = stat.series ?? series.map((s) => s.name);
70
75
  return names.flatMap((name) => {
@@ -75,9 +80,10 @@ export class Statistics {
75
80
  data: match.data,
76
81
  x: Statistics.#accessor(match.x),
77
82
  y: Statistics.#accessor(match.y),
83
+ axis: valueAxis,
78
84
  color: colorFor?.(name)
79
85
  };
80
- return [Statistics.buildMarker(source, stat)];
86
+ return Statistics.buildMarker(source, stat);
81
87
  });
82
88
  });
83
89
  }
@@ -128,7 +134,7 @@ export class Statistics {
128
134
  * (neither field) always falls through the guard below untouched, and a
129
135
  * future "common" marker kind is eligible with no extra bookkeeping here.
130
136
  */
131
- static expandMarkers(markers, fallbackData) {
137
+ static expandMarkers(markers, fallbackData, valueAxis) {
132
138
  return markers.flatMap((marker) => {
133
139
  const statable = marker;
134
140
  const { x, y } = statable;
@@ -137,7 +143,11 @@ export class Statistics {
137
143
  if (!statable.statistics?.length || !isAccessor(x) || !isAccessor(y))
138
144
  return [marker];
139
145
  const data = statable.data ?? fallbackData;
140
- const accessors = { x: x, y: y };
146
+ const accessors = {
147
+ x: x,
148
+ y: y,
149
+ axis: valueAxis
150
+ };
141
151
  // A marker's `color` channel groups it: each statistic is then derived per
142
152
  // group, in that group's own color - same as a plot's statistics per series.
143
153
  const colorFn = statable.color
@@ -146,7 +156,7 @@ export class Statistics {
146
156
  const flatColor = Statistics.#markerBaseColor(statable);
147
157
  const derived = statable.statistics.flatMap((stat) => {
148
158
  if (!colorFn || !statable.color || stat.pooled) {
149
- return [Statistics.buildMarker({ data, ...accessors, color: flatColor }, stat)];
159
+ return Statistics.buildMarker({ data, ...accessors, color: flatColor }, stat);
150
160
  }
151
161
  return Statistics.#groupRowsByColor(data, statable.color).flatMap((rows) => Statistics.buildMarker({ data: rows, ...accessors, color: colorFn(rows[0]) }, stat));
152
162
  });
@@ -24,9 +24,17 @@ export class StatisticsPhase {
24
24
  run = (state) => {
25
25
  if (!state.panels)
26
26
  return { ...state, markers: this.#resolve(state) };
27
- const markers = state.panels.flatMap((panel) => this.#resolve(FacetPanels.narrowToPanel(state, panel.key)).map((marker) => ({ ...marker, [PANEL_KEY]: panel.key })));
27
+ const markers = state.panels.flatMap((panel) => this.#resolve(this.#ownTo(FacetPanels.narrowToPanel(state, panel.key), panel.key)).map((marker) => ({ ...marker, [PANEL_KEY]: panel.key })));
28
28
  return { ...state, markers };
29
29
  };
30
+ /** `state` with the author's markers that the "facet" phase tagged for another panel left out. */
31
+ #ownTo(state, panel) {
32
+ const authorMarkers = state.authorMarkers?.filter((marker) => {
33
+ const tagged = marker[PANEL_KEY];
34
+ return tagged === undefined || tagged === panel;
35
+ });
36
+ return { ...state, authorMarkers };
37
+ }
30
38
  #resolve(state) {
31
39
  const options = this.#options;
32
40
  const { resolvedSeries = [], flat = [], colorForSeries, statistics, authorMarkers = [] } = state;
@@ -53,7 +61,12 @@ export class StatisticsPhase {
53
61
  ? (state.processedGroups ?? []).map((group) => group.series)
54
62
  : resolvedSeries;
55
63
  return [
56
- ...Statistics.buildForPlot({ series: measured, statistics, colorFor: colorForSeries }),
64
+ ...Statistics.buildForPlot({
65
+ series: measured,
66
+ statistics,
67
+ valueAxis,
68
+ colorFor: colorForSeries
69
+ }),
57
70
  ...Statistics.expandMarkers(AuthorMarkers.prepare(positioned, {
58
71
  grouping: inheritGrouping ? state.grouping : undefined,
59
72
  color: inheritGrouping ? state.color : undefined,
@@ -61,7 +74,7 @@ export class StatisticsPhase {
61
74
  flat,
62
75
  resolvedSeries,
63
76
  scopedGroups: state.scopedGroups
64
- }), flat)
77
+ }), flat, valueAxis)
65
78
  ];
66
79
  }
67
80
  }
@@ -5,5 +5,5 @@ import { type StatisticSource } from '../../../types/phases/statistics/source';
5
5
  export declare class BollingerStatistic {
6
6
  static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: Extract<StatisticConfig, {
7
7
  type: 'bollinger';
8
- }>): BollingerMarkerConfig;
8
+ }>): BollingerMarkerConfig[];
9
9
  }
@@ -2,17 +2,19 @@ import { STATISTIC_FALLBACK_COLOR } from '../../../types/phases/statistics/sourc
2
2
  /** Bollinger bands over the source, drawn as a `bollinger` marker (svelteplot computes them at render time). */
3
3
  export class BollingerStatistic {
4
4
  static build(source, config) {
5
- return {
6
- type: 'bollinger',
7
- data: source.data,
8
- x: source.x,
9
- y: source.y,
10
- n: config.n,
11
- k: config.k,
12
- styles: {
13
- ...config.styles,
14
- stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
5
+ return [
6
+ {
7
+ type: 'bollinger',
8
+ data: source.data,
9
+ x: source.x,
10
+ y: source.y,
11
+ n: config.n,
12
+ k: config.k,
13
+ styles: {
14
+ ...config.styles,
15
+ stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
16
+ }
15
17
  }
16
- };
18
+ ];
17
19
  }
18
20
  }
@@ -5,5 +5,5 @@ import { type StatisticSource } from '../../../types/phases/statistics/source';
5
5
  export declare class BoxStatistic {
6
6
  static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: Extract<StatisticConfig, {
7
7
  type: 'box';
8
- }>): BoxMarkerConfig;
8
+ }>): BoxMarkerConfig[];
9
9
  }
@@ -2,17 +2,19 @@ import { STATISTIC_FALLBACK_COLOR } from '../../../types/phases/statistics/sourc
2
2
  /** Box-and-whisker summary of the source, drawn as a `box` marker. */
3
3
  export class BoxStatistic {
4
4
  static build(source, config) {
5
- return {
6
- type: 'box',
7
- data: source.data,
8
- x: source.x,
9
- y: source.y,
10
- sort: config.sort,
11
- bar: { fill: source.color ?? STATISTIC_FALLBACK_COLOR, ...config.bar },
12
- rule: config.rule,
13
- dot: config.dot,
14
- tickMedian: config.tickMedian,
15
- tickMinMax: config.tickMinMax
16
- };
5
+ return [
6
+ {
7
+ type: 'box',
8
+ data: source.data,
9
+ x: source.x,
10
+ y: source.y,
11
+ sort: config.sort,
12
+ bar: { fill: source.color ?? STATISTIC_FALLBACK_COLOR, ...config.bar },
13
+ rule: config.rule,
14
+ dot: config.dot,
15
+ tickMedian: config.tickMedian,
16
+ tickMinMax: config.tickMinMax
17
+ }
18
+ ];
17
19
  }
18
20
  }
@@ -5,5 +5,5 @@ import { type StatisticSource } from '../../../types/phases/statistics/source';
5
5
  export declare class Density2dStatistic {
6
6
  static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: Extract<StatisticConfig, {
7
7
  type: 'density2d';
8
- }>): DensityMarkerConfig;
8
+ }>): DensityMarkerConfig[];
9
9
  }
@@ -2,17 +2,19 @@ import { STATISTIC_FALLBACK_COLOR } from '../../../types/phases/statistics/sourc
2
2
  /** 2D kernel density over the source's `x` and `y`, drawn as a `density` marker. */
3
3
  export class Density2dStatistic {
4
4
  static build(source, config) {
5
- return {
6
- type: 'density',
7
- data: source.data,
8
- x: source.x,
9
- y: source.y,
10
- bandwidth: config.bandwidth,
11
- thresholds: config.thresholds,
12
- styles: {
13
- ...config.styles,
14
- stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
5
+ return [
6
+ {
7
+ type: 'density',
8
+ data: source.data,
9
+ x: source.x,
10
+ y: source.y,
11
+ bandwidth: config.bandwidth,
12
+ thresholds: config.thresholds,
13
+ styles: {
14
+ ...config.styles,
15
+ stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
16
+ }
15
17
  }
16
- };
18
+ ];
17
19
  }
18
20
  }
@@ -8,5 +8,5 @@ export declare class DensityStatistic {
8
8
  * `x` is the value and `y` the density, so it draws on the plot's axes as-is.
9
9
  * The output is one derived row per estimate point rather than one per input row.
10
10
  */
11
- static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: DensityStatisticOptions): AreaMarkerConfig;
11
+ static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: DensityStatisticOptions): AreaMarkerConfig[];
12
12
  }
@@ -15,15 +15,17 @@ export class DensityStatistic {
15
15
  kernel: config.kernel,
16
16
  bandwidth: config.bandwidth
17
17
  });
18
- return {
19
- type: 'area',
20
- data: result.data,
21
- x: result.x,
22
- y: result.y,
23
- styles: {
24
- ...config.styles,
25
- fill: config.styles?.fill ?? source.color ?? STATISTIC_FALLBACK_COLOR
18
+ return [
19
+ {
20
+ type: 'area',
21
+ data: result.data,
22
+ x: result.x,
23
+ y: result.y,
24
+ styles: {
25
+ ...config.styles,
26
+ fill: config.styles?.fill ?? source.color ?? STATISTIC_FALLBACK_COLOR
27
+ }
26
28
  }
27
- };
29
+ ];
28
30
  }
29
31
  }
@@ -0,0 +1,8 @@
1
+ import type { DeviationStatisticOptions } from '../../../types/layout/statistics';
2
+ import type { AxisBasedMarkersConfig } from '../../../types/markers/common';
3
+ import { type StatisticSource } from '../../../types/phases/statistics/source';
4
+ /** An estimator of the source's values along the plot's value axis and a band around it, drawn as a `rect` and a `rule` marker, each optionally labelled by a `text` marker. */
5
+ export declare class DeviationStatistic {
6
+ #private;
7
+ static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: DeviationStatisticOptions): AxisBasedMarkersConfig[];
8
+ }
@@ -0,0 +1,111 @@
1
+ import { deviation, extent, mean, median } from 'd3-array';
2
+ import { resolveAccessor } from '../../../utils/accessors';
3
+ import { STATISTIC_FALLBACK_COLOR } from '../../../types/phases/statistics/source';
4
+ /** Scales a median absolute deviation to the standard deviation of a normal distribution. */
5
+ const MAD_SCALE = 1.4826;
6
+ const DEFAULT_BAND_OPACITY = 0.15;
7
+ const LABEL_FONT_SIZE = 10;
8
+ /** Pixels between a label and the line it names, and between it and the plot's edge. */
9
+ const LABEL_GAP = 4;
10
+ /** An estimator of the source's values along the plot's value axis and a band around it, drawn as a `rect` and a `rule` marker, each optionally labelled by a `text` marker. */
11
+ export class DeviationStatistic {
12
+ static build(source, config) {
13
+ const axis = source.axis ?? 'y';
14
+ const read = resolveAccessor(source[axis]);
15
+ const values = source.data
16
+ .map((d) => {
17
+ const v = read(d);
18
+ return v instanceof Date ? v.getTime() : typeof v === 'number' ? v : NaN;
19
+ })
20
+ .filter(Number.isFinite);
21
+ if (!values.length)
22
+ return [];
23
+ const center = DeviationStatistic.#estimate(values, config.estimator ?? 'mean');
24
+ const spread = DeviationStatistic.#spread(values, config.spread ?? 'stdev');
25
+ const half = (config.k ?? 1) * spread;
26
+ const color = source.color ?? STATISTIC_FALLBACK_COLOR;
27
+ const markers = [];
28
+ if (config.band !== false) {
29
+ const { label, ...style } = config.band ?? {};
30
+ const [lo, hi] = [center - half, center + half];
31
+ markers.push({
32
+ type: 'rect',
33
+ data: [{ lo, hi }],
34
+ ...(axis === 'x' ? { x1: 'lo', x2: 'hi' } : { y1: 'lo', y2: 'hi' }),
35
+ styles: { fillOpacity: DEFAULT_BAND_OPACITY, ...style, fill: style.fill ?? color }
36
+ });
37
+ if (label) {
38
+ const own = label === true ? {} : label;
39
+ const lower = own.edge === 'lower';
40
+ const outside = own.position === 'outside';
41
+ markers.push(DeviationStatistic.#label(axis, lower ? lo : hi, color, lower === outside, {
42
+ text: own.text ?? (config.spread === 'mad' ? 'MAD' : 'STDEV'),
43
+ styles: own.styles
44
+ }));
45
+ }
46
+ }
47
+ if (config.rule !== false) {
48
+ const { label, ...style } = config.rule ?? {};
49
+ markers.push({
50
+ type: 'rule',
51
+ axis,
52
+ value: center,
53
+ styles: { ...style, stroke: style.stroke ?? color }
54
+ });
55
+ if (label) {
56
+ const own = label === true ? {} : label;
57
+ markers.push(DeviationStatistic.#label(axis, center, color, axis === 'x', {
58
+ text: own.text ?? (config.estimator ?? 'mean').toUpperCase(),
59
+ styles: own.styles
60
+ }));
61
+ }
62
+ }
63
+ return markers;
64
+ }
65
+ /**
66
+ * A label beside the line at `position`, against the plot's start edge: a
67
+ * vertical line's reads down from the top, a horizontal line's ends at the
68
+ * right. `towardLower` puts its body on the side of lower values (left of a
69
+ * vertical line, below a horizontal one).
70
+ */
71
+ static #label(axis, position, color, towardLower, label) {
72
+ const vertical = axis === 'x';
73
+ const fontSize = label.styles?.fontSize ?? LABEL_FONT_SIZE;
74
+ const sign = towardLower ? -1 : 1;
75
+ // A vertical line's text is centred on its own point, so its half-height plus the gap clears the line.
76
+ const gap = LABEL_GAP + (vertical ? fontSize / 2 : 0);
77
+ const [dx, dy] = vertical ? [sign * gap, LABEL_GAP] : [-LABEL_GAP, -sign * gap];
78
+ return {
79
+ type: 'text',
80
+ text: label.text,
81
+ ...(vertical ? { x: position } : { y: position }),
82
+ frameAnchor: vertical ? 'top' : 'right',
83
+ styles: {
84
+ fill: color,
85
+ fontSize,
86
+ ...(vertical
87
+ ? { rotate: 90, textAnchor: 'start', lineAnchor: 'middle' }
88
+ : { textAnchor: 'end', lineAnchor: towardLower ? 'top' : 'bottom' }),
89
+ ...label.styles,
90
+ dx: dx + (label.styles?.dx ?? 0),
91
+ dy: dy + (label.styles?.dy ?? 0)
92
+ }
93
+ };
94
+ }
95
+ static #estimate(values, estimator) {
96
+ if (estimator === 'median')
97
+ return median(values);
98
+ if (estimator === 'midrange') {
99
+ const [lo, hi] = extent(values);
100
+ return (lo + hi) / 2;
101
+ }
102
+ return mean(values);
103
+ }
104
+ static #spread(values, spread) {
105
+ if (spread === 'mad') {
106
+ const mid = median(values);
107
+ return MAD_SCALE * median(values.map((v) => Math.abs(v - mid)));
108
+ }
109
+ return deviation(values) ?? 0;
110
+ }
111
+ }
@@ -8,5 +8,5 @@ export declare class MovingAverageStatistic {
8
8
  * no dedicated mark for this (unlike `regression`/`bollinger`). `windowY`
9
9
  * keeps one output row per input row, so `x` passes straight through.
10
10
  */
11
- static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: MovingAverageStatisticOptions): LineMarkerConfig;
11
+ static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: MovingAverageStatisticOptions): LineMarkerConfig[];
12
12
  }
@@ -16,15 +16,17 @@ export class MovingAverageStatistic {
16
16
  k: config.k,
17
17
  reduce: config.reduce ?? 'mean'
18
18
  });
19
- return {
20
- type: 'line',
21
- data: result.data,
22
- x: result.x,
23
- y: result.y,
24
- styles: {
25
- ...config.styles,
26
- stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
19
+ return [
20
+ {
21
+ type: 'line',
22
+ data: result.data,
23
+ x: result.x,
24
+ y: result.y,
25
+ styles: {
26
+ ...config.styles,
27
+ stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
28
+ }
27
29
  }
28
- };
30
+ ];
29
31
  }
30
32
  }
@@ -5,5 +5,5 @@ import { type StatisticSource } from '../../../types/phases/statistics/source';
5
5
  export declare class RegressionStatistic {
6
6
  static build<T extends Record<string, unknown>>(source: StatisticSource<T>, config: Extract<StatisticConfig, {
7
7
  type: 'regression';
8
- }>): RegressionMarkerConfig;
8
+ }>): RegressionMarkerConfig[];
9
9
  }
@@ -2,20 +2,22 @@ import { STATISTIC_FALLBACK_COLOR } from '../../../types/phases/statistics/sourc
2
2
  /** A regression curve over the source, drawn as a `regression` marker (svelteplot fits it at render time). */
3
3
  export class RegressionStatistic {
4
4
  static build(source, config) {
5
- return {
6
- type: 'regression',
7
- data: source.data,
8
- x: source.x,
9
- y: source.y,
10
- regressionType: config.regressionType,
11
- order: config.order,
12
- base: config.base,
13
- span: config.span,
14
- confidence: config.confidence,
15
- styles: {
16
- ...config.styles,
17
- stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
5
+ return [
6
+ {
7
+ type: 'regression',
8
+ data: source.data,
9
+ x: source.x,
10
+ y: source.y,
11
+ regressionType: config.regressionType,
12
+ order: config.order,
13
+ base: config.base,
14
+ span: config.span,
15
+ confidence: config.confidence,
16
+ styles: {
17
+ ...config.styles,
18
+ stroke: config.styles?.stroke ?? source.color ?? STATISTIC_FALLBACK_COLOR
19
+ }
18
20
  }
19
- };
21
+ ];
20
22
  }
21
23
  }
@@ -1,4 +1,4 @@
1
- import { resolveAccessor } from '../../plots/utils/accessors';
1
+ import { resolveAccessor } from '../../utils/accessors';
2
2
  import { isGapValue } from '../../plots/utils/gaps';
3
3
  const POSITION_CHANNELS = {
4
4
  x: ['x', 'x1', 'x2'],
@@ -1,7 +1,9 @@
1
1
  import { Transforms } from './Transforms';
2
+ import { ValueSelection } from './ValueSelection';
3
+ import { ProcessedPositions } from './ProcessedPositions';
2
4
  import { seriesIdOf } from '../../utils/grouping';
3
5
  import { PANEL_KEY } from '../facet/FacetPanels';
4
- import { resolveAccessor } from '../../plots/utils/accessors';
6
+ import { resolveAccessor } from '../../utils/accessors';
5
7
  import { buildGroupedSeries } from '../../plots/utils/segments';
6
8
  import { PlotAxes } from '../data/PlotAxes';
7
9
  /** The field each processed row carries its series name under, for its color, legend and labels. */
@@ -94,12 +96,56 @@ export class TransformsPhase {
94
96
  };
95
97
  return this.#withGroups({ ...state, processedData });
96
98
  };
97
- /** `state` with its processed rows split into the visual groups the kind's marks draw (`processedGroups`). */
99
+ /**
100
+ * `state` with its processed rows split into the visual groups the kind's marks
101
+ * draw (`processedGroups`), and the rows its value labels are written for
102
+ * (`labelled`).
103
+ */
98
104
  #withGroups(state) {
99
105
  const processedGroups = this.#options.groups === 'runs'
100
106
  ? TransformsPhase.#buildRuns(state)
101
107
  : TransformsPhase.#buildGroups(state, this.#connect);
102
- return { ...state, processedGroups };
108
+ return { ...state, processedGroups, ...this.#labelled(state) };
109
+ }
110
+ /**
111
+ * The rows `styles.values` writes labels for, picked per facet panel - a
112
+ * panel's own last row, not the last of every panel - by the author's
113
+ * `select` and `series`, over the plot's own default. Left out while the
114
+ * labels are off, or when the plot picks no rows.
115
+ */
116
+ #labelled(state) {
117
+ const options = this.#options.labels;
118
+ const values = state.values;
119
+ if (!options || !(values?.show ?? options.show))
120
+ return {};
121
+ const processed = state.processedData;
122
+ const valueAxis = PlotAxes.valueOf(state);
123
+ const select = values?.select ?? options.select;
124
+ const selections = ValueSelection.transforms(select, values?.series, valueAxis);
125
+ const position = ProcessedPositions.of(processed, valueAxis);
126
+ const skip = options.skip?.(state);
127
+ const channels = {
128
+ x: position.x,
129
+ y: position.y,
130
+ group: options.group === 'category'
131
+ ? position[PlotAxes.categoryOf(state)]
132
+ : SERIES_ID_KEY
133
+ };
134
+ const panels = new Map();
135
+ for (const row of processed.data) {
136
+ if (skip?.(row))
137
+ continue;
138
+ const bucket = panels.get(row[PANEL_KEY]);
139
+ if (bucket)
140
+ bucket.push(row);
141
+ else
142
+ panels.set(row[PANEL_KEY], [row]);
143
+ }
144
+ const labelled = new Set([...panels.values()].flatMap((rows) => ValueSelection.pick(rows, selections, channels)));
145
+ return {
146
+ labelled: processed.data.filter((row) => labelled.has(row)),
147
+ labelSelects: ValueSelection.selectors(select)
148
+ };
103
149
  }
104
150
  /** What a gap-filled row carries: its interpolated value and the kind of zone that filled it. */
105
151
  static #fillTags(fill) {
@@ -0,0 +1,30 @@
1
+ import type { ValueSelect } from '../../types/layout/styles';
2
+ import type { MarkerTransform } from '../../types/transforms';
3
+ import type { ProcessedRow } from '../../types/phases';
4
+ /**
5
+ * Which rows of a plot a value label is written for: `styles.values.select`
6
+ * (or the plot's own default) and `series`, run as `filter` and `select`
7
+ * transforms over the processed rows. The labelled rows are the union of what
8
+ * each selector picks, returned as the rows themselves, in their own order.
9
+ */
10
+ export declare class ValueSelection {
11
+ /** `select` as a list: none is every row. */
12
+ static selectors(select: ValueSelect | ValueSelect[] | undefined): ValueSelect[];
13
+ /**
14
+ * The transforms that pick the rows, one list per selector: the series filter,
15
+ * then the `select` of that selector, with `'min'` and `'max'` read on
16
+ * `valueAxis`. Without selectors, one list that only filters the series.
17
+ */
18
+ static transforms(select: ValueSelect | ValueSelect[] | undefined, series: string | string[] | undefined, valueAxis: 'x' | 'y'): MarkerTransform[][];
19
+ /**
20
+ * The rows of `rows` that any of `selections` picks, grouped by `group`
21
+ * (a field key or accessor) and compared on `x` and `y` - the value axis'
22
+ * channel is what `'min'` and `'max'` read. A transform returns copies of its
23
+ * rows, so each is traced back to the row it came from.
24
+ */
25
+ static pick(rows: ProcessedRow[], selections: MarkerTransform[][], channels: {
26
+ x: unknown;
27
+ y: unknown;
28
+ group: unknown;
29
+ }): ProcessedRow[];
30
+ }