@fundar/data-chart-telling 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +58 -19
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +172 -95
  5. package/dist/configuration/themes/index.d.ts +5 -1304
  6. package/dist/index.d.ts +24 -14
  7. package/dist/index.js +20 -10
  8. package/dist/layout/base/BasePlotLayout.svelte +129 -51
  9. package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
  10. package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
  11. package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
  12. package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
  13. package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
  14. package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
  15. package/dist/layout/coordinates/ZoomedProjection.js +24 -0
  16. package/dist/layout/coordinates/camera.svelte.js +11 -8
  17. package/dist/layout/coordinates/projections/argentina.js +1 -1
  18. package/dist/layout/coordinates/projections/fit.d.ts +1 -1
  19. package/dist/layout/coordinates/projections/fit.js +1 -1
  20. package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
  21. package/dist/layout/coordinates/zoom.svelte.js +4 -5
  22. package/dist/layout/facet/FacetLayout.svelte +1 -1
  23. package/dist/layout/facet/config.js +1 -1
  24. package/dist/layout/figure/Figure.svelte +2 -0
  25. package/dist/layout/geometry/GeometryLayout.svelte +14 -9
  26. package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
  27. package/dist/layout/geometry/MarkerOffset.svelte +28 -0
  28. package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
  29. package/dist/layout/grid/GridCell.svelte +6 -8
  30. package/dist/layout/hover/HoverSettings.d.ts +20 -6
  31. package/dist/layout/hover/HoverSettings.js +29 -4
  32. package/dist/layout/legend/ContinuousSection.svelte +44 -9
  33. package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
  34. package/dist/layout/legend/DiscreteSection.svelte +2 -2
  35. package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
  36. package/dist/layout/legend/LegendChannels.js +36 -12
  37. package/dist/layout/legend/LegendLayout.svelte +9 -1
  38. package/dist/layout/legend/LegendState.svelte.d.ts +9 -0
  39. package/dist/layout/legend/LegendState.svelte.js +24 -3
  40. package/dist/layout/legend/SizeSection.svelte +1 -1
  41. package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
  42. package/dist/layout/margins/PlotMargins.svelte.js +4 -8
  43. package/dist/layout/plot/Plot.svelte +6 -3
  44. package/dist/layout/plot/PublicPlotContext.d.ts +5 -4
  45. package/dist/layout/plot/PublicPlotContext.js +7 -3
  46. package/dist/layout/plot/Slice.d.ts +5 -1
  47. package/dist/layout/plot/Slice.js +18 -6
  48. package/dist/layout/scales/EdgeTicks.d.ts +39 -0
  49. package/dist/layout/scales/EdgeTicks.js +82 -0
  50. package/dist/layout/scales/NiceTicks.d.ts +43 -0
  51. package/dist/layout/scales/NiceTicks.js +76 -0
  52. package/dist/layout/scales/ScalesLayout.svelte +133 -34
  53. package/dist/layout/scales/ScalesLayout.svelte.d.ts +10 -0
  54. package/dist/layout/scales/SveltePlotScale.d.ts +15 -0
  55. package/dist/layout/scales/SveltePlotScale.js +86 -0
  56. package/dist/layout/scales/TickLabels.d.ts +32 -0
  57. package/dist/layout/scales/TickLabels.js +55 -0
  58. package/dist/layout/styles/StylesLayout.svelte +2 -2
  59. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  60. package/dist/layout/styles/ValueLabels.js +83 -23
  61. package/dist/layout/timeline/Timeline.svelte +5 -2
  62. package/dist/layout/timeline/Timeline.svelte.d.ts +2 -0
  63. package/dist/layout/timeline/TimelineLayout.svelte +39 -13
  64. package/dist/layout/timeline/TimelineLayout.svelte.d.ts +7 -5
  65. package/dist/layout/timeline/TimelineRule.svelte +1 -0
  66. package/dist/layout/timeline/TimelineState.svelte.d.ts +13 -5
  67. package/dist/layout/timeline/TimelineState.svelte.js +42 -8
  68. package/dist/layout/timeline/TimelineTime.d.ts +18 -0
  69. package/dist/layout/timeline/TimelineTime.js +117 -0
  70. package/dist/layout/tooltip/Tooltip.svelte +10 -7
  71. package/dist/layout/tooltip/Tooltip.svelte.d.ts +6 -4
  72. package/dist/layout/tooltip/TooltipState.svelte.d.ts +8 -2
  73. package/dist/layout/tooltip/TooltipState.svelte.js +23 -4
  74. package/dist/markers/MarkerKinds.d.ts +5 -0
  75. package/dist/markers/MarkerKinds.js +1 -0
  76. package/dist/markers/area/AreaMarker.svelte +15 -63
  77. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  78. package/dist/markers/bar/BarMarker.svelte +8 -4
  79. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  80. package/dist/markers/box/BoxMarker.svelte +40 -9
  81. package/dist/markers/delta/Delta.js +1 -1
  82. package/dist/markers/delta/DeltaMarker.svelte +9 -7
  83. package/dist/markers/dot/DotMarker.svelte +24 -27
  84. package/dist/markers/image/ImageMarker.svelte +17 -12
  85. package/dist/markers/inset/InsetMarker.svelte +2 -2
  86. package/dist/markers/line/LineMarker.svelte +1 -0
  87. package/dist/markers/link/LinkMarker.svelte +174 -29
  88. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  89. package/dist/markers/rule/RuleMarker.svelte +9 -3
  90. package/dist/markers/text/Declutter.d.ts +4 -0
  91. package/dist/markers/text/Declutter.js +26 -11
  92. package/dist/markers/text/TextMarker.svelte +91 -48
  93. package/dist/markers/tick/TickMarker.svelte +27 -25
  94. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  95. package/dist/markers/utils/MarkerChannels.js +42 -7
  96. package/dist/markers/utils/RowOffset.d.ts +23 -0
  97. package/dist/markers/utils/RowOffset.js +23 -0
  98. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  99. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  100. package/dist/markers/utils/RowStroke.d.ts +31 -0
  101. package/dist/markers/utils/RowStroke.js +28 -0
  102. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  103. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  104. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  105. package/dist/markers/violin/ViolinProfiles.js +55 -0
  106. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  107. package/dist/phases/Pipeline.d.ts +5 -0
  108. package/dist/phases/Pipeline.js +8 -2
  109. package/dist/phases/data/DataPhase.d.ts +5 -11
  110. package/dist/phases/data/DataPhase.js +14 -11
  111. package/dist/phases/data/PlotAxes.d.ts +10 -0
  112. package/dist/phases/data/PlotAxes.js +14 -1
  113. package/dist/phases/facet/FacetPanels.d.ts +55 -0
  114. package/dist/phases/facet/FacetPanels.js +96 -0
  115. package/dist/phases/facet/FacetPhase.d.ts +1 -42
  116. package/dist/phases/facet/FacetPhase.js +1 -87
  117. package/dist/phases/hover/HoverPhase.d.ts +6 -43
  118. package/dist/phases/hover/HoverPhase.js +19 -54
  119. package/dist/phases/mapping/MappingPhase.d.ts +1 -1
  120. package/dist/phases/mapping/MappingPhase.js +3 -5
  121. package/dist/phases/markers/MarkersPhase.js +2 -1
  122. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  123. package/dist/phases/scales/CategoryOrder.js +73 -0
  124. package/dist/phases/scales/ScalesPhase.d.ts +1 -3
  125. package/dist/phases/scales/ScalesPhase.js +37 -27
  126. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +6 -2
  127. package/dist/phases/sharedScales/SharedScalesPhase.js +14 -8
  128. package/dist/phases/statistics/Statistics.d.ts +10 -6
  129. package/dist/phases/statistics/Statistics.js +20 -10
  130. package/dist/phases/statistics/StatisticsPhase.js +10 -6
  131. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  132. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  133. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  134. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  135. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  136. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  137. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  138. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  139. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  140. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  141. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  142. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  143. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  144. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  145. package/dist/phases/tooltip/TooltipPhase.d.ts +4 -2
  146. package/dist/phases/tooltip/TooltipPhase.js +10 -3
  147. package/dist/phases/transforms/ProcessedPositions.d.ts +30 -0
  148. package/dist/phases/transforms/ProcessedPositions.js +74 -0
  149. package/dist/phases/transforms/TransformsPhase.d.ts +5 -42
  150. package/dist/phases/transforms/TransformsPhase.js +67 -58
  151. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  152. package/dist/phases/transforms/ValueSelection.js +53 -0
  153. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  154. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  155. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  156. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  157. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  158. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +4 -3
  159. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  160. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  161. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  162. package/dist/plots/{scatter → correlation/scatter}/defaults.js +6 -5
  163. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  164. package/dist/plots/{scatter → correlation/scatter}/markers.js +5 -4
  165. package/dist/plots/distribution/box/BoxSummaries.d.ts +19 -0
  166. package/dist/plots/distribution/box/BoxSummaries.js +101 -0
  167. package/dist/plots/distribution/box/Plot.svelte +42 -0
  168. package/dist/plots/distribution/box/Plot.svelte.d.ts +26 -0
  169. package/dist/plots/distribution/box/defaults.d.ts +12 -0
  170. package/dist/plots/distribution/box/defaults.js +34 -0
  171. package/dist/plots/distribution/box/markers.d.ts +12 -0
  172. package/dist/plots/distribution/box/markers.js +34 -0
  173. package/dist/plots/distribution/density/Plot.svelte +45 -0
  174. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  175. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  176. package/dist/plots/distribution/density/defaults.js +29 -0
  177. package/dist/plots/distribution/density/markers.d.ts +9 -0
  178. package/dist/plots/distribution/density/markers.js +42 -0
  179. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  180. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  181. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  182. package/dist/plots/{histogram → distribution/histogram}/defaults.js +4 -4
  183. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  184. package/dist/plots/{histogram → distribution/histogram}/markers.js +7 -7
  185. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  186. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  187. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  188. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +7 -6
  189. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  190. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +8 -11
  191. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  192. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  193. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  194. package/dist/plots/distribution/violin/defaults.js +58 -0
  195. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  196. package/dist/plots/distribution/violin/markers.js +71 -0
  197. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  198. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  199. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  200. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  201. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  202. package/dist/plots/{area → evolution/area}/markers.js +2 -3
  203. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  204. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  205. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  206. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  207. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  208. package/dist/plots/{line → evolution/line}/markers.js +7 -6
  209. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  210. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  211. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  212. package/dist/plots/evolution/slope/defaults.js +31 -0
  213. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  214. package/dist/plots/evolution/slope/markers.js +79 -0
  215. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  216. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  217. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  218. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  219. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  220. package/dist/plots/evolution/sparkline/markers.js +56 -0
  221. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  222. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  223. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  224. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  225. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  226. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  227. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  228. package/dist/plots/map/geo/GeoSegments.js +23 -0
  229. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  230. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  231. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  232. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  233. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  234. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  235. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  236. package/dist/plots/{geo → map/geo}/phases/hover.js +5 -5
  237. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  238. package/dist/plots/{geo → map/geo}/phases/markers.js +8 -13
  239. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  240. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  241. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  242. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  243. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  244. package/dist/plots/{geo → map/geo}/slices.js +7 -4
  245. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  246. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  247. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  248. package/dist/plots/{bar → ranking/bar}/defaults.js +17 -15
  249. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  250. package/dist/plots/{bar → ranking/bar}/markers.js +11 -19
  251. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  252. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  253. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  254. package/dist/plots/ranking/bullet/defaults.js +24 -0
  255. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  256. package/dist/plots/ranking/bullet/markers.js +90 -0
  257. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  258. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  259. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  260. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  261. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  262. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  263. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  264. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  265. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  266. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  267. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  268. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  269. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  270. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  271. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  272. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  273. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  274. package/dist/plots/ranking/forest/defaults.js +20 -0
  275. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  276. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  277. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  278. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  279. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  280. package/dist/plots/utils/RowNumbers.js +24 -0
  281. package/dist/plots/utils/gaps.js +1 -1
  282. package/dist/plots/utils/segments.js +1 -1
  283. package/dist/types/configuration/styling.d.ts +287 -132
  284. package/dist/types/layout/composer.d.ts +5 -2
  285. package/dist/types/layout/coordinates.d.ts +5 -4
  286. package/dist/types/layout/legend.d.ts +21 -5
  287. package/dist/types/layout/plot.d.ts +44 -1
  288. package/dist/types/layout/scales.d.ts +51 -3
  289. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  290. package/dist/types/layout/statistics/index.d.ts +7 -2
  291. package/dist/types/layout/styles/base.d.ts +18 -0
  292. package/dist/types/layout/styles/bullet.d.ts +25 -0
  293. package/dist/types/layout/styles/connector.d.ts +98 -0
  294. package/dist/types/layout/styles/curve.d.ts +11 -0
  295. package/dist/types/layout/styles/frame.d.ts +17 -0
  296. package/dist/types/layout/styles/gaps.d.ts +12 -0
  297. package/dist/types/layout/styles/geo.d.ts +55 -0
  298. package/dist/types/layout/styles/index.d.ts +8 -0
  299. package/dist/types/layout/styles/index.js +8 -0
  300. package/dist/types/layout/styles/values.d.ts +47 -0
  301. package/dist/types/layout/timeline.d.ts +19 -7
  302. package/dist/types/layout/tooltip.d.ts +6 -2
  303. package/dist/types/markers/axis/area.d.ts +2 -2
  304. package/dist/types/markers/axis/arrow.d.ts +3 -0
  305. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  306. package/dist/types/markers/axis/bar.d.ts +1 -1
  307. package/dist/types/markers/axis/box.d.ts +5 -0
  308. package/dist/types/markers/axis/difference.d.ts +2 -2
  309. package/dist/types/markers/axis/image.d.ts +3 -2
  310. package/dist/types/markers/axis/line.d.ts +2 -0
  311. package/dist/types/markers/axis/rule.d.ts +9 -0
  312. package/dist/types/markers/axis/trail.d.ts +2 -3
  313. package/dist/types/markers/axis/violin.d.ts +25 -0
  314. package/dist/types/markers/basic/dot.d.ts +3 -2
  315. package/dist/types/markers/basic/text.d.ts +13 -3
  316. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  317. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  318. package/dist/types/markers/common.d.ts +1 -1
  319. package/dist/types/markers/common.js +1 -0
  320. package/dist/types/markers/geo/link.d.ts +5 -1
  321. package/dist/types/phases/hover/phase.d.ts +6 -0
  322. package/dist/types/phases/index.d.ts +1 -1
  323. package/dist/types/phases/scales/phase.d.ts +5 -1
  324. package/dist/types/phases/state.d.ts +20 -4
  325. package/dist/types/phases/statistics/phase.d.ts +3 -1
  326. package/dist/types/phases/statistics/source.d.ts +3 -1
  327. package/dist/types/phases/transforms/phase.d.ts +32 -0
  328. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  329. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  330. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  331. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  332. package/dist/types/plots/distribution/box/props.d.ts +10 -0
  333. package/dist/types/plots/distribution/box/state.d.ts +23 -0
  334. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  335. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  336. package/dist/types/plots/distribution/density/state.js +1 -0
  337. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  338. package/dist/types/plots/distribution/histogram/props.js +1 -0
  339. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  340. package/dist/types/plots/distribution/histogram/state.js +1 -0
  341. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  342. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  343. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  344. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  345. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  346. package/dist/types/plots/distribution/violin/props.js +1 -0
  347. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  348. package/dist/types/plots/distribution/violin/state.js +1 -0
  349. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  350. package/dist/types/plots/evolution/area/props.js +1 -0
  351. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  352. package/dist/types/plots/evolution/area/state.js +1 -0
  353. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  354. package/dist/types/plots/evolution/line/props.js +1 -0
  355. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  356. package/dist/types/plots/evolution/line/state.js +1 -0
  357. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  358. package/dist/types/plots/evolution/slope/props.js +1 -0
  359. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  360. package/dist/types/plots/evolution/slope/state.js +1 -0
  361. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  362. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  363. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  364. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  365. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  366. package/dist/types/plots/map/geo/props.js +1 -0
  367. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  368. package/dist/types/plots/map/geo/state.js +1 -0
  369. package/dist/types/plots/props.d.ts +3 -1
  370. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  371. package/dist/types/plots/ranking/bar/props.js +1 -0
  372. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  373. package/dist/types/plots/ranking/bar/state.js +1 -0
  374. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  375. package/dist/types/plots/ranking/bullet/props.js +1 -0
  376. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  377. package/dist/types/plots/ranking/bullet/state.js +1 -0
  378. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  379. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  380. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  381. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  382. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  383. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  384. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  385. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  386. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  387. package/dist/types/plots/ranking/forest/props.js +1 -0
  388. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  389. package/dist/types/plots/ranking/forest/state.js +1 -0
  390. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  391. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  392. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  393. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  394. package/dist/types/plots/segments/common.d.ts +4 -1
  395. package/dist/utils/OpacityScale.d.ts +14 -0
  396. package/dist/utils/OpacityScale.js +43 -0
  397. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  398. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  399. package/dist/utils/SymbolScale.d.ts +18 -0
  400. package/dist/utils/SymbolScale.js +29 -0
  401. package/dist/utils/color/ColorRamp.d.ts +27 -0
  402. package/dist/utils/color/ColorRamp.js +120 -0
  403. package/dist/utils/color/CssColor.d.ts +19 -0
  404. package/dist/utils/color/CssColor.js +114 -0
  405. package/dist/utils/color/Palette.d.ts +21 -0
  406. package/dist/utils/color/Palette.js +52 -0
  407. package/dist/utils/color/index.d.ts +11 -3
  408. package/dist/utils/color/index.js +14 -3
  409. package/dist/utils/grouping.js +1 -1
  410. package/docs/architecture.md +1 -1
  411. package/docs/chrome.md +39 -8
  412. package/docs/composer.md +19 -3
  413. package/docs/concepts.md +1 -1
  414. package/docs/development.md +14 -5
  415. package/docs/facets.md +62 -8
  416. package/docs/getting-started.md +8 -9
  417. package/docs/legend.md +73 -24
  418. package/docs/markers.md +45 -32
  419. package/docs/plots/correlation/heatmap.md +26 -0
  420. package/docs/plots/correlation/scatter.md +35 -0
  421. package/docs/plots/distribution/box.md +28 -0
  422. package/docs/plots/distribution/density.md +26 -0
  423. package/docs/plots/distribution/histogram.md +33 -0
  424. package/docs/plots/distribution/pyramid.md +31 -0
  425. package/docs/plots/distribution/violin.md +35 -0
  426. package/docs/plots/evolution/area.md +32 -0
  427. package/docs/plots/evolution/line.md +93 -0
  428. package/docs/plots/evolution/slope.md +39 -0
  429. package/docs/plots/evolution/sparkline.md +34 -0
  430. package/docs/plots/ranking/bar.md +59 -0
  431. package/docs/plots/ranking/bullet.md +37 -0
  432. package/docs/plots/ranking/cleveland.md +54 -0
  433. package/docs/plots/ranking/dumbbell.md +39 -0
  434. package/docs/plots/ranking/forest.md +40 -0
  435. package/docs/plots/ranking/lollipop.md +39 -0
  436. package/docs/plots.md +22 -154
  437. package/docs/scales.md +50 -27
  438. package/docs/state.md +1 -1
  439. package/docs/styles-and-segments.md +96 -39
  440. package/docs/theming.md +33 -19
  441. package/docs/timeline.md +62 -28
  442. package/docs/tooltip-and-hover.md +72 -24
  443. package/docs/transforms-and-statistics.md +56 -25
  444. package/examples/BarValues.svelte +2 -2
  445. package/examples/Box.svelte +7 -0
  446. package/examples/Bullet.svelte +17 -0
  447. package/examples/Chrome.svelte +17 -0
  448. package/examples/ChromeOrder.svelte +18 -0
  449. package/examples/Cleveland.svelte +15 -0
  450. package/examples/Composer.svelte +23 -0
  451. package/examples/CustomTooltip.svelte +21 -14
  452. package/examples/Density.svelte +7 -0
  453. package/examples/Dumbbell.svelte +16 -0
  454. package/examples/Facets.svelte +3 -3
  455. package/examples/FacetsCarousel.svelte +14 -0
  456. package/examples/FacetsRowsCols.svelte +23 -0
  457. package/examples/FirstPlot.svelte +7 -0
  458. package/examples/Forest.svelte +17 -0
  459. package/examples/Gaps.svelte +21 -0
  460. package/examples/GroupedBars.svelte +15 -0
  461. package/examples/Heatmap.svelte +7 -0
  462. package/examples/HeatmapSegments.svelte +26 -0
  463. package/examples/Histogram.svelte +14 -0
  464. package/examples/HorizontalBars.svelte +15 -0
  465. package/examples/LegendSections.svelte +27 -0
  466. package/examples/LegendToggle.svelte +3 -3
  467. package/examples/LineByRegion.svelte +18 -0
  468. package/examples/LineDates.svelte +15 -0
  469. package/examples/LineStep.svelte +16 -0
  470. package/examples/LineStepSegment.svelte +18 -0
  471. package/examples/Lollipop.svelte +17 -0
  472. package/examples/Markers.svelte +27 -0
  473. package/examples/MovingAverage.svelte +15 -0
  474. package/examples/Pyramid.svelte +14 -0
  475. package/examples/Regression.svelte +14 -0
  476. package/examples/ResponsiveLine.svelte +7 -7
  477. package/examples/Scales.svelte +26 -0
  478. package/examples/Scatter.svelte +16 -0
  479. package/examples/SegmentHighlight.svelte +22 -0
  480. package/examples/Segments.svelte +11 -3
  481. package/examples/SegmentsBySeries.svelte +25 -0
  482. package/examples/Slope.svelte +17 -0
  483. package/examples/Sparkline.svelte +14 -0
  484. package/examples/StackedArea.svelte +16 -0
  485. package/examples/StackedBars.svelte +15 -0
  486. package/examples/TimelinePlayer.svelte +8 -7
  487. package/examples/TimelineRule.svelte +19 -0
  488. package/examples/Tooltip.svelte +3 -3
  489. package/examples/ValueLabels.svelte +21 -0
  490. package/examples/Violin.svelte +14 -0
  491. package/examples/datasets/argentina-chile-trends.ts +34 -0
  492. package/examples/datasets/commodity-prices.ts +48 -0
  493. package/examples/datasets/countries-over-time.ts +368 -0
  494. package/examples/datasets/daily-temperature.ts +121 -0
  495. package/examples/datasets/earthquakes.ts +977 -0
  496. package/examples/datasets/flight-routes.ts +29 -0
  497. package/examples/datasets/height-density.ts +37 -0
  498. package/examples/datasets/heights.ts +370 -0
  499. package/examples/datasets/index.ts +24 -0
  500. package/examples/datasets/inflation-by-region.ts +44 -0
  501. package/examples/datasets/inflation-ranges.ts +34 -0
  502. package/examples/datasets/iris-flower.ts +207 -0
  503. package/examples/datasets/life-expectancy.ts +95 -0
  504. package/examples/datasets/napoleons-march.ts +182 -0
  505. package/examples/datasets/penguins.ts +54 -0
  506. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  507. package/examples/datasets/population-by-age.ts +890 -0
  508. package/examples/datasets/province-population.ts +521 -0
  509. package/examples/datasets/stock-prices.ts +63 -0
  510. package/examples/datasets/weather-stations-over-time.ts +31 -0
  511. package/examples/datasets/weather-stations.ts +22 -0
  512. package/examples/datasets/wind-vectors.ts +30 -0
  513. package/examples/datasets/world-temperature.ts +400 -0
  514. package/llms-full.txt +51 -12
  515. package/llms.txt +60 -4
  516. package/package.json +12 -2
  517. package/dist/layout/scales/buildScale.d.ts +0 -8
  518. package/dist/layout/scales/buildScale.js +0 -67
  519. package/dist/layout/scales/niceDomain.d.ts +0 -23
  520. package/dist/layout/scales/niceDomain.js +0 -59
  521. package/dist/plots/bar/defaults.d.ts +0 -9
  522. package/dist/plots/geo/features.svelte.d.ts +0 -5
  523. package/dist/plots/geo/features.svelte.js +0 -44
  524. package/dist/plots/geo/phases/tooltip.js +0 -5
  525. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  526. package/dist/plots/utils/geoAccessors.js +0 -220
  527. package/dist/plots/utils/geoSegments.d.ts +0 -29
  528. package/dist/plots/utils/geoSegments.js +0 -37
  529. package/dist/types/layout/styles.d.ts +0 -122
  530. package/dist/types/markers/axis/curveName.d.ts +0 -2
  531. package/dist/types/plots/line/props.d.ts +0 -10
  532. package/dist/utils/color/contrast.d.ts +0 -9
  533. package/dist/utils/color/contrast.js +0 -40
  534. package/dist/utils/color/cssColor.d.ts +0 -4
  535. package/dist/utils/color/cssColor.js +0 -77
  536. package/dist/utils/color/ramp.d.ts +0 -17
  537. package/dist/utils/color/ramp.js +0 -110
  538. package/dist/utils/opacity.d.ts +0 -9
  539. package/dist/utils/opacity.js +0 -38
  540. package/examples/data.ts +0 -12
  541. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  542. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  543. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  544. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  545. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  546. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  547. /package/dist/types/{plots/geo/props.js → layout/styles/gaps.js} +0 -0
  548. /package/dist/types/{plots/geo/state.js → layout/styles/geo.js} +0 -0
  549. /package/dist/types/{plots/heatmap/props.js → layout/styles/values.js} +0 -0
  550. /package/dist/types/{plots/heatmap/state.js → markers/axis/violin.js} +0 -0
  551. /package/dist/types/{plots/histogram/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  552. /package/dist/types/plots/{line → correlation/heatmap}/props.js +0 -0
  553. /package/dist/types/plots/{histogram → correlation/heatmap}/state.js +0 -0
  554. /package/dist/types/plots/{pyramid → correlation/scatter}/props.js +0 -0
  555. /package/dist/types/plots/{line → correlation/scatter}/state.js +0 -0
  556. /package/dist/types/plots/{scatter → distribution/box}/props.js +0 -0
  557. /package/dist/types/plots/{pyramid → distribution/box}/state.js +0 -0
  558. /package/dist/types/plots/{scatter/state.js → distribution/density/props.js} +0 -0
  559. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  560. /package/dist/{plots/utils → utils}/accessors.js +0 -0
@@ -1,13 +1,13 @@
1
1
  <script lang="ts" generics="TRow extends Record<string, unknown>">
2
2
  import type { Snippet } from 'svelte';
3
3
  import { TooltipState } from './TooltipState.svelte';
4
- import type { TooltipAnchorX, TooltipAnchorY } from '../../types/layout/tooltip';
4
+ import type { TooltipAnchorX, TooltipAnchorY, TooltipRow } from '../../types/layout/tooltip';
5
5
 
6
6
  /**
7
7
  * A plot's floating tooltip at `(x, y)`, inside a `position: relative`
8
8
  * parent and themed by the `--dct-tooltip-*` variables. It reads the rows
9
- * the hover matched: its own `content` snippet, given every row, or each
10
- * row's `format` text, one per line. It sits at `anchorX`/`anchorY` of the
9
+ * the hover matched: its own `content` snippet, given every row as matched,
10
+ * or each row's `format` text, one per line, in `sort`'s order. It sits at `anchorX`/`anchorY` of the
11
11
  * point (default right and below) and moves over where it would leave its
12
12
  * plot's box - or `bounds`, when given. See {@link TooltipState}.
13
13
  */
@@ -17,6 +17,7 @@
17
17
  y,
18
18
  rows,
19
19
  format,
20
+ sort,
20
21
  content,
21
22
  bounds,
22
23
  anchorX = 'right',
@@ -27,11 +28,13 @@
27
28
  visible: boolean;
28
29
  x: number;
29
30
  y: number;
30
- /** Every row the hover matched. */
31
- rows: TRow[];
31
+ /** Every row the hover matched, with the color the plot draws it in. */
32
+ rows: TooltipRow<TRow>[];
32
33
  format: (row: TRow) => string;
34
+ /** The order the `format` text reads the rows in. Unset, as matched. */
35
+ sort?: (a: TRow, b: TRow) => number;
33
36
  /** Custom tooltip body, given every row; replaces the `format` text and the default box. */
34
- content?: Snippet<[{ rows: TRow[] }]>;
37
+ content?: Snippet<[{ rows: TooltipRow<TRow>[] }]>;
35
38
  /** Box the tooltip must stay within. Defaults to its plot's box. */
36
39
  bounds?: { width: number; height: number };
37
40
  /** Preferred horizontal side of the point. Defaults to `'right'`. */
@@ -63,7 +66,7 @@
63
66
  {#if content}
64
67
  {@render content({ rows })}
65
68
  {:else}
66
- {TooltipState.text(rows, format)}
69
+ {TooltipState.text(rows, format, sort)}
67
70
  {/if}
68
71
  </div>
69
72
  {/if}
@@ -1,16 +1,18 @@
1
1
  import type { Snippet } from 'svelte';
2
- import type { TooltipAnchorX, TooltipAnchorY } from '../../types/layout/tooltip';
2
+ import type { TooltipAnchorX, TooltipAnchorY, TooltipRow } from '../../types/layout/tooltip';
3
3
  declare function $$render<TRow extends Record<string, unknown>>(): {
4
4
  props: {
5
5
  visible: boolean;
6
6
  x: number;
7
7
  y: number;
8
- /** Every row the hover matched. */
9
- rows: TRow[];
8
+ /** Every row the hover matched, with the color the plot draws it in. */
9
+ rows: TooltipRow<TRow>[];
10
10
  format: (row: TRow) => string;
11
+ /** The order the `format` text reads the rows in. Unset, as matched. */
12
+ sort?: (a: TRow, b: TRow) => number;
11
13
  /** Custom tooltip body, given every row; replaces the `format` text and the default box. */
12
14
  content?: Snippet<[{
13
- rows: TRow[];
15
+ rows: TooltipRow<TRow>[];
14
16
  }]>;
15
17
  /** Box the tooltip must stay within. Defaults to its plot's box. */
16
18
  bounds?: {
@@ -35,8 +35,14 @@ export declare class TooltipState {
35
35
  constructor(inputs: TooltipInputs);
36
36
  /** Where the tooltip sits. */
37
37
  readonly box: Box;
38
- /** The text `rows` read as through `format`, one line each. */
39
- static text<TRow>(rows: TRow[], format: (row: TRow) => string): string;
38
+ /** The text `rows` read as through `format`, one line each, in `sort`'s order when given. */
39
+ static text<TRow>(rows: TRow[], format: (row: TRow) => string, sort?: (a: TRow, b: TRow) => number): string;
40
+ /**
41
+ * Orders rows from the highest value `valueOf` reads to the lowest. A row
42
+ * without a numeric value goes after every one with, and rows that tie keep
43
+ * the order the hover matched them in.
44
+ */
45
+ static descending<TRow>(valueOf: (row: TRow) => unknown): (a: TRow, b: TRow) => number;
40
46
  /** A value as plain text: a date as a locale date, anything else as itself. */
41
47
  static value(value: unknown): string;
42
48
  /**
@@ -1,6 +1,6 @@
1
1
  import { Box } from '../margins/Box';
2
2
  import { PlotMargins } from '../margins/PlotMargins.svelte';
3
- import { resolveAccessor } from '../../plots/utils/accessors';
3
+ import { resolveAccessor } from '../../utils/accessors';
4
4
  import { SERIES_KEY } from '../../phases/transforms/TransformsPhase';
5
5
  import { ValueLabels } from '../styles/ValueLabels';
6
6
  /** A tooltip anchor as the side of the point the tooltip sits on. */
@@ -39,9 +39,28 @@ export class TooltipState {
39
39
  return (this.#plotMargins?.place(size, point, anchor) ??
40
40
  size.placeNear(point, anchor, Box.size(Infinity, Infinity)));
41
41
  });
42
- /** The text `rows` read as through `format`, one line each. */
43
- static text(rows, format) {
44
- return rows.map(format).join('\n');
42
+ /** The text `rows` read as through `format`, one line each, in `sort`'s order when given. */
43
+ static text(rows, format, sort) {
44
+ return (sort ? [...rows].sort(sort) : rows).map(format).join('\n');
45
+ }
46
+ /**
47
+ * Orders rows from the highest value `valueOf` reads to the lowest. A row
48
+ * without a numeric value goes after every one with, and rows that tie keep
49
+ * the order the hover matched them in.
50
+ */
51
+ static descending(valueOf) {
52
+ const numberOf = (row) => {
53
+ const value = valueOf(row);
54
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
55
+ };
56
+ return (a, b) => {
57
+ const left = numberOf(a);
58
+ const right = numberOf(b);
59
+ if (left === undefined || right === undefined) {
60
+ return (left === undefined ? 1 : 0) - (right === undefined ? 1 : 0);
61
+ }
62
+ return right - left;
63
+ };
45
64
  }
46
65
  /** A value as plain text: a date as a locale date, anything else as itself. */
47
66
  static value(value) {
@@ -155,6 +155,11 @@ export declare class MarkerKinds {
155
155
  clip: false;
156
156
  drawsRows: false;
157
157
  };
158
+ violin: {
159
+ clip: true;
160
+ drawsRows: true;
161
+ legendSymbol: "area";
162
+ };
158
163
  voronoi: {
159
164
  clip: true;
160
165
  drawsRows: true;
@@ -38,6 +38,7 @@ export class MarkerKinds {
38
38
  tick: { clip: true, drawsRows: true },
39
39
  trail: { clip: true, drawsRows: true, legendSymbol: 'line' },
40
40
  vector: { clip: false, drawsRows: false },
41
+ violin: { clip: true, drawsRows: true, legendSymbol: 'area' },
41
42
  voronoi: { clip: true, drawsRows: true },
42
43
  voronoiMesh: { clip: true, drawsRows: true },
43
44
  waffle: { clip: true, drawsRows: true }
@@ -15,6 +15,7 @@
15
15
 
16
16
  const plot = usePlot();
17
17
  const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
18
+ const AreaMark = $derived(isHorizontal ? AreaX : AreaY);
18
19
 
19
20
  const cfg = $derived(getConfiguration());
20
21
  const data = $derived(marker.data ?? []);
@@ -29,82 +30,33 @@
29
30
  const y2 = $derived(hasYBand ? marker.y2 : (marker.y ?? 0));
30
31
  const x1 = $derived(hasXBand ? marker.x1 : 0);
31
32
  const x2 = $derived(hasXBand ? marker.x2 : (marker.x ?? 0));
33
+ /** The band's two ends: along `x` when the plot runs horizontally, else along `y`. */
34
+ const band = $derived(isHorizontal ? { x1, x2 } : { y1, y2 });
32
35
  </script>
33
36
 
34
- {#if opacityBuckets}
35
- {#each opacityBuckets as bucket (bucket.value)}
36
- {#if isHorizontal}
37
- <AreaX
38
- data={bucket.data}
39
- x={marker.x}
40
- {x1}
41
- {x2}
42
- y={marker.y}
43
- z={marker.grouping}
44
- stack={false}
45
- curve={marker.curve}
46
- tension={marker.tension}
47
- fill={channelFill ?? marker.styles?.fill}
48
- fillOpacity={bucket.value}
49
- stroke={marker.styles?.stroke}
50
- strokeWidth={marker.styles?.strokeWidth}
51
- strokeOpacity={marker.styles?.strokeOpacity}
52
- strokeDasharray={marker.styles?.strokeDasharray}
53
- />
54
- {:else}
55
- <AreaY
56
- data={bucket.data}
57
- x={marker.x}
58
- y={marker.y}
59
- {y1}
60
- {y2}
61
- z={marker.grouping}
62
- stack={false}
63
- curve={marker.curve}
64
- tension={marker.tension}
65
- fill={channelFill ?? marker.styles?.fill}
66
- fillOpacity={bucket.value}
67
- stroke={marker.styles?.stroke}
68
- strokeWidth={marker.styles?.strokeWidth}
69
- strokeOpacity={marker.styles?.strokeOpacity}
70
- strokeDasharray={marker.styles?.strokeDasharray}
71
- />
72
- {/if}
73
- {/each}
74
- {:else if isHorizontal}
75
- <AreaX
76
- {data}
37
+ {#snippet area(rows: typeof data, fillOpacity: number | undefined)}
38
+ <AreaMark
39
+ data={rows}
77
40
  x={marker.x}
78
- {x1}
79
- {x2}
80
41
  y={marker.y}
42
+ {...band}
81
43
  z={marker.grouping}
82
44
  stack={false}
83
45
  curve={marker.curve}
84
46
  tension={marker.tension}
85
47
  fill={channelFill ?? marker.styles?.fill}
86
- fillOpacity={marker.styles?.fillOpacity ?? cfg.area.fillOpacity}
48
+ {fillOpacity}
87
49
  stroke={marker.styles?.stroke}
88
50
  strokeWidth={marker.styles?.strokeWidth}
89
51
  strokeOpacity={marker.styles?.strokeOpacity}
90
52
  strokeDasharray={marker.styles?.strokeDasharray}
91
53
  />
54
+ {/snippet}
55
+
56
+ {#if opacityBuckets}
57
+ {#each opacityBuckets as bucket (bucket.value)}
58
+ {@render area(bucket.data, bucket.value)}
59
+ {/each}
92
60
  {:else}
93
- <AreaY
94
- {data}
95
- x={marker.x}
96
- y={marker.y}
97
- {y1}
98
- {y2}
99
- z={marker.grouping}
100
- stack={false}
101
- curve={marker.curve}
102
- tension={marker.tension}
103
- fill={channelFill ?? marker.styles?.fill}
104
- fillOpacity={marker.styles?.fillOpacity ?? cfg.area.fillOpacity}
105
- stroke={marker.styles?.stroke}
106
- strokeWidth={marker.styles?.strokeWidth}
107
- strokeOpacity={marker.styles?.strokeOpacity}
108
- strokeDasharray={marker.styles?.strokeDasharray}
109
- />
61
+ {@render area(data, marker.styles?.fillOpacity ?? cfg.area.fillOpacity)}
110
62
  {/if}
@@ -1,19 +1,61 @@
1
1
  <script lang="ts">
2
2
  import { Arrow } from 'svelteplot';
3
+ import { usePlot } from '../../layout/plot/usePlot';
4
+ import { RowStroke } from '../utils/RowStroke';
3
5
  import type { ArrowMarkerConfig } from '../../types/markers/common';
4
6
 
5
- /** Renders one `'arrow'` marker as `<Arrow>` - a point-to-point annotation. Restates svelteplot's own defaults, which an explicit `undefined` would otherwise erase. */
7
+ /**
8
+ * Renders one `'arrow'` marker as `<Arrow>` - a point-to-point annotation.
9
+ * Restates svelteplot's own defaults, which an explicit `undefined` would
10
+ * otherwise erase. An arrow on a band axis ends at the middle of its band: the
11
+ * `<Arrow>` mark reads its start as the band's first edge and its end as the
12
+ * last, so such an arrow is placed in pixels instead.
13
+ */
6
14
  let { marker }: { marker: ArrowMarkerConfig } = $props();
7
15
 
16
+ const plot = usePlot().svelteplot;
8
17
  const data = $derived(marker.data ?? []);
18
+ /** Each row's own stroke, over the marker's `styles`. */
19
+ const row = $derived(RowStroke.of(marker, marker.styles, { stroke: 'currentColor' }));
20
+
21
+ type Row = Record<string, unknown>;
22
+ type Channel = string | number | ((d: never) => unknown) | undefined;
23
+ /** A channel of a row: a field key, a function of the row, or a literal. */
24
+ const read = (channel: Channel, d: Row) =>
25
+ typeof channel === 'string'
26
+ ? d[channel]
27
+ : typeof channel === 'function'
28
+ ? (channel as (d: Row) => unknown)(d)
29
+ : channel;
30
+ /** Where `value` sits along `axis`, in pixels, at the middle of its band on a band axis. */
31
+ const pixel = (axis: 'x' | 'y', value: unknown) => {
32
+ const scale = plot.scales[axis];
33
+ const at = scale.fn(value as never) as number;
34
+ return scale.type === 'band' ? at + scale.fn.bandwidth() / 2 : at;
35
+ };
36
+ const onBand = $derived(plot.scales.x.type === 'band' || plot.scales.y.type === 'band');
37
+ /** The rows with their ends in pixels, when an axis is a band. */
38
+ const placed = $derived(
39
+ onBand
40
+ ? data.map((d) => ({
41
+ ...d,
42
+ __x1: pixel('x', read(marker.x1, d as Row)),
43
+ __x2: pixel('x', read(marker.x2, d as Row)),
44
+ __y1: pixel('y', read(marker.y1, d as Row)),
45
+ __y2: pixel('y', read(marker.y2, d as Row))
46
+ }))
47
+ : data
48
+ );
49
+ /** A pixel channel the scales leave alone. */
50
+ const own = (key: string) => ({ value: (d: Row) => d[key], scale: null }) as never;
9
51
  </script>
10
52
 
11
53
  <Arrow
12
- {data}
13
- x1={marker.x1}
14
- y1={marker.y1}
15
- x2={marker.x2}
16
- y2={marker.y2}
54
+ data={placed}
55
+ x1={onBand ? own('__x1') : marker.x1}
56
+ y1={onBand ? own('__y1') : marker.y1}
57
+ x2={onBand ? own('__x2') : marker.x2}
58
+ y2={onBand ? own('__y2') : marker.y2}
17
59
  bend={marker.bend}
18
60
  headAngle={marker.headAngle ?? 60}
19
61
  headLength={marker.headLength ?? 8}
@@ -21,8 +63,8 @@
21
63
  insetStart={marker.insetStart}
22
64
  insetEnd={marker.insetEnd}
23
65
  sweep={marker.sweep}
24
- stroke={marker.styles?.stroke ?? 'currentColor'}
25
- strokeWidth={marker.styles?.strokeWidth}
26
- strokeOpacity={marker.styles?.strokeOpacity}
66
+ stroke={row.stroke}
67
+ strokeWidth={row.strokeWidth}
68
+ strokeOpacity={row.strokeOpacity}
27
69
  strokeDasharray={marker.styles?.strokeDasharray}
28
70
  />
@@ -43,14 +43,17 @@
43
43
  {#if marker.role === 'segment'}
44
44
  {@const categoryScale = categoryScaleFor(marker.isHorizontal)}
45
45
  {@const bandwidth = categoryScale?.type === 'band' ? categoryScale.fn.bandwidth() : 0}
46
+ {@const centered =
47
+ marker.thickness != null ? Math.max(0, (bandwidth - marker.thickness) / 2) : undefined}
46
48
  {#if marker.isHorizontal}
47
49
  <BarX
48
50
  {data}
49
51
  y={marker.y}
50
52
  x1={marker.x1}
51
53
  x2={marker.x2}
52
- insetTop={marker.insetTop != null ? marker.insetTop * bandwidth : undefined}
53
- insetBottom={marker.insetBottom != null ? marker.insetBottom * bandwidth : undefined}
54
+ insetTop={centered ?? (marker.insetTop != null ? marker.insetTop * bandwidth : undefined)}
55
+ insetBottom={centered ??
56
+ (marker.insetBottom != null ? marker.insetBottom * bandwidth : undefined)}
54
57
  fill={channelFill ?? marker.styles?.fill}
55
58
  fillOpacity={marker.styles?.fillOpacity}
56
59
  stroke={marker.styles?.stroke}
@@ -65,8 +68,9 @@
65
68
  x={marker.x}
66
69
  y1={marker.y1}
67
70
  y2={marker.y2}
68
- insetLeft={marker.insetLeft != null ? marker.insetLeft * bandwidth : undefined}
69
- insetRight={marker.insetRight != null ? marker.insetRight * bandwidth : undefined}
71
+ insetLeft={centered ?? (marker.insetLeft != null ? marker.insetLeft * bandwidth : undefined)}
72
+ insetRight={centered ??
73
+ (marker.insetRight != null ? marker.insetRight * bandwidth : undefined)}
70
74
  fill={channelFill ?? marker.styles?.fill}
71
75
  fillOpacity={marker.styles?.fillOpacity}
72
76
  stroke={marker.styles?.stroke}
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">
2
+ import { SvelteMap } from 'svelte/reactivity';
2
3
  import { BollingerX, BollingerY } from 'svelteplot';
3
4
  import { usePlot } from '../../layout/plot/usePlot';
5
+ import { MarkerChannels } from '../utils/MarkerChannels';
6
+ import { resolveAccessor } from '../../utils/accessors';
7
+ import { getConfiguration } from '../../configuration/config.svelte';
4
8
  import type { BollingerMarkerConfig } from '../../types/markers/common';
5
9
 
6
10
  /**
@@ -9,36 +13,47 @@
9
13
  * (`usePlot().axes`). A `stroke`-independent `fill`-style option
10
14
  * is deliberately not offered - confirmed empirically to have no visible
11
15
  * effect on svelteplot's own line (see `BollingerStatisticOptions`'s own
12
- * doc comment).
16
+ * doc comment). svelteplot draws one line and one band over all its rows, so
17
+ * with a `grouping` each group is drawn as a mark of its own, in the color
18
+ * the plot gives that group unless `styles` sets one.
13
19
  */
14
20
  let { marker }: { marker: BollingerMarkerConfig } = $props();
15
21
 
16
22
  const plot = usePlot();
17
23
  const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
24
+ const BollingerMark = $derived(isHorizontal ? BollingerX : BollingerY);
18
25
 
26
+ const cfg = $derived(getConfiguration());
19
27
  const data = $derived(marker.data ?? []);
28
+
29
+ /** The rows of each group, in the order the groups first appear. */
30
+ const groups = $derived.by(() => {
31
+ if (!marker.grouping) return [{ key: 'all', rows: data }];
32
+ const groupOf = resolveAccessor(marker.grouping as never) as (row: unknown) => unknown;
33
+ const byKey = new SvelteMap<string, typeof data>();
34
+ for (const row of data) {
35
+ const key = String(groupOf(row));
36
+ const rows = byKey.get(key);
37
+ if (rows) rows.push(row);
38
+ else byKey.set(key, [row]);
39
+ }
40
+ return [...byKey].map(([key, rows]) => ({ key, rows }));
41
+ });
42
+
43
+ /** What the plot's palette gives a row's group. */
44
+ const groupFill = $derived(MarkerChannels.buildFill(data, marker.grouping, marker.scales, cfg));
20
45
  </script>
21
46
 
22
- {#if isHorizontal}
23
- <BollingerX
24
- {data}
25
- x={marker.x}
26
- y={marker.y}
27
- n={marker.n}
28
- k={marker.k}
29
- stroke={marker.styles?.stroke}
30
- strokeOpacity={marker.styles?.strokeOpacity}
31
- fill={marker.styles?.bandFill}
32
- />
33
- {:else}
34
- <BollingerY
35
- {data}
47
+ {#each groups as group (group.key)}
48
+ {@const color = marker.grouping ? groupFill?.(group.rows[0]) : undefined}
49
+ <BollingerMark
50
+ data={group.rows}
36
51
  x={marker.x}
37
52
  y={marker.y}
38
53
  n={marker.n}
39
54
  k={marker.k}
40
- stroke={marker.styles?.stroke}
55
+ stroke={marker.styles?.stroke ?? color}
41
56
  strokeOpacity={marker.styles?.strokeOpacity}
42
- fill={marker.styles?.bandFill}
57
+ fill={marker.styles?.bandFill ?? color}
43
58
  />
44
- {/if}
59
+ {/each}
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { BoxX, BoxY } from 'svelteplot';
3
3
  import { usePlot } from '../../layout/plot/usePlot';
4
- import { contrastTextColor } from '../../utils/color';
4
+ import { CssColor } from '../../utils/color';
5
5
  import { getConfiguration } from '../../configuration/config.svelte';
6
6
  import type { BoxMarkerConfig } from '../../types/markers/common';
7
7
 
@@ -18,6 +18,33 @@
18
18
 
19
19
  const plot = usePlot();
20
20
  const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
21
+ const BoxMark = $derived(isHorizontal ? BoxX : BoxY);
22
+
23
+ /**
24
+ * With `thickness`, the box is that many pixels across, centered on the
25
+ * marker's share of its category's band (`slot`), instead of filling the band:
26
+ * the bar's insets and every sub-mark's offset follow it.
27
+ */
28
+ const thickness = $derived(marker.thickness);
29
+ const slotIndex = $derived(marker.slot?.index ?? 0);
30
+ const slotCount = $derived(marker.slot?.count ?? 1);
31
+ const bandwidth = $derived.by(() => {
32
+ const scale = isHorizontal ? plot.svelteplot.scales.y : plot.svelteplot.scales.x;
33
+ return scale?.type === 'band' ? scale.fn.bandwidth() : 0;
34
+ });
35
+ const placement = $derived.by(() => {
36
+ if (thickness == null || !bandwidth) return undefined;
37
+ const share = bandwidth / slotCount;
38
+ const offset = share * slotIndex + share / 2 - bandwidth / 2;
39
+ const inset = Math.max(0, (bandwidth - thickness) / 2);
40
+ return {
41
+ inset,
42
+ side: isHorizontal
43
+ ? { insetTop: inset, insetBottom: inset }
44
+ : { insetLeft: inset, insetRight: inset },
45
+ shift: isHorizontal ? { dy: offset } : { dx: offset }
46
+ };
47
+ });
21
48
 
22
49
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
50
  const data = $derived((marker.data ?? []) as any[]);
@@ -39,12 +66,15 @@
39
66
  (typeof marker.bar === 'object' && marker.bar.fill != null
40
67
  ? (marker.bar.fill as string)
41
68
  : undefined) ?? cfg.palette[0],
69
+ ...placement?.side,
70
+ ...placement?.shift,
42
71
  ...(typeof marker.bar === 'object' ? marker.bar : {})
43
72
  });
44
73
  const barFill = $derived(bar.fill as string);
45
74
 
46
75
  /** `bar.insetLeft`/`insetRight` averaged into one symmetric value - a tick's own `inset` is a single number/percentage, not independent left/right. */
47
76
  const tickInset = $derived.by(() => {
77
+ if (placement) return placement.inset;
48
78
  const l = typeof bar.insetLeft === 'number' ? bar.insetLeft : undefined;
49
79
  const r = typeof bar.insetRight === 'number' ? bar.insetRight : undefined;
50
80
  if (l === undefined && r === undefined) return undefined;
@@ -77,14 +107,19 @@
77
107
  return out;
78
108
  }
79
109
 
80
- const ruleDefault = $derived(lineStyleDefaults(barFill));
81
- const dotDefault = $derived(fillStyleDefaults());
110
+ const ruleDefault = $derived({ ...lineStyleDefaults(barFill), ...placement?.shift });
111
+ const dotDefault: Record<string, unknown> = $derived({
112
+ ...fillStyleDefaults(),
113
+ ...placement?.shift
114
+ });
82
115
  const tickMedianDefault = $derived({
83
- ...lineStyleDefaults(contrastTextColor(barFill)),
116
+ ...lineStyleDefaults(CssColor.contrastText(barFill)),
117
+ ...placement?.shift,
84
118
  ...(tickInset !== undefined ? { inset: tickInset } : {})
85
119
  });
86
120
  const tickMinMaxDefault = $derived({
87
121
  ...lineStyleDefaults(barFill),
122
+ ...placement?.shift,
88
123
  ...(tickInset !== undefined ? { inset: tickInset } : {})
89
124
  });
90
125
 
@@ -136,8 +171,4 @@
136
171
  });
137
172
  </script>
138
173
 
139
- {#if isHorizontal}
140
- <BoxX {data} x={marker.x} y={marker.y} sort={marker.sort} {...passthrough} />
141
- {:else}
142
- <BoxY {data} x={marker.x} y={marker.y} sort={marker.sort} {...passthrough} />
143
- {/if}
174
+ <BoxMark {data} x={marker.x} y={marker.y} sort={marker.sort} {...passthrough} />
@@ -1,4 +1,4 @@
1
- import { resolveAccessor } from '../../plots/utils/accessors';
1
+ import { resolveAccessor } from '../../utils/accessors';
2
2
  /**
3
3
  * A delta marker's measure: the gap, at one position along `axis`, between
4
4
  * the two curves (or axis lines) it compares. A target series is read where
@@ -3,12 +3,15 @@
3
3
  import DotMarker from '../dot/DotMarker.svelte';
4
4
  import TextMarker from '../text/TextMarker.svelte';
5
5
  import { Delta } from './Delta';
6
+ import { getConfiguration } from '../../configuration/config.svelte';
6
7
  import type { Series } from '../../types/plots/data/common';
7
8
  import type { DeltaMarkerConfig } from '../../types/markers/axis/delta';
8
9
 
9
10
  let { marker, data = [] }: { marker: DeltaMarkerConfig; data?: Series<TData>[] } = $props();
10
11
 
11
12
  const resolved = $derived(Delta.build(marker.axis, data, marker));
13
+ const label = $derived(getConfiguration().delta.text[marker.axis]);
14
+ const lineAnchor = $derived(marker.text?.lineAnchor ?? label.lineAnchor);
12
15
 
13
16
  const clampRange = $derived.by((): [number, number] | undefined => {
14
17
  const domain = marker.axis === 'x' ? marker.yDomain : marker.xDomain;
@@ -27,10 +30,9 @@
27
30
  }
28
31
 
29
32
  function textVaryCoord(fromVis: number, toVis: number) {
30
- const anchor = marker.text?.lineAnchor ?? 'middle';
31
- return anchor === 'top'
33
+ return lineAnchor === 'top'
32
34
  ? Math.max(fromVis, toVis)
33
- : anchor === 'bottom'
35
+ : lineAnchor === 'bottom'
34
36
  ? Math.min(fromVis, toVis)
35
37
  : (fromVis + toVis) / 2;
36
38
  }
@@ -82,12 +84,12 @@
82
84
  styles: {
83
85
  fontWeight: 'bold',
84
86
  fontSize: 14,
85
- textAnchor: 'middle',
87
+ textAnchor: label.textAnchor,
86
88
  fill: marker.line?.stroke ?? 'currentColor',
87
89
  ...marker.text,
88
- dx: marker.text?.dx ?? (marker.axis === 'x' ? 12 : 0),
89
- dy: marker.text?.dy ?? (marker.axis === 'x' ? 0 : -10),
90
- lineAnchor: marker.axis === 'x' ? (marker.text?.lineAnchor ?? 'middle') : 'bottom'
90
+ dx: marker.text?.dx ?? label.dx,
91
+ dy: marker.text?.dy ?? label.dy,
92
+ lineAnchor
91
93
  }
92
94
  }}
93
95
  />
@@ -2,7 +2,8 @@
2
2
  import { Dot } from 'svelteplot';
3
3
  import { MarkerChannels } from '../utils/MarkerChannels';
4
4
  import { getConfiguration } from '../../configuration/config.svelte';
5
- import { resolveAccessor } from '../../plots/utils/accessors';
5
+ import { resolveAccessor } from '../../utils/accessors';
6
+ import RowOffsetMarks from '../utils/RowOffsetMarks.svelte';
6
7
  import type { DotMarkerConfig } from '../../types/markers/common';
7
8
 
8
9
  /**
@@ -69,34 +70,30 @@
69
70
  const strokeDasharray = $derived(styles?.dotStrokeDasharray);
70
71
  </script>
71
72
 
73
+ {#snippet dots(rows: TData[], fillOpacity: number)}
74
+ <RowOffsetMarks {marker} {rows}>
75
+ {#snippet mark(own)}
76
+ <Dot
77
+ data={own}
78
+ x={x ?? 0}
79
+ y={y ?? 0}
80
+ {r}
81
+ {fill}
82
+ {fillOpacity}
83
+ {stroke}
84
+ {strokeWidth}
85
+ {strokeOpacity}
86
+ {strokeDasharray}
87
+ {symbol}
88
+ />
89
+ {/snippet}
90
+ </RowOffsetMarks>
91
+ {/snippet}
92
+
72
93
  {#if opacityBuckets}
73
94
  {#each opacityBuckets as bucket (bucket.value)}
74
- <Dot
75
- data={bucket.data}
76
- x={x ?? 0}
77
- y={y ?? 0}
78
- {r}
79
- {fill}
80
- fillOpacity={bucket.value}
81
- {stroke}
82
- {strokeWidth}
83
- {strokeOpacity}
84
- {strokeDasharray}
85
- {symbol}
86
- />
95
+ {@render dots(bucket.data, bucket.value)}
87
96
  {/each}
88
97
  {:else}
89
- <Dot
90
- data={displayData}
91
- x={x ?? 0}
92
- y={y ?? 0}
93
- {r}
94
- {fill}
95
- fillOpacity={flatFillOpacity}
96
- {stroke}
97
- {strokeWidth}
98
- {strokeOpacity}
99
- {strokeDasharray}
100
- {symbol}
101
- />
98
+ {@render dots(displayData, flatFillOpacity)}
102
99
  {/if}