@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
@@ -0,0 +1,120 @@
1
+ import { interpolateRgb, piecewise } from 'd3-interpolate';
2
+ import * as d3Chromatic from 'd3-scale-chromatic';
3
+ import { CssColor } from './CssColor';
4
+ /** A value mapped to a color: a continuous ramp between colors, or a color per category. */
5
+ export class ColorRamp {
6
+ /** `{turbo: interpolateTurbo, blues: interpolateBlues, ...}`, built from every `interpolate*` d3-scale-chromatic export. */
7
+ static NAMED = Object.fromEntries(Object.entries(d3Chromatic)
8
+ .filter((entry) => entry[0].startsWith('interpolate'))
9
+ .map(([name, fn]) => [name.slice('interpolate'.length).toLowerCase(), fn]));
10
+ /** Linearly maps `v` from `[min, max]` onto `[0, 1]`, clamped at both ends. */
11
+ static normalize(v, min, max) {
12
+ if (v == null)
13
+ return 0;
14
+ const denom = max - min || 1;
15
+ return Math.max(0, Math.min(1, (v - min) / denom));
16
+ }
17
+ /** A simple 2-color continuous ramp over `[min, max]`. */
18
+ static between(min, max, colorMin, colorMax) {
19
+ let interpolator;
20
+ try {
21
+ interpolator = interpolateRgb(CssColor.resolve(colorMin), CssColor.resolve(colorMax));
22
+ }
23
+ catch {
24
+ return () => '#ccc';
25
+ }
26
+ return (v) => {
27
+ if (v == null)
28
+ return '#ccc';
29
+ return interpolator(ColorRamp.normalize(v, min, max));
30
+ };
31
+ }
32
+ /**
33
+ * Resolves a {@link ColorScaleConfig} into a `value => color` function - the
34
+ * one shared implementation for every level the config can appear at
35
+ * (`scales.color`, a `segments` entry, a marker's own `scales`).
36
+ * `computedDomain` is the fallback when `config.domain` is unset;
37
+ * `defaultScheme` is used when `config.scheme` is unset - the theme's own
38
+ * 2-color continuous ramp, or a discrete palette for a categorical domain
39
+ * (e.g. per-series identity colors).
40
+ */
41
+ static resolve(config, computedDomain, defaultScheme) {
42
+ const domain = config?.domain ?? computedDomain;
43
+ const scheme = config?.scheme ?? defaultScheme;
44
+ const unknown = config?.unknown ?? '#ccc';
45
+ if (!domain || domain.length === 0)
46
+ return () => unknown;
47
+ // A category → color map always resolves by direct lookup, regardless of domain shape.
48
+ if (typeof scheme === 'object' && !Array.isArray(scheme)) {
49
+ return (v) => (v == null ? unknown : (scheme[String(v)] ?? unknown));
50
+ }
51
+ // A named d3-scale-chromatic ramp (e.g. 'turbo') resolves straight to its own interpolator.
52
+ const namedInterpolator = typeof scheme === 'string' ? ColorRamp.NAMED[scheme.toLowerCase()] : undefined;
53
+ if (typeof scheme === 'string' && !namedInterpolator)
54
+ return () => unknown;
55
+ const [from, to] = config?.schemeRange ?? [0, 1];
56
+ const named = namedInterpolator && ((t) => namedInterpolator(from + t * (to - from)));
57
+ const resolvedScheme = namedInterpolator
58
+ ? undefined
59
+ : scheme.map(CssColor.resolve);
60
+ if (resolvedScheme && resolvedScheme.length === 0)
61
+ return () => unknown;
62
+ if (resolvedScheme && resolvedScheme.length === 1) {
63
+ const only = resolvedScheme[0];
64
+ return () => only;
65
+ }
66
+ // Categorical domain (explicit category list): sample the ramp evenly, one stop per category.
67
+ if (typeof domain[0] === 'string') {
68
+ const categories = domain;
69
+ const swatches = resolvedScheme ??
70
+ categories.map((_, i) => named(categories.length > 1 ? i / (categories.length - 1) : 0));
71
+ return (v) => {
72
+ if (v == null)
73
+ return unknown;
74
+ const idx = categories.indexOf(String(v));
75
+ return idx < 0 ? unknown : swatches[idx % swatches.length];
76
+ };
77
+ }
78
+ // Continuous domain: interpolate smoothly across every scheme stop (or the named ramp directly).
79
+ const [lo, hi] = domain;
80
+ let interpolator;
81
+ if (namedInterpolator) {
82
+ interpolator = named;
83
+ }
84
+ else {
85
+ try {
86
+ interpolator = piecewise(interpolateRgb, resolvedScheme);
87
+ }
88
+ catch {
89
+ return () => unknown;
90
+ }
91
+ }
92
+ const pivot = config?.pivot;
93
+ const stopCount = resolvedScheme?.length ?? Infinity;
94
+ return (v) => {
95
+ if (v == null)
96
+ return unknown;
97
+ const n = Number(v);
98
+ if (Number.isNaN(n))
99
+ return unknown;
100
+ const t = pivot != null && stopCount >= 3
101
+ ? n <= pivot
102
+ ? 0.5 * ColorRamp.normalize(n, lo, pivot)
103
+ : 0.5 + 0.5 * ColorRamp.normalize(n, pivot, hi)
104
+ : ColorRamp.normalize(n, lo, hi);
105
+ return interpolator(t);
106
+ };
107
+ }
108
+ /**
109
+ * A numeric value as a color, through the configuration's default continuous ramp
110
+ * (a named `scheme`, else the colors `min` and `max`) unless `own` sets a scheme of its
111
+ * own. The configuration's `schemeRange` only trims the ramp it names.
112
+ */
113
+ static continuous(cfg, own, domain) {
114
+ const { scheme, schemeRange, min, max } = cfg.continuous;
115
+ const config = own?.scheme === undefined && scheme && schemeRange
116
+ ? { ...own, schemeRange: own?.schemeRange ?? schemeRange }
117
+ : own;
118
+ return ColorRamp.resolve({ ...config, domain }, domain, scheme ?? [min, max]);
119
+ }
120
+ }
@@ -0,0 +1,19 @@
1
+ type Rgb = [number, number, number];
2
+ /** A CSS color string: read into its red, green and blue, and judged against another by WCAG contrast. */
3
+ export declare class CssColor {
4
+ #private;
5
+ /** Resolves a `var(--x)` reference to its computed value; any other CSS color string passes through unchanged. */
6
+ static resolve(color: string): string;
7
+ /** Parses any CSS color syntax (hex, rgb(), oklch(), named colors, hsl(), ...) into an `[r, g, b]` (0-255) triple, or `null` if it can't be resolved. */
8
+ static parse(color: string): Rgb | null;
9
+ /** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
10
+ static contrastRatio(colorA: string, colorB: string): number;
11
+ /**
12
+ * The `candidates` entry with the highest WCAG contrast ratio against
13
+ * `background`. Defaults to plain white/black; pass a grayscale or other
14
+ * palette to widen the choice. Falls back to the first candidate when
15
+ * `background` can't be parsed.
16
+ */
17
+ static contrastText(background: string, candidates?: string[]): string;
18
+ }
19
+ export {};
@@ -0,0 +1,114 @@
1
+ import { isBrowser } from '../../stores/device';
2
+ /** A CSS color string: read into its red, green and blue, and judged against another by WCAG contrast. */
3
+ export class CssColor {
4
+ /** Resolves a `var(--x)` reference to its computed value; any other CSS color string passes through unchanged. */
5
+ static resolve(color) {
6
+ if (!isBrowser)
7
+ return color;
8
+ if (!color.startsWith('var('))
9
+ return color;
10
+ const varName = color.slice(4, -1).trim();
11
+ const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();
12
+ return value || color;
13
+ }
14
+ /** Parses any CSS color syntax (hex, rgb(), oklch(), named colors, hsl(), ...) into an `[r, g, b]` (0-255) triple, or `null` if it can't be resolved. */
15
+ static parse(color) {
16
+ const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color.trim());
17
+ if (hex) {
18
+ const digits = hex[1].length === 3
19
+ ? hex[1]
20
+ .split('')
21
+ .map((c) => c + c)
22
+ .join('')
23
+ : hex[1];
24
+ const num = parseInt(digits, 16);
25
+ return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
26
+ }
27
+ const rgb = /^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i.exec(color);
28
+ if (rgb)
29
+ return [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])];
30
+ const oklch = CssColor.#parseOklch(color);
31
+ if (oklch)
32
+ return oklch;
33
+ // Named colors, hsl(), and any other CSS color syntax: resolved to
34
+ // `rgb(...)` via the browser's computed style, then reparsed.
35
+ if (!isBrowser)
36
+ return null;
37
+ const el = document.createElement('div');
38
+ el.style.color = color;
39
+ document.body.appendChild(el);
40
+ const computed = getComputedStyle(el).color;
41
+ document.body.removeChild(el);
42
+ if (!computed || computed === color)
43
+ return null;
44
+ return CssColor.parse(computed);
45
+ }
46
+ /** WCAG contrast ratio between two colors, from 1 (no contrast) to 21 (black on white). */
47
+ static contrastRatio(colorA, colorB) {
48
+ const a = CssColor.parse(CssColor.resolve(colorA));
49
+ const b = CssColor.parse(CssColor.resolve(colorB));
50
+ if (!a || !b)
51
+ return 1;
52
+ const lA = CssColor.#luminance(a);
53
+ const lB = CssColor.#luminance(b);
54
+ return (Math.max(lA, lB) + 0.05) / (Math.min(lA, lB) + 0.05);
55
+ }
56
+ /**
57
+ * The `candidates` entry with the highest WCAG contrast ratio against
58
+ * `background`. Defaults to plain white/black; pass a grayscale or other
59
+ * palette to widen the choice. Falls back to the first candidate when
60
+ * `background` can't be parsed.
61
+ */
62
+ static contrastText(background, candidates = ['#ffffff', '#000000']) {
63
+ if (candidates.length === 0)
64
+ return '#000000';
65
+ let best = candidates[0];
66
+ let bestRatio = -Infinity;
67
+ for (const candidate of candidates) {
68
+ const ratio = CssColor.contrastRatio(background, candidate);
69
+ if (ratio > bestRatio) {
70
+ bestRatio = ratio;
71
+ best = candidate;
72
+ }
73
+ }
74
+ return best;
75
+ }
76
+ static #luminance([r, g, b]) {
77
+ const [rs, gs, bs] = [r, g, b].map((c) => {
78
+ const s = c / 255;
79
+ return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
80
+ });
81
+ return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;
82
+ }
83
+ static #linearToSrgb8(c) {
84
+ const s = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
85
+ return Math.max(0, Math.min(1, s)) * 255;
86
+ }
87
+ /**
88
+ * Parses `oklch(L C H)` directly instead of round-tripping through the
89
+ * browser's computed style: Chromium/Firefox serialize computed oklch()
90
+ * values back as oklch() (not rgb()), so the generic browser-fallback in
91
+ * {@link CssColor.parse} sees an unchanged string on the second pass and its
92
+ * infinite-loop guard mistakes that for a parse failure.
93
+ */
94
+ static #parseOklch(color) {
95
+ const match = /^oklch\(\s*([\d.]+)(%)?\s+([\d.]+)\s+([\d.]+)/i.exec(color.trim());
96
+ if (!match)
97
+ return null;
98
+ const L = match[2] ? Number(match[1]) / 100 : Number(match[1]);
99
+ const C = Number(match[3]);
100
+ const H = (Number(match[4]) * Math.PI) / 180;
101
+ const a = C * Math.cos(H);
102
+ const b = C * Math.sin(H);
103
+ const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
104
+ const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
105
+ const s_ = L - 0.0894841775 * a - 1.291485548 * b;
106
+ const l = l_ ** 3;
107
+ const m = m_ ** 3;
108
+ const s = s_ ** 3;
109
+ const r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;
110
+ const g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;
111
+ const bl = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;
112
+ return [CssColor.#linearToSrgb8(r), CssColor.#linearToSrgb8(g), CssColor.#linearToSrgb8(bl)];
113
+ }
114
+ }
@@ -0,0 +1,21 @@
1
+ import type { PaletteInput } from '../../types/configuration/styling';
2
+ /** The categorical palette of a configuration, as a list of colors. */
3
+ export declare class Palette {
4
+ /** How many colors a palette named after a continuous ramp takes, unless it says. */
5
+ static readonly COUNT = 8;
6
+ /** The color at `index` of `palette`, cycling when the index runs past its end: the default color for an unstyled series. */
7
+ static at(index: number, palette: string[]): string;
8
+ /**
9
+ * `input` as a list of colors: a list as it is; a name as the d3-scale-chromatic color list of
10
+ * that name (`'dark2'`, `'tableau10'`...) or, for a ramp (`'viridis'`, `'blues'`...), colors spread
11
+ * evenly along it; `{ scheme, count, schemeRange }` the same with its own count and part of the ramp.
12
+ * `undefined` when the name is not one of those.
13
+ */
14
+ static resolve(input: PaletteInput): string[] | undefined;
15
+ /** `patch` with its `palette` resolved to a list of colors, or left out (with a warning) when it names no scheme. */
16
+ static resolveIn<T extends {
17
+ palette?: PaletteInput;
18
+ } & Record<string, unknown>>(patch: T): Omit<T, 'palette'> & {
19
+ palette?: string[];
20
+ };
21
+ }
@@ -0,0 +1,52 @@
1
+ import * as d3Chromatic from 'd3-scale-chromatic';
2
+ import { ColorRamp } from './ColorRamp';
3
+ /** `{dark2: [...], tableau10: [...], ...}`, from every flat `scheme*` color list d3-scale-chromatic exports. */
4
+ const DISCRETE_SCHEMES = Object.fromEntries(Object.entries(d3Chromatic)
5
+ .filter((entry) => entry[0].startsWith('scheme') &&
6
+ Array.isArray(entry[1]) &&
7
+ entry[1].every((color) => typeof color === 'string'))
8
+ .map(([name, colors]) => [name.slice('scheme'.length).toLowerCase(), colors]));
9
+ /** The categorical palette of a configuration, as a list of colors. */
10
+ export class Palette {
11
+ /** How many colors a palette named after a continuous ramp takes, unless it says. */
12
+ static COUNT = 8;
13
+ /** The color at `index` of `palette`, cycling when the index runs past its end: the default color for an unstyled series. */
14
+ static at(index, palette) {
15
+ if (palette.length === 0)
16
+ return 'currentColor';
17
+ return palette[index % palette.length];
18
+ }
19
+ /**
20
+ * `input` as a list of colors: a list as it is; a name as the d3-scale-chromatic color list of
21
+ * that name (`'dark2'`, `'tableau10'`...) or, for a ramp (`'viridis'`, `'blues'`...), colors spread
22
+ * evenly along it; `{ scheme, count, schemeRange }` the same with its own count and part of the ramp.
23
+ * `undefined` when the name is not one of those.
24
+ */
25
+ static resolve(input) {
26
+ if (Array.isArray(input))
27
+ return [...input];
28
+ const { scheme, count, schemeRange } = typeof input === 'string' ? { scheme: input } : input;
29
+ const name = scheme.toLowerCase();
30
+ const list = DISCRETE_SCHEMES[name];
31
+ if (list)
32
+ return count === undefined ? [...list] : list.slice(0, count);
33
+ const ramp = ColorRamp.NAMED[name];
34
+ if (!ramp)
35
+ return undefined;
36
+ const [from, to] = schemeRange ?? [0, 1];
37
+ const total = Math.max(1, count ?? Palette.COUNT);
38
+ return Array.from({ length: total }, (_, index) => ramp(from + (total > 1 ? index / (total - 1) : 0.5) * (to - from)));
39
+ }
40
+ /** `patch` with its `palette` resolved to a list of colors, or left out (with a warning) when it names no scheme. */
41
+ static resolveIn(patch) {
42
+ const { palette, ...rest } = patch;
43
+ if (palette === undefined)
44
+ return rest;
45
+ const colors = Palette.resolve(palette);
46
+ if (!colors) {
47
+ console.warn(`setConfiguration: palette ${JSON.stringify(palette)} is not a list of colors or a d3-scale-chromatic scheme name; the palette is left as it was.`);
48
+ return rest;
49
+ }
50
+ return { ...rest, palette: colors };
51
+ }
52
+ }
@@ -1,3 +1,11 @@
1
- export { resolveCssColor } from './cssColor';
2
- export { contrastRatio, contrastTextColor } from './contrast';
3
- export { normalize, paletteColor, makeColorScale, resolveColorScale } from './ramp';
1
+ export { CssColor } from './CssColor';
2
+ export { ColorRamp } from './ColorRamp';
3
+ export { Palette } from './Palette';
4
+ import { ColorRamp } from './ColorRamp';
5
+ export declare const resolveCssColor: (color: string) => string;
6
+ export declare const contrastRatio: (colorA: string, colorB: string) => number;
7
+ export declare const contrastTextColor: (background: string, candidates?: string[]) => string;
8
+ export declare const normalize: (v: number, min: number, max: number) => number;
9
+ export declare const makeColorScale: (min: number, max: number, colorMin: string, colorMax: string) => (v: number) => string;
10
+ export declare const resolveColorScale: typeof ColorRamp.resolve;
11
+ export declare const paletteColor: (index: number, palette: string[]) => string;
@@ -1,3 +1,14 @@
1
- export { resolveCssColor } from './cssColor';
2
- export { contrastRatio, contrastTextColor } from './contrast';
3
- export { normalize, paletteColor, makeColorScale, resolveColorScale } from './ramp';
1
+ export { CssColor } from './CssColor';
2
+ export { ColorRamp } from './ColorRamp';
3
+ export { Palette } from './Palette';
4
+ import { CssColor } from './CssColor';
5
+ import { ColorRamp } from './ColorRamp';
6
+ import { Palette } from './Palette';
7
+ // The package's public function names, over the classes above.
8
+ export const resolveCssColor = (color) => CssColor.resolve(color);
9
+ export const contrastRatio = (colorA, colorB) => CssColor.contrastRatio(colorA, colorB);
10
+ export const contrastTextColor = (background, candidates) => CssColor.contrastText(background, candidates);
11
+ export const normalize = (v, min, max) => ColorRamp.normalize(v, min, max);
12
+ export const makeColorScale = (min, max, colorMin, colorMax) => ColorRamp.between(min, max, colorMin, colorMax);
13
+ export const resolveColorScale = ColorRamp.resolve;
14
+ export const paletteColor = (index, palette) => Palette.at(index, palette);
@@ -1,4 +1,4 @@
1
- import { resolveAccessor } from '../plots/utils/accessors';
1
+ import { resolveAccessor } from './accessors';
2
2
  /**
3
3
  * Splits rows into ordered groups keyed by the stringified accessor value.
4
4
  * Insertion order of first appearance is preserved, which keeps colours stable
@@ -127,7 +127,7 @@ The public readers of that state are `useFigure()` and `usePlot()` ([Reading plo
127
127
  1. Define its props and state types under `types/plots/<kind>/`.
128
128
  2. Write `plots/<kind>/defaults.ts`: a builder returning the options of each phase it customises (`data`, `mapping`, `scales`, `styles`, `markers`, `hover`, `timeline`, ...).
129
129
  3. Write `plots/<kind>/Plot.svelte`: split chrome, `timeline`, `facet` and core props and render the shared `Plot` with the builder.
130
- 4. Export it from `src/lib/index.ts`, add stories under `stories/plots/<kind>/`, tests under `tests/unit/plots/<kind>/`, and a section in [Plots](plots.md).
130
+ 4. Export it from `src/lib/index.ts`, add stories under `stories/plots/<kind>/`, tests under `tests/unit/plots/<kind>/`, and a page in `docs/plots/` with a row in the [Plots](plots.md) table.
131
131
 
132
132
  ## Conventions
133
133
 
package/docs/chrome.md CHANGED
@@ -7,7 +7,7 @@ The chrome is everything a figure draws around its plot: title, subtitle, legend
7
7
  ```svelte
8
8
  <script lang="ts">
9
9
  import { LinePlot } from '@fundar/data-chart-telling';
10
- import { PRICES } from './data';
10
+ import { PRICES } from './datasets';
11
11
  </script>
12
12
 
13
13
  <!-- A plot carries its own chrome: title, subtitle, legend and caption. -->
@@ -70,7 +70,7 @@ A `header` takes the place of `title` and `subtitle`, and a `footer` the place o
70
70
  ```svelte
71
71
  <script lang="ts">
72
72
  import { LinePlot } from '@fundar/data-chart-telling';
73
- import { PRICES } from './data';
73
+ import { PRICES } from './datasets';
74
74
  </script>
75
75
 
76
76
  <!-- `order` places the chrome blocks; `divider` draws a rule between them. -->
package/docs/composer.md CHANGED
@@ -7,7 +7,7 @@
7
7
  ```svelte
8
8
  <script lang="ts">
9
9
  import { PlotComposer, LinePlot, BarPlot, ScatterPlot } from '@fundar/data-chart-telling';
10
- import { REGION_VALUES, PROVINCE_VALUES, COUNTRIES } from './data';
10
+ import { REGION_VALUES, PROVINCE_VALUES, COUNTRIES_AT_2007 } from './datasets';
11
11
  </script>
12
12
 
13
13
  <!-- Several plots in one figure, placed on named areas of a grid. -->
@@ -26,7 +26,7 @@
26
26
  x="province"
27
27
  y="value"
28
28
  />
29
- <ScatterPlot area="c" data={COUNTRIES} x="gdp" y="life" />
29
+ <ScatterPlot area="c" data={COUNTRIES_AT_2007} x="gdp" y="life" />
30
30
  </PlotComposer>
31
31
  ```
32
32
 
package/docs/concepts.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Plots and figures
4
4
 
5
- A **plot** is one graph: axes and marks. Every plot is a component named after what it draws - `LinePlot`, `AreaPlot`, `BarPlot`, `HistogramPlot`, `BoxPlot`, `HeatmapPlot`, `PyramidPlot`, `ScatterPlot`, `GeoPlot` (see [Plots](plots.md)).
5
+ A **plot** is one graph: axes and marks. Every plot is a component named after what it draws, such as `LinePlot` or `BarPlot` (see [Plots](plots.md) for all of them).
6
6
 
7
7
  A plot is drawn inside a **figure**: the box that holds the plot together with its [chrome](chrome.md) (title, subtitle, legend, timeline, caption). Every plot component is a figure, so a plot with a `title` and a `legend` is still one component. A [`PlotComposer`](composer.md) is a figure that holds several plots.
8
8
 
@@ -53,7 +53,7 @@ Every option has a story under `stories/`, grouped as Plots, Markers, Transforms
53
53
 
54
54
  ## Documentation figures
55
55
 
56
- Every screenshot in the docs is an example, rendered by Playwright to `docs/images/<name>.png` in kebab-case (`examples/LineByRegion.svelte` is `line-by-region.png`). The examples and the screenshots share one file of small real datasets, `examples/data.ts`, which names the source of each, and axes are set to English. `docs/images` is left out of the npm package.
56
+ Every screenshot in the docs is an example, rendered by Playwright to `docs/images/<name>.png` in kebab-case (`examples/LineByRegion.svelte` is `line-by-region.png`). The examples and the screenshots share small real datasets, one file each in `examples/datasets/`, which name their source, and axes are set to English. `docs/images` is left out of the npm package. So are the map boundaries the stories draw: the GeoJSON files in `examples/geo/`, and the datasets in `examples/datasets/` that load them (provinces, countries, comunas, partidos), which are not in the `$datasets` barrel - import them as `$datasets/<name>`.
57
57
 
58
58
  ```bash
59
59
  pnpm docs:images # regenerate docs/images/*.png
package/docs/facets.md CHANGED
@@ -7,7 +7,7 @@
7
7
  ```svelte
8
8
  <script lang="ts">
9
9
  import { LinePlot } from '@fundar/data-chart-telling';
10
- import { REGION_VALUES } from './data';
10
+ import { REGION_VALUES } from './datasets';
11
11
  </script>
12
12
 
13
13
  <!-- One panel per region, three columns, sharing scales. A tooltip with `sync` shows in every panel on purpose. -->
@@ -52,7 +52,7 @@ The data phases (grouping, transforms, statistics, shared scales) run once for a
52
52
  ```svelte
53
53
  <script lang="ts">
54
54
  import { LinePlot } from '@fundar/data-chart-telling';
55
- import { REGION_VALUES } from './data';
55
+ import { REGION_VALUES } from './datasets';
56
56
  </script>
57
57
 
58
58
  <!-- A carousel shows `visible` panels at a time, with navigation below. -->
@@ -79,7 +79,7 @@ The data phases (grouping, transforms, statistics, shared scales) run once for a
79
79
  ```svelte
80
80
  <script lang="ts">
81
81
  import { LinePlot } from '@fundar/data-chart-telling';
82
- import { REGION_VALUES } from './data';
82
+ import { REGION_VALUES } from './datasets';
83
83
 
84
84
  // Each region's value split into two sectors.
85
85
  const SECTORS = [
@@ -18,7 +18,7 @@ pnpm add @fundar/data-chart-telling svelte svelteplot
18
18
  ```svelte
19
19
  <script lang="ts">
20
20
  import { LinePlot } from '@fundar/data-chart-telling';
21
- import { REGION_VALUES } from './data';
21
+ import { REGION_VALUES } from './datasets';
22
22
  </script>
23
23
 
24
24
  <!-- The smallest useful plot: rows, the fields to map and a pixel size. -->
@@ -29,7 +29,7 @@ pnpm add @fundar/data-chart-telling svelte svelteplot
29
29
 
30
30
  ![A line plot with one line per region](images/first-plot.png)
31
31
 
32
- - `data` is an array of flat rows, here `{ date, region, value }` from [examples/data.ts](../examples/data.ts); `x` and `y` name the fields that position each row.
32
+ - `data` is an array of flat rows, here `{ date, region, value }` from [examples/datasets/inflation-by-region.ts](../examples/datasets/inflation-by-region.ts); `x` and `y` name the fields that position each row.
33
33
  - `color="region"` splits the rows into one series per region and gives each its own color.
34
34
  - `width` and `height` are pixels.
35
35
 
package/docs/legend.md CHANGED
@@ -6,13 +6,13 @@ A plot builds its legend from what it draws: its series, the scales its channels
6
6
 
7
7
  `legend` is unset or `true` for the automatic legend, `false` for none. The automatic legend can have these sections:
8
8
 
9
- | Section | Appears when | Content |
10
- | ------------------ | ------------------------------- | ------------------------------------------ |
11
- | series (discrete) | the plot has several series | one item per series, in its color and mark |
12
- | color (continuous) | `color` is a continuous value | a ramp with its min and max |
13
- | opacity | `opacity` is a continuous value | a ramp fading across the opacity range |
14
- | size | `r` is mapped | a few dots at representative values |
15
- | symbol | `symbol` is mapped | each category next to its shape |
9
+ | Section | Appears when | Content |
10
+ | ------------------ | ------------------------------- | ---------------------------------------------------------- |
11
+ | series (discrete) | the plot has several series | one item per series, in its color and mark |
12
+ | color (continuous) | `color` is a continuous value | a ramp with its min and max |
13
+ | opacity | `opacity` is a continuous value | a bar fading across the opacity range, over a checkerboard |
14
+ | size | `r` is mapped | a few dots at representative values |
15
+ | symbol | `symbol` is mapped | each category next to its shape |
16
16
 
17
17
  Segments and markers join the series section when they carry a `legend` label:
18
18
 
@@ -42,7 +42,7 @@ Items become clickable with `interactive` on the series section. `disabled` says
42
42
  ```svelte
43
43
  <script lang="ts">
44
44
  import { LinePlot } from '@fundar/data-chart-telling';
45
- import { REGION_VALUES } from './data';
45
+ import { REGION_VALUES } from './datasets';
46
46
  import LegendReader from './LegendReader.svelte';
47
47
  </script>
48
48
 
@@ -94,12 +94,12 @@ legend={{
94
94
  series: { title: 'Division', layout: { type: 'flex' } },
95
95
  color: { title: 'Temperature', interactive: { enabled: true } },
96
96
  opacity: { title: 'Confidence' },
97
- size: { title: 'Population' },
97
+ r: { title: 'Population' },
98
98
  symbol: { title: 'Income group' }
99
99
  }}
100
100
  ```
101
101
 
102
- Each channel key adjusts the section that channel draws: any section field except what the plots compute (items, ranges, domains). An entry with `match` adjusts only the section whose title matches; a list of entries adjusts several.
102
+ Each key is the name of the channel (the plot's own prop: `r` for the size section) and adjusts the section that channel draws: any section field except what the plots compute (items, ranges, domains). An entry with `match` adjusts only the section whose title matches; a list of entries adjusts several.
103
103
 
104
104
  ## Explicit sections
105
105
 
@@ -110,7 +110,7 @@ A list replaces the automatic legend with exactly those sections:
110
110
  ```svelte
111
111
  <script lang="ts">
112
112
  import { LinePlot } from '@fundar/data-chart-telling';
113
- import { REGION_VALUES } from './data';
113
+ import { REGION_VALUES } from './datasets';
114
114
  </script>
115
115
 
116
116
  <!-- An explicit legend: a discrete section of toggles and a continuous ramp. -->
@@ -150,4 +150,6 @@ Section types:
150
150
 
151
151
  ## Placement and look
152
152
 
153
+ An opacity section draws its bar as one color fading over a checkerboard, so it reads as transparency and not as a color ramp; the color is the marker's own when it has one, else `legend.continuous.opacity.color` (black by default), and `legend.continuous.opacity.checker` sets the squares.
154
+
153
155
  The legend is a chrome block: `order` places it (`'legend'`, or in a row with the plot). Its fonts, gaps, swatch size and the continuous bar's geometry are `legend.*` in the [configuration](theming.md). A paginated section's prev/next arrows are replaceable with a `navButton` snippet.