layerchart 2.0.0-next.1 → 2.0.0-next.10

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 (275) hide show
  1. package/dist/actions/movable.d.ts +28 -0
  2. package/dist/actions/movable.js +91 -0
  3. package/dist/components/AnnotationLine.svelte +143 -0
  4. package/dist/components/AnnotationLine.svelte.d.ts +30 -0
  5. package/dist/components/AnnotationPoint.svelte +119 -0
  6. package/dist/components/AnnotationPoint.svelte.d.ts +34 -0
  7. package/dist/components/AnnotationRange.svelte +147 -0
  8. package/dist/components/AnnotationRange.svelte.d.ts +40 -0
  9. package/dist/components/Arc.svelte +344 -151
  10. package/dist/components/Arc.svelte.d.ts +138 -0
  11. package/dist/components/Area.svelte +165 -149
  12. package/dist/components/Area.svelte.d.ts +45 -0
  13. package/dist/components/Axis.svelte +320 -179
  14. package/dist/components/Axis.svelte.d.ts +127 -0
  15. package/dist/components/Bar.svelte +166 -107
  16. package/dist/components/Bar.svelte.d.ts +51 -0
  17. package/dist/components/Bars.svelte +56 -67
  18. package/dist/components/Bars.svelte.d.ts +27 -0
  19. package/dist/components/Blur.svelte +42 -12
  20. package/dist/components/Blur.svelte.d.ts +23 -21
  21. package/dist/components/Bounds.svelte +49 -19
  22. package/dist/components/Bounds.svelte.d.ts +24 -50
  23. package/dist/components/BrushContext.svelte +296 -168
  24. package/dist/components/BrushContext.svelte.d.ts +97 -65
  25. package/dist/components/Calendar.svelte +116 -59
  26. package/dist/components/Calendar.svelte.d.ts +50 -31
  27. package/dist/components/Chart.svelte +1289 -398
  28. package/dist/components/Chart.svelte.d.ts +535 -410
  29. package/dist/components/ChartClipPath.svelte +37 -15
  30. package/dist/components/ChartClipPath.svelte.d.ts +21 -19
  31. package/dist/components/Circle.svelte +124 -85
  32. package/dist/components/Circle.svelte.d.ts +52 -0
  33. package/dist/components/CircleClipPath.svelte +76 -16
  34. package/dist/components/CircleClipPath.svelte.d.ts +46 -0
  35. package/dist/components/ClipPath.svelte +71 -21
  36. package/dist/components/ClipPath.svelte.d.ts +40 -27
  37. package/dist/components/ColorRamp.svelte +75 -9
  38. package/dist/components/ColorRamp.svelte.d.ts +37 -19
  39. package/dist/components/ComputedStyles.svelte +17 -5
  40. package/dist/components/ComputedStyles.svelte.d.ts +11 -19
  41. package/dist/components/Connector.svelte +149 -0
  42. package/dist/components/Connector.svelte.d.ts +51 -0
  43. package/dist/components/Dagre.svelte +211 -122
  44. package/dist/components/Dagre.svelte.d.ts +119 -56
  45. package/dist/components/ForceSimulation.svelte +215 -90
  46. package/dist/components/ForceSimulation.svelte.d.ts +82 -35
  47. package/dist/components/Frame.svelte +33 -13
  48. package/dist/components/Frame.svelte.d.ts +13 -17
  49. package/dist/components/GeoCircle.svelte +29 -16
  50. package/dist/components/GeoCircle.svelte.d.ts +22 -24
  51. package/dist/components/GeoContext.svelte +113 -72
  52. package/dist/components/GeoContext.svelte.d.ts +49 -41
  53. package/dist/components/GeoEdgeFade.svelte +49 -13
  54. package/dist/components/GeoEdgeFade.svelte.d.ts +17 -19
  55. package/dist/components/GeoPath.svelte +157 -127
  56. package/dist/components/GeoPath.svelte.d.ts +48 -36
  57. package/dist/components/GeoPoint.svelte +52 -20
  58. package/dist/components/GeoPoint.svelte.d.ts +25 -22
  59. package/dist/components/GeoSpline.svelte +75 -26
  60. package/dist/components/GeoSpline.svelte.d.ts +29 -20
  61. package/dist/components/GeoTile.svelte +100 -49
  62. package/dist/components/GeoTile.svelte.d.ts +38 -23
  63. package/dist/components/GeoVisible.svelte +17 -9
  64. package/dist/components/GeoVisible.svelte.d.ts +10 -18
  65. package/dist/components/Graticule.svelte +30 -14
  66. package/dist/components/Graticule.svelte.d.ts +11 -52
  67. package/dist/components/Grid.svelte +230 -117
  68. package/dist/components/Grid.svelte.d.ts +71 -0
  69. package/dist/components/Group.svelte +173 -106
  70. package/dist/components/Group.svelte.d.ts +81 -0
  71. package/dist/components/Highlight.svelte +410 -308
  72. package/dist/components/Highlight.svelte.d.ts +107 -0
  73. package/dist/components/Hull.svelte +97 -46
  74. package/dist/components/Hull.svelte.d.ts +40 -30
  75. package/dist/components/Labels.svelte +127 -47
  76. package/dist/components/Labels.svelte.d.ts +70 -27
  77. package/dist/components/Legend.svelte +374 -190
  78. package/dist/components/Legend.svelte.d.ts +95 -44
  79. package/dist/components/Line.svelte +163 -125
  80. package/dist/components/Line.svelte.d.ts +75 -0
  81. package/dist/components/LinearGradient.svelte +153 -78
  82. package/dist/components/LinearGradient.svelte.d.ts +66 -31
  83. package/dist/components/Link.svelte +160 -104
  84. package/dist/components/Link.svelte.d.ts +54 -0
  85. package/dist/components/Marker.svelte +100 -39
  86. package/dist/components/Marker.svelte.d.ts +59 -27
  87. package/dist/components/MarkerWrapper.svelte +35 -0
  88. package/dist/components/MarkerWrapper.svelte.d.ts +18 -0
  89. package/dist/components/MonthPath.svelte +65 -20
  90. package/dist/components/MonthPath.svelte.d.ts +23 -17
  91. package/dist/components/MotionPath.svelte +80 -24
  92. package/dist/components/MotionPath.svelte.d.ts +46 -27
  93. package/dist/components/Pack.svelte +53 -17
  94. package/dist/components/Pack.svelte.d.ts +42 -21
  95. package/dist/components/Partition.svelte +64 -22
  96. package/dist/components/Partition.svelte.d.ts +49 -26
  97. package/dist/components/Pattern.svelte +297 -11
  98. package/dist/components/Pattern.svelte.d.ts +103 -19
  99. package/dist/components/Pie.svelte +122 -76
  100. package/dist/components/Pie.svelte.d.ts +65 -51
  101. package/dist/components/Point.svelte +20 -9
  102. package/dist/components/Point.svelte.d.ts +16 -20
  103. package/dist/components/Points.svelte +148 -137
  104. package/dist/components/Points.svelte.d.ts +45 -34
  105. package/dist/components/RadialGradient.svelte +148 -77
  106. package/dist/components/RadialGradient.svelte.d.ts +69 -31
  107. package/dist/components/Rect.svelte +121 -102
  108. package/dist/components/Rect.svelte.d.ts +36 -0
  109. package/dist/components/RectClipPath.svelte +82 -18
  110. package/dist/components/RectClipPath.svelte.d.ts +55 -0
  111. package/dist/components/Rule.svelte +107 -63
  112. package/dist/components/Rule.svelte.d.ts +40 -19
  113. package/dist/components/Sankey.svelte +132 -55
  114. package/dist/components/Sankey.svelte.d.ts +61 -31
  115. package/dist/components/Spline.svelte +281 -218
  116. package/dist/components/Spline.svelte.d.ts +95 -0
  117. package/dist/components/Text.svelte +463 -197
  118. package/dist/components/Text.svelte.d.ts +136 -0
  119. package/dist/components/Threshold.svelte +48 -16
  120. package/dist/components/Threshold.svelte.d.ts +29 -31
  121. package/dist/components/TileImage.svelte +103 -30
  122. package/dist/components/TileImage.svelte.d.ts +48 -23
  123. package/dist/components/TransformContext.svelte +365 -171
  124. package/dist/components/TransformControls.svelte +50 -26
  125. package/dist/components/TransformControls.svelte.d.ts +27 -19
  126. package/dist/components/Tree.svelte +74 -33
  127. package/dist/components/Tree.svelte.d.ts +42 -30
  128. package/dist/components/Treemap.svelte +119 -42
  129. package/dist/components/Treemap.svelte.d.ts +75 -27
  130. package/dist/components/Voronoi.svelte +153 -103
  131. package/dist/components/Voronoi.svelte.d.ts +42 -41
  132. package/dist/components/charts/ArcChart.svelte +464 -0
  133. package/dist/components/charts/ArcChart.svelte.d.ts +90 -0
  134. package/dist/components/charts/AreaChart.svelte +444 -393
  135. package/dist/components/charts/AreaChart.svelte.d.ts +61 -0
  136. package/dist/components/charts/BarChart.svelte +463 -389
  137. package/dist/components/charts/BarChart.svelte.d.ts +76 -0
  138. package/dist/components/charts/ChartAnnotations.svelte +37 -0
  139. package/dist/components/charts/ChartAnnotations.svelte.d.ts +10 -0
  140. package/dist/components/charts/DefaultTooltip.svelte +60 -0
  141. package/dist/components/charts/DefaultTooltip.svelte.d.ts +10 -0
  142. package/dist/components/charts/LineChart.svelte +366 -315
  143. package/dist/components/charts/LineChart.svelte.d.ts +53 -0
  144. package/dist/components/charts/PieChart.svelte +458 -316
  145. package/dist/components/charts/PieChart.svelte.d.ts +137 -353
  146. package/dist/components/charts/ScatterChart.svelte +332 -296
  147. package/dist/components/charts/ScatterChart.svelte.d.ts +39 -0
  148. package/dist/components/charts/index.d.ts +8 -0
  149. package/dist/components/charts/index.js +7 -0
  150. package/dist/components/charts/types.d.ts +253 -0
  151. package/dist/components/charts/utils.svelte.d.ts +30 -0
  152. package/dist/components/charts/utils.svelte.js +59 -0
  153. package/dist/components/index.d.ts +76 -4
  154. package/dist/components/index.js +76 -5
  155. package/dist/components/layout/Canvas.svelte +347 -171
  156. package/dist/components/layout/Canvas.svelte.d.ts +110 -55
  157. package/dist/components/layout/Html.svelte +82 -42
  158. package/dist/components/layout/Html.svelte.d.ts +39 -28
  159. package/dist/components/layout/Layer.svelte +39 -0
  160. package/dist/components/layout/Layer.svelte.d.ts +17 -0
  161. package/dist/components/layout/Svg.svelte +122 -70
  162. package/dist/components/layout/Svg.svelte.d.ts +53 -34
  163. package/dist/components/layout/WebGL.svelte +135 -0
  164. package/dist/components/layout/WebGL.svelte.d.ts +50 -0
  165. package/dist/components/tooltip/Tooltip.svelte +253 -78
  166. package/dist/components/tooltip/Tooltip.svelte.d.ts +149 -31
  167. package/dist/components/tooltip/TooltipContext.svelte +426 -271
  168. package/dist/components/tooltip/TooltipContext.svelte.d.ts +86 -55
  169. package/dist/components/tooltip/TooltipHeader.svelte +100 -11
  170. package/dist/components/tooltip/TooltipHeader.svelte.d.ts +43 -23
  171. package/dist/components/tooltip/TooltipItem.svelte +167 -27
  172. package/dist/components/tooltip/TooltipItem.svelte.d.ts +63 -31
  173. package/dist/components/tooltip/TooltipList.svelte +22 -3
  174. package/dist/components/tooltip/TooltipList.svelte.d.ts +6 -17
  175. package/dist/components/tooltip/TooltipSeparator.svelte +27 -1
  176. package/dist/components/tooltip/TooltipSeparator.svelte.d.ts +6 -15
  177. package/dist/components/tooltip/index.d.ts +6 -0
  178. package/dist/components/tooltip/index.js +6 -0
  179. package/dist/components/tooltip/tooltipMetaContext.d.ts +79 -0
  180. package/dist/components/tooltip/tooltipMetaContext.js +139 -0
  181. package/dist/components/types.d.ts +1 -0
  182. package/dist/components/types.js +1 -0
  183. package/dist/docs/Blockquote.svelte +3 -1
  184. package/dist/docs/Blockquote.svelte.d.ts +5 -16
  185. package/dist/docs/Code.svelte +20 -12
  186. package/dist/docs/Code.svelte.d.ts +12 -22
  187. package/dist/docs/ConnectorSweepMenuField.svelte +17 -0
  188. package/dist/docs/ConnectorSweepMenuField.svelte.d.ts +7 -0
  189. package/dist/docs/ConnectorTypeMenuField.svelte +17 -0
  190. package/dist/docs/ConnectorTypeMenuField.svelte.d.ts +7 -0
  191. package/dist/docs/CurveMenuField.svelte +14 -3
  192. package/dist/docs/CurveMenuField.svelte.d.ts +9 -18
  193. package/dist/docs/GeoDebug.svelte +47 -42
  194. package/dist/docs/GeoDebug.svelte.d.ts +4 -16
  195. package/dist/docs/Header1.svelte +4 -2
  196. package/dist/docs/Header1.svelte.d.ts +5 -18
  197. package/dist/docs/Json.svelte +11 -3
  198. package/dist/docs/Json.svelte.d.ts +9 -17
  199. package/dist/docs/Layout.svelte +10 -7
  200. package/dist/docs/Layout.svelte.d.ts +5 -15
  201. package/dist/docs/Link.svelte +7 -3
  202. package/dist/docs/Link.svelte.d.ts +5 -27
  203. package/dist/docs/PathDataMenuField.svelte +14 -10
  204. package/dist/docs/PathDataMenuField.svelte.d.ts +8 -18
  205. package/dist/docs/Preview.svelte +20 -7
  206. package/dist/docs/Preview.svelte.d.ts +12 -22
  207. package/dist/docs/TilesetField.svelte +20 -19
  208. package/dist/docs/TilesetField.svelte.d.ts +6 -19
  209. package/dist/docs/TransformDebug.svelte +5 -6
  210. package/dist/docs/TransformDebug.svelte.d.ts +18 -14
  211. package/dist/docs/ViewSourceButton.svelte +7 -4
  212. package/dist/docs/ViewSourceButton.svelte.d.ts +8 -18
  213. package/dist/types/d3-shape-extentions.d.ts +7 -0
  214. package/dist/utils/afterTick.d.ts +5 -0
  215. package/dist/utils/afterTick.js +8 -0
  216. package/dist/utils/arcText.svelte.d.ts +57 -0
  217. package/dist/utils/arcText.svelte.js +262 -0
  218. package/dist/utils/array.d.ts +9 -1
  219. package/dist/utils/array.js +13 -0
  220. package/dist/utils/attributes.d.ts +29 -0
  221. package/dist/utils/attributes.js +40 -0
  222. package/dist/utils/canvas.js +47 -10
  223. package/dist/utils/chart.d.ts +78 -0
  224. package/dist/utils/chart.js +512 -0
  225. package/dist/utils/color.d.ts +1 -0
  226. package/dist/utils/color.js +8 -0
  227. package/dist/utils/common.d.ts +3 -5
  228. package/dist/utils/common.js +3 -2
  229. package/dist/utils/connectorUtils.d.ts +21 -0
  230. package/dist/utils/connectorUtils.js +111 -0
  231. package/dist/utils/createId.d.ts +7 -0
  232. package/dist/utils/createId.js +9 -0
  233. package/dist/utils/debug.d.ts +1 -0
  234. package/dist/utils/debug.js +84 -0
  235. package/dist/utils/filterObject.d.ts +9 -0
  236. package/dist/utils/filterObject.js +12 -0
  237. package/dist/utils/graph/dagre.d.ts +34 -0
  238. package/dist/utils/graph/dagre.js +78 -0
  239. package/dist/utils/graph/dagre.test.d.ts +1 -0
  240. package/dist/utils/{graph.test.js → graph/dagre.test.js} +19 -33
  241. package/dist/utils/graph/sankey.d.ts +28 -0
  242. package/dist/utils/{graph.js → graph/sankey.js} +13 -41
  243. package/dist/utils/index.d.ts +3 -1
  244. package/dist/utils/index.js +3 -1
  245. package/dist/utils/key.svelte.d.ts +3 -0
  246. package/dist/utils/key.svelte.js +11 -0
  247. package/dist/utils/legendPayload.d.ts +7 -0
  248. package/dist/utils/legendPayload.js +8 -0
  249. package/dist/utils/motion.svelte.d.ts +140 -0
  250. package/dist/utils/motion.svelte.js +180 -0
  251. package/dist/utils/motion.test.d.ts +1 -0
  252. package/dist/utils/motion.test.js +213 -0
  253. package/dist/utils/{rect.d.ts → rect.svelte.d.ts} +7 -4
  254. package/dist/utils/rect.svelte.js +105 -0
  255. package/dist/utils/scales.svelte.d.ts +91 -0
  256. package/dist/utils/scales.svelte.js +201 -0
  257. package/dist/utils/stack.d.ts +2 -3
  258. package/dist/utils/stack.js +1 -1
  259. package/dist/utils/string.js +87 -0
  260. package/dist/utils/ticks.d.ts +9 -3
  261. package/dist/utils/ticks.js +122 -147
  262. package/dist/utils/ticks.test.d.ts +1 -0
  263. package/dist/utils/ticks.test.js +57 -0
  264. package/dist/utils/types.d.ts +81 -0
  265. package/package.json +27 -24
  266. package/dist/components/ChartContext.svelte +0 -295
  267. package/dist/components/ChartContext.svelte.d.ts +0 -139
  268. package/dist/components/TransformContext.svelte.d.ts +0 -158
  269. package/dist/stores/motionStore.d.ts +0 -30
  270. package/dist/stores/motionStore.js +0 -62
  271. package/dist/utils/graph.d.ts +0 -37
  272. package/dist/utils/rect.js +0 -107
  273. package/dist/utils/scales.d.ts +0 -66
  274. package/dist/utils/scales.js +0 -136
  275. /package/dist/{utils/graph.test.d.ts → components/charts/types.js} +0 -0
@@ -1,173 +1,231 @@
1
- <script lang="ts" generics="TData">
1
+ <script lang="ts" module>
2
+ import type { SeriesData, SimplifiedChartProps, SimplifiedChartPropsObject } from './types.js';
3
+ import type { AnyScale } from '../../utils/scales.svelte.js';
2
4
  import { onMount, type ComponentProps } from 'svelte';
3
- import { scaleLinear, scaleOrdinal, scaleTime } from 'd3-scale';
5
+
6
+ export type ScatterChartExtraSnippetProps<TData> = {
7
+ getLabelsProps: (
8
+ s: SeriesData<TData, typeof Points>,
9
+ i: number
10
+ ) => ComponentProps<typeof Labels<TData>>;
11
+ getPointsProps: (
12
+ s: SeriesData<TData, typeof Points>,
13
+ i: number
14
+ ) => ComponentProps<typeof Points>;
15
+ getHighlightProps: () => ComponentProps<typeof Highlight>;
16
+ getAxisProps: (axisDirection: 'x' | 'y') => ComponentProps<typeof Axis>;
17
+ getRuleProps: () => ComponentProps<typeof Rule>;
18
+ };
19
+
20
+ export type ScatterChartPropsObjProp = Pick<
21
+ SimplifiedChartPropsObject,
22
+ | 'brush'
23
+ | 'canvas'
24
+ | 'grid'
25
+ | 'highlight'
26
+ | 'labels'
27
+ | 'legend'
28
+ | 'points'
29
+ | 'rule'
30
+ | 'svg'
31
+ | 'tooltip'
32
+ | 'xAxis'
33
+ | 'yAxis'
34
+ >;
35
+
36
+ export type ScatterChartProps<TData> = Omit<
37
+ SimplifiedChartProps<TData, typeof Points, ScatterChartExtraSnippetProps<TData>>,
38
+ 'radial'
39
+ > & {
40
+ props?: ScatterChartPropsObjProp;
41
+ yDomain?: ComponentProps<typeof BrushContext>['yDomain'];
42
+ yScale?: AnyScale;
43
+ };
44
+ </script>
45
+
46
+ <script lang="ts" generics="TData">
47
+ import { scaleLinear, scaleTime } from 'd3-scale';
4
48
  import { format } from '@layerstack/utils';
5
49
  import { cls } from '@layerstack/tailwind';
6
- import { selectionStore } from '@layerstack/svelte-stores';
7
50
 
8
51
  import Axis from '../Axis.svelte';
9
52
  import BrushContext from '../BrushContext.svelte';
10
- import Canvas from '../layout/Canvas.svelte';
11
53
  import Chart from '../Chart.svelte';
54
+ import ChartAnnotations from './ChartAnnotations.svelte';
12
55
  import ChartClipPath from '../ChartClipPath.svelte';
13
56
  import Grid from '../Grid.svelte';
14
57
  import Highlight from '../Highlight.svelte';
15
58
  import Labels from '../Labels.svelte';
59
+ import Layer from '../layout/Layer.svelte';
16
60
  import Legend from '../Legend.svelte';
17
61
  import Points from '../Points.svelte';
18
62
  import Rule from '../Rule.svelte';
19
- import Svg from '../layout/Svg.svelte';
20
63
  import * as Tooltip from '../tooltip/index.js';
21
64
 
22
- import {
23
- accessor,
24
- chartDataArray,
25
- defaultChartPadding,
26
- type Accessor,
27
- } from '../../utils/common.js';
65
+ import { accessor, chartDataArray, defaultChartPadding } from '../../utils/common.js';
28
66
  import { asAny } from '../../utils/types.js';
29
-
30
- interface $$Props extends ComponentProps<Chart<TData>> {
31
- axis?: typeof axis;
32
- brush?: typeof brush;
33
- grid?: typeof grid;
34
- labels?: typeof labels;
35
- legend?: typeof legend;
36
- profile?: typeof profile;
37
- props?: typeof props;
38
- series?: typeof series;
39
- renderContext?: typeof renderContext;
40
- ontooltipclick?: typeof ontooltipclick;
41
- }
42
-
43
- export let data: $$Props['data'] = [];
44
- export let x: Accessor<TData> = undefined;
45
- export let y: Accessor<TData> = undefined;
46
-
47
- /** Set xDomain. Useful for external brush control */
48
- export let xDomain: ComponentProps<typeof BrushContext>['xDomain'] = undefined;
49
- /** Set yDomain. Useful for external brush control */
50
- export let yDomain: ComponentProps<typeof BrushContext>['yDomain'] = undefined;
51
-
52
- export let series: {
53
- key: string;
54
- label?: string;
55
- data: TData[];
56
- color?: string;
57
- props?: Partial<ComponentProps<Points>>;
58
- }[] = [{ key: 'default', data: chartDataArray(data), color: 'var(--color-primary)' }];
59
- $: isDefaultSeries = series.length === 1 && series[0].key === 'default';
60
-
61
- export let axis: ComponentProps<Axis> | 'x' | 'y' | boolean = true;
62
- export let brush: ComponentProps<BrushContext> | boolean = false;
63
- export let grid: ComponentProps<Grid> | boolean = true;
64
- export let labels: ComponentProps<Labels> | boolean = false;
65
- export let legend: ComponentProps<Legend> | boolean = false;
66
- export let rule: ComponentProps<Rule> | boolean = true;
67
-
68
- /** Expose tooltip context for external access */
69
- export let tooltipContext: ComponentProps<Tooltip.Context>['tooltip'] = undefined;
70
-
71
- /** Event dispatched with current tooltip data */
72
- export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {};
73
-
74
- export let props: {
75
- brush?: Partial<ComponentProps<BrushContext>>;
76
- canvas?: Partial<ComponentProps<Canvas>>;
77
- debug?: typeof debug;
78
- grid?: Partial<ComponentProps<Grid>>;
79
- highlight?: Partial<ComponentProps<Highlight>>;
80
- labels?: Partial<ComponentProps<Labels>>;
81
- legend?: Partial<ComponentProps<Legend>>;
82
- points?: Partial<ComponentProps<Points>>;
83
- profile?: typeof profile;
84
- rule?: Partial<ComponentProps<Rule>>;
85
- svg?: Partial<ComponentProps<Svg>>;
86
- tooltip?: {
87
- context?: Partial<ComponentProps<Tooltip.Context>>;
88
- root?: Partial<ComponentProps<Tooltip.Root>>;
89
- header?: Partial<ComponentProps<Tooltip.Header>>;
90
- list?: Partial<ComponentProps<Tooltip.List>>;
91
- item?: Partial<ComponentProps<Tooltip.Item>>;
92
- separator?: Partial<ComponentProps<Tooltip.Separator>>;
93
- };
94
- xAxis?: Partial<ComponentProps<Axis>>;
95
- yAxis?: Partial<ComponentProps<Axis>>;
96
- } = {};
97
-
98
- export let renderContext: 'svg' | 'canvas' = 'svg';
99
-
100
- /** Log initial render performance using `console.time` */
101
- export let profile = false;
102
-
103
- /** Enable debug mode */
104
- export let debug = false;
67
+ import { createLegendProps, SeriesState } from './utils.svelte.js';
68
+
69
+ let {
70
+ data = [],
71
+ x: xProp,
72
+ y: yProp,
73
+ xDomain,
74
+ yDomain,
75
+ series: seriesProp,
76
+ seriesLayout = 'overlap',
77
+ axis = true,
78
+ brush = false,
79
+ grid = true,
80
+ labels = false,
81
+ legend = false,
82
+ points = false,
83
+ rule = true,
84
+ tooltip = true,
85
+ context = $bindable(),
86
+ onTooltipClick = () => {},
87
+ props = {},
88
+ renderContext = 'svg',
89
+ profile = false,
90
+ debug = false,
91
+ xScale: xScaleProp,
92
+ yScale: yScaleProp,
93
+ children: childrenProp,
94
+ aboveContext,
95
+ belowContext,
96
+ belowMarks,
97
+ aboveMarks,
98
+ marks,
99
+ highlight = true,
100
+ annotations = [],
101
+ ...restProps
102
+ }: ScatterChartProps<TData> = $props();
103
+
104
+ const series: SeriesData<TData, typeof Points>[] = $derived(
105
+ seriesProp === undefined ? [{ key: 'default', data: chartDataArray(data) }] : seriesProp
106
+ );
107
+
108
+ const seriesState = new SeriesState(() => series);
105
109
 
106
110
  // Default xScale based on first data's `x` value
107
- $: xScale =
108
- $$props.xScale ??
109
- (accessor(x)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear());
111
+ const xScale = $derived(
112
+ xScaleProp ??
113
+ (accessor(xProp)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear())
114
+ );
110
115
 
111
116
  // Default yScale based on first data's `y` value
112
- $: yScale =
113
- $$props.yScale ??
114
- (accessor(y)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear());
115
-
116
- $: chartData = visibleSeries
117
- .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
118
- .filter((d) => d) as Array<TData>;
119
-
120
- let highlightSeriesKey: (typeof series)[number]['key'] | null = null;
121
-
122
- function setHighlightSeriesKey(seriesKey: typeof highlightSeriesKey) {
123
- highlightSeriesKey = seriesKey ?? null;
124
- }
125
-
126
- $: getPointsProps = (s: (typeof series)[number], i: number) => {
127
- const pointsProps: ComponentProps<Points> = {
117
+ const yScale = $derived(
118
+ yScaleProp ??
119
+ (accessor(yProp)(chartDataArray(data)[0]) instanceof Date ? scaleTime() : scaleLinear())
120
+ );
121
+
122
+ const chartData = $derived(
123
+ seriesState.visibleSeries
124
+ .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
125
+ .filter((d) => d) as Array<TData>
126
+ );
127
+
128
+ function getPointsProps(
129
+ s: SeriesData<TData, typeof Points>,
130
+ i: number
131
+ ): ComponentProps<typeof Points> {
132
+ return {
128
133
  data: s.data,
129
- stroke: s.color,
130
134
  fill: s.color,
131
- fillOpacity: 0.3,
132
135
  ...props.points,
133
136
  ...s.props,
134
137
  class: cls(
135
138
  'transition-opacity',
136
- highlightSeriesKey && highlightSeriesKey !== s.key && 'opacity-10',
139
+ seriesState.highlightKey.current &&
140
+ seriesState.highlightKey.current !== s.key &&
141
+ 'opacity-10',
137
142
  props.points?.class,
138
143
  s.props?.class
139
144
  ),
140
145
  };
146
+ }
141
147
 
142
- return pointsProps;
143
- };
144
-
145
- function getLabelsProps(s: (typeof series)[number], i: number) {
146
- const labelsProps: ComponentProps<Labels> = {
148
+ function getLabelsProps(
149
+ s: SeriesData<TData, typeof Points>,
150
+ i: number
151
+ ): ComponentProps<typeof Labels<TData>> {
152
+ return {
147
153
  data: s.data,
148
154
  ...props.labels,
149
155
  ...(typeof labels === 'object' ? labels : null),
150
156
  class: cls(
151
157
  'stroke-surface-200 transition-opacity',
152
- highlightSeriesKey && highlightSeriesKey !== s.key && 'opacity-10',
158
+ seriesState.highlightKey.current &&
159
+ seriesState.highlightKey.current !== s.key &&
160
+ 'opacity-10',
153
161
  props.labels?.class,
154
162
  typeof labels === 'object' && labels.class
155
163
  ),
156
164
  };
165
+ }
157
166
 
158
- return labelsProps;
167
+ function getLegendProps(): ComponentProps<typeof Legend> {
168
+ return createLegendProps({
169
+ seriesState,
170
+ props: {
171
+ ...props.legend,
172
+ ...(typeof legend === 'object' ? legend : null),
173
+ },
174
+ });
175
+ }
176
+
177
+ function getGridProps(): ComponentProps<typeof Grid> {
178
+ return {
179
+ x: true,
180
+ y: true,
181
+ ...(typeof grid === 'object' ? grid : null),
182
+ ...props.grid,
183
+ };
159
184
  }
160
185
 
161
- const selectedSeries = selectionStore();
162
- $: visibleSeries = series.filter((s) => {
163
- return (
164
- // @ts-expect-error
165
- $selectedSeries.selected.length === 0 || $selectedSeries.isSelected(s.key)
166
- // || highlightSeriesKey == s.key
167
- );
186
+ const activeSeries = $derived.by(() => {
187
+ if (!context?.tooltip?.data) return null;
188
+ // @ts-expect-error - shh
189
+ return series.find((s) => s.key === context?.tooltip.data?.seriesKey) ?? series[0];
168
190
  });
169
191
 
170
- $: brushProps = { ...(typeof brush === 'object' ? brush : null), ...props.brush };
192
+ function getHighlightProps(): ComponentProps<typeof Highlight> {
193
+ return {
194
+ lines: true,
195
+ axis: 'both',
196
+ ...props.highlight,
197
+ points: {
198
+ ...(activeSeries?.color && { fill: activeSeries.color }),
199
+ ...(typeof props.highlight?.points === 'object' ? props.highlight.points : null),
200
+ },
201
+ };
202
+ }
203
+
204
+ function getAxisProps(axisDirection: 'x' | 'y'): ComponentProps<typeof Axis> {
205
+ if (axisDirection === 'y') {
206
+ return {
207
+ placement: 'left',
208
+ ...(typeof axis === 'object' ? axis : null),
209
+ ...props.yAxis,
210
+ };
211
+ }
212
+ return {
213
+ placement: 'bottom',
214
+ ...(typeof axis === 'object' ? axis : null),
215
+ ...props.xAxis,
216
+ };
217
+ }
218
+
219
+ function getRuleProps(): ComponentProps<typeof Rule> {
220
+ return {
221
+ x: 0,
222
+ y: 0,
223
+ ...(typeof rule === 'object' ? rule : null),
224
+ ...props.rule,
225
+ };
226
+ }
227
+
228
+ const brushProps = $derived({ ...(typeof brush === 'object' ? brush : null), ...props.brush });
171
229
 
172
230
  if (profile) {
173
231
  console.time('ScatterChart render');
@@ -177,27 +235,29 @@
177
235
  }
178
236
  </script>
179
237
 
238
+ <!-- svelte-ignore ownership_invalid_binding -->
180
239
  <Chart
240
+ bind:context
181
241
  data={chartData}
182
- {x}
242
+ x={xProp}
183
243
  {xDomain}
184
244
  {xScale}
185
- {y}
245
+ y={yProp}
186
246
  {yDomain}
187
247
  {yScale}
188
248
  yNice
249
+ c={yProp}
250
+ cRange={['var(--color-primary)']}
189
251
  padding={defaultChartPadding(axis, legend)}
190
- {...$$restProps}
191
- tooltip={$$props.tooltip === false
252
+ {...restProps}
253
+ tooltip={tooltip === false
192
254
  ? false
193
255
  : {
194
256
  mode: 'voronoi',
195
- onclick: ontooltipclick,
257
+ onclick: onTooltipClick,
196
258
  debug,
197
259
  ...props.tooltip?.context,
198
- ...$$props.tooltip,
199
260
  }}
200
- bind:tooltipContext
201
261
  brush={brush && (brush === true || brush.mode == undefined || brush.mode === 'integrated')
202
262
  ? {
203
263
  axis: 'both',
@@ -205,191 +265,167 @@
205
265
  xDomain,
206
266
  yDomain,
207
267
  ...brushProps,
208
- onbrushend: (e) => {
268
+ onBrushEnd: (e) => {
209
269
  xDomain = e.xDomain;
210
270
  yDomain = e.yDomain;
211
- brushProps.onbrushend?.(e);
271
+ brushProps.onBrushEnd?.(e);
212
272
  },
213
273
  }
214
274
  : false}
215
- let:x
216
- let:xScale
217
- let:y
218
- let:yScale
219
- let:c
220
- let:cScale
221
- let:r
222
- let:width
223
- let:height
224
- let:padding
225
- let:tooltip
226
- let:config
227
275
  >
228
- {@const slotProps = {
229
- x,
230
- xScale,
231
- y,
232
- yScale,
233
- c,
234
- cScale,
235
- width,
236
- height,
237
- padding,
238
- tooltip,
239
- series,
240
- visibleSeries,
241
- getLabelsProps,
242
- getPointsProps,
243
- highlightSeriesKey,
244
- setHighlightSeriesKey,
245
- }}
246
- {@const activeSeries = tooltip.data
247
- ? (series.find((s) => s.key === tooltip.data.seriesKey) ?? series[0])
248
- : null}
249
-
250
- <slot {...slotProps}>
251
- <slot name="belowContext" {...slotProps} />
252
-
253
- <svelte:component
254
- this={renderContext === 'canvas' ? Canvas : Svg}
255
- {...asAny(renderContext === 'canvas' ? props.canvas : props.svg)}
256
- {debug}
257
- >
258
- <slot name="grid" {...slotProps}>
259
- {#if grid}
260
- <Grid x y {...typeof grid === 'object' ? grid : null} {...props.grid} />
276
+ {#snippet children({ context })}
277
+ {@const snippetProps = {
278
+ context,
279
+ series,
280
+ visibleSeries: seriesState.visibleSeries,
281
+ getLabelsProps,
282
+ getPointsProps,
283
+ getLegendProps,
284
+ getHighlightProps,
285
+ getAxisProps,
286
+ getRuleProps,
287
+ highlightKey: seriesState.highlightKey.current,
288
+ setHighlightKey: seriesState.highlightKey.set,
289
+ }}
290
+
291
+ {#if childrenProp}
292
+ {@render childrenProp(snippetProps)}
293
+ {:else}
294
+ {@render belowContext?.(snippetProps)}
295
+ <Layer
296
+ type={renderContext}
297
+ {...asAny(renderContext === 'canvas' ? props.canvas : props.svg)}
298
+ {debug}
299
+ >
300
+ {#if typeof grid === 'function'}
301
+ {@render grid(snippetProps)}
302
+ {:else if grid}
303
+ <Grid {...getGridProps()} />
261
304
  {/if}
262
- </slot>
263
305
 
264
- <ChartClipPath disabled={!brush}>
265
- <slot name="belowMarks" {...slotProps} />
306
+ <ChartClipPath disabled={!brush}>
307
+ <ChartAnnotations
308
+ {annotations}
309
+ layer="below"
310
+ highlightKey={seriesState.highlightKey.current}
311
+ visibleSeries={seriesState.visibleSeries}
312
+ />
266
313
 
267
- <slot name="marks" {...slotProps}>
268
- {#each visibleSeries as s, i (s.key)}
269
- <Points {...getPointsProps(s, i)} />
270
- {/each}
271
- </slot>
314
+ {@render belowMarks?.(snippetProps)}
272
315
 
273
- <slot name="aboveMarks" {...slotProps} />
274
- </ChartClipPath>
316
+ {#if typeof marks === 'function'}
317
+ {@render marks(snippetProps)}
318
+ {:else}
319
+ {#each seriesState.visibleSeries as s, i (s.key)}
320
+ <Points {...getPointsProps(s, i)} />
321
+ {/each}
322
+ {/if}
275
323
 
276
- <slot name="axis" {...slotProps}>
277
- {#if axis}
324
+ {@render aboveMarks?.(snippetProps)}
325
+ </ChartClipPath>
326
+
327
+ {#if typeof axis === 'function'}
328
+ {@render axis(snippetProps)}
329
+ {#if typeof rule === 'function'}
330
+ {@render rule(snippetProps)}
331
+ {:else if rule}
332
+ <Rule {...getRuleProps()} />
333
+ {/if}
334
+ {:else if axis}
278
335
  {#if axis !== 'x'}
279
- <Axis
280
- placement="left"
281
- format={(value) => format(value, undefined, { variant: 'short' })}
282
- {...typeof axis === 'object' ? axis : null}
283
- {...props.yAxis}
284
- />
336
+ <Axis {...getAxisProps('y')} />
285
337
  {/if}
286
338
 
287
339
  {#if axis !== 'y'}
288
- <Axis
289
- placement="bottom"
290
- format={(value) => format(value, undefined, { variant: 'short' })}
291
- {...typeof axis === 'object' ? axis : null}
292
- {...props.xAxis}
293
- />
340
+ <Axis {...getAxisProps('x')} />
294
341
  {/if}
295
342
 
296
- {#if rule}
297
- <Rule x={0} y={0} {...typeof rule === 'object' ? rule : null} {...props.rule} />
343
+ {#if typeof rule === 'function'}
344
+ {@render rule(snippetProps)}
345
+ {:else if rule}
346
+ <Rule {...getRuleProps()} />
298
347
  {/if}
299
348
  {/if}
300
- </slot>
301
-
302
- <!-- Use `full` to allow labels on edge to not be cropped (bleed into padding) -->
303
- <ChartClipPath disabled={!brush} full>
304
- <slot name="highlight" {...slotProps}>
305
- <Highlight
306
- lines
307
- axis="both"
308
- {...props.highlight}
309
- points={{
310
- fill: activeSeries?.color,
311
- ...(typeof props.highlight?.points === 'object' ? props.highlight.points : null),
312
- }}
349
+
350
+ <!-- Use `full` to allow labels on edge to not be cropped (bleed into padding) -->
351
+ <ChartClipPath disabled={!brush} full>
352
+ {#if typeof highlight === 'function'}
353
+ {@render highlight(snippetProps)}
354
+ {:else if highlight}
355
+ <Highlight {...getHighlightProps()} />
356
+ {/if}
357
+
358
+ {#if typeof labels === 'function'}
359
+ {@render labels(snippetProps)}
360
+ {:else if labels}
361
+ {#each seriesState.visibleSeries as s, i (s.key)}
362
+ <Labels {...getLabelsProps(s, i)} />
363
+ {/each}
364
+ {/if}
365
+
366
+ <ChartAnnotations
367
+ {annotations}
368
+ layer="above"
369
+ highlightKey={seriesState.highlightKey.current}
370
+ visibleSeries={seriesState.visibleSeries}
313
371
  />
314
- </slot>
372
+ </ChartClipPath>
373
+ </Layer>
315
374
 
316
- {#if labels}
317
- {#each visibleSeries as s, i (s.key)}
318
- <Labels {...getLabelsProps(s, i)} />
319
- {/each}
320
- {/if}
321
- </ChartClipPath>
322
- </svelte:component>
323
-
324
- <slot name="aboveContext" {...slotProps} />
325
-
326
- <slot name="legend" {...slotProps}>
327
- {#if legend}
328
- <Legend
329
- scale={isDefaultSeries
330
- ? undefined
331
- : scaleOrdinal(
332
- series.map((s) => s.key),
333
- series.map((s) => s.color)
334
- )}
335
- tickFormat={(key) => series.find((s) => s.key === key)?.label ?? key}
336
- placement="bottom"
337
- variant="swatches"
338
- onclick={(e, item) => $selectedSeries.toggleSelected(item.value)}
339
- onpointerenter={(e, item) => (highlightSeriesKey = item.value)}
340
- onpointerleave={(e) => (highlightSeriesKey = null)}
341
- {...props.legend}
342
- {...typeof legend === 'object' ? legend : null}
343
- classes={{
344
- item: (item) =>
345
- visibleSeries.length && !visibleSeries.some((s) => s.key === item.value)
346
- ? 'opacity-50'
347
- : '',
348
- ...props.legend?.classes,
349
- ...(typeof legend === 'object' ? legend.classes : null),
350
- }}
351
- />
375
+ {@render aboveContext?.(snippetProps)}
376
+
377
+ {#if typeof legend === 'function'}
378
+ {@render legend(snippetProps)}
379
+ {:else if legend}
380
+ <Legend {...getLegendProps()} />
352
381
  {/if}
353
- </slot>
354
-
355
- <slot name="tooltip" {...slotProps}>
356
- <Tooltip.Root {...props.tooltip?.root} let:data>
357
- {#if activeSeries?.key !== 'default'}
358
- <Tooltip.Header
359
- value={activeSeries?.label ?? activeSeries?.key}
360
- color={activeSeries?.color}
361
- {...props.tooltip?.header}
362
- />
363
- {/if}
364
- <Tooltip.List {...props.tooltip?.list}>
365
- <Tooltip.Item
366
- label={typeof config.x === 'string' ? config.x : 'x'}
367
- value={x(data)}
368
- {format}
369
- onpointerenter={() => (highlightSeriesKey = activeSeries?.key ?? null)}
370
- onpointerleave={() => (highlightSeriesKey = null)}
371
- {...props.tooltip?.item}
372
- />
373
- <Tooltip.Item
374
- label={typeof config.y === 'string' ? config.y : 'y'}
375
- value={y(data)}
376
- {format}
377
- onpointerenter={() => (highlightSeriesKey = activeSeries?.key ?? null)}
378
- onpointerleave={() => (highlightSeriesKey = null)}
379
- {...props.tooltip?.item}
380
- />
381
- {#if config.r}
382
- <Tooltip.Item
383
- label={typeof config.r === 'string' ? config.r : 'r'}
384
- value={r(data)}
385
- {format}
386
- onpointerenter={() => (highlightSeriesKey = activeSeries?.key ?? null)}
387
- onpointerleave={() => (highlightSeriesKey = null)}
388
- {...props.tooltip?.item}
389
- />
390
- {/if}
391
- </Tooltip.List>
392
- </Tooltip.Root>
393
- </slot>
394
- </slot>
382
+
383
+ {#if typeof tooltip === 'function'}
384
+ {@render tooltip(snippetProps)}
385
+ {:else if tooltip}
386
+ <Tooltip.Root {context} {...props.tooltip?.root}>
387
+ {#snippet children({ data })}
388
+ {#if activeSeries?.key !== 'default'}
389
+ <Tooltip.Header
390
+ value={activeSeries?.label ?? activeSeries?.key}
391
+ color={activeSeries?.color}
392
+ {...props.tooltip?.header}
393
+ />
394
+ {/if}
395
+ <Tooltip.List {...props.tooltip?.list}>
396
+ <Tooltip.Item
397
+ label={typeof context.config.x === 'string' ? context.config.x : 'x'}
398
+ value={context.x(data)}
399
+ {format}
400
+ onpointerenter={() =>
401
+ (seriesState.highlightKey.current = activeSeries?.key ?? null)}
402
+ onpointerleave={() => (seriesState.highlightKey.current = null)}
403
+ {...props.tooltip?.item}
404
+ />
405
+ <Tooltip.Item
406
+ label={typeof context.config.y === 'string' ? context.config.y : 'y'}
407
+ value={context.y(data)}
408
+ {format}
409
+ onpointerenter={() =>
410
+ (seriesState.highlightKey.current = activeSeries?.key ?? null)}
411
+ onpointerleave={() => (seriesState.highlightKey.current = null)}
412
+ {...props.tooltip?.item}
413
+ />
414
+ {#if context.config.r}
415
+ <Tooltip.Item
416
+ label={typeof context.config.r === 'string' ? context.config.r : 'r'}
417
+ value={context.r(data)}
418
+ {format}
419
+ onpointerenter={() =>
420
+ (seriesState.highlightKey.current = activeSeries?.key ?? null)}
421
+ onpointerleave={() => (seriesState.highlightKey.current = null)}
422
+ {...props.tooltip?.item}
423
+ />
424
+ {/if}
425
+ </Tooltip.List>
426
+ {/snippet}
427
+ </Tooltip.Root>
428
+ {/if}
429
+ {/if}
430
+ {/snippet}
395
431
  </Chart>