layerchart 2.0.0-next.1 → 2.0.0-next.2

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 (266) 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 +155 -0
  4. package/dist/components/AnnotationLine.svelte.d.ts +28 -0
  5. package/dist/components/AnnotationPoint.svelte +121 -0
  6. package/dist/components/AnnotationPoint.svelte.d.ts +32 -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 +287 -174
  14. package/dist/components/Axis.svelte.d.ts +116 -0
  15. package/dist/components/Bar.svelte +163 -107
  16. package/dist/components/Bar.svelte.d.ts +48 -0
  17. package/dist/components/Bars.svelte +54 -68
  18. package/dist/components/Bars.svelte.d.ts +27 -0
  19. package/dist/components/Blur.svelte +31 -7
  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 +60 -15
  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 +47 -12
  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 +28 -13
  66. package/dist/components/Graticule.svelte.d.ts +11 -52
  67. package/dist/components/Grid.svelte +226 -114
  68. package/dist/components/Grid.svelte.d.ts +70 -0
  69. package/dist/components/Group.svelte +132 -105
  70. package/dist/components/Group.svelte.d.ts +53 -0
  71. package/dist/components/Highlight.svelte +409 -307
  72. package/dist/components/Highlight.svelte.d.ts +107 -0
  73. package/dist/components/Hull.svelte +96 -45
  74. package/dist/components/Hull.svelte.d.ts +40 -30
  75. package/dist/components/Labels.svelte +125 -46
  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 +143 -70
  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 +105 -62
  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 +437 -176
  118. package/dist/components/Text.svelte.d.ts +130 -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 +106 -75
  131. package/dist/components/Voronoi.svelte.d.ts +40 -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 +450 -393
  135. package/dist/components/charts/AreaChart.svelte.d.ts +61 -0
  136. package/dist/components/charts/BarChart.svelte +454 -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 +369 -314
  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 +334 -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 +55 -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 +321 -155
  156. package/dist/components/layout/Canvas.svelte.d.ts +104 -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 +246 -78
  166. package/dist/components/tooltip/Tooltip.svelte.d.ts +149 -31
  167. package/dist/components/tooltip/TooltipContext.svelte +409 -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.d.ts +18 -14
  184. package/dist/docs/Code.svelte.d.ts +26 -22
  185. package/dist/docs/ConnectorSweepMenuField.svelte +17 -0
  186. package/dist/docs/ConnectorSweepMenuField.svelte.d.ts +7 -0
  187. package/dist/docs/ConnectorTypeMenuField.svelte +17 -0
  188. package/dist/docs/ConnectorTypeMenuField.svelte.d.ts +7 -0
  189. package/dist/docs/CurveMenuField.svelte +14 -3
  190. package/dist/docs/CurveMenuField.svelte.d.ts +9 -18
  191. package/dist/docs/GeoDebug.svelte +47 -42
  192. package/dist/docs/GeoDebug.svelte.d.ts +4 -16
  193. package/dist/docs/Header1.svelte.d.ts +27 -16
  194. package/dist/docs/Json.svelte.d.ts +20 -16
  195. package/dist/docs/Layout.svelte.d.ts +18 -13
  196. package/dist/docs/Link.svelte.d.ts +33 -21
  197. package/dist/docs/PathDataMenuField.svelte +14 -10
  198. package/dist/docs/PathDataMenuField.svelte.d.ts +8 -18
  199. package/dist/docs/Preview.svelte +20 -7
  200. package/dist/docs/Preview.svelte.d.ts +12 -22
  201. package/dist/docs/TilesetField.svelte.d.ts +21 -17
  202. package/dist/docs/TransformDebug.svelte +5 -6
  203. package/dist/docs/TransformDebug.svelte.d.ts +18 -14
  204. package/dist/docs/ViewSourceButton.svelte.d.ts +21 -17
  205. package/dist/types/d3-shape-extentions.d.ts +7 -0
  206. package/dist/utils/afterTick.d.ts +5 -0
  207. package/dist/utils/afterTick.js +8 -0
  208. package/dist/utils/arcText.svelte.d.ts +57 -0
  209. package/dist/utils/arcText.svelte.js +262 -0
  210. package/dist/utils/array.d.ts +9 -1
  211. package/dist/utils/array.js +13 -0
  212. package/dist/utils/attributes.d.ts +29 -0
  213. package/dist/utils/attributes.js +40 -0
  214. package/dist/utils/canvas.js +47 -10
  215. package/dist/utils/chart.d.ts +78 -0
  216. package/dist/utils/chart.js +512 -0
  217. package/dist/utils/color.d.ts +1 -0
  218. package/dist/utils/color.js +8 -0
  219. package/dist/utils/common.d.ts +3 -5
  220. package/dist/utils/common.js +3 -2
  221. package/dist/utils/connectorUtils.d.ts +21 -0
  222. package/dist/utils/connectorUtils.js +111 -0
  223. package/dist/utils/createId.d.ts +7 -0
  224. package/dist/utils/createId.js +9 -0
  225. package/dist/utils/debug.d.ts +1 -0
  226. package/dist/utils/debug.js +84 -0
  227. package/dist/utils/filterObject.d.ts +9 -0
  228. package/dist/utils/filterObject.js +12 -0
  229. package/dist/utils/graph/dagre.d.ts +34 -0
  230. package/dist/utils/graph/dagre.js +78 -0
  231. package/dist/utils/graph/dagre.test.d.ts +1 -0
  232. package/dist/utils/{graph.test.js → graph/dagre.test.js} +19 -33
  233. package/dist/utils/graph/sankey.d.ts +28 -0
  234. package/dist/utils/{graph.js → graph/sankey.js} +13 -41
  235. package/dist/utils/index.d.ts +3 -1
  236. package/dist/utils/index.js +3 -1
  237. package/dist/utils/key.svelte.d.ts +3 -0
  238. package/dist/utils/key.svelte.js +11 -0
  239. package/dist/utils/legendPayload.d.ts +7 -0
  240. package/dist/utils/legendPayload.js +8 -0
  241. package/dist/utils/motion.svelte.d.ts +140 -0
  242. package/dist/utils/motion.svelte.js +180 -0
  243. package/dist/utils/motion.test.d.ts +1 -0
  244. package/dist/utils/motion.test.js +213 -0
  245. package/dist/utils/{rect.d.ts → rect.svelte.d.ts} +7 -4
  246. package/dist/utils/rect.svelte.js +105 -0
  247. package/dist/utils/scales.svelte.d.ts +90 -0
  248. package/dist/utils/{scales.js → scales.svelte.js} +100 -39
  249. package/dist/utils/stack.d.ts +2 -3
  250. package/dist/utils/stack.js +1 -1
  251. package/dist/utils/string.js +87 -0
  252. package/dist/utils/ticks.d.ts +8 -2
  253. package/dist/utils/ticks.js +28 -0
  254. package/dist/utils/ticks.test.d.ts +1 -0
  255. package/dist/utils/ticks.test.js +67 -0
  256. package/dist/utils/types.d.ts +81 -0
  257. package/package.json +21 -19
  258. package/dist/components/ChartContext.svelte +0 -295
  259. package/dist/components/ChartContext.svelte.d.ts +0 -139
  260. package/dist/components/TransformContext.svelte.d.ts +0 -158
  261. package/dist/stores/motionStore.d.ts +0 -30
  262. package/dist/stores/motionStore.js +0 -62
  263. package/dist/utils/graph.d.ts +0 -37
  264. package/dist/utils/rect.js +0 -107
  265. package/dist/utils/scales.d.ts +0 -66
  266. /package/dist/{utils/graph.test.d.ts → components/charts/types.js} +0 -0
@@ -1,107 +1,187 @@
1
+ <script lang="ts" module>
2
+ import type { Snippet } from 'svelte';
3
+ import type { MarkerOptions } from './MarkerWrapper.svelte';
4
+ import type { CommonStyleProps, Without } from '../utils/types.js';
5
+ import type { SVGAttributes } from 'svelte/elements';
6
+ import type { CurveFactory, CurveFactoryLineOnly, Line } from 'd3-shape';
7
+
8
+ import {
9
+ createControlledMotion,
10
+ createMotion,
11
+ extractTweenConfig,
12
+ type MotionProp,
13
+ type ResolvedMotion,
14
+ } from '../utils/motion.svelte.js';
15
+ import { accessor, type Accessor } from '../utils/common.js';
16
+
17
+ export type SplinePropsWithoutHTML = {
18
+ /**
19
+ * Override data instead of using context
20
+ */
21
+ data?: any;
22
+
23
+ /**
24
+ * Pass `<path d={...} />` explicitly instead of calculating
25
+ * from data / context
26
+ */
27
+ pathData?: string | undefined | null;
28
+
29
+ /**
30
+ * Override `x` accessor from Chart context
31
+ */
32
+ x?: Accessor;
33
+
34
+ /**
35
+ * Override `y` accessor from Chart context
36
+ */
37
+ y?: Accessor;
38
+
39
+ /**
40
+ * Whether to animate the drawing of the path over time.
41
+ * Pass either `true` or an object with transition options to
42
+ * enable the transition.
43
+ *
44
+ * Works best with `tweened` disabled.
45
+ */
46
+ draw?: boolean | Parameters<typeof _drawTransition>[1];
47
+
48
+ /**
49
+ * Curve of spline drawn. Imported via d3-shape.
50
+ *
51
+ * @example
52
+ * import { curveNatural } from 'd3-shape';
53
+ * <Spline curve={curveNatural} />
54
+ *
55
+ * @type {CurveFactory | CurveFactoryLineOnly | undefined}
56
+ */
57
+ curve?: CurveFactory | CurveFactoryLineOnly;
58
+
59
+ /**
60
+ * Function to determine if a point is defined
61
+ *
62
+ * @example
63
+ * <Spline defined={(d) => d.value !== null} />
64
+ */
65
+ defined?: Parameters<Line<any>['defined']>[0];
66
+
67
+ /**
68
+ * Marker to attach to both start and end points of the line
69
+ */
70
+ marker?: MarkerOptions;
71
+
72
+ /**
73
+ * Marker to attach to the middle point of the line
74
+ */
75
+ markerMid?: MarkerOptions;
76
+
77
+ /**
78
+ * Marker to attach to the start point of the line
79
+ */
80
+ markerStart?: MarkerOptions;
81
+
82
+ /**
83
+ * Marker to attach to the end point of the line
84
+ */
85
+ markerEnd?: MarkerOptions;
86
+
87
+ /**
88
+ * Add additional content at the start of the line.
89
+ *
90
+ * Receives `{ point: DOMPoint }` as a snippet prop.
91
+ */
92
+ startContent?: Snippet<[{ point: DOMPoint }]>;
93
+
94
+ /**
95
+ * Add additional content at the end of the line.
96
+ *
97
+ * Receives `{ point: DOMPoint }` as a snippet prop.
98
+ */
99
+ endContent?: Snippet<[{ point: DOMPoint }]>;
100
+
101
+ /**
102
+ * A reference to the `<path>` element.
103
+ *
104
+ * @bindable
105
+ */
106
+ splineRef?: SVGPathElement;
107
+
108
+ motion?: MotionProp;
109
+ } & CommonStyleProps;
110
+
111
+ export type SplineProps = SplinePropsWithoutHTML &
112
+ Without<SVGAttributes<SVGPathElement>, SplinePropsWithoutHTML>;
113
+ </script>
114
+
1
115
  <script lang="ts">
2
- import { onDestroy, tick, type ComponentProps } from 'svelte';
3
- import { writable } from 'svelte/store';
4
- import { tweened as tweenedStore } from 'svelte/motion';
5
116
  import { draw as _drawTransition } from 'svelte/transition';
6
117
  import { cubicInOut } from 'svelte/easing';
7
118
  import { merge } from 'lodash-es';
8
119
 
9
120
  import { line as d3Line, lineRadial } from 'd3-shape';
10
- import type { CurveFactory, CurveFactoryLineOnly, Line } from 'd3-shape';
11
- // import { interpolateString } from 'd3-interpolate';
12
121
  import { interpolatePath } from 'd3-interpolate-path';
13
122
  import { max } from 'd3-array';
14
123
  import { cls } from '@layerstack/tailwind';
15
- import { uniqueId } from '@layerstack/utils';
16
- import { objectId } from '@layerstack/utils/object';
17
124
 
18
- import { chartContext } from './ChartContext.svelte';
19
125
  import Group from './Group.svelte';
20
- import Marker from './Marker.svelte';
21
-
22
- import { motionStore } from '../stores/motionStore.js';
23
- import { accessor, type Accessor } from '../utils/common.js';
24
- import { isScaleBand } from '../utils/scales.js';
126
+ import { isScaleBand } from '../utils/scales.svelte.js';
25
127
  import { flattenPathData } from '../utils/path.js';
26
- import { getCanvasContext } from './layout/Canvas.svelte';
128
+ import { registerCanvasComponent } from './layout/Canvas.svelte';
27
129
  import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
28
130
  import { getRenderContext } from './Chart.svelte';
131
+ import MarkerWrapper from './MarkerWrapper.svelte';
132
+ import { getChartContext } from './Chart.svelte';
133
+ import { createKey } from '../utils/key.svelte.js';
134
+ import { createId } from '../utils/createId.js';
135
+ import { layerClass } from '../utils/attributes.js';
136
+
137
+ const ctx = getChartContext();
138
+
139
+ const uid = $props.id();
140
+
141
+ let {
142
+ data,
143
+ pathData,
144
+ x,
145
+ y,
146
+ motion,
147
+ draw,
148
+ curve,
149
+ defined,
150
+ fill,
151
+ stroke,
152
+ strokeWidth,
153
+ fillOpacity,
154
+ class: className,
155
+ marker,
156
+ markerStart: markerStartProp,
157
+ markerMid: markerMidProp,
158
+ markerEnd: markerEndProp,
159
+ startContent,
160
+ endContent,
161
+ opacity,
162
+ splineRef: splineRefProp = $bindable(),
163
+ ...restProps
164
+ }: SplineProps = $props();
165
+
166
+ let splineRef = $state<SVGPathElement>();
167
+
168
+ $effect.pre(() => {
169
+ splineRefProp = splineRef;
170
+ });
171
+
172
+ const markerStart = $derived(markerStartProp ?? marker);
173
+ const markerMid = $derived(markerMidProp ?? marker);
174
+ const markerEnd = $derived(markerEndProp ?? marker);
29
175
 
30
- const {
31
- data: contextData,
32
- xScale,
33
- yScale,
34
- x: contextX,
35
- y: contextY,
36
- yRange,
37
- radial,
38
- config,
39
- } = chartContext();
40
-
41
- /** Override data instead of using context */
42
- export let data: any = undefined;
43
-
44
- /** Pass `<path d={...} />` explicitly instead of calculating from data / context */
45
- export let pathData: string | undefined | null = undefined;
46
-
47
- /** Override `x` accessor from Chart context */
48
- export let x: Accessor = undefined;
49
- /** Override `y` accessor from Chart context */
50
- export let y: Accessor = undefined;
51
-
52
- /** Interpolate path data using d3-interpolate-path. Works best without `draw` enabled */
53
- export let tweened: boolean | Parameters<typeof tweenedStore>[1] = undefined;
54
- /** Draw path over time. Works best without `tweened` enabled */
55
- export let draw: boolean | Parameters<typeof _drawTransition>[1] = undefined;
56
-
57
- /**
58
- * Curve of spline drawn. Imported via d3-shape.
59
- *
60
- * @example
61
- * import { curveNatural } from 'd3-shape';
62
- * <Spline curve={curveNatrual} />
63
- *
64
- * @type {CurveFactory | CurveFactoryLineOnly | undefined}
65
- */
66
- export let curve: CurveFactory | CurveFactoryLineOnly | undefined = undefined;
67
- export let defined: Parameters<Line<any>['defined']>[0] | undefined = undefined;
68
-
69
- export let fill: string | undefined = undefined;
70
- export let fillOpacity: number | undefined = undefined;
71
- export let stroke: string | undefined = undefined;
72
- export let strokeWidth: number | undefined = undefined;
73
- export let opacity: number | undefined = undefined;
74
-
75
- let className: string | undefined = undefined;
76
- export { className as class };
77
-
78
- export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
79
- export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
80
- export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
81
- export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
82
- export let onpointerdown: ((e: PointerEvent) => void) | undefined = undefined;
83
- export let ontouchmove: ((e: TouchEvent) => void) | undefined = undefined;
84
- export let onpointerover: ((e: PointerEvent) => void) | undefined = undefined;
85
- export let onpointerout: ((e: PointerEvent) => void) | undefined = undefined;
86
-
87
- /** Marker to attach to start, mid, and end points of path */
88
- export let marker: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
89
- undefined;
90
- /** Marker to attach to start point of path */
91
- export let markerStart: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
92
- marker;
93
- /** Marker to attach to all mid points of path */
94
- export let markerMid: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
95
- marker;
96
- /** Marker to attach to end point of path */
97
- export let markerEnd: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
98
- marker;
99
-
100
- $: markerStartId = markerStart || $$slots['markerStart'] ? uniqueId('marker-') : '';
101
- $: markerMidId = markerMid || $$slots['markerMid'] ? uniqueId('marker-') : '';
102
- $: markerEndId = markerEnd || $$slots['markerEnd'] ? uniqueId('marker-') : '';
103
-
104
- function getScaleValue(data: any, scale: typeof $xScale | typeof $yScale, accessor: Function) {
176
+ const markerStartId = $derived(markerStart ? createId('marker-start', uid) : '');
177
+ const markerMidId = $derived(markerMid ? createId('marker-mid', uid) : '');
178
+ const markerEndId = $derived(markerEnd ? createId('marker-end', uid) : '');
179
+
180
+ function getScaleValue(
181
+ data: any,
182
+ scale: typeof ctx.xScale | typeof ctx.yScale,
183
+ accessor: Function
184
+ ) {
105
185
  let value = accessor(data);
106
186
 
107
187
  if (Array.isArray(value)) {
@@ -117,11 +197,20 @@
117
197
  }
118
198
  }
119
199
 
120
- $: xAccessor = x ? accessor(x) : $contextX;
121
- $: yAccessor = y ? accessor(y) : $contextY;
200
+ const xAccessor = $derived(x ? accessor(x) : ctx.x);
201
+ const yAccessor = $derived(y ? accessor(y) : ctx.y);
122
202
 
123
- $: xOffset = isScaleBand($xScale) ? $xScale.bandwidth() / 2 : 0;
124
- $: yOffset = isScaleBand($yScale) ? $yScale.bandwidth() / 2 : 0;
203
+ const xOffset = $derived(isScaleBand(ctx.xScale) ? ctx.xScale.bandwidth() / 2 : 0);
204
+ const yOffset = $derived(isScaleBand(ctx.yScale) ? ctx.yScale.bandwidth() / 2 : 0);
205
+
206
+ const extractedTween = extractTweenConfig(motion);
207
+
208
+ const tweenedOptions: ResolvedMotion | undefined = extractedTween
209
+ ? {
210
+ type: extractedTween.type,
211
+ options: { interpolate: interpolatePath, ...extractedTween.options },
212
+ }
213
+ : undefined;
125
214
 
126
215
  /** Provide initial `0` horizontal baseline and initially hide/untrack scale changes so not reactive (only set on initial mount) */
127
216
  function defaultPathData() {
@@ -130,58 +219,49 @@
130
219
  return '';
131
220
  } else if (pathData) {
132
221
  // Flatten all `y` coordinates of pre-defined `pathData`
133
- return flattenPathData(pathData, Math.min($yScale(0), $yRange[0]));
134
- } else if ($config.x) {
222
+ return flattenPathData(pathData, Math.min(ctx.yScale(0) ?? ctx.yRange[0], ctx.yRange[0]));
223
+ } else if (ctx.config.x) {
135
224
  // Only use default line if `x` accessor is defined (cartesian chart)
136
- const path = $radial
225
+ const path = ctx.radial
137
226
  ? lineRadial()
138
- .angle((d) => $xScale(xAccessor(d)))
139
- .radius((d) => Math.min($yScale(0), $yRange[0]))
227
+ .angle((d) => ctx.xScale(xAccessor(d)) + 0) // Never apply xOffset (LineChart radar, BarChart radial, ...)?
228
+
229
+ .radius((d) => Math.min(ctx.yScale(0), ctx.yRange[0]))
140
230
  : d3Line()
141
- .x((d) => $xScale(xAccessor(d)) + xOffset)
142
- .y((d) => Math.min($yScale(0), $yRange[0]));
231
+ .x((d) => ctx.xScale(xAccessor(d)) + xOffset)
232
+ .y((d) => Math.min(ctx.yScale(0), ctx.yRange[0]));
143
233
 
144
234
  path.defined(defined ?? ((d) => xAccessor(d) != null && yAccessor(d) != null));
145
235
 
146
236
  if (curve) path.curve(curve);
147
237
 
148
- return path(data ?? $contextData);
238
+ return path(data ?? ctx.data);
149
239
  }
150
240
  }
151
241
 
152
- let d: string | null = '';
153
- const tweenedOptions = tweened
154
- ? { interpolate: interpolatePath, ...(typeof tweened === 'object' ? tweened : null) }
155
- : false;
156
- $: tweened_d = motionStore(defaultPathData(), { tweened: tweenedOptions });
157
- $: {
158
- const path = $radial
242
+ const d = $derived.by(() => {
243
+ const path = ctx.radial
159
244
  ? lineRadial()
160
- .angle((d) => getScaleValue(d, $xScale, xAccessor))
161
- .radius((d) => getScaleValue(d, $yScale, yAccessor))
245
+ .angle((d) => getScaleValue(d, ctx.xScale, xAccessor) + 0) // Never apply xOffset (LineChart radar, BarChart radial, ...)?
246
+
247
+ .radius((d) => getScaleValue(d, ctx.yScale, yAccessor) + yOffset)
162
248
  : d3Line()
163
- .x((d) => getScaleValue(d, $xScale, xAccessor) + xOffset)
164
- .y((d) => getScaleValue(d, $yScale, yAccessor) + yOffset);
249
+ .x((d) => getScaleValue(d, ctx.xScale, xAccessor) + xOffset)
250
+ .y((d) => getScaleValue(d, ctx.yScale, yAccessor) + yOffset);
165
251
 
166
252
  path.defined(defined ?? ((d) => xAccessor(d) != null && yAccessor(d) != null));
167
-
168
253
  if (curve) path.curve(curve);
169
254
 
170
- d = pathData ?? path(data ?? $contextData) ?? '';
171
- tweened_d.set(d);
172
- }
255
+ return pathData ?? path(data ?? ctx.data) ?? '';
256
+ });
173
257
 
174
- $: drawTransition = draw ? _drawTransition : () => ({});
258
+ const tweenedState = createMotion(defaultPathData(), () => d, tweenedOptions);
175
259
 
176
- let key = Symbol();
177
- $: if (draw) {
178
- // Anytime the path data changes, redraw
179
- $tweened_d;
180
- key = Symbol();
181
- }
260
+ const drawTransition = $derived(draw ? _drawTransition : () => ({}));
261
+
262
+ let key = $state(Symbol());
182
263
 
183
- const renderContext = getRenderContext();
184
- const canvasContext = getCanvasContext();
264
+ const renderCtx = getRenderContext();
185
265
 
186
266
  function render(
187
267
  ctx: CanvasRenderingContext2D,
@@ -189,7 +269,7 @@
189
269
  ) {
190
270
  renderPathData(
191
271
  ctx,
192
- $tweened_d,
272
+ tweenedState.current,
193
273
  styleOverrides
194
274
  ? merge({ styles: { strokeWidth } }, styleOverrides)
195
275
  : {
@@ -200,80 +280,94 @@
200
280
  }
201
281
 
202
282
  // TODO: Use objectId to work around Svelte 4 reactivity issue (even when memoizing gradients)
203
- $: fillKey = fill && typeof fill === 'object' ? objectId(fill) : fill;
204
- $: strokeKey = stroke && typeof stroke === 'object' ? objectId(stroke) : stroke;
205
-
206
- $: if (renderContext === 'canvas') {
207
- // Redraw when props change
208
- $tweened_d && fillKey && fillOpacity && strokeKey && strokeWidth && className;
209
- canvasContext.invalidate();
210
- }
283
+ const fillKey = createKey(() => fill);
284
+ const strokeKey = createKey(() => stroke);
211
285
 
212
- let canvasUnregister: ReturnType<typeof canvasContext.register>;
213
- $: if (renderContext === 'canvas') {
214
- canvasUnregister = canvasContext.register({
286
+ if (renderCtx === 'canvas') {
287
+ registerCanvasComponent({
215
288
  name: 'Spline',
216
289
  render,
217
290
  events: {
218
- click: onclick,
219
- pointerenter: onpointerenter,
220
- pointermove: onpointermove,
221
- pointerleave: onpointerleave,
222
- pointerdown: onpointerdown,
223
- pointerover: onpointerover,
224
- pointerout: onpointerout,
225
- touchmove: ontouchmove,
291
+ click: restProps.onclick,
292
+ pointerenter: restProps.onpointerenter,
293
+ pointermove: restProps.onpointermove,
294
+ pointerleave: restProps.onpointerleave,
295
+ pointerdown: restProps.onpointerdown,
296
+ pointerover: restProps.onpointerover,
297
+ pointerout: restProps.onpointerout,
298
+ touchmove: restProps.ontouchmove,
226
299
  },
300
+ deps: () => [
301
+ fillKey.current,
302
+ fillOpacity,
303
+ strokeKey.current,
304
+ strokeWidth,
305
+ opacity,
306
+ className,
307
+ tweenedState.current,
308
+ ],
227
309
  });
228
310
  }
229
311
 
230
- onDestroy(() => {
231
- if (renderContext === 'canvas') {
232
- canvasUnregister();
312
+ let startPoint = $state<DOMPoint | undefined>();
313
+
314
+ const endPointDuration = $derived.by(() => {
315
+ if (
316
+ typeof draw === 'object' &&
317
+ draw.duration !== undefined &&
318
+ typeof draw.duration !== 'function'
319
+ ) {
320
+ return draw.duration;
233
321
  }
322
+ return 800;
234
323
  });
235
324
 
236
- let pathEl: SVGPathElement | undefined = undefined;
237
- const startPoint = writable<DOMPoint | undefined>(undefined);
238
- $: endPoint = motionStore<DOMPoint | undefined>(undefined, {
239
- tweened: draw
325
+ const endPoint = createControlledMotion<DOMPoint | undefined>(
326
+ undefined,
327
+ draw
240
328
  ? {
241
- duration: (typeof draw === 'object' && draw.duration) || 800,
242
- easing: (typeof draw === 'object' && draw.easing) || cubicInOut,
243
- interpolate(a, b) {
329
+ type: 'tween',
330
+ duration: () => endPointDuration,
331
+ easing: typeof draw === 'object' && draw.easing ? draw.easing : cubicInOut,
332
+ interpolate() {
244
333
  return (t: number) => {
245
- const totalLength = pathEl?.getTotalLength() ?? 0;
246
- const point = pathEl?.getPointAtLength(totalLength * t);
334
+ const totalLength = splineRef?.getTotalLength() ?? 0;
335
+ const point = splineRef?.getPointAtLength(totalLength * t);
247
336
  return point;
248
337
  };
249
338
  },
250
339
  }
251
- : false,
340
+ : { type: 'none' }
341
+ );
342
+
343
+ $effect(() => {
344
+ if (!startContent && !endContent) return;
345
+ d;
346
+ if (!splineRef || !splineRef.getTotalLength()) return;
347
+ startPoint = splineRef.getPointAtLength(0);
348
+ const totalLength = splineRef.getTotalLength();
349
+ endPoint.target = splineRef.getPointAtLength(totalLength);
252
350
  });
253
351
 
254
- $: {
255
- if ($$slots.start || $$slots.end) {
256
- // Wait for path data to update DOM, then update
257
- d;
258
- tick().then(() => {
259
- if (pathEl) {
260
- startPoint.set(pathEl.getPointAtLength(0));
261
-
262
- const totalLength = pathEl.getTotalLength();
263
- endPoint.set(pathEl.getPointAtLength(totalLength));
264
- }
265
- });
266
- }
267
- }
352
+ $effect(() => {
353
+ if (!draw) return;
354
+ [tweenedState.current];
355
+ // Anytime the path data changes, redraw
356
+ key = Symbol();
357
+ });
268
358
  </script>
269
359
 
270
- {#if renderContext === 'svg'}
360
+ {#if renderCtx === 'svg'}
271
361
  {#key key}
272
- <!-- svelte-ignore a11y-no-static-element-interactions -->
273
362
  <path
274
- d={$tweened_d}
275
- {...$$restProps}
276
- class={cls('path-line', !fill && 'fill-none', !stroke && 'stroke-surface-content', className)}
363
+ d={tweenedState.current}
364
+ {...restProps}
365
+ class={cls(
366
+ layerClass('spline-path'),
367
+ !fill && 'fill-none',
368
+ !stroke && 'stroke-surface-content',
369
+ className
370
+ )}
277
371
  {fill}
278
372
  fill-opacity={fillOpacity}
279
373
  {stroke}
@@ -283,52 +377,21 @@
283
377
  marker-mid={markerMidId ? `url(#${markerMidId})` : undefined}
284
378
  marker-end={markerEndId ? `url(#${markerEndId})` : undefined}
285
379
  in:drawTransition|global={typeof draw === 'object' ? draw : undefined}
286
- on:click={onclick}
287
- on:pointerenter={onpointerenter}
288
- on:pointermove={onpointermove}
289
- on:pointerleave={onpointerleave}
290
- on:pointerdown={onpointerdown}
291
- on:pointerover={onpointerover}
292
- on:pointerout={onpointerout}
293
- on:touchmove={ontouchmove}
294
- bind:this={pathEl}
380
+ bind:this={splineRef}
295
381
  />
382
+ <MarkerWrapper id={markerStartId} marker={markerStart} />
383
+ <MarkerWrapper id={markerMidId} marker={markerMid} />
384
+ <MarkerWrapper id={markerEndId} marker={markerEnd} />
296
385
 
297
- <slot name="markerStart" id={markerStartId}>
298
- {#if markerStart}
299
- <Marker
300
- id={markerStartId}
301
- type={typeof markerStart === 'string' ? markerStart : undefined}
302
- {...typeof markerStart === 'object' ? markerStart : null}
303
- />
304
- {/if}
305
- </slot>
306
-
307
- <slot name="markerMid" id={markerMidId}>
308
- <Marker
309
- id={markerMidId}
310
- type={typeof markerMid === 'string' ? markerMid : undefined}
311
- {...typeof markerMid === 'object' ? markerMid : null}
312
- />
313
- </slot>
314
-
315
- <slot name="markerEnd" id={markerEndId}>
316
- <Marker
317
- id={markerEndId}
318
- type={typeof markerEnd === 'string' ? markerEnd : undefined}
319
- {...typeof markerEnd === 'object' ? markerEnd : null}
320
- />
321
- </slot>
322
-
323
- {#if $$slots.start && $startPoint}
324
- <Group x={$startPoint.x} y={$startPoint.y}>
325
- <slot name="start" point={$startPoint} />
386
+ {#if startContent && startPoint}
387
+ <Group x={startPoint.x} y={startPoint.y} class={layerClass('spline-g-start')}>
388
+ {@render startContent({ point: startPoint })}
326
389
  </Group>
327
390
  {/if}
328
391
 
329
- {#if $$slots.end && $endPoint}
330
- <Group x={$endPoint.x} y={$endPoint.y}>
331
- <slot name="end" point={$endPoint} />
392
+ {#if endContent && endPoint.current}
393
+ <Group x={endPoint.current.x} y={endPoint.current.y} class={layerClass('spline-g-end')}>
394
+ {@render endContent({ point: endPoint.current })}
332
395
  </Group>
333
396
  {/if}
334
397
  {/key}