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,168 +1,364 @@
1
+ <script lang="ts" module>
2
+ export type PieChartExtraSnippetProps<TData> = {
3
+ key: Accessor<TData>;
4
+ label: Accessor<TData>;
5
+ value: Accessor<TData>;
6
+ visibleData: TData[];
7
+ getGroupProps: () => ComponentProps<typeof Group>;
8
+ };
9
+ export type PieChartPropsObjProp = Pick<
10
+ SimplifiedChartPropsObject,
11
+ 'pie' | 'group' | 'arc' | 'legend' | 'canvas' | 'svg' | 'tooltip'
12
+ >;
13
+
14
+ export type PieChartProps<TData> = Pick<
15
+ SimplifiedChartProps<TData, typeof Arc, PieChartExtraSnippetProps<TData>>,
16
+ | 'aboveContext'
17
+ | 'aboveMarks'
18
+ | 'belowContext'
19
+ | 'belowMarks'
20
+ | 'children'
21
+ | 'data'
22
+ | 'debug'
23
+ | 'legend'
24
+ | 'marks'
25
+ | 'onTooltipClick'
26
+ | 'profile'
27
+ | 'renderContext'
28
+ | 'series'
29
+ | 'tooltip'
30
+ | 'tooltipContext'
31
+ | 'cRange'
32
+ | 'padding'
33
+ | 'context'
34
+ > & {
35
+ /**
36
+ * Key accessor
37
+ *
38
+ * @default 'key'
39
+ */
40
+ key?: Accessor<TData>;
41
+
42
+ /**
43
+ * Label accessor
44
+ *
45
+ * @default 'label'
46
+ */
47
+ label?: Accessor<TData>;
48
+
49
+ /**
50
+ * Value accessor
51
+ *
52
+ * @default 'value'
53
+ */
54
+ value?: Accessor<TData>;
55
+
56
+ /**
57
+ * Color accessor
58
+ *
59
+ * @default key
60
+ */
61
+ c?: Accessor<TData>;
62
+
63
+ /**
64
+ * Maximum possible value, useful when `data` is single item
65
+ */
66
+ maxValue?: number;
67
+
68
+ /**
69
+ * Range [min, max] in degrees.
70
+ *
71
+ * See also `startAngle`/`endAngle`
72
+ *
73
+ * @default [0, 360]
74
+ */
75
+ range?: [number, number];
76
+
77
+ props?: PieChartPropsObjProp;
78
+
79
+ /**
80
+ * Inner radius of the arc.
81
+ * value >= 1: discrete value
82
+ * value > 0: percent of `outerRadius`
83
+ * value < 0: offset of `outerRadius`
84
+ */
85
+ innerRadius?: number;
86
+
87
+ /**
88
+ * Outer radius of the arc.
89
+ */
90
+ outerRadius?: number;
91
+
92
+ /**
93
+ * Corner radius of the arc
94
+ *
95
+ * @default 0
96
+ */
97
+ cornerRadius?: number;
98
+
99
+ /**
100
+ * Angle between the arcs
101
+ *
102
+ * @default 0
103
+ */
104
+ padAngle?: number;
105
+
106
+ /**
107
+ * Placement of the PieChart
108
+ *
109
+ * @default 'center'
110
+ */
111
+ placement?: 'left' | 'center' | 'right';
112
+
113
+ /**
114
+ * Center the chart.
115
+ *
116
+ * Override and use `props.group` for more control.
117
+ *
118
+ * @default placement === 'center'
119
+ */
120
+ center?: boolean;
121
+
122
+ /**
123
+ * Replace the default rendering of the `<Pie>` component internally with your own.
124
+ *
125
+ * Use the `props` snippet prop to access the default props.
126
+ */
127
+ pie?: SimplifiedChartSnippet<
128
+ TData,
129
+ typeof Arc,
130
+ PieChartExtraSnippetProps<TData> & {
131
+ /**
132
+ * Default props to apply to the Pie component.
133
+ */
134
+ props: ComponentProps<typeof Pie>;
135
+ /**
136
+ * The index of the pie series currently being iterated over.
137
+ */
138
+ index: number;
139
+ }
140
+ >;
141
+
142
+ /**
143
+ * Replace the default rendering of the `<Arc>` component internally with your own.
144
+ *
145
+ * Use the `props` snippet prop to access the default props.
146
+ */
147
+ arc?: SimplifiedChartSnippet<
148
+ TData,
149
+ typeof Arc,
150
+ PieChartExtraSnippetProps<TData> & {
151
+ props: ComponentProps<typeof Arc>;
152
+ /**
153
+ * The index of the arc currently being iterated over
154
+ */
155
+ index: number;
156
+
157
+ /**
158
+ * The index of the series currently being iterated over.
159
+ */
160
+ seriesIndex: number;
161
+ }
162
+ >;
163
+
164
+ /**
165
+ * A callback function triggered when the arc is clicked.
166
+ */
167
+ onArcClick?: (
168
+ e: MouseEvent,
169
+ detail: { data: any; series: SeriesData<TData, typeof Arc> }
170
+ ) => void;
171
+ };
172
+ </script>
173
+
1
174
  <script lang="ts" generics="TData">
2
- import { onMount, type ComponentProps } from 'svelte';
3
- import { sum } from 'd3-array';
175
+ import { onMount, type ComponentProps, type Snippet } from 'svelte';
4
176
  import { format } from '@layerstack/utils';
5
177
  import { cls } from '@layerstack/tailwind';
6
- import { selectionStore } from '@layerstack/svelte-stores';
178
+ import { SelectionState } from '@layerstack/svelte-state';
179
+ import type { PieArcDatum } from 'd3-shape';
7
180
 
8
181
  import Arc from '../Arc.svelte';
9
- import Canvas from '../layout/Canvas.svelte';
10
182
  import Chart from '../Chart.svelte';
11
183
  import Group from '../Group.svelte';
184
+ import Layer from '../layout/Layer.svelte';
12
185
  import Legend from '../Legend.svelte';
13
186
  import Pie from '../Pie.svelte';
14
- import Svg from '../layout/Svg.svelte';
15
187
  import * as Tooltip from '../tooltip/index.js';
16
188
 
17
189
  import { accessor, chartDataArray, type Accessor } from '../../utils/common.js';
18
190
  import { asAny } from '../../utils/types.js';
19
-
20
- interface $$Props extends ComponentProps<Chart<TData>> {
21
- cornerRadius?: typeof cornerRadius;
22
- innerRadius?: typeof innerRadius;
23
- key?: typeof key;
24
- label?: typeof label;
25
- legend?: typeof legend;
26
- maxValue?: typeof maxValue;
27
- outerRadius?: typeof outerRadius;
28
- padAngle?: typeof padAngle;
29
- center?: typeof center;
30
- placement?: typeof placement;
31
- profile?: typeof profile;
32
- debug?: typeof debug;
33
- props?: typeof props;
34
- range?: typeof range;
35
- series?: typeof series;
36
- value?: typeof value;
37
- renderContext?: typeof renderContext;
38
- onarcclick?: typeof onarcclick;
39
- ontooltipclick?: typeof ontooltipclick;
191
+ import type {
192
+ SeriesData,
193
+ SimplifiedChartProps,
194
+ SimplifiedChartPropsObject,
195
+ SimplifiedChartSnippet,
196
+ } from './types.js';
197
+ import { HighlightKey } from './utils.svelte.js';
198
+ import { setTooltipMetaContext } from '../tooltip/tooltipMetaContext.js';
199
+
200
+ let {
201
+ data = [],
202
+ key = 'key',
203
+ label = 'label',
204
+ value = 'value',
205
+ range = [0, 360],
206
+ c = key,
207
+ innerRadius,
208
+ outerRadius,
209
+ cornerRadius = 0,
210
+ padAngle = 0,
211
+ placement = 'center',
212
+ maxValue,
213
+ center = placement === 'center',
214
+ series: seriesProp,
215
+ legend = false,
216
+ onArcClick = () => {},
217
+ // TODO: Not usable with manual tooltip / arc path. Use `onArcClick`?
218
+ /** Event dispatched with current tooltip data */
219
+ onTooltipClick = () => {},
220
+ props = {},
221
+ renderContext = 'svg',
222
+ profile = false,
223
+ debug = false,
224
+ tooltip = true,
225
+ children: childrenProp,
226
+ aboveContext,
227
+ belowContext,
228
+ belowMarks,
229
+ aboveMarks,
230
+ marks,
231
+ pie,
232
+ arc,
233
+ context = $bindable(),
234
+ ...restProps
235
+ }: PieChartProps<TData> = $props();
236
+
237
+ const series = $derived(
238
+ seriesProp === undefined ? [{ key: 'default', value: value }] : seriesProp
239
+ );
240
+
241
+ const keyAccessor = $derived(accessor(key));
242
+ const labelAccessor = $derived(accessor(label));
243
+ const valueAccessor = $derived(accessor(value));
244
+ const cAccessor = $derived(accessor(c));
245
+
246
+ const allSeriesData = $derived(
247
+ series
248
+ .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
249
+ .filter((d) => d) as Array<TData>
250
+ );
251
+
252
+ const chartData = $derived(
253
+ allSeriesData.length ? allSeriesData : chartDataArray(data)
254
+ ) as Array<TData>;
255
+
256
+ const seriesColors = $derived(series.map((s) => s.color).filter((d) => d != null));
257
+
258
+ const highlightKey = new HighlightKey<TData, typeof Arc>();
259
+ const selectedKeys = new SelectionState();
260
+ const selectedSeries = new SelectionState();
261
+
262
+ const visibleData = $derived(
263
+ chartData.filter((d) => {
264
+ const dataKey = keyAccessor(d);
265
+ return selectedKeys.isEmpty() || selectedKeys.isSelected(dataKey);
266
+ })
267
+ );
268
+
269
+ // TODO: note, I added this because it wasn't consistent with all the other charts
270
+ // unsure if it is correct but will validate with Sean
271
+ const visibleSeries = $derived(
272
+ series.filter((s) => selectedSeries.isEmpty() || selectedSeries.isSelected(s.key))
273
+ );
274
+
275
+ function getLegendProps(): ComponentProps<typeof Legend> {
276
+ return {
277
+ tickFormat: (tick) => {
278
+ const item = chartData.find((d) => keyAccessor(d) === tick);
279
+ return item ? (labelAccessor(item) ?? tick) : tick;
280
+ },
281
+ placement: 'bottom',
282
+ variant: 'swatches',
283
+ onclick: (e, item) => {
284
+ selectedKeys.toggleSelected(item.value);
285
+ // TODO: investigate
286
+ // selectedSeries.toggleSelected(item.value);
287
+ },
288
+ onpointerenter: (e, item) => (highlightKey.current = item.value),
289
+ onpointerleave: (e) => (highlightKey.current = null),
290
+ ...props.legend,
291
+ ...(typeof legend === 'object' ? legend : null),
292
+ classes: {
293
+ item: (item) =>
294
+ visibleData.length && !visibleData.some((d) => keyAccessor(d) === item.value)
295
+ ? 'opacity-50'
296
+ : '',
297
+ ...props.legend?.classes,
298
+ ...(typeof legend === 'object' ? legend.classes : null),
299
+ },
300
+ };
40
301
  }
41
302
 
42
- export let data: $$Props['data'] = [];
43
-
44
- /** Key accessor */
45
- export let key: Accessor<TData> = 'key';
46
- $: keyAccessor = accessor(key);
47
-
48
- /** Label accessor */
49
- export let label: Accessor<TData> = 'label';
50
- $: labelAccessor = accessor(label);
51
-
52
- /** Value accessor */
53
- export let value: Accessor<TData> = 'value';
54
- $: valueAccessor = accessor(value);
55
-
56
- /** Color accessor*/
57
- export let c: Accessor<TData> = key;
58
- $: cAccessor = accessor(c);
59
-
60
- /** Maximum possible value, useful when `data` is single item */
61
- export let maxValue: number | undefined = undefined;
62
-
63
- export let series: {
64
- key: string | number;
65
- label?: string;
66
- value?: Accessor<TData>;
67
- /** Provider series data, else uses chart data (with value/key accessor) */
68
- data?: TData[];
69
- /** Maximum possible value, useful when `data` is single item */
70
- maxValue?: number;
71
- color?: string;
72
- props?: Partial<ComponentProps<Arc>>;
73
- }[] = [{ key: 'default', value: value /*, color: 'var(--color-primary)'*/ }];
74
-
75
- export let legend: ComponentProps<Legend> | boolean = false;
76
-
77
- /**
78
- * Range [min,max] in degrees. See also startAngle/endAngle
79
- */
80
- export let range = [0, 360];
81
-
82
- /**
83
- * Define innerRadius.
84
- * value >= 1: discrete value
85
- * value > 0: percent of `outerRadius`
86
- * value < 0: offset of `outerRadius`
87
- * default: yRange min
88
- */
89
- export let innerRadius: number | undefined = undefined;
90
-
91
- /**
92
- * Define outerRadius. Defaults to yRange max/2 (ie. chart height / 2)
93
- */
94
- export let outerRadius: number | undefined = undefined;
95
-
96
- export let cornerRadius = 0;
97
- export let padAngle = 0;
98
-
99
- /** Placement of PieChart (default: 'center') */
100
- export let placement: 'left' | 'center' | 'right' = 'center';
101
-
102
- /** Center chart. Override and use `props.group` for more control */
103
- export let center = placement === 'center';
104
-
105
- /** Expose tooltip context for external access */
106
- export let tooltipContext: ComponentProps<Tooltip.Context>['tooltip'] = undefined;
107
-
108
- // TODO: Not usable with manual tooltip / arc path. Use `onarcclick`?
109
- /** Event dispatched with current tooltip data */
110
- export let ontooltipclick: (e: MouseEvent, detail: { data: any }) => void = () => {};
111
-
112
- /** Event dispatched when individual Arc is clicked (useful with multiple series) */
113
- export let onarcclick: (
114
- e: MouseEvent,
115
- detail: { data: any; series: (typeof series)[number] }
116
- ) => void = () => {};
117
-
118
- export let props: {
119
- pie?: Partial<ComponentProps<Pie>>;
120
- group?: Partial<ComponentProps<Group>>;
121
- arc?: Partial<ComponentProps<Arc>>;
122
- legend?: Partial<ComponentProps<Legend>>;
123
- canvas?: Partial<ComponentProps<Canvas>>;
124
- svg?: Partial<ComponentProps<Svg>>;
125
- tooltip?: {
126
- context?: Partial<ComponentProps<Tooltip.Context>>;
127
- root?: Partial<ComponentProps<Tooltip.Root>>;
128
- header?: Partial<ComponentProps<Tooltip.Header>>;
129
- list?: Partial<ComponentProps<Tooltip.List>>;
130
- item?: Partial<ComponentProps<Tooltip.Item>>;
131
- separator?: Partial<ComponentProps<Tooltip.Separator>>;
303
+ function getGroupProps(): ComponentProps<typeof Group> {
304
+ if (!context) return {};
305
+ return {
306
+ x:
307
+ placement === 'left'
308
+ ? context.height / 2
309
+ : placement === 'right'
310
+ ? context.width - context.height / 2
311
+ : undefined,
312
+ center: ['left', 'right'].includes(placement) ? 'y' : undefined,
313
+ ...props.group,
132
314
  };
133
- } = {};
134
-
135
- export let renderContext: 'svg' | 'canvas' = 'svg';
136
-
137
- /** Log initial render performance using `console.time` */
138
- export let profile = false;
139
-
140
- /** Enable debug mode */
141
- export let debug = false;
142
-
143
- $: allSeriesData = series
144
- .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
145
- .filter((d) => d) as Array<TData>;
146
-
147
- $: chartData = (allSeriesData.length ? allSeriesData : chartDataArray(data)) as Array<TData>;
148
-
149
- $: seriesColors = series.map((s) => s.color).filter((d) => d != null);
150
-
151
- let highlightKey: (typeof series)[number]['key'] | null = null;
315
+ }
152
316
 
153
- function setHighlightKey(key: typeof highlightKey) {
154
- highlightKey = key ?? null;
317
+ function getPieProps(s: SeriesData<TData, typeof Arc>, i: number): ComponentProps<typeof Pie> {
318
+ return {
319
+ data: s.data,
320
+ range,
321
+ innerRadius,
322
+ outerRadius,
323
+ cornerRadius,
324
+ padAngle,
325
+ ...props.pie,
326
+ };
155
327
  }
156
328
 
157
- const selectedKeys = selectionStore();
158
- $: visibleData = chartData.filter((d) => {
159
- const dataKey = keyAccessor(d);
160
- return (
161
- // @ts-expect-error
162
- $selectedKeys.selected.length === 0 || $selectedKeys.isSelected(dataKey)
163
- // || highlightKey == dataKey
164
- );
165
- });
329
+ function getArcProps(
330
+ s: SeriesData<TData, typeof Arc>,
331
+ seriesIndex: number,
332
+ arc: PieArcDatum<any>,
333
+ arcIndex: number
334
+ ): ComponentProps<typeof Arc> {
335
+ if (!context) return {};
336
+ const arcDataProps =
337
+ 'props' in arc.data && typeof arc.data.props === 'object' ? arc.data.props : {};
338
+ return {
339
+ startAngle: arc.startAngle,
340
+ endAngle: arc.endAngle,
341
+ outerRadius: visibleSeries.length > 1 ? seriesIndex * (outerRadius ?? 0) : outerRadius,
342
+ innerRadius,
343
+ cornerRadius,
344
+ padAngle,
345
+ fill: context.cScale?.(context.c(arc.data)),
346
+ data: arc.data,
347
+ tooltipContext: context.tooltip,
348
+ onclick: (e) => {
349
+ onArcClick(e, { data: arc.data, series: s });
350
+ // Workaround for `tooltip={{ mode: 'manual' }}
351
+ onTooltipClick(e, { data: arc.data });
352
+ },
353
+ class: cls(
354
+ 'transition-opacity',
355
+ highlightKey.current && highlightKey.current !== keyAccessor(arc.data) && 'opacity-50'
356
+ ),
357
+ ...props.arc,
358
+ ...s.props,
359
+ ...arcDataProps,
360
+ };
361
+ }
166
362
 
167
363
  if (profile) {
168
364
  console.time('PieChart render');
@@ -170,13 +366,34 @@
170
366
  console.timeEnd('PieChart render');
171
367
  });
172
368
  }
369
+
370
+ setTooltipMetaContext({
371
+ type: 'pie',
372
+ get color() {
373
+ return c;
374
+ },
375
+ get value() {
376
+ return value;
377
+ },
378
+ get label() {
379
+ return label;
380
+ },
381
+ get key() {
382
+ return key;
383
+ },
384
+ get visibleSeries() {
385
+ return visibleSeries;
386
+ },
387
+ });
173
388
  </script>
174
389
 
390
+ <!-- svelte-ignore ownership_invalid_binding -->
175
391
  <Chart
392
+ bind:context
176
393
  data={visibleData}
177
394
  x={value}
178
395
  y={key}
179
- {c}
396
+ c={key}
180
397
  cDomain={chartData.map(keyAccessor)}
181
398
  cRange={seriesColors.length
182
399
  ? seriesColors
@@ -191,176 +408,101 @@
191
408
  'var(--color-danger)',
192
409
  ]}
193
410
  padding={{ bottom: legend === true ? 32 : 0 }}
194
- {...$$restProps}
195
- tooltip={props.tooltip?.context}
196
- bind:tooltipContext
197
- let:x
198
- let:xScale
199
- let:y
200
- let:c
201
- let:cScale
202
- let:yScale
203
- let:width
204
- let:height
205
- let:padding
206
- let:tooltip
411
+ {...restProps}
412
+ tooltip={tooltip === false ? false : props.tooltip?.context}
207
413
  >
208
- {@const slotProps = {
209
- key,
210
- label,
211
- value,
212
- x,
213
- xScale,
214
- y,
215
- yScale,
216
- c,
217
- cScale,
218
- width,
219
- height,
220
- padding,
221
- tooltip,
222
- series,
223
- visibleData,
224
- highlightKey,
225
- setHighlightKey,
226
- }}
227
- <slot {...slotProps}>
228
- <slot name="belowContext" {...slotProps} />
229
-
230
- <svelte:component
231
- this={renderContext === 'canvas' ? Canvas : Svg}
232
- {...asAny(renderContext === 'canvas' ? props.canvas : props.svg)}
233
- {center}
234
- {debug}
235
- >
236
- <slot name="belowMarks" {...slotProps} />
237
-
238
- <slot name="marks" {...slotProps}>
239
- <Group
240
- x={placement === 'left'
241
- ? height / 2
242
- : placement === 'right'
243
- ? width - height / 2
244
- : undefined}
245
- center={['left', 'right'].includes(placement) ? 'y' : undefined}
246
- {...props.group}
247
- >
248
- {#each series as s, i (s.key)}
249
- {@const singleArc = s.data?.length === 1 || chartData.length === 1}
250
- {#if singleArc}
251
- {@const d = s.data?.[0] || chartData[0]}
252
- <Arc
253
- value={valueAccessor(d)}
254
- domain={[0, s.maxValue ?? maxValue ?? sum(chartData, valueAccessor)]}
255
- {range}
256
- {innerRadius}
257
- outerRadius={(outerRadius ?? 0) < 0 ? i * (outerRadius ?? 0) : outerRadius}
258
- {cornerRadius}
259
- {padAngle}
260
- fill={s.color ?? cScale?.(c(d))}
261
- track={{ fill: s.color ?? cScale?.(c(d)), fillOpacity: 0.1 }}
262
- {tooltip}
263
- data={d}
264
- onclick={(e) => {
265
- onarcclick(e, { data: d, series: s });
266
- // Workaround for `tooltip={{ mode: 'manual' }}
267
- ontooltipclick(e, { data: d });
268
- }}
269
- {...props.arc}
270
- {...s.props}
271
- class={cls(
272
- 'transition-opacity',
273
- highlightKey && highlightKey !== keyAccessor(d) && 'opacity-50',
274
- props.arc?.class,
275
- s.props?.class
276
- )}
414
+ {#snippet children({ context })}
415
+ {@const snippetProps = {
416
+ label: labelAccessor,
417
+ key: keyAccessor,
418
+ value: valueAccessor,
419
+ color: cAccessor,
420
+ context,
421
+ series,
422
+ visibleSeries,
423
+ visibleData,
424
+ highlightKey: highlightKey.current,
425
+ setHighlightKey: highlightKey.set,
426
+ getLegendProps,
427
+ getGroupProps,
428
+ }}
429
+ {#if childrenProp}
430
+ {@render childrenProp(snippetProps)}
431
+ {:else}
432
+ {@render belowContext?.(snippetProps)}
433
+
434
+ <Layer
435
+ type={renderContext}
436
+ {...asAny(renderContext === 'canvas' ? props.canvas : props.svg)}
437
+ {center}
438
+ {debug}
439
+ >
440
+ {@render belowMarks?.(snippetProps)}
441
+
442
+ {#if typeof marks === 'function'}
443
+ {@render marks(snippetProps)}
444
+ {:else}
445
+ <Group {...getGroupProps()}>
446
+ {#each visibleSeries as s, seriesIdx (s.key)}
447
+ {#if typeof pie === 'function'}
448
+ {@render pie({
449
+ ...snippetProps,
450
+ props: getPieProps(s, seriesIdx),
451
+ index: seriesIdx,
452
+ })}
453
+ {:else}
454
+ <Pie {...getPieProps(s, seriesIdx)}>
455
+ {#snippet children({ arcs })}
456
+ {#each arcs as arcData, arcIdx (`${seriesIdx}-${arcIdx}`)}
457
+ {@const arcProps = getArcProps(s, seriesIdx, arcData, arcIdx)}
458
+ {#if typeof arc === 'function'}
459
+ {@render arc({
460
+ ...snippetProps,
461
+ props: arcProps,
462
+ index: arcIdx,
463
+ seriesIndex: seriesIdx,
464
+ })}
465
+ {:else}
466
+ <Arc {...arcProps} />
467
+ {/if}
468
+ {/each}
469
+ {/snippet}
470
+ </Pie>
471
+ {/if}
472
+ {/each}
473
+ </Group>
474
+ {/if}
475
+
476
+ {@render aboveMarks?.(snippetProps)}
477
+ </Layer>
478
+
479
+ {@render aboveContext?.(snippetProps)}
480
+
481
+ {#if typeof legend === 'function'}
482
+ {@render legend(snippetProps)}
483
+ {:else if legend}
484
+ <Legend {...getLegendProps()} />
485
+ {/if}
486
+
487
+ {#if typeof tooltip === 'function'}
488
+ {@render tooltip(snippetProps)}
489
+ {:else if tooltip}
490
+ <Tooltip.Root {context} {...props.tooltip?.root}>
491
+ {#snippet children({ data })}
492
+ <Tooltip.List {...props.tooltip?.list}>
493
+ <Tooltip.Item
494
+ label={labelAccessor(data) || keyAccessor(data)}
495
+ value={valueAccessor(data)}
496
+ color={context.cScale?.(context.c(data))}
497
+ {format}
498
+ onpointerenter={() => (highlightKey.current = keyAccessor(data))}
499
+ onpointerleave={() => (highlightKey.current = null)}
500
+ {...props.tooltip?.item}
277
501
  />
278
- {:else}
279
- <Pie
280
- data={s.data}
281
- {range}
282
- {innerRadius}
283
- {outerRadius}
284
- {cornerRadius}
285
- {padAngle}
286
- {...props.pie}
287
- let:arcs
288
- >
289
- {#each arcs as arc}
290
- <Arc
291
- startAngle={arc.startAngle}
292
- endAngle={arc.endAngle}
293
- outerRadius={series.length > 1 ? i * (outerRadius ?? 0) : outerRadius}
294
- {innerRadius}
295
- {cornerRadius}
296
- {padAngle}
297
- fill={cScale?.(c(arc.data))}
298
- data={arc.data}
299
- {tooltip}
300
- onclick={(e) => {
301
- onarcclick(e, { data: arc.data, series: s });
302
- // Workaround for `tooltip={{ mode: 'manual' }}
303
- ontooltipclick(e, { data: arc.data });
304
- }}
305
- class={cls(
306
- 'transition-opacity',
307
- highlightKey && highlightKey !== keyAccessor(arc.data) && 'opacity-50'
308
- )}
309
- {...props.arc}
310
- {...s.props}
311
- />
312
- {/each}
313
- </Pie>
314
- {/if}
315
- {/each}
316
- </Group>
317
- </slot>
318
-
319
- <slot name="aboveMarks" {...slotProps} />
320
- </svelte:component>
321
-
322
- <slot name="aboveContext" {...slotProps} />
323
-
324
- <slot name="legend" {...slotProps}>
325
- {#if legend}
326
- <Legend
327
- tickFormat={(tick) => {
328
- const item = chartData.find((d) => keyAccessor(d) === tick);
329
- return item ? (labelAccessor(item) ?? tick) : tick;
330
- }}
331
- placement="bottom"
332
- variant="swatches"
333
- onclick={(e, item) => $selectedKeys.toggleSelected(item.value)}
334
- onpointerenter={(e, item) => (highlightKey = item.value)}
335
- onpointerleave={(e) => (highlightKey = null)}
336
- {...props.legend}
337
- {...typeof legend === 'object' ? legend : null}
338
- classes={{
339
- item: (item) =>
340
- visibleData.length && !visibleData.some((d) => keyAccessor(d) === item.value)
341
- ? 'opacity-50'
342
- : '',
343
- ...props.legend?.classes,
344
- ...(typeof legend === 'object' ? legend.classes : null),
345
- }}
346
- />
502
+ </Tooltip.List>
503
+ {/snippet}
504
+ </Tooltip.Root>
347
505
  {/if}
348
- </slot>
349
-
350
- <slot name="tooltip" {...slotProps}>
351
- <Tooltip.Root {...props.tooltip?.root} let:data>
352
- <Tooltip.List {...props.tooltip?.list}>
353
- <Tooltip.Item
354
- label={labelAccessor(data) || keyAccessor(data)}
355
- value={valueAccessor(data)}
356
- color={cScale?.(c(data))}
357
- {format}
358
- onpointerenter={() => (highlightKey = keyAccessor(data))}
359
- onpointerleave={() => (highlightKey = null)}
360
- {...props.tooltip?.item}
361
- />
362
- </Tooltip.List>
363
- </Tooltip.Root>
364
- </slot>
365
- </slot>
506
+ {/if}
507
+ {/snippet}
366
508
  </Chart>