layerchart 2.0.0-next.1 → 2.0.0-next.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/dist/actions/movable.d.ts +28 -0
  2. package/dist/actions/movable.js +91 -0
  3. package/dist/components/AnnotationLine.svelte +143 -0
  4. package/dist/components/AnnotationLine.svelte.d.ts +30 -0
  5. package/dist/components/AnnotationPoint.svelte +119 -0
  6. package/dist/components/AnnotationPoint.svelte.d.ts +34 -0
  7. package/dist/components/AnnotationRange.svelte +147 -0
  8. package/dist/components/AnnotationRange.svelte.d.ts +40 -0
  9. package/dist/components/Arc.svelte +344 -151
  10. package/dist/components/Arc.svelte.d.ts +138 -0
  11. package/dist/components/Area.svelte +165 -149
  12. package/dist/components/Area.svelte.d.ts +45 -0
  13. package/dist/components/Axis.svelte +320 -179
  14. package/dist/components/Axis.svelte.d.ts +127 -0
  15. package/dist/components/Bar.svelte +166 -107
  16. package/dist/components/Bar.svelte.d.ts +51 -0
  17. package/dist/components/Bars.svelte +56 -67
  18. package/dist/components/Bars.svelte.d.ts +27 -0
  19. package/dist/components/Blur.svelte +42 -12
  20. package/dist/components/Blur.svelte.d.ts +23 -21
  21. package/dist/components/Bounds.svelte +49 -19
  22. package/dist/components/Bounds.svelte.d.ts +24 -50
  23. package/dist/components/BrushContext.svelte +296 -168
  24. package/dist/components/BrushContext.svelte.d.ts +97 -65
  25. package/dist/components/Calendar.svelte +116 -59
  26. package/dist/components/Calendar.svelte.d.ts +50 -31
  27. package/dist/components/Chart.svelte +1289 -398
  28. package/dist/components/Chart.svelte.d.ts +535 -410
  29. package/dist/components/ChartClipPath.svelte +37 -15
  30. package/dist/components/ChartClipPath.svelte.d.ts +21 -19
  31. package/dist/components/Circle.svelte +124 -85
  32. package/dist/components/Circle.svelte.d.ts +52 -0
  33. package/dist/components/CircleClipPath.svelte +76 -16
  34. package/dist/components/CircleClipPath.svelte.d.ts +46 -0
  35. package/dist/components/ClipPath.svelte +71 -21
  36. package/dist/components/ClipPath.svelte.d.ts +40 -27
  37. package/dist/components/ColorRamp.svelte +75 -9
  38. package/dist/components/ColorRamp.svelte.d.ts +37 -19
  39. package/dist/components/ComputedStyles.svelte +17 -5
  40. package/dist/components/ComputedStyles.svelte.d.ts +11 -19
  41. package/dist/components/Connector.svelte +149 -0
  42. package/dist/components/Connector.svelte.d.ts +51 -0
  43. package/dist/components/Dagre.svelte +211 -122
  44. package/dist/components/Dagre.svelte.d.ts +119 -56
  45. package/dist/components/ForceSimulation.svelte +215 -90
  46. package/dist/components/ForceSimulation.svelte.d.ts +82 -35
  47. package/dist/components/Frame.svelte +33 -13
  48. package/dist/components/Frame.svelte.d.ts +13 -17
  49. package/dist/components/GeoCircle.svelte +29 -16
  50. package/dist/components/GeoCircle.svelte.d.ts +22 -24
  51. package/dist/components/GeoContext.svelte +113 -72
  52. package/dist/components/GeoContext.svelte.d.ts +49 -41
  53. package/dist/components/GeoEdgeFade.svelte +49 -13
  54. package/dist/components/GeoEdgeFade.svelte.d.ts +17 -19
  55. package/dist/components/GeoPath.svelte +157 -127
  56. package/dist/components/GeoPath.svelte.d.ts +48 -36
  57. package/dist/components/GeoPoint.svelte +52 -20
  58. package/dist/components/GeoPoint.svelte.d.ts +25 -22
  59. package/dist/components/GeoSpline.svelte +75 -26
  60. package/dist/components/GeoSpline.svelte.d.ts +29 -20
  61. package/dist/components/GeoTile.svelte +100 -49
  62. package/dist/components/GeoTile.svelte.d.ts +38 -23
  63. package/dist/components/GeoVisible.svelte +17 -9
  64. package/dist/components/GeoVisible.svelte.d.ts +10 -18
  65. package/dist/components/Graticule.svelte +30 -14
  66. package/dist/components/Graticule.svelte.d.ts +11 -52
  67. package/dist/components/Grid.svelte +230 -117
  68. package/dist/components/Grid.svelte.d.ts +71 -0
  69. package/dist/components/Group.svelte +173 -106
  70. package/dist/components/Group.svelte.d.ts +81 -0
  71. package/dist/components/Highlight.svelte +410 -308
  72. package/dist/components/Highlight.svelte.d.ts +107 -0
  73. package/dist/components/Hull.svelte +97 -46
  74. package/dist/components/Hull.svelte.d.ts +40 -30
  75. package/dist/components/Labels.svelte +127 -47
  76. package/dist/components/Labels.svelte.d.ts +70 -27
  77. package/dist/components/Legend.svelte +374 -190
  78. package/dist/components/Legend.svelte.d.ts +95 -44
  79. package/dist/components/Line.svelte +163 -125
  80. package/dist/components/Line.svelte.d.ts +75 -0
  81. package/dist/components/LinearGradient.svelte +153 -78
  82. package/dist/components/LinearGradient.svelte.d.ts +66 -31
  83. package/dist/components/Link.svelte +160 -104
  84. package/dist/components/Link.svelte.d.ts +54 -0
  85. package/dist/components/Marker.svelte +100 -39
  86. package/dist/components/Marker.svelte.d.ts +59 -27
  87. package/dist/components/MarkerWrapper.svelte +35 -0
  88. package/dist/components/MarkerWrapper.svelte.d.ts +18 -0
  89. package/dist/components/MonthPath.svelte +65 -20
  90. package/dist/components/MonthPath.svelte.d.ts +23 -17
  91. package/dist/components/MotionPath.svelte +80 -24
  92. package/dist/components/MotionPath.svelte.d.ts +46 -27
  93. package/dist/components/Pack.svelte +53 -17
  94. package/dist/components/Pack.svelte.d.ts +42 -21
  95. package/dist/components/Partition.svelte +64 -22
  96. package/dist/components/Partition.svelte.d.ts +49 -26
  97. package/dist/components/Pattern.svelte +297 -11
  98. package/dist/components/Pattern.svelte.d.ts +103 -19
  99. package/dist/components/Pie.svelte +122 -76
  100. package/dist/components/Pie.svelte.d.ts +65 -51
  101. package/dist/components/Point.svelte +20 -9
  102. package/dist/components/Point.svelte.d.ts +16 -20
  103. package/dist/components/Points.svelte +148 -137
  104. package/dist/components/Points.svelte.d.ts +45 -34
  105. package/dist/components/RadialGradient.svelte +148 -77
  106. package/dist/components/RadialGradient.svelte.d.ts +69 -31
  107. package/dist/components/Rect.svelte +121 -102
  108. package/dist/components/Rect.svelte.d.ts +36 -0
  109. package/dist/components/RectClipPath.svelte +82 -18
  110. package/dist/components/RectClipPath.svelte.d.ts +55 -0
  111. package/dist/components/Rule.svelte +107 -63
  112. package/dist/components/Rule.svelte.d.ts +40 -19
  113. package/dist/components/Sankey.svelte +132 -55
  114. package/dist/components/Sankey.svelte.d.ts +61 -31
  115. package/dist/components/Spline.svelte +281 -218
  116. package/dist/components/Spline.svelte.d.ts +95 -0
  117. package/dist/components/Text.svelte +463 -197
  118. package/dist/components/Text.svelte.d.ts +136 -0
  119. package/dist/components/Threshold.svelte +48 -16
  120. package/dist/components/Threshold.svelte.d.ts +29 -31
  121. package/dist/components/TileImage.svelte +103 -30
  122. package/dist/components/TileImage.svelte.d.ts +48 -23
  123. package/dist/components/TransformContext.svelte +365 -171
  124. package/dist/components/TransformControls.svelte +50 -26
  125. package/dist/components/TransformControls.svelte.d.ts +27 -19
  126. package/dist/components/Tree.svelte +74 -33
  127. package/dist/components/Tree.svelte.d.ts +42 -30
  128. package/dist/components/Treemap.svelte +119 -42
  129. package/dist/components/Treemap.svelte.d.ts +75 -27
  130. package/dist/components/Voronoi.svelte +153 -103
  131. package/dist/components/Voronoi.svelte.d.ts +42 -41
  132. package/dist/components/charts/ArcChart.svelte +464 -0
  133. package/dist/components/charts/ArcChart.svelte.d.ts +90 -0
  134. package/dist/components/charts/AreaChart.svelte +444 -393
  135. package/dist/components/charts/AreaChart.svelte.d.ts +61 -0
  136. package/dist/components/charts/BarChart.svelte +463 -389
  137. package/dist/components/charts/BarChart.svelte.d.ts +76 -0
  138. package/dist/components/charts/ChartAnnotations.svelte +37 -0
  139. package/dist/components/charts/ChartAnnotations.svelte.d.ts +10 -0
  140. package/dist/components/charts/DefaultTooltip.svelte +60 -0
  141. package/dist/components/charts/DefaultTooltip.svelte.d.ts +10 -0
  142. package/dist/components/charts/LineChart.svelte +366 -315
  143. package/dist/components/charts/LineChart.svelte.d.ts +53 -0
  144. package/dist/components/charts/PieChart.svelte +458 -316
  145. package/dist/components/charts/PieChart.svelte.d.ts +137 -353
  146. package/dist/components/charts/ScatterChart.svelte +332 -296
  147. package/dist/components/charts/ScatterChart.svelte.d.ts +39 -0
  148. package/dist/components/charts/index.d.ts +8 -0
  149. package/dist/components/charts/index.js +7 -0
  150. package/dist/components/charts/types.d.ts +253 -0
  151. package/dist/components/charts/utils.svelte.d.ts +30 -0
  152. package/dist/components/charts/utils.svelte.js +59 -0
  153. package/dist/components/index.d.ts +76 -4
  154. package/dist/components/index.js +76 -5
  155. package/dist/components/layout/Canvas.svelte +347 -171
  156. package/dist/components/layout/Canvas.svelte.d.ts +110 -55
  157. package/dist/components/layout/Html.svelte +82 -42
  158. package/dist/components/layout/Html.svelte.d.ts +39 -28
  159. package/dist/components/layout/Layer.svelte +39 -0
  160. package/dist/components/layout/Layer.svelte.d.ts +17 -0
  161. package/dist/components/layout/Svg.svelte +122 -70
  162. package/dist/components/layout/Svg.svelte.d.ts +53 -34
  163. package/dist/components/layout/WebGL.svelte +135 -0
  164. package/dist/components/layout/WebGL.svelte.d.ts +50 -0
  165. package/dist/components/tooltip/Tooltip.svelte +253 -78
  166. package/dist/components/tooltip/Tooltip.svelte.d.ts +149 -31
  167. package/dist/components/tooltip/TooltipContext.svelte +426 -271
  168. package/dist/components/tooltip/TooltipContext.svelte.d.ts +86 -55
  169. package/dist/components/tooltip/TooltipHeader.svelte +100 -11
  170. package/dist/components/tooltip/TooltipHeader.svelte.d.ts +43 -23
  171. package/dist/components/tooltip/TooltipItem.svelte +167 -27
  172. package/dist/components/tooltip/TooltipItem.svelte.d.ts +63 -31
  173. package/dist/components/tooltip/TooltipList.svelte +22 -3
  174. package/dist/components/tooltip/TooltipList.svelte.d.ts +6 -17
  175. package/dist/components/tooltip/TooltipSeparator.svelte +27 -1
  176. package/dist/components/tooltip/TooltipSeparator.svelte.d.ts +6 -15
  177. package/dist/components/tooltip/index.d.ts +6 -0
  178. package/dist/components/tooltip/index.js +6 -0
  179. package/dist/components/tooltip/tooltipMetaContext.d.ts +79 -0
  180. package/dist/components/tooltip/tooltipMetaContext.js +139 -0
  181. package/dist/components/types.d.ts +1 -0
  182. package/dist/components/types.js +1 -0
  183. package/dist/docs/Blockquote.svelte +3 -1
  184. package/dist/docs/Blockquote.svelte.d.ts +5 -16
  185. package/dist/docs/Code.svelte +20 -12
  186. package/dist/docs/Code.svelte.d.ts +12 -22
  187. package/dist/docs/ConnectorSweepMenuField.svelte +17 -0
  188. package/dist/docs/ConnectorSweepMenuField.svelte.d.ts +7 -0
  189. package/dist/docs/ConnectorTypeMenuField.svelte +17 -0
  190. package/dist/docs/ConnectorTypeMenuField.svelte.d.ts +7 -0
  191. package/dist/docs/CurveMenuField.svelte +14 -3
  192. package/dist/docs/CurveMenuField.svelte.d.ts +9 -18
  193. package/dist/docs/GeoDebug.svelte +47 -42
  194. package/dist/docs/GeoDebug.svelte.d.ts +4 -16
  195. package/dist/docs/Header1.svelte +4 -2
  196. package/dist/docs/Header1.svelte.d.ts +5 -18
  197. package/dist/docs/Json.svelte +11 -3
  198. package/dist/docs/Json.svelte.d.ts +9 -17
  199. package/dist/docs/Layout.svelte +10 -7
  200. package/dist/docs/Layout.svelte.d.ts +5 -15
  201. package/dist/docs/Link.svelte +7 -3
  202. package/dist/docs/Link.svelte.d.ts +5 -27
  203. package/dist/docs/PathDataMenuField.svelte +14 -10
  204. package/dist/docs/PathDataMenuField.svelte.d.ts +8 -18
  205. package/dist/docs/Preview.svelte +20 -7
  206. package/dist/docs/Preview.svelte.d.ts +12 -22
  207. package/dist/docs/TilesetField.svelte +20 -19
  208. package/dist/docs/TilesetField.svelte.d.ts +6 -19
  209. package/dist/docs/TransformDebug.svelte +5 -6
  210. package/dist/docs/TransformDebug.svelte.d.ts +18 -14
  211. package/dist/docs/ViewSourceButton.svelte +7 -4
  212. package/dist/docs/ViewSourceButton.svelte.d.ts +8 -18
  213. package/dist/types/d3-shape-extentions.d.ts +7 -0
  214. package/dist/utils/afterTick.d.ts +5 -0
  215. package/dist/utils/afterTick.js +8 -0
  216. package/dist/utils/arcText.svelte.d.ts +57 -0
  217. package/dist/utils/arcText.svelte.js +262 -0
  218. package/dist/utils/array.d.ts +9 -1
  219. package/dist/utils/array.js +13 -0
  220. package/dist/utils/attributes.d.ts +29 -0
  221. package/dist/utils/attributes.js +40 -0
  222. package/dist/utils/canvas.js +47 -10
  223. package/dist/utils/chart.d.ts +78 -0
  224. package/dist/utils/chart.js +512 -0
  225. package/dist/utils/color.d.ts +1 -0
  226. package/dist/utils/color.js +8 -0
  227. package/dist/utils/common.d.ts +3 -5
  228. package/dist/utils/common.js +3 -2
  229. package/dist/utils/connectorUtils.d.ts +21 -0
  230. package/dist/utils/connectorUtils.js +111 -0
  231. package/dist/utils/createId.d.ts +7 -0
  232. package/dist/utils/createId.js +9 -0
  233. package/dist/utils/debug.d.ts +1 -0
  234. package/dist/utils/debug.js +84 -0
  235. package/dist/utils/filterObject.d.ts +9 -0
  236. package/dist/utils/filterObject.js +12 -0
  237. package/dist/utils/graph/dagre.d.ts +34 -0
  238. package/dist/utils/graph/dagre.js +78 -0
  239. package/dist/utils/graph/dagre.test.d.ts +1 -0
  240. package/dist/utils/{graph.test.js → graph/dagre.test.js} +19 -33
  241. package/dist/utils/graph/sankey.d.ts +28 -0
  242. package/dist/utils/{graph.js → graph/sankey.js} +13 -41
  243. package/dist/utils/index.d.ts +3 -1
  244. package/dist/utils/index.js +3 -1
  245. package/dist/utils/key.svelte.d.ts +3 -0
  246. package/dist/utils/key.svelte.js +11 -0
  247. package/dist/utils/legendPayload.d.ts +7 -0
  248. package/dist/utils/legendPayload.js +8 -0
  249. package/dist/utils/motion.svelte.d.ts +140 -0
  250. package/dist/utils/motion.svelte.js +180 -0
  251. package/dist/utils/motion.test.d.ts +1 -0
  252. package/dist/utils/motion.test.js +213 -0
  253. package/dist/utils/{rect.d.ts → rect.svelte.d.ts} +7 -4
  254. package/dist/utils/rect.svelte.js +105 -0
  255. package/dist/utils/scales.svelte.d.ts +91 -0
  256. package/dist/utils/scales.svelte.js +201 -0
  257. package/dist/utils/stack.d.ts +2 -3
  258. package/dist/utils/stack.js +1 -1
  259. package/dist/utils/string.js +87 -0
  260. package/dist/utils/ticks.d.ts +9 -3
  261. package/dist/utils/ticks.js +122 -147
  262. package/dist/utils/ticks.test.d.ts +1 -0
  263. package/dist/utils/ticks.test.js +57 -0
  264. package/dist/utils/types.d.ts +81 -0
  265. package/package.json +28 -24
  266. package/dist/components/ChartContext.svelte +0 -295
  267. package/dist/components/ChartContext.svelte.d.ts +0 -139
  268. package/dist/components/TransformContext.svelte.d.ts +0 -158
  269. package/dist/stores/motionStore.d.ts +0 -30
  270. package/dist/stores/motionStore.js +0 -62
  271. package/dist/utils/graph.d.ts +0 -37
  272. package/dist/utils/rect.js +0 -107
  273. package/dist/utils/scales.d.ts +0 -66
  274. package/dist/utils/scales.js +0 -136
  275. /package/dist/{utils/graph.test.d.ts → components/charts/types.js} +0 -0
@@ -1,79 +1,223 @@
1
- <script lang="ts">
2
- import { fade } from 'svelte/transition';
3
- import { cls } from '@layerstack/tailwind';
1
+ <script lang="ts" module>
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { Without } from '../../utils/types.js';
4
+ import type { TooltipPayload } from './tooltipMetaContext.js';
5
+ import type { Placement } from '../types.js';
4
6
 
5
- import { chartContext } from './../ChartContext.svelte';
6
- import { tooltipContext } from './TooltipContext.svelte';
7
- import { motionStore } from '../../stores/motionStore.js';
8
- import { isScaleBand } from '../../utils/scales.js';
7
+ export type Align = 'start' | 'center' | 'end';
9
8
 
10
- /** `x` position of tooltip. By default uses the pointer/mouse, can also snap to data or an explicit fixed position. */
11
- export let x: 'pointer' | 'data' | number = 'pointer';
12
- /** `y` position of tooltip. By default uses the pointer/mouse, can also snap to data or an explicit fixed position. */
13
- export let y: 'pointer' | 'data' | number = 'pointer';
9
+ export type TooltipPropsWithoutHTML<T = any> = {
10
+ /**
11
+ * `x` position of tooltip. By default uses the pointer/mouse, can also snap to data or an
12
+ * explicit fixed position.
13
+ *
14
+ * @default 'pointer'
15
+ */
16
+ x?: 'pointer' | 'data' | number;
17
+ /**
18
+ * `y` position of tooltip. By default uses the pointer/mouse, can also snap to data or an
19
+ * explicit fixed position.
20
+ *
21
+ * @default 'pointer'
22
+ */
23
+ y?: 'pointer' | 'data' | number;
14
24
 
15
- /** Offset added to `x` position */
16
- export let xOffset = x === 'pointer' ? 10 : 0;
25
+ /**
26
+ * Offset added to `x` position
27
+ *
28
+ * @default x === 'pointer' ? 10 : 0
29
+ */
30
+ xOffset?: number;
17
31
 
18
- /** Offset added to `y` position */
19
- export let yOffset = y === 'pointer' ? 10 : 0;
32
+ /**
33
+ * Offset added to `y` position
34
+ *
35
+ * @default y === 'pointer' ? 10 : 0
36
+ */
37
+ yOffset?: number;
20
38
 
21
- /** Align based on edge of tooltip */
22
- type Placement =
23
- | 'top-left'
24
- | 'top'
25
- | 'top-right'
26
- | 'left'
27
- | 'center'
28
- | 'right'
29
- | 'bottom-left'
30
- | 'bottom'
31
- | 'bottom-right';
32
- export let anchor: Placement = 'top-left';
39
+ /**
40
+ * Align based on edge of tooltip
41
+ *
42
+ * @default 'top-left'
43
+ */
44
+ anchor?: Placement;
33
45
 
34
- export let contained: 'container' | 'window' | false = 'container';
35
- export let variant: 'default' | 'invert' | 'none' = 'default';
46
+ /**
47
+ * The default motion state of the tooltip.
48
+ *
49
+ * @default "spring"
50
+ */
51
+ motion?: MotionProp;
36
52
 
37
- /** Set to `false` to disable spring transitions */
38
- export let motion = true;
53
+ /**
54
+ * Allow pointer events. Disabled by default to reduce accidental selection, but useful to
55
+ * enable to allow interactive tooltips (using `locked`)
56
+ *
57
+ * @default false
58
+ */
59
+ pointerEvents?: boolean;
39
60
 
40
- /** Allow pointer events. Disabled by default to reduce accidental selection, but useful to enable to allow interactdive tooltips (using `locked`) */
41
- export let pointerEvents = false;
61
+ /**
62
+ * Include padding area (ex. axis)
63
+ *
64
+ * @default 'container'
65
+ */
66
+ contained?: 'container' | 'window' | false;
42
67
 
43
- export let classes: {
44
- root?: string;
45
- container?: string;
46
- header?: string;
47
- content?: string;
48
- } = {};
68
+ /**
69
+ * Tooltip variant
70
+ *
71
+ * @default 'default'
72
+ */
73
+ variant?: 'default' | 'invert' | 'none';
49
74
 
50
- const { padding, xScale, xGet, yScale, yGet, containerWidth, containerHeight } = chartContext();
51
- const tooltip = tooltipContext();
75
+ /**
76
+ * Classes to apply to the various elements of the tooltip.
77
+ *
78
+ * @default {}
79
+ */
80
+ classes?: {
81
+ /**
82
+ * Classes to apply to the root tooltip element
83
+ */
84
+ root?: string;
85
+ /**
86
+ * Classes to apply to the tooltip container element
87
+ */
88
+ container?: string;
89
+ /**
90
+ * Classes to apply to the tooltip content element
91
+ */
92
+ content?: string;
93
+ /**
94
+ * Classes to apply to the tooltip header element
95
+ */
96
+ header?: string;
97
+ };
52
98
 
53
- let tooltipWidth = 0;
54
- let tooltipHeight = 0;
99
+ children?: Snippet<
100
+ [
101
+ {
102
+ /**
103
+ * The chart data that triggered the tooltip.
104
+ */
105
+ data: T;
55
106
 
56
- const xPos = motionStore($tooltip.x, { spring: motion });
57
- const yPos = motionStore($tooltip.y, { spring: motion });
107
+ /**
108
+ * An array of tooltip payloads, each containing data for a specific series,
109
+ * along with their own `payload` property that contains the same data as `data`.
110
+ *
111
+ * This is useful when working with the simplified charts, such as `AreaChart`, `BarChart`,
112
+ * `PieChart`, etc., where series construction is handled internally.
113
+ */
114
+ payload: TooltipPayload[];
115
+ },
116
+ ]
117
+ >;
118
+
119
+ /**
120
+ * A reference to the tooltip's outermost `<div>` tag.
121
+ *
122
+ * @bindable
123
+ */
124
+ rootRef?: HTMLElement;
125
+
126
+ /**
127
+ * Props to pass to the underlying elements rendered
128
+ * by the Tooltip component
129
+ */
130
+ props?: {
131
+ /**
132
+ * Props to pass to the root tooltip element
133
+ */
134
+ root?: HTMLAttributes<HTMLElement>;
135
+ /**
136
+ * Props to pass to the tooltip container element
137
+ */
138
+ container?: HTMLAttributes<HTMLElement>;
139
+ /**
140
+ * Props to pass to the tooltip content element
141
+ */
142
+ content?: HTMLAttributes<HTMLElement>;
143
+ };
144
+
145
+ /**
146
+ * Optionally pass the chart's context to the tooltip to get
147
+ * type inference for the data.
148
+ */
149
+ context?: ChartContextValue<T, any, any>;
150
+ };
151
+
152
+ export type TooltipProps<T = any> = TooltipPropsWithoutHTML<T> &
153
+ Without<HTMLAttributes<HTMLElement>, TooltipPropsWithoutHTML<T>>;
154
+ </script>
155
+
156
+ <script lang="ts" generics="T = any">
157
+ import { fade } from 'svelte/transition';
158
+ import { cls } from '@layerstack/tailwind';
58
159
 
59
- type Align = 'start' | 'center' | 'end';
160
+ import { isScaleBand } from '../../utils/scales.svelte.js';
161
+ import { getChartContext, type ChartContextValue } from '../Chart.svelte';
162
+ import { getTooltipContext } from './TooltipContext.svelte';
163
+ import { createMotion, type MotionProp } from '../../utils/motion.svelte.js';
164
+ import { untrack, type Snippet } from 'svelte';
165
+ import { layerClass } from '../../utils/attributes.js';
60
166
 
61
- function alignValue(value: number, align: Align, addlOffset: number, tooltipSize: number) {
167
+ let {
168
+ anchor = 'top-left',
169
+ classes = {},
170
+ contained = 'container',
171
+ motion = 'spring',
172
+ pointerEvents = false,
173
+ variant = 'default',
174
+ x = 'pointer',
175
+ xOffset = x === 'pointer' ? 10 : 0,
176
+ y = 'pointer',
177
+ yOffset = y === 'pointer' ? 10 : 0,
178
+ children,
179
+ rootRef: rootRefProp = $bindable(),
180
+ props = {
181
+ root: {},
182
+ container: {},
183
+ content: {},
184
+ },
185
+ class: className,
186
+ }: TooltipProps<T> = $props();
187
+
188
+ let rootRef = $state<HTMLElement>();
189
+ $effect.pre(() => {
190
+ rootRefProp = rootRef;
191
+ });
192
+
193
+ const ctx = getChartContext();
194
+ const tooltipCtx = getTooltipContext();
195
+
196
+ let tooltipWidth = $state(0);
197
+ let tooltipHeight = $state(0);
198
+
199
+ function alignValue(value: number, align: Align, additionalOffset: number, tooltipSize: number) {
62
200
  const alignOffset = align === 'center' ? tooltipSize / 2 : align === 'end' ? tooltipSize : 0;
63
- return value + (align === 'end' ? -addlOffset : addlOffset) - alignOffset;
201
+ return value + (align === 'end' ? -additionalOffset : additionalOffset) - alignOffset;
64
202
  }
65
203
 
66
- $: if ($tooltip?.data) {
67
- const xBandOffset = isScaleBand($xScale)
68
- ? $xScale.step() / 2 - ($xScale.padding() * $xScale.step()) / 2
204
+ const positions = $derived.by(() => {
205
+ if (!tooltipCtx.data) {
206
+ // if no data, fallback?
207
+ const tooltipX = untrack(() => tooltipCtx.x);
208
+ const tooltipY = untrack(() => tooltipCtx.y);
209
+ return { x: tooltipX, y: tooltipY };
210
+ }
211
+ const xBandOffset = isScaleBand(ctx.xScale)
212
+ ? ctx.xScale.step() / 2 - (ctx.xScale.padding() * ctx.xScale.step()) / 2
69
213
  : 0;
70
214
 
71
215
  const xValue: number =
72
216
  typeof x === 'number'
73
217
  ? x
74
218
  : x === 'data'
75
- ? $xGet($tooltip.data) + $padding.left + xBandOffset
76
- : $tooltip.x;
219
+ ? ctx.xGet(tooltipCtx.data) + ctx.padding.left + xBandOffset
220
+ : tooltipCtx.x;
77
221
 
78
222
  let xAlign: Align = 'start';
79
223
  switch (anchor) {
@@ -96,15 +240,15 @@
96
240
  break;
97
241
  }
98
242
 
99
- const yBandOffset = isScaleBand($yScale)
100
- ? $yScale.step() / 2 - ($yScale.padding() * $yScale.step()) / 2
243
+ const yBandOffset = isScaleBand(ctx.yScale)
244
+ ? ctx.yScale.step() / 2 - (ctx.yScale.padding() * ctx.yScale.step()) / 2
101
245
  : 0;
102
246
  const yValue: number =
103
247
  typeof y === 'number'
104
248
  ? y
105
249
  : y === 'data'
106
- ? $yGet($tooltip.data) + $padding.top + yBandOffset
107
- : $tooltip.y;
250
+ ? ctx.yGet(tooltipCtx.data) + ctx.padding.top + yBandOffset
251
+ : tooltipCtx.y;
108
252
 
109
253
  let yAlign: Align = 'start';
110
254
  switch (anchor) {
@@ -138,23 +282,23 @@
138
282
  rect.right = rect.left + tooltipWidth;
139
283
 
140
284
  if (contained === 'container') {
141
- // Only attempt repositiong if not fixed (ie. `pointer`/`data`)
285
+ // Only attempt repositioning if not fixed (ie. `pointer`/`data`)
142
286
  if (typeof x !== 'number') {
143
287
  // Check if outside of container and swap align side accordingly
144
- if ((xAlign === 'start' || xAlign === 'center') && rect.right > $containerWidth) {
288
+ if ((xAlign === 'start' || xAlign === 'center') && rect.right > ctx.containerWidth) {
145
289
  rect.left = alignValue(xValue, 'end', xOffset, tooltipWidth);
146
290
  }
147
- if ((xAlign === 'end' || xAlign === 'center') && rect.left < $padding.left) {
291
+ if ((xAlign === 'end' || xAlign === 'center') && rect.left < ctx.padding.left) {
148
292
  rect.left = alignValue(xValue, 'start', xOffset, tooltipWidth);
149
293
  }
150
294
  }
151
295
  rect.right = rect.left + tooltipWidth;
152
296
 
153
297
  if (typeof y !== 'number') {
154
- if ((yAlign === 'start' || yAlign === 'center') && rect.bottom > $containerHeight) {
298
+ if ((yAlign === 'start' || yAlign === 'center') && rect.bottom > ctx.containerHeight) {
155
299
  rect.top = alignValue(yValue, 'end', yOffset, tooltipHeight);
156
300
  }
157
- if ((yAlign === 'end' || yAlign === 'center') && rect.top < $padding.top) {
301
+ if ((yAlign === 'end' || yAlign === 'center') && rect.top < ctx.padding.top) {
158
302
  rect.top = alignValue(yValue, 'start', yOffset, tooltipHeight);
159
303
  }
160
304
  }
@@ -162,10 +306,10 @@
162
306
  } else if (contained === 'window') {
163
307
  // Check if outside of window / viewport and swap align side accordingly
164
308
  // Root <div> won't be available on initial mount
165
- if (rootEl?.parentElement) {
166
- const parentViewportRect = rootEl.parentElement.getBoundingClientRect();
309
+ if (rootRef?.parentElement) {
310
+ const parentViewportRect = rootRef.parentElement.getBoundingClientRect();
167
311
 
168
- // Only attempt repositiong if not fixed (ie. `pointer`/`data`)
312
+ // Only attempt repositioning if not fixed (ie. `pointer`/`data`)
169
313
  if (typeof x !== 'number') {
170
314
  if (
171
315
  (xAlign === 'start' || xAlign === 'center') &&
@@ -196,26 +340,44 @@
196
340
  rect.bottom = rect.top + tooltipHeight;
197
341
  }
198
342
  }
343
+ return {
344
+ x: rect.left,
345
+ y: rect.top,
346
+ };
347
+ });
199
348
 
200
- $yPos = rect.top;
201
- $xPos = rect.left;
202
- }
349
+ const motionX = createMotion(tooltipCtx.x, () => positions.x, motion);
350
+ const motionY = createMotion(tooltipCtx.y, () => positions.y, motion);
203
351
 
204
- let rootEl: HTMLDivElement;
352
+ $effect(() => {
353
+ if (!tooltipCtx.data) {
354
+ tooltipCtx.isHoveringTooltipContent = false;
355
+ }
356
+ });
205
357
  </script>
206
358
 
207
- {#if $tooltip.data}
359
+ {#if tooltipCtx.data}
208
360
  <div
209
- class={cls('absolute z-50 select-none', !pointerEvents && 'pointer-events-none', classes.root)}
210
- style:top="{$yPos}px"
211
- style:left="{$xPos}px"
361
+ {...props.root}
362
+ class={cls('root', layerClass('tooltip-root'), classes.root, props.root?.class)}
363
+ class:pointer-events-none={!pointerEvents}
364
+ style:top="{motionY.current}px"
365
+ style:left="{motionX.current}px"
212
366
  transition:fade={{ duration: 100 }}
213
367
  bind:clientWidth={tooltipWidth}
214
368
  bind:clientHeight={tooltipHeight}
215
- bind:this={rootEl}
369
+ bind:this={rootRef}
370
+ onpointerenter={() => {
371
+ tooltipCtx.isHoveringTooltipContent = true;
372
+ }}
373
+ onpointerleave={() => {
374
+ tooltipCtx.isHoveringTooltipContent = false;
375
+ }}
216
376
  >
217
377
  <div
378
+ {...props.container}
218
379
  class={cls(
380
+ layerClass('tooltip-container'),
219
381
  variant !== 'none' && ['text-sm py-1 px-2 h-full rounded-sm elevation-1'],
220
382
  {
221
383
  default: [
@@ -229,14 +391,27 @@
229
391
  none: '',
230
392
  }[variant],
231
393
  classes.container,
232
- $$props.class
394
+ props.container?.class,
395
+ className
233
396
  )}
234
397
  >
235
- {#if $$slots.default}
236
- <div class={cls(classes.content)}>
237
- <slot data={$tooltip.data} />
398
+ {#if children}
399
+ <div {...props.content} class={cls(layerClass('tooltip-content'), classes.content)}>
400
+ {@render children({ data: tooltipCtx.data, payload: tooltipCtx.payload })}
238
401
  </div>
239
402
  {/if}
240
403
  </div>
241
404
  </div>
242
405
  {/if}
406
+
407
+ <style>
408
+ .root {
409
+ position: absolute;
410
+ z-index: 50;
411
+ user-select: none;
412
+ }
413
+
414
+ .pointer-events-none {
415
+ pointer-events: none;
416
+ }
417
+ </style>
@@ -1,35 +1,153 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- x?: "pointer" | "data" | number | undefined;
6
- y?: "pointer" | "data" | number | undefined;
7
- xOffset?: number | undefined;
8
- yOffset?: number | undefined;
9
- anchor?: ("bottom" | "left" | "right" | "top" | "center" | "top-left" | "top-right" | "bottom-left" | "bottom-right") | undefined;
10
- contained?: "container" | "window" | false | undefined;
11
- variant?: "default" | "invert" | "none" | undefined;
12
- motion?: boolean | undefined;
13
- pointerEvents?: boolean | undefined;
14
- classes?: {
15
- root?: string;
16
- container?: string;
17
- header?: string;
18
- content?: string;
19
- } | undefined;
1
+ import type { HTMLAttributes } from 'svelte/elements';
2
+ import type { Without } from '../../utils/types.js';
3
+ import type { TooltipPayload } from './tooltipMetaContext.js';
4
+ import type { Placement } from '../types.js';
5
+ export type Align = 'start' | 'center' | 'end';
6
+ export type TooltipPropsWithoutHTML<T = any> = {
7
+ /**
8
+ * `x` position of tooltip. By default uses the pointer/mouse, can also snap to data or an
9
+ * explicit fixed position.
10
+ *
11
+ * @default 'pointer'
12
+ */
13
+ x?: 'pointer' | 'data' | number;
14
+ /**
15
+ * `y` position of tooltip. By default uses the pointer/mouse, can also snap to data or an
16
+ * explicit fixed position.
17
+ *
18
+ * @default 'pointer'
19
+ */
20
+ y?: 'pointer' | 'data' | number;
21
+ /**
22
+ * Offset added to `x` position
23
+ *
24
+ * @default x === 'pointer' ? 10 : 0
25
+ */
26
+ xOffset?: number;
27
+ /**
28
+ * Offset added to `y` position
29
+ *
30
+ * @default y === 'pointer' ? 10 : 0
31
+ */
32
+ yOffset?: number;
33
+ /**
34
+ * Align based on edge of tooltip
35
+ *
36
+ * @default 'top-left'
37
+ */
38
+ anchor?: Placement;
39
+ /**
40
+ * The default motion state of the tooltip.
41
+ *
42
+ * @default "spring"
43
+ */
44
+ motion?: MotionProp;
45
+ /**
46
+ * Allow pointer events. Disabled by default to reduce accidental selection, but useful to
47
+ * enable to allow interactive tooltips (using `locked`)
48
+ *
49
+ * @default false
50
+ */
51
+ pointerEvents?: boolean;
52
+ /**
53
+ * Include padding area (ex. axis)
54
+ *
55
+ * @default 'container'
56
+ */
57
+ contained?: 'container' | 'window' | false;
58
+ /**
59
+ * Tooltip variant
60
+ *
61
+ * @default 'default'
62
+ */
63
+ variant?: 'default' | 'invert' | 'none';
64
+ /**
65
+ * Classes to apply to the various elements of the tooltip.
66
+ *
67
+ * @default {}
68
+ */
69
+ classes?: {
70
+ /**
71
+ * Classes to apply to the root tooltip element
72
+ */
73
+ root?: string;
74
+ /**
75
+ * Classes to apply to the tooltip container element
76
+ */
77
+ container?: string;
78
+ /**
79
+ * Classes to apply to the tooltip content element
80
+ */
81
+ content?: string;
82
+ /**
83
+ * Classes to apply to the tooltip header element
84
+ */
85
+ header?: string;
20
86
  };
21
- events: {
22
- [evt: string]: CustomEvent<any>;
23
- };
24
- slots: {
25
- default: {
26
- data: any;
27
- };
87
+ children?: Snippet<[
88
+ {
89
+ /**
90
+ * The chart data that triggered the tooltip.
91
+ */
92
+ data: T;
93
+ /**
94
+ * An array of tooltip payloads, each containing data for a specific series,
95
+ * along with their own `payload` property that contains the same data as `data`.
96
+ *
97
+ * This is useful when working with the simplified charts, such as `AreaChart`, `BarChart`,
98
+ * `PieChart`, etc., where series construction is handled internally.
99
+ */
100
+ payload: TooltipPayload[];
101
+ }
102
+ ]>;
103
+ /**
104
+ * A reference to the tooltip's outermost `<div>` tag.
105
+ *
106
+ * @bindable
107
+ */
108
+ rootRef?: HTMLElement;
109
+ /**
110
+ * Props to pass to the underlying elements rendered
111
+ * by the Tooltip component
112
+ */
113
+ props?: {
114
+ /**
115
+ * Props to pass to the root tooltip element
116
+ */
117
+ root?: HTMLAttributes<HTMLElement>;
118
+ /**
119
+ * Props to pass to the tooltip container element
120
+ */
121
+ container?: HTMLAttributes<HTMLElement>;
122
+ /**
123
+ * Props to pass to the tooltip content element
124
+ */
125
+ content?: HTMLAttributes<HTMLElement>;
28
126
  };
127
+ /**
128
+ * Optionally pass the chart's context to the tooltip to get
129
+ * type inference for the data.
130
+ */
131
+ context?: ChartContextValue<T, any, any>;
29
132
  };
30
- export type TooltipProps = typeof __propDef.props;
31
- export type TooltipEvents = typeof __propDef.events;
32
- export type TooltipSlots = typeof __propDef.slots;
33
- export default class Tooltip extends SvelteComponentTyped<TooltipProps, TooltipEvents, TooltipSlots> {
133
+ export type TooltipProps<T = any> = TooltipPropsWithoutHTML<T> & Without<HTMLAttributes<HTMLElement>, TooltipPropsWithoutHTML<T>>;
134
+ import { type ChartContextValue } from '../Chart.svelte';
135
+ import { type MotionProp } from '../../utils/motion.svelte.js';
136
+ import { type Snippet } from 'svelte';
137
+ declare class __sveltets_Render<T = any> {
138
+ props(): TooltipProps<T>;
139
+ events(): {};
140
+ slots(): {};
141
+ bindings(): "rootRef";
142
+ exports(): {};
143
+ }
144
+ interface $$IsomorphicComponent {
145
+ new <T = any>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
146
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
147
+ } & ReturnType<__sveltets_Render<T>['exports']>;
148
+ <T = any>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
149
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
34
150
  }
35
- export {};
151
+ declare const Tooltip: $$IsomorphicComponent;
152
+ type Tooltip<T = any> = InstanceType<typeof Tooltip<T>>;
153
+ export default Tooltip;