@fundar/data-chart-telling 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +6 -6
  3. package/dist/configuration/config.svelte.d.ts +1 -1
  4. package/dist/configuration/config.svelte.js +165 -100
  5. package/dist/configuration/themes/index.d.ts +5 -1428
  6. package/dist/index.d.ts +23 -14
  7. package/dist/index.js +20 -11
  8. package/dist/layout/base/BasePlotLayout.svelte +115 -50
  9. package/dist/layout/base/BasePlotLayout.svelte.d.ts +1 -38
  10. package/dist/layout/coordinates/CoordinatesLayout.svelte +42 -40
  11. package/dist/layout/coordinates/CoordinatesLayout.svelte.d.ts +0 -2
  12. package/dist/layout/coordinates/ProjectionZoom.svelte +48 -0
  13. package/dist/layout/coordinates/ProjectionZoom.svelte.d.ts +10 -0
  14. package/dist/layout/coordinates/ZoomedProjection.d.ts +11 -0
  15. package/dist/layout/coordinates/ZoomedProjection.js +24 -0
  16. package/dist/layout/coordinates/camera.svelte.js +11 -8
  17. package/dist/layout/coordinates/projections/argentina.js +1 -1
  18. package/dist/layout/coordinates/projections/fit.d.ts +1 -1
  19. package/dist/layout/coordinates/projections/fit.js +1 -1
  20. package/dist/layout/coordinates/zoom.svelte.d.ts +4 -5
  21. package/dist/layout/coordinates/zoom.svelte.js +4 -5
  22. package/dist/layout/facet/FacetLayout.svelte +1 -1
  23. package/dist/layout/facet/config.js +1 -1
  24. package/dist/layout/figure/Figure.svelte +2 -0
  25. package/dist/layout/geometry/GeometryLayout.svelte +14 -9
  26. package/dist/layout/geometry/GeometryLayout.svelte.d.ts +0 -3
  27. package/dist/layout/geometry/MarkerOffset.svelte +28 -0
  28. package/dist/layout/geometry/MarkerOffset.svelte.d.ts +13 -0
  29. package/dist/layout/grid/GridCell.svelte +6 -8
  30. package/dist/layout/legend/ContinuousSection.svelte +44 -9
  31. package/dist/layout/legend/DiscreteBadgeItem.svelte +2 -2
  32. package/dist/layout/legend/DiscreteSection.svelte +2 -2
  33. package/dist/layout/legend/DiscreteSymbolIcon.svelte +1 -1
  34. package/dist/layout/legend/LegendChannels.js +36 -12
  35. package/dist/layout/legend/LegendLayout.svelte +9 -1
  36. package/dist/layout/legend/LegendState.svelte.d.ts +4 -0
  37. package/dist/layout/legend/LegendState.svelte.js +20 -3
  38. package/dist/layout/legend/SizeSection.svelte +1 -1
  39. package/dist/layout/margins/PlotMargins.svelte.d.ts +2 -5
  40. package/dist/layout/margins/PlotMargins.svelte.js +4 -8
  41. package/dist/layout/plot/Slice.d.ts +5 -1
  42. package/dist/layout/plot/Slice.js +14 -4
  43. package/dist/layout/scales/NiceTicks.d.ts +3 -0
  44. package/dist/layout/scales/NiceTicks.js +4 -0
  45. package/dist/layout/scales/ScalesLayout.svelte +72 -7
  46. package/dist/layout/scales/ScalesLayout.svelte.d.ts +5 -0
  47. package/dist/layout/scales/SveltePlotScale.d.ts +2 -2
  48. package/dist/layout/scales/SveltePlotScale.js +13 -6
  49. package/dist/layout/scales/TickLabels.d.ts +32 -0
  50. package/dist/layout/scales/TickLabels.js +55 -0
  51. package/dist/layout/styles/StylesLayout.svelte +2 -2
  52. package/dist/layout/styles/ValueLabels.d.ts +33 -5
  53. package/dist/layout/styles/ValueLabels.js +80 -21
  54. package/dist/layout/timeline/TimelineLayout.svelte +1 -1
  55. package/dist/layout/tooltip/Tooltip.svelte +4 -4
  56. package/dist/layout/tooltip/Tooltip.svelte.d.ts +4 -4
  57. package/dist/layout/tooltip/TooltipState.svelte.js +1 -1
  58. package/dist/markers/MarkerKinds.d.ts +5 -0
  59. package/dist/markers/MarkerKinds.js +1 -0
  60. package/dist/markers/area/AreaMarker.svelte +15 -63
  61. package/dist/markers/arrow/ArrowMarker.svelte +51 -9
  62. package/dist/markers/bar/BarMarker.svelte +8 -4
  63. package/dist/markers/bollinger/BollingerMarker.svelte +33 -18
  64. package/dist/markers/box/BoxMarker.svelte +40 -9
  65. package/dist/markers/delta/Delta.js +1 -1
  66. package/dist/markers/dot/DotMarker.svelte +24 -27
  67. package/dist/markers/image/ImageMarker.svelte +17 -12
  68. package/dist/markers/inset/InsetMarker.svelte +2 -2
  69. package/dist/markers/line/LineMarker.svelte +1 -0
  70. package/dist/markers/link/LinkMarker.svelte +174 -29
  71. package/dist/markers/regression/RegressionMarker.svelte +16 -33
  72. package/dist/markers/rule/RuleMarker.svelte +9 -3
  73. package/dist/markers/text/Declutter.d.ts +4 -0
  74. package/dist/markers/text/Declutter.js +26 -11
  75. package/dist/markers/text/TextMarker.svelte +91 -48
  76. package/dist/markers/tick/TickMarker.svelte +27 -25
  77. package/dist/markers/utils/MarkerChannels.d.ts +24 -0
  78. package/dist/markers/utils/MarkerChannels.js +42 -7
  79. package/dist/markers/utils/RowOffset.d.ts +23 -0
  80. package/dist/markers/utils/RowOffset.js +23 -0
  81. package/dist/markers/utils/RowOffsetMarks.svelte +30 -0
  82. package/dist/markers/utils/RowOffsetMarks.svelte.d.ts +33 -0
  83. package/dist/markers/utils/RowStroke.d.ts +31 -0
  84. package/dist/markers/utils/RowStroke.js +28 -0
  85. package/dist/markers/violin/ViolinMarker.svelte +75 -0
  86. package/dist/markers/violin/ViolinMarker.svelte.d.ts +7 -0
  87. package/dist/markers/violin/ViolinProfiles.d.ts +29 -0
  88. package/dist/markers/violin/ViolinProfiles.js +55 -0
  89. package/dist/markers/waffle/WaffleMarker.svelte +17 -37
  90. package/dist/phases/Pipeline.d.ts +5 -0
  91. package/dist/phases/Pipeline.js +5 -0
  92. package/dist/phases/data/DataPhase.js +3 -3
  93. package/dist/phases/data/PlotAxes.d.ts +10 -0
  94. package/dist/phases/data/PlotAxes.js +14 -1
  95. package/dist/phases/facet/FacetPanels.d.ts +1 -0
  96. package/dist/phases/facet/FacetPanels.js +1 -0
  97. package/dist/phases/mapping/MappingPhase.js +1 -1
  98. package/dist/phases/markers/MarkersPhase.js +2 -1
  99. package/dist/phases/scales/CategoryOrder.d.ts +23 -0
  100. package/dist/phases/scales/CategoryOrder.js +73 -0
  101. package/dist/phases/scales/ScalesPhase.js +21 -7
  102. package/dist/phases/sharedScales/SharedScalesPhase.d.ts +3 -2
  103. package/dist/phases/sharedScales/SharedScalesPhase.js +5 -2
  104. package/dist/phases/statistics/Statistics.d.ts +10 -6
  105. package/dist/phases/statistics/Statistics.js +20 -10
  106. package/dist/phases/statistics/StatisticsPhase.js +7 -2
  107. package/dist/phases/statistics/methods/BollingerStatistic.d.ts +1 -1
  108. package/dist/phases/statistics/methods/BollingerStatistic.js +13 -11
  109. package/dist/phases/statistics/methods/BoxStatistic.d.ts +1 -1
  110. package/dist/phases/statistics/methods/BoxStatistic.js +14 -12
  111. package/dist/phases/statistics/methods/Density2dStatistic.d.ts +1 -1
  112. package/dist/phases/statistics/methods/Density2dStatistic.js +13 -11
  113. package/dist/phases/statistics/methods/DensityStatistic.d.ts +1 -1
  114. package/dist/phases/statistics/methods/DensityStatistic.js +11 -9
  115. package/dist/phases/statistics/methods/DeviationStatistic.d.ts +8 -0
  116. package/dist/phases/statistics/methods/DeviationStatistic.js +111 -0
  117. package/dist/phases/statistics/methods/MovingAverageStatistic.d.ts +1 -1
  118. package/dist/phases/statistics/methods/MovingAverageStatistic.js +11 -9
  119. package/dist/phases/statistics/methods/RegressionStatistic.d.ts +1 -1
  120. package/dist/phases/statistics/methods/RegressionStatistic.js +16 -14
  121. package/dist/phases/transforms/ProcessedPositions.js +1 -1
  122. package/dist/phases/transforms/TransformsPhase.js +49 -3
  123. package/dist/phases/transforms/ValueSelection.d.ts +30 -0
  124. package/dist/phases/transforms/ValueSelection.js +53 -0
  125. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte +5 -2
  126. package/dist/plots/{heatmap → correlation/heatmap}/Plot.svelte.d.ts +2 -2
  127. package/dist/plots/{heatmap → correlation/heatmap}/defaults.d.ts +2 -2
  128. package/dist/plots/{heatmap → correlation/heatmap}/defaults.js +5 -5
  129. package/dist/plots/{heatmap → correlation/heatmap}/markers.d.ts +4 -4
  130. package/dist/plots/{heatmap → correlation/heatmap}/markers.js +3 -3
  131. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte +5 -2
  132. package/dist/plots/{scatter → correlation/scatter}/Plot.svelte.d.ts +2 -2
  133. package/dist/plots/{scatter → correlation/scatter}/defaults.d.ts +2 -2
  134. package/dist/plots/{scatter → correlation/scatter}/defaults.js +4 -4
  135. package/dist/plots/{scatter → correlation/scatter}/markers.d.ts +4 -4
  136. package/dist/plots/{scatter → correlation/scatter}/markers.js +3 -3
  137. package/dist/plots/{box → distribution/box}/BoxSummaries.d.ts +2 -2
  138. package/dist/plots/{box → distribution/box}/BoxSummaries.js +6 -6
  139. package/dist/plots/{box → distribution/box}/Plot.svelte +2 -2
  140. package/dist/plots/{box → distribution/box}/Plot.svelte.d.ts +2 -2
  141. package/dist/plots/{box → distribution/box}/defaults.d.ts +2 -2
  142. package/dist/plots/{box → distribution/box}/defaults.js +1 -1
  143. package/dist/plots/{box → distribution/box}/markers.d.ts +2 -2
  144. package/dist/plots/distribution/density/Plot.svelte +45 -0
  145. package/dist/plots/distribution/density/Plot.svelte.d.ts +26 -0
  146. package/dist/plots/distribution/density/defaults.d.ts +9 -0
  147. package/dist/plots/distribution/density/defaults.js +29 -0
  148. package/dist/plots/distribution/density/markers.d.ts +9 -0
  149. package/dist/plots/distribution/density/markers.js +42 -0
  150. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte +2 -2
  151. package/dist/plots/{histogram → distribution/histogram}/Plot.svelte.d.ts +2 -2
  152. package/dist/plots/{histogram → distribution/histogram}/defaults.d.ts +2 -2
  153. package/dist/plots/{histogram → distribution/histogram}/defaults.js +3 -3
  154. package/dist/plots/{histogram → distribution/histogram}/markers.d.ts +3 -3
  155. package/dist/plots/{histogram → distribution/histogram}/markers.js +5 -5
  156. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte +5 -2
  157. package/dist/plots/{pyramid → distribution/pyramid}/Plot.svelte.d.ts +2 -2
  158. package/dist/plots/{pyramid → distribution/pyramid}/defaults.d.ts +2 -2
  159. package/dist/plots/{pyramid → distribution/pyramid}/defaults.js +6 -6
  160. package/dist/plots/{pyramid → distribution/pyramid}/markers.d.ts +4 -4
  161. package/dist/plots/{pyramid → distribution/pyramid}/markers.js +6 -6
  162. package/dist/plots/distribution/violin/Plot.svelte +45 -0
  163. package/dist/plots/distribution/violin/Plot.svelte.d.ts +26 -0
  164. package/dist/plots/distribution/violin/defaults.d.ts +10 -0
  165. package/dist/plots/distribution/violin/defaults.js +58 -0
  166. package/dist/plots/distribution/violin/markers.d.ts +10 -0
  167. package/dist/plots/distribution/violin/markers.js +71 -0
  168. package/dist/plots/{area → evolution/area}/Plot.svelte +2 -2
  169. package/dist/plots/{area → evolution/area}/Plot.svelte.d.ts +2 -2
  170. package/dist/plots/{area → evolution/area}/defaults.d.ts +2 -2
  171. package/dist/plots/{area → evolution/area}/defaults.js +2 -0
  172. package/dist/plots/{area → evolution/area}/markers.d.ts +2 -2
  173. package/dist/plots/{area → evolution/area}/markers.js +1 -1
  174. package/dist/plots/{line → evolution/line}/Plot.svelte +2 -2
  175. package/dist/plots/{line → evolution/line}/Plot.svelte.d.ts +2 -2
  176. package/dist/plots/{line → evolution/line}/defaults.d.ts +2 -2
  177. package/dist/plots/{line → evolution/line}/defaults.js +2 -0
  178. package/dist/plots/{line → evolution/line}/markers.d.ts +11 -8
  179. package/dist/plots/{line → evolution/line}/markers.js +6 -4
  180. package/dist/plots/evolution/slope/Plot.svelte +42 -0
  181. package/dist/plots/evolution/slope/Plot.svelte.d.ts +26 -0
  182. package/dist/plots/evolution/slope/defaults.d.ts +8 -0
  183. package/dist/plots/evolution/slope/defaults.js +31 -0
  184. package/dist/plots/evolution/slope/markers.d.ts +16 -0
  185. package/dist/plots/evolution/slope/markers.js +79 -0
  186. package/dist/plots/evolution/sparkline/Plot.svelte +45 -0
  187. package/dist/plots/evolution/sparkline/Plot.svelte.d.ts +26 -0
  188. package/dist/plots/evolution/sparkline/defaults.d.ts +7 -0
  189. package/dist/plots/evolution/sparkline/defaults.js +23 -0
  190. package/dist/plots/evolution/sparkline/markers.d.ts +7 -0
  191. package/dist/plots/evolution/sparkline/markers.js +56 -0
  192. package/dist/plots/{geo → map/geo}/Core.svelte +11 -10
  193. package/dist/plots/{geo → map/geo}/Core.svelte.d.ts +1 -1
  194. package/dist/plots/map/geo/GeoFeatures.svelte.d.ts +9 -0
  195. package/dist/plots/map/geo/GeoFeatures.svelte.js +55 -0
  196. package/dist/plots/map/geo/GeoGeometry.d.ts +27 -0
  197. package/dist/plots/map/geo/GeoGeometry.js +142 -0
  198. package/dist/plots/map/geo/GeoSegments.d.ts +16 -0
  199. package/dist/plots/map/geo/GeoSegments.js +23 -0
  200. package/dist/plots/{geo → map/geo}/Plot.svelte +10 -10
  201. package/dist/plots/{geo → map/geo}/Plot.svelte.d.ts +2 -2
  202. package/dist/plots/{geo → map/geo}/defaults.d.ts +2 -2
  203. package/dist/plots/{geo → map/geo}/defaults.js +1 -1
  204. package/dist/plots/{geo → map/geo}/phases/data.d.ts +1 -1
  205. package/dist/plots/{geo → map/geo}/phases/data.js +7 -6
  206. package/dist/plots/{geo → map/geo}/phases/hover.d.ts +1 -1
  207. package/dist/plots/{geo → map/geo}/phases/hover.js +2 -2
  208. package/dist/plots/{geo → map/geo}/phases/markers.d.ts +1 -1
  209. package/dist/plots/{geo → map/geo}/phases/markers.js +6 -10
  210. package/dist/plots/{geo → map/geo}/phases/scales.d.ts +2 -2
  211. package/dist/plots/{geo → map/geo}/phases/scales.js +28 -12
  212. package/dist/plots/{geo → map/geo}/phases/tooltip.d.ts +1 -1
  213. package/dist/plots/map/geo/phases/tooltip.js +5 -0
  214. package/dist/plots/{geo → map/geo}/slices.d.ts +2 -2
  215. package/dist/plots/{geo → map/geo}/slices.js +2 -2
  216. package/dist/plots/{bar → ranking/bar}/Plot.svelte +2 -2
  217. package/dist/plots/{bar → ranking/bar}/Plot.svelte.d.ts +2 -2
  218. package/dist/plots/ranking/bar/defaults.d.ts +16 -0
  219. package/dist/plots/{bar → ranking/bar}/defaults.js +15 -9
  220. package/dist/plots/{bar → ranking/bar}/markers.d.ts +8 -8
  221. package/dist/plots/{bar → ranking/bar}/markers.js +8 -17
  222. package/dist/plots/ranking/bullet/Plot.svelte +42 -0
  223. package/dist/plots/ranking/bullet/Plot.svelte.d.ts +26 -0
  224. package/dist/plots/ranking/bullet/defaults.d.ts +8 -0
  225. package/dist/plots/ranking/bullet/defaults.js +24 -0
  226. package/dist/plots/ranking/bullet/markers.d.ts +10 -0
  227. package/dist/plots/ranking/bullet/markers.js +90 -0
  228. package/dist/plots/ranking/cleveland/ClevelandConnector.d.ts +48 -0
  229. package/dist/plots/ranking/cleveland/ClevelandConnector.js +140 -0
  230. package/dist/plots/ranking/cleveland/ClevelandMarkers.d.ts +33 -0
  231. package/dist/plots/ranking/cleveland/ClevelandMarkers.js +375 -0
  232. package/dist/plots/ranking/cleveland/ClevelandRanges.d.ts +31 -0
  233. package/dist/plots/ranking/cleveland/ClevelandRanges.js +116 -0
  234. package/dist/plots/ranking/cleveland/Plot.svelte +45 -0
  235. package/dist/plots/ranking/cleveland/Plot.svelte.d.ts +26 -0
  236. package/dist/plots/ranking/cleveland/defaults.d.ts +13 -0
  237. package/dist/plots/ranking/cleveland/defaults.js +66 -0
  238. package/dist/plots/ranking/dumbbell/Plot.svelte +45 -0
  239. package/dist/plots/ranking/dumbbell/Plot.svelte.d.ts +26 -0
  240. package/dist/plots/ranking/dumbbell/defaults.d.ts +9 -0
  241. package/dist/plots/ranking/dumbbell/defaults.js +19 -0
  242. package/dist/plots/ranking/forest/Plot.svelte +42 -0
  243. package/dist/plots/ranking/forest/Plot.svelte.d.ts +26 -0
  244. package/dist/plots/ranking/forest/defaults.d.ts +11 -0
  245. package/dist/plots/ranking/forest/defaults.js +20 -0
  246. package/dist/plots/ranking/lollipop/Plot.svelte +45 -0
  247. package/dist/plots/ranking/lollipop/Plot.svelte.d.ts +26 -0
  248. package/dist/plots/ranking/lollipop/defaults.d.ts +9 -0
  249. package/dist/plots/ranking/lollipop/defaults.js +18 -0
  250. package/dist/plots/utils/RowNumbers.d.ts +16 -0
  251. package/dist/plots/utils/RowNumbers.js +24 -0
  252. package/dist/plots/utils/gaps.js +1 -1
  253. package/dist/plots/utils/segments.js +1 -1
  254. package/dist/types/configuration/styling.d.ts +276 -143
  255. package/dist/types/layout/coordinates.d.ts +5 -4
  256. package/dist/types/layout/legend.d.ts +21 -5
  257. package/dist/types/layout/plot.d.ts +44 -1
  258. package/dist/types/layout/scales.d.ts +39 -7
  259. package/dist/types/layout/statistics/deviation.d.ts +40 -0
  260. package/dist/types/layout/statistics/index.d.ts +7 -2
  261. package/dist/types/layout/styles/base.d.ts +18 -0
  262. package/dist/types/layout/styles/bullet.d.ts +25 -0
  263. package/dist/types/layout/styles/connector.d.ts +98 -0
  264. package/dist/types/layout/styles/curve.d.ts +11 -0
  265. package/dist/types/layout/styles/frame.d.ts +17 -0
  266. package/dist/types/layout/styles/gaps.d.ts +12 -0
  267. package/dist/types/layout/styles/geo.d.ts +55 -0
  268. package/dist/types/layout/styles/index.d.ts +8 -0
  269. package/dist/types/layout/styles/index.js +8 -0
  270. package/dist/types/layout/styles/values.d.ts +47 -0
  271. package/dist/types/layout/timeline.d.ts +5 -2
  272. package/dist/types/layout/tooltip.d.ts +6 -2
  273. package/dist/types/markers/axis/area.d.ts +2 -2
  274. package/dist/types/markers/axis/arrow.d.ts +3 -0
  275. package/dist/types/markers/axis/axisBasedMarkersConfig.d.ts +2 -1
  276. package/dist/types/markers/axis/bar.d.ts +1 -1
  277. package/dist/types/markers/axis/box.d.ts +5 -0
  278. package/dist/types/markers/axis/difference.d.ts +2 -2
  279. package/dist/types/markers/axis/image.d.ts +3 -2
  280. package/dist/types/markers/axis/line.d.ts +2 -0
  281. package/dist/types/markers/axis/rule.d.ts +9 -0
  282. package/dist/types/markers/axis/trail.d.ts +2 -3
  283. package/dist/types/markers/axis/violin.d.ts +25 -0
  284. package/dist/types/markers/basic/dot.d.ts +3 -2
  285. package/dist/types/markers/basic/text.d.ts +13 -3
  286. package/dist/types/markers/channels/commonMarkerConfig.d.ts +7 -3
  287. package/dist/types/markers/channels/commonMarkerConfigWithRowOffset.d.ts +13 -0
  288. package/dist/types/markers/common.d.ts +1 -1
  289. package/dist/types/markers/common.js +1 -0
  290. package/dist/types/markers/geo/link.d.ts +5 -1
  291. package/dist/types/phases/index.d.ts +1 -1
  292. package/dist/types/phases/scales/phase.d.ts +5 -1
  293. package/dist/types/phases/state.d.ts +15 -2
  294. package/dist/types/phases/statistics/source.d.ts +3 -1
  295. package/dist/types/phases/transforms/phase.d.ts +22 -0
  296. package/dist/types/plots/{heatmap → correlation/heatmap}/props.d.ts +6 -6
  297. package/dist/types/plots/{heatmap → correlation/heatmap}/state.d.ts +4 -4
  298. package/dist/types/plots/{scatter → correlation/scatter}/props.d.ts +6 -6
  299. package/dist/types/plots/{scatter → correlation/scatter}/state.d.ts +2 -2
  300. package/dist/types/plots/{box → distribution/box}/props.d.ts +6 -6
  301. package/dist/types/plots/{box → distribution/box}/state.d.ts +3 -3
  302. package/dist/types/plots/distribution/density/props.d.ts +23 -0
  303. package/dist/types/plots/distribution/density/state.d.ts +6 -0
  304. package/dist/types/plots/{histogram → distribution/histogram}/props.d.ts +7 -7
  305. package/dist/types/plots/{histogram → distribution/histogram}/state.d.ts +2 -2
  306. package/dist/types/plots/distribution/histogram/state.js +1 -0
  307. package/dist/types/plots/{pyramid → distribution/pyramid}/props.d.ts +6 -6
  308. package/dist/types/plots/distribution/pyramid/props.js +1 -0
  309. package/dist/types/plots/{pyramid → distribution/pyramid}/state.d.ts +3 -3
  310. package/dist/types/plots/distribution/pyramid/state.js +1 -0
  311. package/dist/types/plots/distribution/violin/props.d.ts +23 -0
  312. package/dist/types/plots/distribution/violin/props.js +1 -0
  313. package/dist/types/plots/distribution/violin/state.d.ts +6 -0
  314. package/dist/types/plots/distribution/violin/state.js +1 -0
  315. package/dist/types/plots/{area → evolution/area}/props.d.ts +6 -6
  316. package/dist/types/plots/evolution/area/props.js +1 -0
  317. package/dist/types/plots/{area → evolution/area}/state.d.ts +2 -2
  318. package/dist/types/plots/evolution/area/state.js +1 -0
  319. package/dist/types/plots/evolution/line/props.d.ts +10 -0
  320. package/dist/types/plots/evolution/line/props.js +1 -0
  321. package/dist/types/plots/{line → evolution/line}/state.d.ts +3 -3
  322. package/dist/types/plots/evolution/line/state.js +1 -0
  323. package/dist/types/plots/evolution/slope/props.d.ts +5 -0
  324. package/dist/types/plots/evolution/slope/props.js +1 -0
  325. package/dist/types/plots/evolution/slope/state.d.ts +5 -0
  326. package/dist/types/plots/evolution/slope/state.js +1 -0
  327. package/dist/types/plots/evolution/sparkline/props.d.ts +5 -0
  328. package/dist/types/plots/evolution/sparkline/props.js +1 -0
  329. package/dist/types/plots/evolution/sparkline/state.d.ts +5 -0
  330. package/dist/types/plots/evolution/sparkline/state.js +1 -0
  331. package/dist/types/plots/{geo → map/geo}/props.d.ts +8 -8
  332. package/dist/types/plots/map/geo/props.js +1 -0
  333. package/dist/types/plots/{geo → map/geo}/state.d.ts +18 -11
  334. package/dist/types/plots/map/geo/state.js +1 -0
  335. package/dist/types/plots/props.d.ts +1 -1
  336. package/dist/types/plots/{bar → ranking/bar}/props.d.ts +6 -6
  337. package/dist/types/plots/ranking/bar/props.js +1 -0
  338. package/dist/types/plots/{bar → ranking/bar}/state.d.ts +2 -2
  339. package/dist/types/plots/ranking/bar/state.js +1 -0
  340. package/dist/types/plots/ranking/bullet/props.d.ts +22 -0
  341. package/dist/types/plots/ranking/bullet/props.js +1 -0
  342. package/dist/types/plots/ranking/bullet/state.d.ts +5 -0
  343. package/dist/types/plots/ranking/bullet/state.js +1 -0
  344. package/dist/types/plots/ranking/cleveland/props.d.ts +10 -0
  345. package/dist/types/plots/ranking/cleveland/props.js +1 -0
  346. package/dist/types/plots/ranking/cleveland/state.d.ts +49 -0
  347. package/dist/types/plots/ranking/cleveland/state.js +1 -0
  348. package/dist/types/plots/ranking/dumbbell/props.d.ts +10 -0
  349. package/dist/types/plots/ranking/dumbbell/props.js +1 -0
  350. package/dist/types/plots/ranking/dumbbell/state.d.ts +5 -0
  351. package/dist/types/plots/ranking/dumbbell/state.js +1 -0
  352. package/dist/types/plots/ranking/forest/props.d.ts +23 -0
  353. package/dist/types/plots/ranking/forest/props.js +1 -0
  354. package/dist/types/plots/ranking/forest/state.d.ts +5 -0
  355. package/dist/types/plots/ranking/forest/state.js +1 -0
  356. package/dist/types/plots/ranking/lollipop/props.d.ts +10 -0
  357. package/dist/types/plots/ranking/lollipop/props.js +1 -0
  358. package/dist/types/plots/ranking/lollipop/state.d.ts +5 -0
  359. package/dist/types/plots/ranking/lollipop/state.js +1 -0
  360. package/dist/types/plots/segments/common.d.ts +4 -1
  361. package/dist/utils/OpacityScale.d.ts +14 -0
  362. package/dist/utils/OpacityScale.js +43 -0
  363. package/dist/utils/{symbol.d.ts → SymbolPath.d.ts} +0 -12
  364. package/dist/utils/{symbol.js → SymbolPath.js} +0 -24
  365. package/dist/utils/SymbolScale.d.ts +18 -0
  366. package/dist/utils/SymbolScale.js +29 -0
  367. package/dist/utils/color/ColorRamp.d.ts +27 -0
  368. package/dist/utils/color/ColorRamp.js +120 -0
  369. package/dist/utils/color/CssColor.d.ts +19 -0
  370. package/dist/utils/color/CssColor.js +114 -0
  371. package/dist/utils/color/Palette.d.ts +21 -0
  372. package/dist/utils/color/Palette.js +52 -0
  373. package/dist/utils/color/index.d.ts +11 -3
  374. package/dist/utils/color/index.js +14 -3
  375. package/dist/utils/grouping.js +1 -1
  376. package/docs/architecture.md +1 -1
  377. package/docs/chrome.md +2 -2
  378. package/docs/composer.md +2 -2
  379. package/docs/concepts.md +1 -1
  380. package/docs/development.md +1 -1
  381. package/docs/facets.md +3 -3
  382. package/docs/getting-started.md +2 -2
  383. package/docs/legend.md +13 -11
  384. package/docs/markers.md +29 -27
  385. package/docs/plots/correlation/heatmap.md +26 -0
  386. package/docs/plots/correlation/scatter.md +35 -0
  387. package/docs/plots/distribution/box.md +28 -0
  388. package/docs/plots/distribution/density.md +26 -0
  389. package/docs/plots/distribution/histogram.md +33 -0
  390. package/docs/plots/distribution/pyramid.md +31 -0
  391. package/docs/plots/distribution/violin.md +35 -0
  392. package/docs/plots/evolution/area.md +32 -0
  393. package/docs/plots/evolution/line.md +93 -0
  394. package/docs/plots/evolution/slope.md +39 -0
  395. package/docs/plots/evolution/sparkline.md +34 -0
  396. package/docs/plots/ranking/bar.md +59 -0
  397. package/docs/plots/ranking/bullet.md +37 -0
  398. package/docs/plots/ranking/cleveland.md +54 -0
  399. package/docs/plots/ranking/dumbbell.md +39 -0
  400. package/docs/plots/ranking/forest.md +40 -0
  401. package/docs/plots/ranking/lollipop.md +39 -0
  402. package/docs/plots.md +22 -280
  403. package/docs/scales.md +30 -24
  404. package/docs/styles-and-segments.md +24 -21
  405. package/docs/theming.md +23 -20
  406. package/docs/timeline.md +3 -3
  407. package/docs/tooltip-and-hover.md +10 -10
  408. package/docs/transforms-and-statistics.md +13 -12
  409. package/examples/BarValues.svelte +1 -1
  410. package/examples/Box.svelte +1 -1
  411. package/examples/Bullet.svelte +17 -0
  412. package/examples/Chrome.svelte +1 -1
  413. package/examples/ChromeOrder.svelte +1 -1
  414. package/examples/Cleveland.svelte +15 -0
  415. package/examples/Composer.svelte +2 -2
  416. package/examples/CustomTooltip.svelte +1 -1
  417. package/examples/Density.svelte +7 -0
  418. package/examples/Dumbbell.svelte +16 -0
  419. package/examples/Facets.svelte +1 -1
  420. package/examples/FacetsCarousel.svelte +1 -1
  421. package/examples/FacetsRowsCols.svelte +1 -1
  422. package/examples/FirstPlot.svelte +1 -1
  423. package/examples/Forest.svelte +17 -0
  424. package/examples/Gaps.svelte +2 -2
  425. package/examples/GroupedBars.svelte +1 -1
  426. package/examples/Heatmap.svelte +3 -3
  427. package/examples/HeatmapSegments.svelte +8 -8
  428. package/examples/Histogram.svelte +1 -1
  429. package/examples/HorizontalBars.svelte +1 -1
  430. package/examples/LegendSections.svelte +1 -1
  431. package/examples/LegendToggle.svelte +1 -1
  432. package/examples/LineByRegion.svelte +1 -1
  433. package/examples/LineDates.svelte +1 -1
  434. package/examples/LineStep.svelte +16 -0
  435. package/examples/LineStepSegment.svelte +18 -0
  436. package/examples/Lollipop.svelte +17 -0
  437. package/examples/Markers.svelte +1 -1
  438. package/examples/MovingAverage.svelte +1 -1
  439. package/examples/Pyramid.svelte +9 -2
  440. package/examples/Regression.svelte +2 -2
  441. package/examples/ResponsiveLine.svelte +1 -1
  442. package/examples/Scales.svelte +1 -1
  443. package/examples/Scatter.svelte +2 -2
  444. package/examples/SegmentHighlight.svelte +1 -1
  445. package/examples/Segments.svelte +1 -1
  446. package/examples/SegmentsBySeries.svelte +1 -1
  447. package/examples/Slope.svelte +17 -0
  448. package/examples/Sparkline.svelte +14 -0
  449. package/examples/StackedArea.svelte +1 -1
  450. package/examples/StackedBars.svelte +1 -1
  451. package/examples/TimelinePlayer.svelte +1 -1
  452. package/examples/TimelineRule.svelte +1 -1
  453. package/examples/Tooltip.svelte +1 -1
  454. package/examples/ValueLabels.svelte +1 -1
  455. package/examples/Violin.svelte +14 -0
  456. package/examples/datasets/argentina-chile-trends.ts +34 -0
  457. package/examples/datasets/commodity-prices.ts +48 -0
  458. package/examples/datasets/countries-over-time.ts +368 -0
  459. package/examples/datasets/daily-temperature.ts +121 -0
  460. package/examples/datasets/earthquakes.ts +977 -0
  461. package/examples/datasets/flight-routes.ts +29 -0
  462. package/examples/datasets/height-density.ts +37 -0
  463. package/examples/datasets/heights.ts +370 -0
  464. package/examples/datasets/index.ts +24 -0
  465. package/examples/datasets/inflation-by-region.ts +44 -0
  466. package/examples/datasets/inflation-ranges.ts +34 -0
  467. package/examples/datasets/iris-flower.ts +207 -0
  468. package/examples/datasets/life-expectancy.ts +95 -0
  469. package/examples/datasets/napoleons-march.ts +182 -0
  470. package/examples/datasets/penguins.ts +54 -0
  471. package/examples/datasets/population-by-age-with-gaps.ts +23 -0
  472. package/examples/datasets/population-by-age.ts +890 -0
  473. package/examples/datasets/province-population.ts +521 -0
  474. package/examples/datasets/stock-prices.ts +63 -0
  475. package/examples/datasets/weather-stations-over-time.ts +31 -0
  476. package/examples/datasets/weather-stations.ts +22 -0
  477. package/examples/datasets/wind-vectors.ts +30 -0
  478. package/examples/datasets/world-temperature.ts +400 -0
  479. package/llms-full.txt +22 -11
  480. package/llms.txt +32 -4
  481. package/package.json +10 -1
  482. package/dist/plots/bar/defaults.d.ts +0 -9
  483. package/dist/plots/geo/features.svelte.d.ts +0 -5
  484. package/dist/plots/geo/features.svelte.js +0 -44
  485. package/dist/plots/geo/phases/tooltip.js +0 -5
  486. package/dist/plots/utils/geoAccessors.d.ts +0 -72
  487. package/dist/plots/utils/geoAccessors.js +0 -220
  488. package/dist/plots/utils/geoSegments.d.ts +0 -29
  489. package/dist/plots/utils/geoSegments.js +0 -37
  490. package/dist/types/layout/styles.d.ts +0 -122
  491. package/dist/types/markers/axis/curveName.d.ts +0 -2
  492. package/dist/types/plots/line/props.d.ts +0 -10
  493. package/dist/utils/color/contrast.d.ts +0 -9
  494. package/dist/utils/color/contrast.js +0 -40
  495. package/dist/utils/color/cssColor.d.ts +0 -4
  496. package/dist/utils/color/cssColor.js +0 -77
  497. package/dist/utils/color/ramp.d.ts +0 -17
  498. package/dist/utils/color/ramp.js +0 -110
  499. package/dist/utils/opacity.d.ts +0 -9
  500. package/dist/utils/opacity.js +0 -38
  501. package/examples/data.ts +0 -324
  502. /package/dist/plots/{box → distribution/box}/markers.js +0 -0
  503. /package/dist/types/layout/{styles.js → statistics/deviation.js} +0 -0
  504. /package/dist/types/{markers/axis/curveName.js → layout/styles/base.js} +0 -0
  505. /package/dist/types/{plots/area/props.js → layout/styles/bullet.js} +0 -0
  506. /package/dist/types/{plots/area/state.js → layout/styles/connector.js} +0 -0
  507. /package/dist/types/{plots/bar/props.js → layout/styles/curve.js} +0 -0
  508. /package/dist/types/{plots/bar/state.js → layout/styles/frame.js} +0 -0
  509. /package/dist/types/{plots/box/props.js → layout/styles/gaps.js} +0 -0
  510. /package/dist/types/{plots/box/state.js → layout/styles/geo.js} +0 -0
  511. /package/dist/types/{plots/geo/props.js → layout/styles/values.js} +0 -0
  512. /package/dist/types/{plots/geo/state.js → markers/axis/violin.js} +0 -0
  513. /package/dist/types/{plots/heatmap/props.js → markers/channels/commonMarkerConfigWithRowOffset.js} +0 -0
  514. /package/dist/types/plots/{histogram → correlation/heatmap}/props.js +0 -0
  515. /package/dist/types/plots/{heatmap → correlation/heatmap}/state.js +0 -0
  516. /package/dist/types/plots/{line → correlation/scatter}/props.js +0 -0
  517. /package/dist/types/plots/{histogram → correlation/scatter}/state.js +0 -0
  518. /package/dist/types/plots/{pyramid → distribution/box}/props.js +0 -0
  519. /package/dist/types/plots/{line → distribution/box}/state.js +0 -0
  520. /package/dist/types/plots/{scatter → distribution/density}/props.js +0 -0
  521. /package/dist/types/plots/{pyramid → distribution/density}/state.js +0 -0
  522. /package/dist/types/plots/{scatter/state.js → distribution/histogram/props.js} +0 -0
  523. /package/dist/{plots/utils → utils}/accessors.d.ts +0 -0
  524. /package/dist/{plots/utils → utils}/accessors.js +0 -0
@@ -3,6 +3,8 @@
3
3
  import { usePlot } from '../../layout/plot/usePlot';
4
4
  import { getConfiguration } from '../../configuration/config.svelte';
5
5
  import { BandNudge } from '../utils/BandNudge';
6
+ import { RowOffset } from '../utils/RowOffset';
7
+ import RowOffsetMarks from '../utils/RowOffsetMarks.svelte';
6
8
  import { Declutter } from './Declutter';
7
9
  import { PlotMargins } from '../../layout/margins/PlotMargins.svelte';
8
10
  import { Box } from '../../layout/margins/Box';
@@ -34,7 +36,12 @@
34
36
  const text = $derived(marker.text ?? '');
35
37
  const styles = $derived(marker.styles);
36
38
 
37
- const displayData = $derived(data.length > 0 ? data : [{} as TData]);
39
+ // A label placed by a literal (or by the frame) draws once without rows; one placed by a field of its rows draws nothing.
40
+ const placedByRows = (position: unknown) =>
41
+ ['string', 'function', 'symbol'].includes(typeof position);
42
+ const displayData = $derived(
43
+ data.length > 0 ? data : placedByRows(x) || placedByRows(y) ? [] : [{} as TData]
44
+ );
38
45
  // Per-row accessors give literal values; an empty one takes the flat default.
39
46
  const flatFill = $derived(styles?.fill ?? 'currentColor');
40
47
  const fill = $derived.by(() => {
@@ -50,14 +57,27 @@
50
57
  const fontWeight = $derived(styles?.fontWeight ?? 'normal');
51
58
  const fontStyleProp = $derived(styles?.fontStyle ?? 'normal');
52
59
  // An unresolved `'outside'` falls back to `'start'`.
53
- const textAnchor = $derived<Exclude<TextAnchor, 'outside'>>(
54
- styles?.textAnchor === 'outside' ? 'start' : (styles?.textAnchor ?? 'middle')
60
+ const anchorOf = (anchor: TextAnchor | undefined): Exclude<TextAnchor, 'outside'> =>
61
+ anchor === 'outside' ? 'start' : (anchor ?? 'middle');
62
+ const textAnchor = $derived(
63
+ anchorOf(
64
+ typeof marker.textAnchor === 'function'
65
+ ? undefined
66
+ : (marker.textAnchor ?? styles?.textAnchor)
67
+ )
55
68
  );
56
69
  const lineAnchor = $derived(styles?.lineAnchor ?? 'middle');
57
70
  // A label in a slice of its band sits off the band's middle, at its drawn width.
58
71
  const nudge = $derived(BandNudge.of(plot.scales, marker.bandSlice));
59
- const dx = $derived((styles?.dx ?? 0) + nudge.dx);
60
- const dy = $derived((styles?.dy ?? 0) + nudge.dy);
72
+ // The fixed offset, which `declutter` and `edgeAware` place labels by; a function of the row moves each label after that, through `RowOffsetMarks`.
73
+ const fixedOffset = $derived(
74
+ RowOffset.whole(marker, { dx: styles?.dx ?? 0, dy: styles?.dy ?? 0 })
75
+ );
76
+ const dx = $derived(fixedOffset.dx + nudge.dx);
77
+ const dy = $derived(fixedOffset.dy + nudge.dy);
78
+ const anchorAt = (d: TData) =>
79
+ typeof marker.textAnchor === 'function' ? anchorOf(marker.textAnchor(d)) : textAnchor;
80
+ const projected = $derived(!!plot.scales.projection);
61
81
 
62
82
  const declutter = $derived.by(() => {
63
83
  if (!marker.declutter) return undefined;
@@ -67,11 +87,17 @@
67
87
  elbowGap: own.elbowGap ?? defaults.elbowGap,
68
88
  laneStep: own.laneStep ?? defaults.laneStep,
69
89
  labelGap: own.labelGap ?? defaults.labelGap,
90
+ aligned: own.aligned,
91
+ flip: own.flip,
70
92
  connector: { ...defaults.connector, ...own.connector }
71
93
  };
72
94
  });
73
95
  const perRow = $derived(
74
- !!declutter || !!marker.edgeAware || !!marker.onPointerEnter || !!marker.onPointerLeave
96
+ !!declutter ||
97
+ !!marker.edgeAware ||
98
+ !!marker.onPointerEnter ||
99
+ !!marker.onPointerLeave ||
100
+ typeof marker.textAnchor === 'function'
75
101
  );
76
102
  const dir = $derived(Math.sign(dx) || 1);
77
103
 
@@ -99,9 +125,13 @@
99
125
  if ((!declutter && !marker.edgeAware) || !xScale || !yScale) return undefined;
100
126
  const xOf = channel(x ?? 0);
101
127
  const yOf = channel(y ?? 0);
128
+ // A band's position is its start; a mark sits at its middle.
129
+ const middle = (scale: typeof plot.scales.x) =>
130
+ scale?.type === 'band' ? scale.fn.bandwidth() / 2 : 0;
131
+ const [dx0, dy0] = [middle(plot.scales.x), middle(plot.scales.y)];
102
132
  return displayData.map((d) => ({
103
- px: Number(xScale(xOf(d) as never)),
104
- py: Number(yScale(yOf(d) as never))
133
+ px: Number(xScale(xOf(d) as never)) + dx0,
134
+ py: Number(yScale(yOf(d) as never)) + dy0
105
135
  }));
106
136
  });
107
137
 
@@ -112,6 +142,8 @@
112
142
  dx,
113
143
  fontSize,
114
144
  geometry: declutter,
145
+ forceAligned: declutter.aligned,
146
+ flip: declutter.flip,
115
147
  bounds
116
148
  })
117
149
  : undefined
@@ -157,33 +189,40 @@
157
189
  rowAnchor: typeof textAnchor,
158
190
  rowLineAnchor: typeof lineAnchor
159
191
  )}
160
- <Text
161
- data={rows}
162
- x={x ?? 0}
163
- y={y ?? 0}
164
- text={text ?? ''}
165
- dx={rowDx}
166
- dy={rowDy}
167
- fill={fill as never}
168
- fillOpacity={fillOpacity as never}
169
- {fontSize}
170
- {fontWeight}
171
- textAnchor={rowAnchor}
172
- lineAnchor={rowLineAnchor}
173
- fontStyle={fontStyleProp}
174
- lineHeight={styles?.lineHeight}
175
- rotate={styles?.rotate}
176
- stroke={styles?.stroke}
177
- strokeWidth={styles?.strokeWidth}
178
- paintOrder={styles?.paintOrder}
179
- class={styles?.class}
180
- textClass={styles?.textClass}
181
- />
192
+ <g transform={projected ? `translate(${rowDx},${rowDy})` : undefined}>
193
+ <Text
194
+ data={rows}
195
+ x={x ?? (marker.frameAnchor ? undefined : 0)}
196
+ y={y ?? (marker.frameAnchor ? undefined : 0)}
197
+ frameAnchor={marker.frameAnchor}
198
+ text={text ?? ''}
199
+ dx={projected ? 0 : rowDx}
200
+ dy={projected ? 0 : rowDy}
201
+ fill={fill as never}
202
+ fillOpacity={fillOpacity as never}
203
+ {fontSize}
204
+ {fontWeight}
205
+ textAnchor={rowAnchor}
206
+ lineAnchor={rowLineAnchor}
207
+ fontStyle={fontStyleProp}
208
+ lineHeight={styles?.lineHeight}
209
+ rotate={styles?.rotate}
210
+ stroke={styles?.stroke}
211
+ strokeWidth={styles?.strokeWidth}
212
+ paintOrder={styles?.paintOrder}
213
+ class={styles?.class}
214
+ textClass={styles?.textClass}
215
+ />
216
+ </g>
182
217
  {/snippet}
183
218
 
184
219
  {#snippet labels()}
185
220
  {#if !perRow}
186
- {@render label(displayData, dx, dy, textAnchor, lineAnchor)}
221
+ <RowOffsetMarks {marker} rows={displayData}>
222
+ {#snippet mark(rows)}
223
+ {@render label(rows, dx, dy, textAnchor, lineAnchor)}
224
+ {/snippet}
225
+ </RowOffsetMarks>
187
226
  {:else if (!declutter && !marker.edgeAware) || points}
188
227
  <!-- A decluttered or edge-aware label waits for both scales. -->
189
228
  {#each displayData as d, i (i)}
@@ -213,23 +252,27 @@
213
252
  onpointerenter={marker.onPointerEnter && (() => marker.onPointerEnter?.(d))}
214
253
  onpointerleave={marker.onPointerLeave && (() => marker.onPointerLeave?.(d))}
215
254
  >
216
- {#if placement}
217
- {@render label(
218
- [d],
219
- placement.dx,
220
- placement.dy + extraDy,
221
- placement.textAnchor,
222
- placement.lineAnchor
223
- )}
224
- {:else}
225
- {@render label(
226
- [d],
227
- labelDx,
228
- dy + extraDy,
229
- lane?.aligned && laneDir !== dir ? flipAnchor(textAnchor) : textAnchor,
230
- lineAnchor
231
- )}
232
- {/if}
255
+ <RowOffsetMarks {marker} rows={[d]}>
256
+ {#snippet mark(rows)}
257
+ {#if placement}
258
+ {@render label(
259
+ rows,
260
+ placement.dx,
261
+ placement.dy + extraDy,
262
+ placement.textAnchor,
263
+ placement.lineAnchor
264
+ )}
265
+ {:else}
266
+ {@render label(
267
+ rows,
268
+ labelDx,
269
+ dy + extraDy,
270
+ lane?.aligned && laneDir !== dir ? flipAnchor(anchorAt(d)) : anchorAt(d),
271
+ lineAnchor
272
+ )}
273
+ {/if}
274
+ {/snippet}
275
+ </RowOffsetMarks>
233
276
  </g>
234
277
  {/each}
235
278
  {/if}
@@ -10,35 +10,37 @@
10
10
 
11
11
  const plot = usePlot();
12
12
  const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
13
+ const TickMark = $derived(isHorizontal ? TickX : TickY);
13
14
 
14
15
  const cfg = $derived(getConfiguration());
15
16
  const data = $derived(marker.data ?? []);
16
17
  const channelStroke = $derived(MarkerChannels.buildFill(data, marker.color, marker.scales, cfg));
17
18
  const stroke = $derived(channelStroke ?? marker.styles?.stroke ?? 'currentColor');
19
+
20
+ /**
21
+ * A tick across a band axis spans the whole band, whatever `tickLength` says -
22
+ * svelteplot reads it only off a band-less axis. A fixed `tickLength` there is
23
+ * made true by insetting the tick from both edges of its band.
24
+ */
25
+ const inset = $derived.by(() => {
26
+ const length = marker.tickLength;
27
+ const across = plot.svelteplot.scales[isHorizontal ? 'y' : 'x'];
28
+ if (typeof length !== 'number' || across.type !== 'band') return undefined;
29
+ return Math.max(0, (across.fn.bandwidth() - length) / 2);
30
+ });
31
+ /** svelteplot's tick marks read `inset` though their types do not list it. */
32
+ const insetProps = $derived((inset === undefined ? {} : { inset }) as Record<string, unknown>);
18
33
  </script>
19
34
 
20
- {#if isHorizontal}
21
- <TickX
22
- {data}
23
- x={marker.x}
24
- y={marker.y}
25
- tickLength={marker.tickLength}
26
- {stroke}
27
- strokeWidth={marker.styles?.strokeWidth}
28
- strokeOpacity={marker.styles?.strokeOpacity}
29
- strokeDasharray={marker.styles?.strokeDasharray}
30
- strokeLinecap={marker.styles?.strokeLinecap}
31
- />
32
- {:else}
33
- <TickY
34
- {data}
35
- x={marker.x}
36
- y={marker.y}
37
- tickLength={marker.tickLength}
38
- {stroke}
39
- strokeWidth={marker.styles?.strokeWidth}
40
- strokeOpacity={marker.styles?.strokeOpacity}
41
- strokeDasharray={marker.styles?.strokeDasharray}
42
- strokeLinecap={marker.styles?.strokeLinecap}
43
- />
44
- {/if}
35
+ <TickMark
36
+ {data}
37
+ x={marker.x}
38
+ y={marker.y}
39
+ tickLength={marker.tickLength}
40
+ {...insetProps}
41
+ {stroke}
42
+ strokeWidth={marker.styles?.strokeWidth}
43
+ strokeOpacity={marker.styles?.strokeOpacity}
44
+ strokeDasharray={marker.styles?.strokeDasharray}
45
+ strokeLinecap={marker.styles?.strokeLinecap}
46
+ />
@@ -1,4 +1,5 @@
1
1
  import type { ChannelScalesConfig } from '../../types/layout/scales';
2
+ import type { ProcessedData } from '../../types/phases';
2
3
  import type { SymbolType } from '../../types/plots/constants';
3
4
  import type { PlotStylesConfig } from '../../types/configuration/styling';
4
5
  /** One resolved opacity bucket: every row in `data` renders at exactly `value`. */
@@ -11,6 +12,29 @@ export type OpacityBucket<TData> = {
11
12
  * over its rows, shared by every marker kind that intersects `CommonMarkerConfig`.
12
13
  */
13
14
  export declare class MarkerChannels {
15
+ /**
16
+ * The scales a marker with none of its own draws with: the plot's, except
17
+ * a numeric color `domain` - it spans the plot's own values, so the
18
+ * marker's own values would all land at one end of it. The scheme (and
19
+ * pivot) carry over; the domain is read from the marker's own rows.
20
+ */
21
+ static inheritScales(own: ChannelScalesConfig | undefined, plot: ChannelScalesConfig | undefined): ChannelScalesConfig | undefined;
22
+ /** `markers`, each `dot` with no scales of its own carrying the plot's ({@link inheritScales}). */
23
+ static inheritAll<TMarker extends {
24
+ type: string;
25
+ scales?: ChannelScalesConfig;
26
+ }>(markers: TMarker[], plot: ChannelScalesConfig | undefined): TMarker[];
27
+ /**
28
+ * `markers`, each `bollinger` that draws the plot's own rows (it sets no `data`)
29
+ * and no `x` or `y` of its own, reading the plot's: they are the same rows, so
30
+ * the same channels place them.
31
+ */
32
+ static inheritPosition<TMarker extends {
33
+ type: string;
34
+ data?: unknown;
35
+ x?: unknown;
36
+ y?: unknown;
37
+ }>(markers: TMarker[], processed: ProcessedData | undefined): TMarker[];
14
38
  /**
15
39
  * Resolves a `CommonMarkerConfig` pair into a per-row fill accessor, or
16
40
  * `undefined` when `color` is unset (caller falls back to its own flat
@@ -1,11 +1,45 @@
1
- import { resolveColorScale } from '../../utils/color';
2
- import { resolveOpacityScale } from '../../utils/opacity';
3
- import { resolveSymbolScale } from '../../utils/symbol';
1
+ import { resolveAccessor } from '../../utils/accessors';
2
+ import { ColorRamp } from '../../utils/color';
3
+ import { OpacityScale } from '../../utils/OpacityScale';
4
+ import { SymbolScale } from '../../utils/SymbolScale';
4
5
  /**
5
6
  * What a marker's own `color`, `symbol` and `opacity` channels resolve to,
6
7
  * over its rows, shared by every marker kind that intersects `CommonMarkerConfig`.
7
8
  */
8
9
  export class MarkerChannels {
10
+ /**
11
+ * The scales a marker with none of its own draws with: the plot's, except
12
+ * a numeric color `domain` - it spans the plot's own values, so the
13
+ * marker's own values would all land at one end of it. The scheme (and
14
+ * pivot) carry over; the domain is read from the marker's own rows.
15
+ */
16
+ static inheritScales(own, plot) {
17
+ if (own || !plot?.color)
18
+ return own ?? plot;
19
+ const { domain, ...color } = plot.color;
20
+ const numeric = Array.isArray(domain) && domain.every((v) => typeof v === 'number');
21
+ return { ...plot, color: numeric ? color : plot.color };
22
+ }
23
+ /** `markers`, each `dot` with no scales of its own carrying the plot's ({@link inheritScales}). */
24
+ static inheritAll(markers, plot) {
25
+ return markers.map((marker) => marker.type === 'dot' && !marker.scales
26
+ ? { ...marker, scales: MarkerChannels.inheritScales(undefined, plot) }
27
+ : marker);
28
+ }
29
+ /**
30
+ * `markers`, each `bollinger` that draws the plot's own rows (it sets no `data`)
31
+ * and no `x` or `y` of its own, reading the plot's: they are the same rows, so
32
+ * the same channels place them.
33
+ */
34
+ static inheritPosition(markers, processed) {
35
+ if (!processed)
36
+ return markers;
37
+ const read = (channel) => channel === undefined ? undefined : resolveAccessor(channel);
38
+ const plot = { x: read(processed.channels.x), y: read(processed.channels.y) };
39
+ return markers.map((marker) => marker.type === 'bollinger' && marker.data === undefined
40
+ ? { ...marker, x: marker.x ?? plot.x, y: marker.y ?? plot.y }
41
+ : marker);
42
+ }
9
43
  /**
10
44
  * Resolves a `CommonMarkerConfig` pair into a per-row fill accessor, or
11
45
  * `undefined` when `color` is unset (caller falls back to its own flat
@@ -29,8 +63,9 @@ export class MarkerChannels {
29
63
  const domain = allNumeric
30
64
  ? [Math.min(...rawVals.map(Number)), Math.max(...rawVals.map(Number))]
31
65
  : [...new Set(rawVals.map(String))];
32
- const defaultScheme = allNumeric ? [cfg.continuous.min, cfg.continuous.max] : cfg.palette;
33
- const colorScale = resolveColorScale(scales?.color, domain, defaultScheme);
66
+ const colorScale = allNumeric
67
+ ? ColorRamp.continuous(cfg, scales?.color, domain)
68
+ : ColorRamp.resolve(scales?.color, domain, cfg.palette);
34
69
  return (d) => colorScale(colorFn(d));
35
70
  }
36
71
  /**
@@ -51,7 +86,7 @@ export class MarkerChannels {
51
86
  ];
52
87
  if (!domain.length)
53
88
  return undefined;
54
- const scale = resolveSymbolScale(scales?.symbol, domain, cfg.symbols);
89
+ const scale = SymbolScale.resolve(scales?.symbol, domain, cfg.symbols);
55
90
  return (d) => scale(symbolFn(d));
56
91
  }
57
92
  /**
@@ -83,7 +118,7 @@ export class MarkerChannels {
83
118
  const domain = allNumeric
84
119
  ? [Math.min(...rawVals.map(Number)), Math.max(...rawVals.map(Number))]
85
120
  : [...new Set(rawVals.map(String))];
86
- const scale = resolveOpacityScale(scales?.opacity, domain, cfg.continuous.opacityRange);
121
+ const scale = OpacityScale.resolve(scales?.opacity, domain, cfg.continuous.opacityRange);
87
122
  const buckets = new Map();
88
123
  for (const d of data) {
89
124
  const resolved = scale(opacityFn(d));
@@ -0,0 +1,23 @@
1
+ import type { RowOffset as RowOffsetConfig } from '../../types/markers/channels/commonMarkerConfigWithRowOffset';
2
+ type Offsets = {
3
+ dx?: RowOffsetConfig;
4
+ dy?: RowOffsetConfig;
5
+ };
6
+ type Pixels = {
7
+ dx: number;
8
+ dy: number;
9
+ };
10
+ /**
11
+ * A marker's `dx`/`dy`: numbers move the whole marker (drawn once by
12
+ * `MarkerOffset`), functions move each row (drawn by the marker itself, with
13
+ * `RowOffsetMarks`), so no part is applied twice.
14
+ */
15
+ export declare class RowOffset {
16
+ /** The numeric part, for the whole marker; a part left unset takes `fallback`, a function counts as none. */
17
+ static whole(marker: Offsets, fallback?: Pixels): Pixels;
18
+ /** Whether any part of the offset is a function of the row. */
19
+ static isPerRow(marker: Offsets): boolean;
20
+ /** The functional part, for one row. */
21
+ static ofRow(marker: Offsets, row: unknown): Pixels;
22
+ }
23
+ export {};
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A marker's `dx`/`dy`: numbers move the whole marker (drawn once by
3
+ * `MarkerOffset`), functions move each row (drawn by the marker itself, with
4
+ * `RowOffsetMarks`), so no part is applied twice.
5
+ */
6
+ export class RowOffset {
7
+ /** The numeric part, for the whole marker; a part left unset takes `fallback`, a function counts as none. */
8
+ static whole(marker, fallback = { dx: 0, dy: 0 }) {
9
+ const part = (own, otherwise) => typeof own === 'function' ? 0 : (own ?? otherwise);
10
+ return { dx: part(marker.dx, fallback.dx), dy: part(marker.dy, fallback.dy) };
11
+ }
12
+ /** Whether any part of the offset is a function of the row. */
13
+ static isPerRow(marker) {
14
+ return typeof marker.dx === 'function' || typeof marker.dy === 'function';
15
+ }
16
+ /** The functional part, for one row. */
17
+ static ofRow(marker, row) {
18
+ return {
19
+ dx: typeof marker.dx === 'function' ? (marker.dx(row) ?? 0) : 0,
20
+ dy: typeof marker.dy === 'function' ? (marker.dy(row) ?? 0) : 0
21
+ };
22
+ }
23
+ }
@@ -0,0 +1,30 @@
1
+ <script lang="ts" generics="TRow">
2
+ import type { Snippet } from 'svelte';
3
+ import { RowOffset } from './RowOffset';
4
+ import type { RowOffset as RowOffsetConfig } from '../../types/markers/channels/commonMarkerConfigWithRowOffset';
5
+
6
+ /**
7
+ * Draws a marker's rows through `mark`, each moved by the marker's per-row
8
+ * `dx`/`dy` (a function of the row). A fixed offset is not applied here -
9
+ * `MarkerOffset` moves the whole marker. With no function offset, the rows
10
+ * are drawn together as they are.
11
+ */
12
+ let {
13
+ marker,
14
+ rows,
15
+ mark
16
+ }: {
17
+ marker: { dx?: RowOffsetConfig; dy?: RowOffsetConfig };
18
+ rows: TRow[];
19
+ mark: Snippet<[TRow[]]>;
20
+ } = $props();
21
+ </script>
22
+
23
+ {#if RowOffset.isPerRow(marker)}
24
+ {#each rows as row, index (index)}
25
+ {@const { dx, dy } = RowOffset.ofRow(marker, row)}
26
+ <g transform="translate({dx},{dy})">{@render mark([row])}</g>
27
+ {/each}
28
+ {:else}
29
+ {@render mark(rows)}
30
+ {/if}
@@ -0,0 +1,33 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { RowOffset as RowOffsetConfig } from '../../types/markers/channels/commonMarkerConfigWithRowOffset';
3
+ declare function $$render<TRow>(): {
4
+ props: {
5
+ marker: {
6
+ dx?: RowOffsetConfig;
7
+ dy?: RowOffsetConfig;
8
+ };
9
+ rows: TRow[];
10
+ mark: Snippet<[TRow[]]>;
11
+ };
12
+ exports: {};
13
+ bindings: "";
14
+ slots: {};
15
+ events: {};
16
+ };
17
+ declare class __sveltets_Render<TRow> {
18
+ props(): ReturnType<typeof $$render<TRow>>['props'];
19
+ events(): ReturnType<typeof $$render<TRow>>['events'];
20
+ slots(): ReturnType<typeof $$render<TRow>>['slots'];
21
+ bindings(): "";
22
+ exports(): {};
23
+ }
24
+ interface $$IsomorphicComponent {
25
+ new <TRow>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TRow>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TRow>['props']>, ReturnType<__sveltets_Render<TRow>['events']>, ReturnType<__sveltets_Render<TRow>['slots']>> & {
26
+ $$bindings?: ReturnType<__sveltets_Render<TRow>['bindings']>;
27
+ } & ReturnType<__sveltets_Render<TRow>['exports']>;
28
+ <TRow>(internal: unknown, props: ReturnType<__sveltets_Render<TRow>['props']> & {}): ReturnType<__sveltets_Render<TRow>['exports']>;
29
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
30
+ }
31
+ declare const RowOffsetMarks: $$IsomorphicComponent;
32
+ type RowOffsetMarks<TRow> = InstanceType<typeof RowOffsetMarks<TRow>>;
33
+ export default RowOffsetMarks;
@@ -0,0 +1,31 @@
1
+ import type { StrokeStyle } from '../../types/plots/styling';
2
+ /** A stroke channel per row: a field key of the row, or a function of it. */
3
+ type RowChannel<T> = string | ((d: never) => T) | undefined;
4
+ /**
5
+ * The stroke of a line-like marker that takes it row by row (a `rule`, an
6
+ * `arrow`): each of `stroke`, `strokeWidth` and `strokeOpacity` is a field of
7
+ * the row or a function of it, else the marker's own `styles`, else a default.
8
+ * A color and an opacity per row are drawn as they are - svelteplot would map
9
+ * them through its own color and opacity scales.
10
+ */
11
+ export declare class RowStroke {
12
+ #private;
13
+ /** The props a mark takes for `channels`, over `styles` and the given `fallback`s. */
14
+ static of(channels: {
15
+ stroke?: RowChannel<string | undefined>;
16
+ strokeWidth?: RowChannel<number>;
17
+ strokeOpacity?: RowChannel<number>;
18
+ }, styles: StrokeStyle | undefined, fallback: {
19
+ stroke: string;
20
+ strokeWidth?: number;
21
+ strokeOpacity?: number;
22
+ }): {
23
+ stroke: string | {
24
+ value: (d: Record<string, unknown>) => string | undefined;
25
+ scale: null;
26
+ };
27
+ strokeWidth: number | ((d: Record<string, unknown>) => number) | undefined;
28
+ strokeOpacity: never;
29
+ };
30
+ }
31
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The stroke of a line-like marker that takes it row by row (a `rule`, an
3
+ * `arrow`): each of `stroke`, `strokeWidth` and `strokeOpacity` is a field of
4
+ * the row or a function of it, else the marker's own `styles`, else a default.
5
+ * A color and an opacity per row are drawn as they are - svelteplot would map
6
+ * them through its own color and opacity scales.
7
+ */
8
+ export class RowStroke {
9
+ /** A per-row channel as the function svelteplot reads. */
10
+ static #accessor(channel) {
11
+ return typeof channel === 'string'
12
+ ? (d) => d[channel]
13
+ : channel;
14
+ }
15
+ /** The props a mark takes for `channels`, over `styles` and the given `fallback`s. */
16
+ static of(channels, styles, fallback) {
17
+ const color = RowStroke.#accessor(channels.stroke);
18
+ const width = RowStroke.#accessor(channels.strokeWidth);
19
+ const opacity = RowStroke.#accessor(channels.strokeOpacity);
20
+ return {
21
+ stroke: color ? { value: color, scale: null } : (styles?.stroke ?? fallback.stroke),
22
+ strokeWidth: width ?? styles?.strokeWidth ?? fallback.strokeWidth,
23
+ strokeOpacity: (opacity
24
+ ? { value: opacity, scale: null }
25
+ : (styles?.strokeOpacity ?? fallback.strokeOpacity))
26
+ };
27
+ }
28
+ }
@@ -0,0 +1,75 @@
1
+ <script lang="ts">
2
+ import { usePlot } from '../../layout/plot/usePlot';
3
+ import { getConfiguration } from '../../configuration/config.svelte';
4
+ import { resolveAccessor } from '../../utils/accessors';
5
+ import { ViolinProfiles } from './ViolinProfiles';
6
+ import type { ViolinMarkerConfig } from '../../types/markers/common';
7
+ import type { ProcessedRow } from '../../types/phases';
8
+
9
+ /**
10
+ * Renders one `'violin'` marker: for each category of its rows, the density
11
+ * curve mirrored around the middle of the category's band, or of the share of
12
+ * it the marker's `slot` takes. The curve is drawn on the plot's own scales;
13
+ * the plot's axes say which of `x`/`y` holds the category.
14
+ */
15
+ let { marker }: { marker: ViolinMarkerConfig } = $props();
16
+
17
+ const plot = usePlot();
18
+ const cfg = $derived(getConfiguration());
19
+ const isHorizontal = $derived(plot.axes?.isHorizontal ?? false);
20
+ const categoryScale = $derived(
21
+ isHorizontal ? plot.svelteplot.scales.y : plot.svelteplot.scales.x
22
+ );
23
+ const valueScale = $derived(isHorizontal ? plot.svelteplot.scales.x : plot.svelteplot.scales.y);
24
+
25
+ const data = $derived((marker.data ?? []) as ProcessedRow[]);
26
+ const profiles = $derived(
27
+ ViolinProfiles.of(
28
+ data,
29
+ {
30
+ category: resolveAccessor((isHorizontal ? marker.y : marker.x) as never),
31
+ value: resolveAccessor((isHorizontal ? marker.x : marker.y) as never)
32
+ },
33
+ { kernel: marker.kernel, bandwidth: marker.bandwidth, trim: marker.trim }
34
+ )
35
+ );
36
+
37
+ const slotIndex = $derived(marker.slot?.index ?? 0);
38
+ const slotCount = $derived(marker.slot?.count ?? 1);
39
+ const bandwidth = $derived(categoryScale?.type === 'band' ? categoryScale.fn.bandwidth() : 0);
40
+ const share = $derived(bandwidth / slotCount);
41
+
42
+ /** The pixel point at `along` the value axis and `across` the category axis. */
43
+ const point = (across: number, along: number): [number, number] =>
44
+ isHorizontal ? [along, across] : [across, along];
45
+ const at = (value: number) => Number(valueScale?.fn?.(value as never));
46
+
47
+ const shapes = $derived.by(() => {
48
+ if (categoryScale?.type !== 'band' || !valueScale?.fn) return [];
49
+ return profiles.flatMap((profile) => {
50
+ const start = Number(categoryScale.fn(profile.category as never));
51
+ if (!Number.isFinite(start)) return [];
52
+ const center = start + share * slotIndex + share / 2;
53
+ const full = marker.peak ?? Math.max(...profile.curve.map((p) => p.density));
54
+ const half = (density: number) => (full > 0 ? (density / full) * (share / 2) : 0);
55
+ const side = (sign: 1 | -1) =>
56
+ profile.curve.map((p) => point(center + sign * half(p.density), at(p.value)));
57
+ const outline = [...side(-1), ...side(1).reverse()];
58
+ return [outline.map(([x, y], i) => `${i ? 'L' : 'M'}${x},${y}`).join('') + 'Z'];
59
+ });
60
+ });
61
+ </script>
62
+
63
+ <g class="dct-violin">
64
+ {#each shapes as d, i (i)}
65
+ <path
66
+ {d}
67
+ fill={marker.styles?.fill}
68
+ fill-opacity={marker.styles?.fillOpacity ?? cfg.violin.fillOpacity}
69
+ stroke={marker.styles?.stroke}
70
+ stroke-width={marker.styles?.strokeWidth}
71
+ stroke-opacity={marker.styles?.strokeOpacity}
72
+ stroke-dasharray={marker.styles?.strokeDasharray}
73
+ />
74
+ {/each}
75
+ </g>
@@ -0,0 +1,7 @@
1
+ import type { ViolinMarkerConfig } from '../../types/markers/common';
2
+ type $$ComponentProps = {
3
+ marker: ViolinMarkerConfig;
4
+ };
5
+ declare const ViolinMarker: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type ViolinMarker = ReturnType<typeof ViolinMarker>;
7
+ export default ViolinMarker;