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,55 +1,129 @@
1
- <script lang="ts">
2
- import { onDestroy } from 'svelte';
3
- import { uniqueId } from '@layerstack/utils';
1
+ <script lang="ts" module>
2
+ import { asAny, type Without } from '../utils/types.js';
3
+ import type { SVGAttributes } from 'svelte/elements';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ export type LinearGradientPropsWithoutHTML = {
7
+ /**
8
+ * Unique id for linearGradient
9
+ */
10
+ id?: string;
11
+
12
+ /**
13
+ * Array array of strings (colors), will equally distributed from 0-100%.
14
+ * If array of tuples, will use first value as the offset, and second as color
15
+ *
16
+ * @default `['var(--tw-gradient-from)', 'var(--tw-gradient-to)']`
17
+ */
18
+ stops?: string[] | [string | number, string][];
19
+
20
+ /**
21
+ * Apply color stops top-to-bottom (true) or left-to-right (false)
22
+ *
23
+ * @default false
24
+ */
25
+ vertical?: boolean;
26
+
27
+ /**
28
+ * @default '0%'
29
+ */
30
+ x1?: string;
31
+
32
+ /**
33
+ * @default '0%'
34
+ */
35
+ y1?: string;
36
+
37
+ /**
38
+ * @default vertical ? '0%' : '100%'
39
+ */
40
+ x2?: string;
41
+ /**
42
+ * @default vertical ? '100%' : '0%'
43
+ */
44
+ y2?: string;
45
+
46
+ /**
47
+ * Rotate the gradient by a given angle in degrees
48
+ */
49
+ rotate?: number;
50
+
51
+ /**
52
+ * Define the coordinate system for attributes (i.e. gradientUnits)
53
+ *
54
+ * @default 'objectBoundingBox'
55
+ */
56
+ units?: 'objectBoundingBox' | 'userSpaceOnUse';
57
+
58
+ /**
59
+ * A bindable reference to the underlying `<linearGradient>` element
60
+ *
61
+ * @bindable
62
+ */
63
+ ref?: SVGLinearGradientElement;
64
+
65
+ /**
66
+ * Render as a child of the gradient and will opt out of the default stops
67
+ * being rendered.
68
+ */
69
+ stopsContent?: Snippet;
70
+
71
+ children?: Snippet<[{ id: string; gradient: string }]>;
72
+ };
73
+
74
+ export type LinearGradientProps = LinearGradientPropsWithoutHTML &
75
+ Without<SVGAttributes<SVGLinearGradientElement>, LinearGradientPropsWithoutHTML>;
76
+ </script>
4
77
 
5
- import { getRenderContext } from './Chart.svelte';
6
- import { chartContext } from './ChartContext.svelte';
7
- import { getCanvasContext } from './layout/Canvas.svelte';
78
+ <script lang="ts">
79
+ import { getChartContext, getRenderContext } from './Chart.svelte';
80
+ import { registerCanvasComponent } from './layout/Canvas.svelte';
8
81
  import { createLinearGradient, getComputedStyles } from '../utils/canvas.js';
9
82
  import { parsePercent } from '../utils/math.js';
83
+ import { createId } from '../utils/createId.js';
84
+ import { extractLayerProps, layerClass } from '../utils/attributes.js';
85
+ import { cls } from '@layerstack/tailwind';
86
+
87
+ const uid = $props.id();
88
+
89
+ let {
90
+ id = createId('linearGradient-', uid),
91
+ stops = ['var(--tw-gradient-from)', 'var(--tw-gradient-to)'],
92
+ vertical = false,
93
+ x1 = '0%',
94
+ y1 = '0%',
95
+ x2 = vertical ? '0%' : '100%',
96
+ y2 = vertical ? '100%' : '0%',
97
+ rotate,
98
+ units = 'objectBoundingBox',
99
+ ref: refProp = $bindable(),
100
+ class: className,
101
+ stopsContent,
102
+ children,
103
+ ...restProps
104
+ }: LinearGradientProps = $props();
105
+
106
+ let ref = $state<SVGLinearGradientElement>();
107
+ $effect.pre(() => {
108
+ refProp = ref;
109
+ });
10
110
 
11
- /** Unique id for linearGradient */
12
- export let id: string = uniqueId('linearGradient-');
13
-
14
- /** Array array of strings (colors), will equally distributed from 0-100%. If array of tuples, will use first value as the offset, and second as color */
15
- export let stops: string[] | [string | number, string][] = [
16
- 'var(--tw-gradient-from)',
17
- 'var(--tw-gradient-to)',
18
- ];
19
-
20
- /** Apply color stops top-to-bottom (true) or left-to-right (false) */
21
- export let vertical = false;
22
- export let x1 = '0%';
23
- export let y1 = '0%';
24
- export let x2 = vertical ? '0%' : '100%';
25
- export let y2 = vertical ? '100%' : '0%';
26
-
27
- export let rotate: number | undefined = undefined;
28
-
29
- /** Define the coordinate system for attributes (i.e. gradientUnits) */
30
- export let units: 'objectBoundingBox' | 'userSpaceOnUse' = 'objectBoundingBox';
31
-
32
- let className: string | undefined = undefined;
33
- export { className as class };
34
-
35
- const { width, height, padding } = chartContext();
36
-
37
- const renderContext = getRenderContext();
38
- const canvasContext = getCanvasContext();
111
+ const ctx = getChartContext();
112
+ const renderCtx = getRenderContext();
39
113
 
40
- let canvasGradient: CanvasGradient;
114
+ let canvasGradient = $state<CanvasGradient>();
41
115
 
42
- function render(ctx: CanvasRenderingContext2D) {
116
+ function render(_ctx: CanvasRenderingContext2D) {
43
117
  // Use `getComputedStyles()` to convert each stop (if using CSS variables and/or classes) to color values
44
118
  const _stops = stops.map((stop, i) => {
45
119
  if (Array.isArray(stop)) {
46
- const { fill } = getComputedStyles(ctx.canvas, {
120
+ const { fill } = getComputedStyles(_ctx.canvas, {
47
121
  styles: { fill: stop[1] },
48
122
  classes: className,
49
123
  });
50
124
  return { offset: parsePercent(stop[0]), color: fill };
51
125
  } else {
52
- const { fill } = getComputedStyles(ctx.canvas, {
126
+ const { fill } = getComputedStyles(_ctx.canvas, {
53
127
  styles: { fill: stop },
54
128
  classes: className,
55
129
  });
@@ -57,41 +131,38 @@
57
131
  }
58
132
  });
59
133
 
60
- // TODO: Use x1/y1/x2/y2 values (convert from pecentage strings)
134
+ // TODO: Use x1/y1/x2/y2 values (convert from percentage strings)
61
135
  const gradient = createLinearGradient(
62
- ctx,
63
- $padding.left,
64
- $padding.top,
65
- vertical ? $padding.left : $width - $padding.right,
66
- vertical ? $height + $padding.bottom : $padding.top,
136
+ _ctx,
137
+ ctx.padding.left,
138
+ ctx.padding.top,
139
+ vertical ? ctx.padding.left : ctx.width - ctx.padding.right,
140
+ vertical ? ctx.height + ctx.padding.bottom : ctx.padding.top,
67
141
  _stops
68
142
  );
69
143
 
70
144
  canvasGradient = gradient;
71
145
  }
72
146
 
73
- $: if (renderContext === 'canvas') {
74
- x1 && y1 && x2 && y2 && stops && className;
75
- canvasContext.invalidate();
76
- }
77
-
78
- let canvasUnregister: ReturnType<typeof canvasContext.register>;
79
- $: if (renderContext === 'canvas') {
80
- canvasUnregister = canvasContext.register({ name: 'Gradient', render });
147
+ if (renderCtx === 'canvas') {
148
+ registerCanvasComponent({
149
+ name: 'Gradient',
150
+ render,
151
+ deps: () => [x1, y1, x2, y2, stops, className],
152
+ });
81
153
  }
82
-
83
- onDestroy(() => {
84
- if (renderContext === 'canvas') {
85
- canvasUnregister();
86
- }
87
- });
88
154
  </script>
89
155
 
90
- {#if renderContext === 'canvas'}
91
- <slot {id} gradient={canvasGradient} />
92
- {:else if renderContext === 'svg'}
156
+ {#if renderCtx === 'canvas'}
157
+ <!--
158
+ TODO: we can probably pass the context to coerce this type so we don't need a bunch
159
+ of predicates to check if the gradient is a CanvasGradient or not...
160
+ -->
161
+ {@render children?.({ id, gradient: asAny(canvasGradient) })}
162
+ {:else if renderCtx === 'svg'}
93
163
  <defs>
94
164
  <linearGradient
165
+ bind:this={ref}
95
166
  {id}
96
167
  {x1}
97
168
  {y1}
@@ -99,25 +170,29 @@
99
170
  {y2}
100
171
  gradientTransform={rotate ? `rotate(${rotate})` : ''}
101
172
  gradientUnits={units}
102
- {...$$restProps}
173
+ {...extractLayerProps(restProps, 'linear-gradient')}
103
174
  >
104
- <slot name="stops">
105
- {#if stops}
106
- {#each stops as stop, i}
107
- {#if Array.isArray(stop)}
108
- <stop offset={stop[0]} stop-color={stop[1]} class={className} />
109
- {:else}
110
- <stop
111
- offset="{i * (100 / (stops.length - 1))}%"
112
- stop-color={stop}
113
- class={className}
114
- />
115
- {/if}
116
- {/each}
117
- {/if}
118
- </slot>
175
+ {#if stopsContent}
176
+ {@render stopsContent?.()}
177
+ {:else if stops}
178
+ {#each stops as stop, i}
179
+ {#if Array.isArray(stop)}
180
+ <stop
181
+ offset={stop[0]}
182
+ stop-color={stop[1]}
183
+ class={cls(layerClass('linear-gradient-stop'), className)}
184
+ />
185
+ {:else}
186
+ <stop
187
+ offset="{i * (100 / (stops.length - 1))}%"
188
+ stop-color={stop}
189
+ class={cls(layerClass('linear-gradient-stop'), className)}
190
+ />
191
+ {/if}
192
+ {/each}
193
+ {/if}
119
194
  </linearGradient>
120
195
  </defs>
121
196
 
122
- <slot {id} gradient="url(#{id})" />
197
+ {@render children?.({ id, gradient: `url(#${id})` })}
123
198
  {/if}
@@ -1,32 +1,67 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- id?: string | undefined;
6
- stops?: string[] | [string | number, string][] | undefined;
7
- vertical?: boolean | undefined;
8
- x1?: string | undefined;
9
- y1?: string | undefined;
10
- x2?: string | undefined;
11
- y2?: string | undefined;
12
- rotate?: number | undefined | undefined;
13
- units?: "objectBoundingBox" | "userSpaceOnUse" | undefined;
14
- class?: string | undefined | undefined;
15
- };
16
- events: {
17
- [evt: string]: CustomEvent<any>;
18
- };
19
- slots: {
20
- default: {
21
- id: string;
22
- gradient: string;
23
- };
24
- stops: {};
25
- };
1
+ import { type Without } from '../utils/types.js';
2
+ import type { SVGAttributes } from 'svelte/elements';
3
+ import type { Snippet } from 'svelte';
4
+ export type LinearGradientPropsWithoutHTML = {
5
+ /**
6
+ * Unique id for linearGradient
7
+ */
8
+ id?: string;
9
+ /**
10
+ * Array array of strings (colors), will equally distributed from 0-100%.
11
+ * If array of tuples, will use first value as the offset, and second as color
12
+ *
13
+ * @default `['var(--tw-gradient-from)', 'var(--tw-gradient-to)']`
14
+ */
15
+ stops?: string[] | [string | number, string][];
16
+ /**
17
+ * Apply color stops top-to-bottom (true) or left-to-right (false)
18
+ *
19
+ * @default false
20
+ */
21
+ vertical?: boolean;
22
+ /**
23
+ * @default '0%'
24
+ */
25
+ x1?: string;
26
+ /**
27
+ * @default '0%'
28
+ */
29
+ y1?: string;
30
+ /**
31
+ * @default vertical ? '0%' : '100%'
32
+ */
33
+ x2?: string;
34
+ /**
35
+ * @default vertical ? '100%' : '0%'
36
+ */
37
+ y2?: string;
38
+ /**
39
+ * Rotate the gradient by a given angle in degrees
40
+ */
41
+ rotate?: number;
42
+ /**
43
+ * Define the coordinate system for attributes (i.e. gradientUnits)
44
+ *
45
+ * @default 'objectBoundingBox'
46
+ */
47
+ units?: 'objectBoundingBox' | 'userSpaceOnUse';
48
+ /**
49
+ * A bindable reference to the underlying `<linearGradient>` element
50
+ *
51
+ * @bindable
52
+ */
53
+ ref?: SVGLinearGradientElement;
54
+ /**
55
+ * Render as a child of the gradient and will opt out of the default stops
56
+ * being rendered.
57
+ */
58
+ stopsContent?: Snippet;
59
+ children?: Snippet<[{
60
+ id: string;
61
+ gradient: string;
62
+ }]>;
26
63
  };
27
- export type LinearGradientProps = typeof __propDef.props;
28
- export type LinearGradientEvents = typeof __propDef.events;
29
- export type LinearGradientSlots = typeof __propDef.slots;
30
- export default class LinearGradient extends SvelteComponentTyped<LinearGradientProps, LinearGradientEvents, LinearGradientSlots> {
31
- }
32
- export {};
64
+ export type LinearGradientProps = LinearGradientPropsWithoutHTML & Without<SVGAttributes<SVGLinearGradientElement>, LinearGradientPropsWithoutHTML>;
65
+ declare const LinearGradient: import("svelte").Component<LinearGradientProps, {}, "ref">;
66
+ type LinearGradient = ReturnType<typeof LinearGradient>;
67
+ export default LinearGradient;
@@ -1,6 +1,73 @@
1
+ <script lang="ts" module>
2
+ import type { MarkerOptions } from './MarkerWrapper.svelte';
3
+ import type { Without } from '../utils/types.js';
4
+ import type { MotionNoneOption, MotionTweenOption } from '../utils/motion.svelte.js';
5
+ import { curveBumpX, curveBumpY, type CurveFactory } from 'd3-shape';
6
+
7
+ export type LinkPropsWithoutHTML = {
8
+ // Override what is used from context
9
+ data?: any;
10
+
11
+ /**
12
+ * Update source and target accessors to be compatible with d3-sankey. see: https://github.com/d3/d3-sankey#sankeyLinkHorizontal
13
+ *
14
+ * @default false
15
+ */
16
+ sankey?: boolean;
17
+ source?: (d: any) => any;
18
+ target?: (d: any) => any;
19
+
20
+ /**
21
+ * Convenient property to swap x/y accessor logic
22
+ */
23
+ orientation?: 'vertical' | 'horizontal';
24
+
25
+ x?: (d: any) => any;
26
+ y?: (d: any) => any;
27
+ curve?: CurveFactory;
28
+
29
+ /**
30
+ * Marker to attach to both start and end points of the line
31
+ */
32
+ marker?: MarkerOptions;
33
+
34
+ /**
35
+ * Marker to attach to the middle point of the line
36
+ */
37
+ markerMid?: MarkerOptions;
38
+
39
+ /**
40
+ * Marker to attach to the start point of the line
41
+ */
42
+ markerStart?: MarkerOptions;
43
+
44
+ /**
45
+ * Marker to attach to the end point of the line
46
+ */
47
+ markerEnd?: MarkerOptions;
48
+
49
+ /**
50
+ * Apply explicit coordinates to the line. Useful when dealing with
51
+ * force simulation links.
52
+ */
53
+ explicitCoords?: {
54
+ x1: number;
55
+ y1: number;
56
+ x2: number;
57
+ y2: number;
58
+ };
59
+
60
+ motion?: MotionTweenOption | MotionNoneOption;
61
+ };
62
+
63
+ export type LinkProps = LinkPropsWithoutHTML & Without<ConnectorProps, LinkPropsWithoutHTML>;
64
+
65
+ const FALLBACK_COORDS = { x: 0, y: 0 };
66
+ </script>
67
+
1
68
  <script lang="ts">
2
69
  /*
3
- TODO:
70
+ TODO:
4
71
  - [ ] Show path progressively show / animated in on load. Also fix sliding in from left side (at last in from bottom)
5
72
  - [ ] Support link types
6
73
  - [ ] https://airbnb.io/visx/linktypes
@@ -13,109 +80,98 @@
13
80
  - [ ] Investigate: https://observablehq.com/@fil/sankey-link-paths
14
81
  - [ ] Use for annotations - https://github.com/techniq/layerchart/issues/11
15
82
  */
16
- import type { ComponentProps } from 'svelte';
17
- import type { tweened as tweenedStore } from 'svelte/motion';
18
- import { link as d3Link, curveBumpX, curveBumpY } from 'd3-shape';
19
- import { interpolatePath } from 'd3-interpolate-path';
20
-
21
- import { motionStore } from '../stores/motionStore.js';
22
- import { uniqueId } from '@layerstack/utils';
23
-
24
- import Marker from './Marker.svelte';
25
- import Spline from './Spline.svelte';
26
-
27
- // Override what is used from context
28
- export let data: any = undefined; // TODO: Update Type
29
-
30
- /**
31
- * Update source and target accessors to be compatible with d3-sankey. see: https://github.com/d3/d3-sankey#sankeyLinkHorizontal
32
- */
33
- export let sankey = false;
34
- export let source = sankey ? (d: any) => [d.source.x1, d.y0] : (d: any) => d.source;
35
- export let target = sankey ? (d: any) => [d.target.x0, d.y1] : (d: any) => d.target;
36
-
37
- /** Convenient property to swap x/y accessor logic */
38
- export let orientation: 'vertical' | 'horizontal' = sankey ? 'horizontal' : 'vertical';
39
- export let x = (d: any) => (sankey ? d[0] : orientation === 'horizontal' ? d.y : d.x);
40
- export let y = (d: any) => (sankey ? d[1] : orientation === 'horizontal' ? d.x : d.y);
41
- export let curve = orientation === 'horizontal' ? curveBumpX : curveBumpY;
42
-
43
- export let onclick: ((e: MouseEvent) => void) | undefined = undefined;
44
- export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
45
- export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
46
- export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
47
- export let onpointerover: ((e: PointerEvent) => void) | undefined = undefined;
48
- export let onpointerout: ((e: PointerEvent) => void) | undefined = undefined;
49
-
50
- /** Marker to attach to start, mid, and end points of path */
51
- export let marker: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
52
- undefined;
53
- /** Marker to attach to start point of path */
54
- export let markerStart: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
55
- marker;
56
- /** Marker to attach to all mid points of path */
57
- export let markerMid: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
58
- marker;
59
- /** Marker to attach to end point of path */
60
- export let markerEnd: ComponentProps<Marker>['type'] | ComponentProps<Marker> | undefined =
61
- marker;
62
-
63
- $: markerStartId = markerStart || $$slots['markerStart'] ? uniqueId('marker-') : '';
64
- $: markerMidId = markerMid || $$slots['markerMid'] ? uniqueId('marker-') : '';
65
- $: markerEndId = markerEnd || $$slots['markerEnd'] ? uniqueId('marker-') : '';
66
-
67
- export let tweened: boolean | Parameters<typeof tweenedStore>[1] = undefined;
68
- const tweenedOptions = tweened
69
- ? { interpolate: interpolatePath, ...(typeof tweened === 'object' ? tweened : null) }
70
- : false;
71
- $: tweened_d = motionStore('', { tweened: tweenedOptions });
72
-
73
- $: {
74
- orientation; // subscribe to orientation changes to update link
75
- const link = d3Link(curve).source(source).target(target).x(x).y(y);
76
- const d = link(data) ?? '';
77
- tweened_d.set(d);
78
- }
83
+ import Connector, { type ConnectorProps } from './Connector.svelte';
84
+ import { extractLayerProps } from '../utils/attributes.js';
85
+
86
+ let {
87
+ data,
88
+ sankey = false,
89
+ source: sourceProp,
90
+ target: targetProp,
91
+ orientation: orientationProp,
92
+ x: xProp,
93
+ y: yProp,
94
+ curve: curveProp,
95
+ explicitCoords,
96
+ type = 'd3',
97
+ sweep = 'none',
98
+ ...restProps
99
+ }: LinkProps = $props();
100
+
101
+ const sourceAccessor = $derived.by(() => {
102
+ if (sourceProp) return sourceProp;
103
+ if (sankey) return (d: any) => ({ node: d.source, y: d.y0, isSource: true });
104
+ return (d: any) => d.source;
105
+ });
106
+
107
+ const targetAccessor = $derived.by(() => {
108
+ if (targetProp) return targetProp;
109
+ if (sankey) return (d: any) => ({ node: d.target, y: d.y1, isSource: false });
110
+ return (d: any) => d.target;
111
+ });
112
+
113
+ const orientation = $derived.by(() => {
114
+ if (orientationProp) return orientationProp;
115
+ if (sankey) return 'horizontal';
116
+ return 'vertical';
117
+ });
118
+
119
+ const curve = $derived.by(() => {
120
+ if (curveProp) return curveProp;
121
+ if (orientation === 'horizontal') return curveBumpX;
122
+ return curveBumpY;
123
+ });
124
+
125
+ const xAccessor = $derived.by(() => {
126
+ if (xProp) return xProp;
127
+ if (sankey) return (d: any) => (d.isSource ? d.node.x1 : d.node.x0);
128
+ return (d: any) => (orientation === 'horizontal' ? d.y : d.x);
129
+ });
130
+
131
+ const yAccessor = $derived.by(() => {
132
+ if (yProp) return yProp;
133
+ if (sankey) return (d: any) => d.y;
134
+ return (d: any) => (orientation === 'horizontal' ? d.x : d.y);
135
+ });
136
+
137
+ const sourceCoords = $derived.by(() => {
138
+ if (explicitCoords) return { x: explicitCoords.x1, y: explicitCoords.y1 };
139
+ if (!data) return FALLBACK_COORDS;
140
+
141
+ try {
142
+ const sourceData = sourceAccessor(data);
143
+ if (sourceData == null) return FALLBACK_COORDS;
144
+ const xVal = xAccessor(sourceData);
145
+ const yVal = yAccessor(sourceData);
146
+ return { x: Number.isFinite(xVal) ? xVal : 0, y: Number.isFinite(yVal) ? yVal : 0 };
147
+ } catch (e) {
148
+ console.error('Error accessing source coordinates:', e, 'Data:', data);
149
+ return FALLBACK_COORDS;
150
+ }
151
+ });
152
+
153
+ const targetCoords = $derived.by(() => {
154
+ if (explicitCoords) return { x: explicitCoords.x2, y: explicitCoords.y2 };
155
+ if (!data) return FALLBACK_COORDS;
156
+
157
+ try {
158
+ const targetData = targetAccessor(data);
159
+ if (targetData == null) return FALLBACK_COORDS;
160
+ const xVal = xAccessor(targetData);
161
+ const yVal = yAccessor(targetData);
162
+ return { x: Number.isFinite(xVal) ? xVal : 0, y: Number.isFinite(yVal) ? yVal : 0 };
163
+ } catch (e) {
164
+ console.error('Error accessing target coordinates:', e, 'Data:', data);
165
+ return FALLBACK_COORDS;
166
+ }
167
+ });
79
168
  </script>
80
169
 
81
- <Spline
82
- class="path-link"
83
- pathData={$tweened_d}
84
- fill="none"
85
- marker-start={markerStartId ? `url(#${markerStartId})` : undefined}
86
- marker-mid={markerMidId ? `url(#${markerMidId})` : undefined}
87
- marker-end={markerEndId ? `url(#${markerEndId})` : undefined}
88
- {onclick}
89
- {onpointerenter}
90
- {onpointermove}
91
- {onpointerleave}
92
- {onpointerover}
93
- {onpointerout}
94
- {...$$restProps}
170
+ <Connector
171
+ source={sourceCoords}
172
+ target={targetCoords}
173
+ {type}
174
+ {curve}
175
+ {sweep}
176
+ {...extractLayerProps(restProps, 'link')}
95
177
  />
96
-
97
- <slot name="markerStart" id={markerStartId}>
98
- {#if markerStart}
99
- <Marker
100
- id={markerStartId}
101
- type={typeof markerStart === 'string' ? markerStart : undefined}
102
- {...typeof markerStart === 'object' ? markerStart : null}
103
- />
104
- {/if}
105
- </slot>
106
-
107
- <slot name="markerMid" id={markerMidId}>
108
- <Marker
109
- id={markerMidId}
110
- type={typeof markerMid === 'string' ? markerMid : undefined}
111
- {...typeof markerMid === 'object' ? markerMid : null}
112
- />
113
- </slot>
114
-
115
- <slot name="markerEnd" id={markerEndId}>
116
- <Marker
117
- id={markerEndId}
118
- type={typeof markerEnd === 'string' ? markerEnd : undefined}
119
- {...typeof markerEnd === 'object' ? markerEnd : null}
120
- />
121
- </slot>