layerchart 2.0.0-next.1 → 2.0.0-next.3

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 +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 +283 -180
  14. package/dist/components/Axis.svelte.d.ts +117 -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 +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 +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 +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 +108 -76
  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,5 +1,9 @@
1
- <script lang="ts">
2
- import { onDestroy } from 'svelte';
1
+ <script lang="ts" module>
2
+ import type { CommonStyleProps, Without } from '../utils/types.js';
3
+ import type { Snippet } from 'svelte';
4
+ import type { PointerEventHandler, SVGAttributes } from 'svelte/elements';
5
+ import type { TooltipContextValue } from './tooltip/TooltipContext.svelte';
6
+ import { curveLinearClosed, type CurveFactory, type CurveFactoryLineOnly } from 'd3-shape';
3
7
  import {
4
8
  geoTransform as d3geoTransform,
5
9
  type GeoIdentityTransform,
@@ -7,124 +11,149 @@
7
11
  type GeoProjection,
8
12
  type GeoTransformPrototype,
9
13
  } from 'd3-geo';
14
+ import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
15
+
16
+ export type GeoPathPropsWithoutHTML = {
17
+ /**
18
+ * GeoJSON data to render
19
+ */
20
+ geojson?: GeoPermissibleObjects | null;
21
+
22
+ /**
23
+ * Tooltip context to setup pointer events to show tooltip for related data
24
+ */
25
+ tooltipContext?: TooltipContextValue | undefined;
26
+
27
+ /**
28
+ * Click event handler
29
+ */
30
+ onclick?:
31
+ | ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath> | undefined) => void)
32
+ | undefined;
33
+
34
+ /**
35
+ * Curve of path drawn. Imported via d3-shape.
36
+ *
37
+ * @example
38
+ * import { curveCatmullRom } from 'd3-shape';
39
+ * <GeoPath curve={curveCatmullRom} />
40
+ *
41
+ * @default curveLinearClosed
42
+ */
43
+ curve?: CurveFactory | CurveFactoryLineOnly;
44
+
45
+ /**
46
+ * Apply geo transform to projection.
47
+ * Useful to draw straight lines with `geoMercator` projection.
48
+ *
49
+ * @see https://d3js.org/d3-geo/projection#geoTransform
50
+ * @see https://stackoverflow.com/a/56409480/191902
51
+ **/
52
+ geoTransform?: (projection: GeoProjection | GeoIdentityTransform) => GeoTransformPrototype;
53
+
54
+ /**
55
+ * A reference to the underlying `<path>` element
56
+ * @bindable
57
+ */
58
+ ref?: SVGPathElement;
59
+
60
+ children?: Snippet<[{ geoPath: ReturnType<typeof geoCurvePath> | undefined }]>;
61
+ } & CommonStyleProps;
62
+
63
+ export type GeoPathProps = GeoPathPropsWithoutHTML &
64
+ Without<SVGAttributes<SVGPathElement>, GeoPathPropsWithoutHTML>;
65
+ </script>
66
+
67
+ <script lang="ts">
10
68
  import { cls } from '@layerstack/tailwind';
11
69
  import { merge } from 'lodash-es';
12
70
 
13
71
  import { getRenderContext } from './Chart.svelte';
14
- import { getCanvasContext } from './layout/Canvas.svelte';
15
- import { geoContext } from './GeoContext.svelte';
16
- import type { TooltipContextValue } from './tooltip/TooltipContext.svelte';
17
- import { curveLinearClosed, type CurveFactory, type CurveFactoryLineOnly } from 'd3-shape';
72
+ import { registerCanvasComponent } from './layout/Canvas.svelte';
18
73
  import { geoCurvePath } from '../utils/geo.js';
19
- import { renderPathData, type ComputedStylesOptions } from '../utils/canvas.js';
20
- import { objectId } from '@layerstack/utils/object';
21
-
22
- export let geojson: GeoPermissibleObjects | null | undefined = undefined;
23
-
24
- export let fill: string | undefined = undefined;
25
- export let stroke: string | undefined = undefined;
26
- export let strokeWidth: number | undefined = undefined;
27
- export let opacity: number | undefined = undefined;
28
-
29
- /**
30
- * Tooltip context to setup pointer events to show tooltip for related data
31
- */
32
- export let tooltip: TooltipContextValue | undefined = undefined;
33
-
34
- export let onclick:
35
- | ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath>) => void)
36
- | undefined = undefined;
37
- export let onpointerenter: ((e: PointerEvent) => void) | undefined = undefined;
38
- export let onpointermove: ((e: PointerEvent) => void) | undefined = undefined;
39
- export let onpointerleave: ((e: PointerEvent) => void) | undefined = undefined;
40
- export let onpointerdown: ((e: PointerEvent) => void) | undefined = undefined;
41
- export let ontouchmove: ((e: TouchEvent) => void) | undefined = undefined;
42
-
43
- /**
44
- * Curve of path drawn. Imported via d3-shape.
45
- *
46
- * @example
47
- * import { curveCatmullRom } from 'd3-shape';
48
- * <GeoPath curve={curveCatmullRom} />
49
- *
50
- * @type {CurveFactory | CurveFactoryLineOnly | undefined}
51
- */
52
- export let curve: CurveFactory | CurveFactoryLineOnly = curveLinearClosed;
53
-
54
- let className: string | undefined = undefined;
55
- export { className as class };
56
-
57
- const geo = geoContext();
58
-
59
- /**
60
- * Apply geo transform to projection. Useful to draw straight lines with `geoMercator` projection.
61
- * See: https://d3js.org/d3-geo/projection#geoTransform and https://stackoverflow.com/a/56409480/191902
62
- **/
63
- export let geoTransform:
64
- | ((projection: GeoProjection | GeoIdentityTransform) => GeoTransformPrototype)
65
- | undefined = undefined;
66
-
67
- $: _projection = geoTransform ? d3geoTransform(geoTransform($geo)) : $geo;
68
-
69
- $: geoPath = geoCurvePath(_projection, curve);
70
- $: {
71
- // Recreate `geoPath()` if `geojson` data changes (fixes ghosting issue when rendering to canvas)
74
+ import { getGeoContext } from './GeoContext.svelte';
75
+ import { createKey } from '../utils/key.svelte.js';
76
+ import { layerClass } from '../utils/attributes.js';
77
+
78
+ let {
79
+ fill,
80
+ stroke,
81
+ strokeWidth,
82
+ opacity,
83
+ geoTransform,
84
+ geojson,
85
+ tooltipContext,
86
+ curve = curveLinearClosed,
87
+ onclick,
88
+ class: className,
89
+ ref: refProp = $bindable(),
90
+ children,
91
+ ...restProps
92
+ }: GeoPathProps = $props();
93
+
94
+ let ref = $state<SVGPathElement>();
95
+ $effect.pre(() => {
96
+ refProp = ref;
97
+ });
98
+
99
+ const geo = getGeoContext();
100
+
101
+ const projection = $derived(
102
+ geoTransform && geo.projection ? d3geoTransform(geoTransform(geo.projection)) : geo.projection
103
+ );
104
+
105
+ const geoPath = $derived.by(() => {
72
106
  geojson;
73
- geoPath = geoCurvePath(_projection, curve);
74
- }
107
+ if (!projection) return;
108
+ return geoCurvePath(projection, curve);
109
+ });
75
110
 
76
- const renderContext = getRenderContext();
77
- const canvasContext = getCanvasContext();
111
+ const renderCtx = getRenderContext();
78
112
 
79
113
  function render(
80
114
  ctx: CanvasRenderingContext2D,
81
115
  styleOverrides: ComputedStylesOptions | undefined
82
116
  ) {
83
- if (geojson) {
84
- const pathData = geoPath(geojson);
85
- renderPathData(
86
- ctx,
87
- pathData,
88
- styleOverrides
89
- ? merge({ styles: { strokeWidth } }, styleOverrides)
90
- : {
91
- styles: { fill, stroke, strokeWidth, opacity },
92
- classes: className,
93
- }
94
- );
95
- }
117
+ if (!geojson) return;
118
+ const pathData = geoPath?.(geojson);
119
+ renderPathData(
120
+ ctx,
121
+ pathData,
122
+ styleOverrides
123
+ ? merge({ styles: { strokeWidth } }, styleOverrides)
124
+ : {
125
+ styles: { fill, stroke, strokeWidth, opacity },
126
+ classes: className,
127
+ }
128
+ );
96
129
  }
97
130
 
98
131
  // TODO: Use objectId to work around Svelte 4 reactivity issue (even when memoizing gradients)
99
- $: fillKey = fill && typeof fill === 'object' ? objectId(fill) : fill;
100
- $: strokeKey = stroke && typeof stroke === 'object' ? objectId(stroke) : stroke;
101
-
102
- $: if (renderContext === 'canvas') {
103
- // Redraw when geojson, projection, or class change
104
- geojson && _projection && fillKey && strokeKey && strokeWidth && opacity && className;
105
- canvasContext.invalidate();
106
- }
132
+ const fillKey = createKey(() => fill);
133
+ const strokeKey = createKey(() => stroke);
107
134
 
108
135
  // Hide `geoPath` and `tooltip` reactivity
109
136
  function _onClick(e: MouseEvent) {
110
137
  onclick?.(e, geoPath);
111
138
  }
112
- function _onPointerEnter(e: PointerEvent) {
113
- onpointerenter?.(e);
114
- tooltip?.show(e, geojson);
115
- }
116
- function _onPointerMove(e: PointerEvent) {
117
- onpointermove?.(e);
118
- tooltip?.show(e, geojson);
119
- }
120
- function _onPointerLeave(e: PointerEvent) {
121
- onpointerleave?.(e);
122
- tooltip?.hide();
123
- }
124
139
 
125
- let canvasUnregister: ReturnType<typeof canvasContext.register>;
126
- $: if (renderContext === 'canvas') {
127
- canvasUnregister = canvasContext.register({
140
+ const _onPointerEnter: PointerEventHandler<SVGPathElement> = (e) => {
141
+ restProps.onpointerenter?.(e);
142
+ tooltipContext?.show(e, geojson);
143
+ };
144
+
145
+ const _onPointerMove: PointerEventHandler<SVGPathElement> = (e) => {
146
+ restProps.onpointermove?.(e);
147
+ tooltipContext?.show(e, geojson);
148
+ };
149
+
150
+ const _onPointerLeave: PointerEventHandler<SVGPathElement> = (e) => {
151
+ restProps.onpointerleave?.(e);
152
+ tooltipContext?.hide();
153
+ };
154
+
155
+ if (renderCtx === 'canvas') {
156
+ registerCanvasComponent({
128
157
  name: 'GeoPath',
129
158
  render,
130
159
  events: {
@@ -132,36 +161,37 @@
132
161
  pointerenter: _onPointerEnter,
133
162
  pointermove: _onPointerMove,
134
163
  pointerleave: _onPointerLeave,
135
- pointerdown: onpointerdown,
136
- touchmove: ontouchmove,
164
+ pointerdown: restProps.onpointerdown,
165
+ touchmove: restProps.ontouchmove,
137
166
  },
167
+ deps: () => [
168
+ geojson,
169
+ projection,
170
+ fillKey.current,
171
+ strokeKey.current,
172
+ strokeWidth,
173
+ opacity,
174
+ className,
175
+ ],
138
176
  });
139
177
  }
140
-
141
- onDestroy(() => {
142
- if (renderContext === 'canvas') {
143
- canvasUnregister();
144
- }
145
- });
146
178
  </script>
147
179
 
148
- <!-- svelte-ignore a11y-no-static-element-interactions -->
149
- <slot {geoPath}>
150
- {#if renderContext === 'svg'}
151
- <path
152
- {...$$restProps}
153
- d={geojson ? geoPath(geojson) : ''}
154
- {fill}
155
- {stroke}
156
- stroke-width={strokeWidth}
157
- {opacity}
158
- on:click={_onClick}
159
- on:pointerenter={_onPointerEnter}
160
- on:pointermove={_onPointerMove}
161
- on:pointerleave={_onPointerLeave}
162
- on:pointerdown={onpointerdown}
163
- on:touchmove={ontouchmove}
164
- class={cls(fill == null && 'fill-transparent', className)}
165
- />
166
- {/if}
167
- </slot>
180
+ {#if children}
181
+ {@render children({ geoPath })}
182
+ {:else if renderCtx === 'svg'}
183
+ <path
184
+ bind:this={ref}
185
+ {...restProps}
186
+ d={geojson ? geoPath?.(geojson) : ''}
187
+ {fill}
188
+ {stroke}
189
+ stroke-width={strokeWidth}
190
+ {opacity}
191
+ onclick={_onClick}
192
+ onpointerenter={_onPointerEnter}
193
+ onpointermove={_onPointerMove}
194
+ onpointerleave={_onPointerLeave}
195
+ class={cls(layerClass('geo-path'), fill == null && 'fill-transparent', className)}
196
+ />
197
+ {/if}
@@ -1,39 +1,51 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import { type GeoIdentityTransform, type GeoPermissibleObjects, type GeoProjection, type GeoTransformPrototype } from 'd3-geo';
1
+ import type { CommonStyleProps, Without } from '../utils/types.js';
2
+ import type { Snippet } from 'svelte';
3
+ import type { SVGAttributes } from 'svelte/elements';
3
4
  import type { TooltipContextValue } from './tooltip/TooltipContext.svelte';
4
5
  import { type CurveFactory, type CurveFactoryLineOnly } from 'd3-shape';
6
+ import { type GeoIdentityTransform, type GeoPermissibleObjects, type GeoProjection, type GeoTransformPrototype } from 'd3-geo';
7
+ export type GeoPathPropsWithoutHTML = {
8
+ /**
9
+ * GeoJSON data to render
10
+ */
11
+ geojson?: GeoPermissibleObjects | null;
12
+ /**
13
+ * Tooltip context to setup pointer events to show tooltip for related data
14
+ */
15
+ tooltipContext?: TooltipContextValue | undefined;
16
+ /**
17
+ * Click event handler
18
+ */
19
+ onclick?: ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath> | undefined) => void) | undefined;
20
+ /**
21
+ * Curve of path drawn. Imported via d3-shape.
22
+ *
23
+ * @example
24
+ * import { curveCatmullRom } from 'd3-shape';
25
+ * <GeoPath curve={curveCatmullRom} />
26
+ *
27
+ * @default curveLinearClosed
28
+ */
29
+ curve?: CurveFactory | CurveFactoryLineOnly;
30
+ /**
31
+ * Apply geo transform to projection.
32
+ * Useful to draw straight lines with `geoMercator` projection.
33
+ *
34
+ * @see https://d3js.org/d3-geo/projection#geoTransform
35
+ * @see https://stackoverflow.com/a/56409480/191902
36
+ **/
37
+ geoTransform?: (projection: GeoProjection | GeoIdentityTransform) => GeoTransformPrototype;
38
+ /**
39
+ * A reference to the underlying `<path>` element
40
+ * @bindable
41
+ */
42
+ ref?: SVGPathElement;
43
+ children?: Snippet<[{
44
+ geoPath: ReturnType<typeof geoCurvePath> | undefined;
45
+ }]>;
46
+ } & CommonStyleProps;
47
+ export type GeoPathProps = GeoPathPropsWithoutHTML & Without<SVGAttributes<SVGPathElement>, GeoPathPropsWithoutHTML>;
5
48
  import { geoCurvePath } from '../utils/geo.js';
6
- declare const __propDef: {
7
- props: {
8
- [x: string]: any;
9
- geojson?: GeoPermissibleObjects | null | undefined;
10
- fill?: string | undefined | undefined;
11
- stroke?: string | undefined | undefined;
12
- strokeWidth?: number | undefined | undefined;
13
- opacity?: number | undefined | undefined;
14
- tooltip?: TooltipContextValue | undefined;
15
- onclick?: ((e: MouseEvent, geoPath: ReturnType<typeof geoCurvePath>) => void) | undefined | undefined;
16
- onpointerenter?: ((e: PointerEvent) => void) | undefined | undefined;
17
- onpointermove?: ((e: PointerEvent) => void) | undefined | undefined;
18
- onpointerleave?: ((e: PointerEvent) => void) | undefined | undefined;
19
- onpointerdown?: ((e: PointerEvent) => void) | undefined | undefined;
20
- ontouchmove?: ((e: TouchEvent) => void) | undefined | undefined;
21
- curve?: (CurveFactory | CurveFactoryLineOnly) | undefined;
22
- class?: string | undefined | undefined;
23
- geoTransform?: ((projection: GeoProjection | GeoIdentityTransform) => GeoTransformPrototype) | undefined | undefined;
24
- };
25
- events: {
26
- [evt: string]: CustomEvent<any>;
27
- };
28
- slots: {
29
- default: {
30
- geoPath: import("d3-geo").GeoPath<unknown, GeoPermissibleObjects>;
31
- };
32
- };
33
- };
34
- export type GeoPathProps = typeof __propDef.props;
35
- export type GeoPathEvents = typeof __propDef.events;
36
- export type GeoPathSlots = typeof __propDef.slots;
37
- export default class GeoPath extends SvelteComponentTyped<GeoPathProps, GeoPathEvents, GeoPathSlots> {
38
- }
39
- export {};
49
+ declare const GeoPath: import("svelte").Component<GeoPathProps, {}, "ref">;
50
+ type GeoPath = ReturnType<typeof GeoPath>;
51
+ export default GeoPath;
@@ -1,42 +1,74 @@
1
- <script lang="ts">
2
- import { onDestroy } from 'svelte';
1
+ <script lang="ts" module>
2
+ import type { Snippet } from 'svelte';
3
+ import type { SVGAttributes } from 'svelte/elements';
4
+ import Circle, { type CircleProps, type CirclePropsWithoutHTML } from './Circle.svelte';
5
+ import type { Without } from '../utils/types.js';
6
+
7
+ export type GeoPointPropsWithoutHTML = {
8
+ /**
9
+ * Latitude of the point.
10
+ */
11
+ lat: number;
12
+
13
+ /**
14
+ * Longitude of the point.
15
+ */
16
+ long: number;
17
+
18
+ /**
19
+ * A bindable reference to the underlying element, which
20
+ * can be a `<circle>` or `<g>` element.
21
+ */
22
+ ref?: Element;
23
+
24
+ children?: Snippet<[{ x: number; y: number }]>;
25
+ };
3
26
 
4
- import { geoContext } from './GeoContext.svelte';
5
- import Circle from './Circle.svelte';
27
+ export type GeoPointProps = Omit<
28
+ GeoPointPropsWithoutHTML & Without<CircleProps, GeoPointPropsWithoutHTML>,
29
+ 'x' | 'y'
30
+ >;
31
+ </script>
32
+
33
+ <script lang="ts">
6
34
  import Group from './Group.svelte';
7
- import { getCanvasContext } from './layout/Canvas.svelte';
8
35
  import { getRenderContext } from './Chart.svelte';
36
+ import { getGeoContext } from './GeoContext.svelte';
37
+ import { extractLayerProps } from '../utils/attributes.js';
38
+
39
+ let { lat, long, ref: refProp = $bindable(), children, ...restProps }: GeoPointProps = $props();
9
40
 
10
- /** Latitude */
11
- export let lat: number;
12
- /** Longitude */
13
- export let long: number;
41
+ let ref = $state<Element>();
42
+ $effect.pre(() => {
43
+ refProp = ref;
44
+ });
14
45
 
15
- const geo = geoContext();
46
+ const geoCtx = getGeoContext();
16
47
 
17
- $: [x, y] = $geo([long, lat]) ?? [0, 0];
48
+ const points = $derived(geoCtx.projection?.([long, lat]) ?? [0, 0]);
49
+ const x = $derived(points[0]);
50
+ const y = $derived(points[1]);
18
51
 
19
52
  const renderContext = getRenderContext();
20
- const canvasContext = getCanvasContext();
21
53
  </script>
22
54
 
23
55
  {#if renderContext === 'svg'}
24
- {#if $$slots.default}
25
- <Group {x} {y} {...$$restProps}>
26
- <slot {x} {y} />
56
+ {#if children}
57
+ <Group {x} {y} {...extractLayerProps(restProps, 'geo-point-group')}>
58
+ {@render children({ x, y })}
27
59
  </Group>
28
60
  {:else}
29
- <Circle cx={x} cy={y} {...$$restProps} />
61
+ <Circle cx={x} cy={y} {...extractLayerProps(restProps, 'geo-point')} />
30
62
  {/if}
31
63
  {/if}
32
64
 
33
65
  {#if renderContext === 'canvas'}
34
- {#if $$slots.default}
35
- <!-- TODO: Handle Canvas translation. Conslidate with svg use case above -->
66
+ {#if children}
67
+ <!-- TODO: Handle Canvas translation. Consolidate with svg use case above -->
36
68
  <!-- <Group {x} {y} {...$$restProps}> -->
37
- <slot {x} {y} />
69
+ {@render children({ x, y })}
38
70
  <!-- </Group> -->
39
71
  {:else}
40
- <Circle cx={x} cy={y} {...$$restProps} />
72
+ <Circle cx={x} cy={y} {...extractLayerProps(restProps, 'geo-point')} />
41
73
  {/if}
42
74
  {/if}
@@ -1,23 +1,26 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- lat: number;
6
- long: number;
7
- };
8
- events: {
9
- [evt: string]: CustomEvent<any>;
10
- };
11
- slots: {
12
- default: {
13
- x: any;
14
- y: any;
15
- };
16
- };
1
+ import type { Snippet } from 'svelte';
2
+ import { type CircleProps } from './Circle.svelte';
3
+ import type { Without } from '../utils/types.js';
4
+ export type GeoPointPropsWithoutHTML = {
5
+ /**
6
+ * Latitude of the point.
7
+ */
8
+ lat: number;
9
+ /**
10
+ * Longitude of the point.
11
+ */
12
+ long: number;
13
+ /**
14
+ * A bindable reference to the underlying element, which
15
+ * can be a `<circle>` or `<g>` element.
16
+ */
17
+ ref?: Element;
18
+ children?: Snippet<[{
19
+ x: number;
20
+ y: number;
21
+ }]>;
17
22
  };
18
- export type GeoPointProps = typeof __propDef.props;
19
- export type GeoPointEvents = typeof __propDef.events;
20
- export type GeoPointSlots = typeof __propDef.slots;
21
- export default class GeoPoint extends SvelteComponentTyped<GeoPointProps, GeoPointEvents, GeoPointSlots> {
22
- }
23
- export {};
23
+ export type GeoPointProps = Omit<GeoPointPropsWithoutHTML & Without<CircleProps, GeoPointPropsWithoutHTML>, 'x' | 'y'>;
24
+ declare const GeoPoint: import("svelte").Component<GeoPointProps, {}, "ref">;
25
+ type GeoPoint = ReturnType<typeof GeoPoint>;
26
+ export default GeoPoint;
@@ -1,36 +1,85 @@
1
- <script lang="ts">
1
+ <script lang="ts" module>
2
+ import Spline, { type SplineProps } from './Spline.svelte';
2
3
  import { curveNatural, type CurveFactory, type CurveFactoryLineOnly } from 'd3-shape';
3
- import { geoOrthographic, geoInterpolate } from 'd3-geo';
4
+ import type { Without } from '../utils/types.js';
5
+
6
+ export type GeoSplinePropsWithoutHTML = {
7
+ /**
8
+ * Link between two points on the globe.
9
+ */
10
+ link: { source: [number, number]; target: [number, number] };
11
+
12
+ /**
13
+ * The amount of loft to apply to the middle of the curve.
14
+ *
15
+ * @default 1.0
16
+ */
17
+ loft?: number;
18
+
19
+ /**
20
+ * Curve of spline drawn. Imported via d3-shape.
21
+ *
22
+ * @example
23
+ * import { curveNatural } from 'd3-shape';
24
+ * <GeoSpline curve={curveNatural} />
25
+ *
26
+ * @default curveNatural
27
+ */
28
+ curve?: CurveFactory | CurveFactoryLineOnly;
29
+ };
4
30
 
5
- import { geoContext } from './GeoContext.svelte';
6
- import Spline from './Spline.svelte';
31
+ export type GeoSplineProps = GeoSplinePropsWithoutHTML &
32
+ Without<SplineProps, GeoSplinePropsWithoutHTML>;
33
+ </script>
34
+
35
+ <script lang="ts">
36
+ import { geoOrthographic, geoInterpolate } from 'd3-geo';
7
37
 
8
- export let link: { source: [number, number]; target: [number, number] };
38
+ import { getGeoContext } from './GeoContext.svelte';
39
+ import { extractLayerProps } from '../utils/attributes.js';
9
40
 
10
- /** Amount of loft to apply to the midle of the curve */
11
- export let loft = 1.0;
41
+ let {
42
+ link,
43
+ loft = 1.0,
44
+ curve = curveNatural,
45
+ splineRef: splineRefProp = $bindable(),
46
+ ...restProps
47
+ }: GeoSplineProps = $props();
12
48
 
13
- /**
14
- * Curve of spline drawn. Imported via d3-shape.
15
- *
16
- * @example
17
- * import { curveNatural } from 'd3-shape';
18
- * <GeoSpline curve={curveNatrual} />
19
- *
20
- * @type {CurveFactory | CurveFactoryLineOnly | undefined}
21
- */
22
- export let curve: CurveFactory | CurveFactoryLineOnly | undefined = curveNatural;
49
+ let splineRef = $state<SVGPathElement>();
50
+ $effect.pre(() => {
51
+ splineRefProp = splineRef;
52
+ });
23
53
 
24
- const geo = geoContext();
54
+ const geoCtx = getGeoContext();
25
55
 
26
- $: loftedProjection = geoOrthographic()
27
- .translate($geo.translate())
28
- .rotate($geo.rotate())
29
- .scale($geo.scale() * loft);
56
+ const loftedProjection = $derived(
57
+ geoCtx.projection
58
+ ? geoOrthographic()
59
+ .translate(geoCtx.projection.translate())
60
+ .rotate(geoCtx.projection.rotate())
61
+ .scale(geoCtx.projection.scale() * loft)
62
+ : undefined
63
+ );
30
64
 
31
- $: source = $geo(link.source);
32
- $: target = $geo(link.target);
33
- $: middle = loftedProjection(geoInterpolate(link.source, link.target)(0.5));
65
+ const source = $derived(geoCtx.projection ? geoCtx.projection(link.source) : [0, 0]) as [
66
+ number,
67
+ number,
68
+ ];
69
+ const target = $derived(geoCtx.projection ? geoCtx.projection(link.target) : [0, 0]) as [
70
+ number,
71
+ number,
72
+ ];
73
+ const middle = $derived(
74
+ geoCtx.projection ? loftedProjection!(geoInterpolate(link.source, link.target)(0.5)) : [0, 0]
75
+ ) as [number, number];
34
76
  </script>
35
77
 
36
- <Spline data={[source, middle, target]} x={(d) => d[0]} y={(d) => d[1]} {curve} {...$$restProps} />
78
+ <Spline
79
+ bind:splineRef
80
+ data={[source, middle, target]}
81
+ x={(d) => d[0]}
82
+ y={(d) => d[1]}
83
+ {curve}
84
+ {...extractLayerProps(restProps, 'geo-spline')}
85
+ />