@automattic/charts 0.56.3 → 0.56.5

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 (186) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/charts/bar-chart/index.cjs +5 -5
  3. package/dist/charts/bar-chart/index.css +12 -0
  4. package/dist/charts/bar-chart/index.css.map +1 -1
  5. package/dist/charts/bar-chart/index.js +4 -4
  6. package/dist/charts/bar-list-chart/index.cjs +6 -6
  7. package/dist/charts/bar-list-chart/index.css +12 -0
  8. package/dist/charts/bar-list-chart/index.css.map +1 -1
  9. package/dist/charts/bar-list-chart/index.js +5 -5
  10. package/dist/charts/conversion-funnel-chart/index.cjs +5 -3
  11. package/dist/charts/conversion-funnel-chart/index.cjs.map +1 -1
  12. package/dist/charts/conversion-funnel-chart/index.css +14 -1
  13. package/dist/charts/conversion-funnel-chart/index.css.map +1 -1
  14. package/dist/charts/conversion-funnel-chart/index.d.cts +2 -0
  15. package/dist/charts/conversion-funnel-chart/index.d.ts +2 -0
  16. package/dist/charts/conversion-funnel-chart/index.js +4 -2
  17. package/dist/charts/geo-chart/index.cjs +4 -4
  18. package/dist/charts/geo-chart/index.css +12 -0
  19. package/dist/charts/geo-chart/index.css.map +1 -1
  20. package/dist/charts/geo-chart/index.js +3 -3
  21. package/dist/charts/leaderboard-chart/index.cjs +5 -5
  22. package/dist/charts/leaderboard-chart/index.css +12 -0
  23. package/dist/charts/leaderboard-chart/index.css.map +1 -1
  24. package/dist/charts/leaderboard-chart/index.js +4 -4
  25. package/dist/charts/line-chart/index.cjs +5 -5
  26. package/dist/charts/line-chart/index.css +12 -0
  27. package/dist/charts/line-chart/index.css.map +1 -1
  28. package/dist/charts/line-chart/index.js +4 -4
  29. package/dist/charts/pie-chart/index.cjs +7 -7
  30. package/dist/charts/pie-chart/index.css +12 -0
  31. package/dist/charts/pie-chart/index.css.map +1 -1
  32. package/dist/charts/pie-chart/index.js +6 -6
  33. package/dist/charts/pie-semi-circle-chart/index.cjs +7 -7
  34. package/dist/charts/pie-semi-circle-chart/index.css +12 -0
  35. package/dist/charts/pie-semi-circle-chart/index.css.map +1 -1
  36. package/dist/charts/pie-semi-circle-chart/index.js +6 -6
  37. package/dist/charts/sparkline/index.cjs +6 -6
  38. package/dist/charts/sparkline/index.css +12 -0
  39. package/dist/charts/sparkline/index.css.map +1 -1
  40. package/dist/charts/sparkline/index.js +5 -5
  41. package/dist/{chunk-OTZT3MC2.cjs → chunk-2A34OA5O.cjs} +19 -20
  42. package/dist/chunk-2A34OA5O.cjs.map +1 -0
  43. package/dist/{chunk-H34CJSR6.js → chunk-32ESS4MV.js} +406 -363
  44. package/dist/chunk-32ESS4MV.js.map +1 -0
  45. package/dist/{chunk-CEZGL6YP.js → chunk-6CCZL2JJ.js} +15 -7
  46. package/dist/chunk-6CCZL2JJ.js.map +1 -0
  47. package/dist/{chunk-NW3RUYK2.cjs → chunk-7QDEU3KN.cjs} +15 -22
  48. package/dist/chunk-7QDEU3KN.cjs.map +1 -0
  49. package/dist/chunk-7TQSPLIN.js +351 -0
  50. package/dist/chunk-7TQSPLIN.js.map +1 -0
  51. package/dist/{chunk-T4J6TI55.js → chunk-AFWQR3SM.js} +102 -79
  52. package/dist/chunk-AFWQR3SM.js.map +1 -0
  53. package/dist/{chunk-5XI443YP.js → chunk-BPYKWMI7.js} +72 -64
  54. package/dist/chunk-BPYKWMI7.js.map +1 -0
  55. package/dist/{chunk-TNRKEBTA.js → chunk-DBY6C4O2.js} +148 -164
  56. package/dist/{chunk-TNRKEBTA.js.map → chunk-DBY6C4O2.js.map} +1 -1
  57. package/dist/chunk-DLSUC7RN.js +1065 -0
  58. package/dist/chunk-DLSUC7RN.js.map +1 -0
  59. package/dist/{chunk-TVV7ZI7C.cjs → chunk-EJJO2QNB.cjs} +399 -356
  60. package/dist/chunk-EJJO2QNB.cjs.map +1 -0
  61. package/dist/{chunk-ODF5O5PV.cjs → chunk-FIFSYVN6.cjs} +154 -170
  62. package/dist/chunk-FIFSYVN6.cjs.map +1 -0
  63. package/dist/chunk-FY325WQ4.cjs +1065 -0
  64. package/dist/chunk-FY325WQ4.cjs.map +1 -0
  65. package/dist/{chunk-SRXJLAKG.cjs → chunk-I2276W3I.cjs} +28 -37
  66. package/dist/chunk-I2276W3I.cjs.map +1 -0
  67. package/dist/{chunk-7UJPVCMB.cjs → chunk-IHESL7H5.cjs} +265 -262
  68. package/dist/chunk-IHESL7H5.cjs.map +1 -0
  69. package/dist/chunk-JL4ZKKZU.cjs +375 -0
  70. package/dist/chunk-JL4ZKKZU.cjs.map +1 -0
  71. package/dist/chunk-KHRPRH4V.js +165 -0
  72. package/dist/chunk-KHRPRH4V.js.map +1 -0
  73. package/dist/{chunk-A3AEEGKR.js → chunk-KXRWNFQJ.js} +20 -21
  74. package/dist/chunk-KXRWNFQJ.js.map +1 -0
  75. package/dist/{chunk-2VPPTJS2.js → chunk-KXSLMOW5.js} +256 -253
  76. package/dist/chunk-KXSLMOW5.js.map +1 -0
  77. package/dist/chunk-LT4YOIMM.js +375 -0
  78. package/dist/chunk-LT4YOIMM.js.map +1 -0
  79. package/dist/chunk-LTPJPIDP.cjs +165 -0
  80. package/dist/chunk-LTPJPIDP.cjs.map +1 -0
  81. package/dist/chunk-NGHXTIUE.cjs +120 -0
  82. package/dist/chunk-NGHXTIUE.cjs.map +1 -0
  83. package/dist/chunk-PCOI2GT5.js +120 -0
  84. package/dist/chunk-PCOI2GT5.js.map +1 -0
  85. package/dist/{chunk-YYQ4IK5V.cjs → chunk-Q6G3BGCL.cjs} +103 -80
  86. package/dist/chunk-Q6G3BGCL.cjs.map +1 -0
  87. package/dist/{chunk-HIWNB5PK.cjs → chunk-RCY6XLGU.cjs} +13 -5
  88. package/dist/chunk-RCY6XLGU.cjs.map +1 -0
  89. package/dist/chunk-TKPK4RFS.cjs +351 -0
  90. package/dist/chunk-TKPK4RFS.cjs.map +1 -0
  91. package/dist/{chunk-C33AQZEC.js → chunk-TYIH5LMV.js} +16 -23
  92. package/dist/chunk-TYIH5LMV.js.map +1 -0
  93. package/dist/chunk-X6GX4QUJ.js +421 -0
  94. package/dist/chunk-X6GX4QUJ.js.map +1 -0
  95. package/dist/chunk-XCXAWMJQ.cjs +421 -0
  96. package/dist/chunk-XCXAWMJQ.cjs.map +1 -0
  97. package/dist/chunk-XWYZIFZW.js +66 -0
  98. package/dist/chunk-XWYZIFZW.js.map +1 -0
  99. package/dist/{chunk-7HROSZRS.cjs → chunk-Y3NNQMAX.cjs} +70 -62
  100. package/dist/chunk-Y3NNQMAX.cjs.map +1 -0
  101. package/dist/components/legend/index.cjs +2 -2
  102. package/dist/components/legend/index.css +12 -0
  103. package/dist/components/legend/index.css.map +1 -1
  104. package/dist/components/legend/index.js +1 -1
  105. package/dist/components/tooltip/index.cjs +2 -2
  106. package/dist/components/tooltip/index.js +1 -1
  107. package/dist/components/trend-indicator/index.cjs +2 -2
  108. package/dist/components/trend-indicator/index.js +1 -1
  109. package/dist/hooks/index.cjs +4 -2
  110. package/dist/hooks/index.cjs.map +1 -1
  111. package/dist/hooks/index.css +12 -0
  112. package/dist/hooks/index.css.map +1 -1
  113. package/dist/hooks/index.d.cts +28 -2
  114. package/dist/hooks/index.d.ts +28 -2
  115. package/dist/hooks/index.js +3 -1
  116. package/dist/index.cjs +18 -18
  117. package/dist/index.cjs.map +1 -1
  118. package/dist/index.css +14 -1
  119. package/dist/index.css.map +1 -1
  120. package/dist/index.d.cts +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.js +17 -17
  123. package/dist/providers/index.cjs +2 -2
  124. package/dist/providers/index.css +12 -0
  125. package/dist/providers/index.css.map +1 -1
  126. package/dist/providers/index.d.cts +1 -1
  127. package/dist/providers/index.d.ts +1 -1
  128. package/dist/providers/index.js +1 -1
  129. package/dist/{themes-DQs9rbN5.d.cts → themes-BDVaIfBz.d.cts} +9 -0
  130. package/dist/{themes-CRV5fVzJ.d.ts → themes-mcS8QNkQ.d.ts} +9 -0
  131. package/package.json +6 -2
  132. package/src/charts/conversion-funnel-chart/conversion-funnel-chart.module.scss +2 -1
  133. package/src/charts/conversion-funnel-chart/conversion-funnel-chart.tsx +16 -6
  134. package/src/charts/conversion-funnel-chart/test/conversion-funnel-chart.test.tsx +34 -0
  135. package/src/charts/conversion-funnel-chart/types.ts +2 -0
  136. package/src/charts/pie-chart/pie-chart.tsx +2 -3
  137. package/src/hooks/index.ts +1 -0
  138. package/src/hooks/test/use-chart-margin.test.tsx +44 -0
  139. package/src/hooks/test/use-tooltip-portal-relocator.test.ts +216 -0
  140. package/src/hooks/use-chart-margin.tsx +92 -6
  141. package/src/hooks/use-tooltip-portal-relocator.module.scss +10 -0
  142. package/src/hooks/use-tooltip-portal-relocator.ts +177 -0
  143. package/src/providers/chart-context/global-charts-provider.tsx +18 -1
  144. package/tsup.config.ts +11 -0
  145. package/dist/chunk-2VPPTJS2.js.map +0 -1
  146. package/dist/chunk-5XI443YP.js.map +0 -1
  147. package/dist/chunk-7HROSZRS.cjs.map +0 -1
  148. package/dist/chunk-7UJPVCMB.cjs.map +0 -1
  149. package/dist/chunk-A3AEEGKR.js.map +0 -1
  150. package/dist/chunk-C33AQZEC.js.map +0 -1
  151. package/dist/chunk-CEZGL6YP.js.map +0 -1
  152. package/dist/chunk-COOC2TVQ.js +0 -167
  153. package/dist/chunk-COOC2TVQ.js.map +0 -1
  154. package/dist/chunk-EJHLLXBV.js +0 -362
  155. package/dist/chunk-EJHLLXBV.js.map +0 -1
  156. package/dist/chunk-FWMJ2FR2.js +0 -121
  157. package/dist/chunk-FWMJ2FR2.js.map +0 -1
  158. package/dist/chunk-GRYNIPWH.cjs +0 -385
  159. package/dist/chunk-GRYNIPWH.cjs.map +0 -1
  160. package/dist/chunk-H34CJSR6.js.map +0 -1
  161. package/dist/chunk-HIWNB5PK.cjs.map +0 -1
  162. package/dist/chunk-IZWC33YN.cjs +0 -357
  163. package/dist/chunk-IZWC33YN.cjs.map +0 -1
  164. package/dist/chunk-KOF32DBL.cjs +0 -1058
  165. package/dist/chunk-KOF32DBL.cjs.map +0 -1
  166. package/dist/chunk-LHWRZMF7.cjs +0 -362
  167. package/dist/chunk-LHWRZMF7.cjs.map +0 -1
  168. package/dist/chunk-MFRS2PEY.cjs +0 -121
  169. package/dist/chunk-MFRS2PEY.cjs.map +0 -1
  170. package/dist/chunk-MMDLXS6O.js +0 -75
  171. package/dist/chunk-MMDLXS6O.js.map +0 -1
  172. package/dist/chunk-NW3RUYK2.cjs.map +0 -1
  173. package/dist/chunk-ODF5O5PV.cjs.map +0 -1
  174. package/dist/chunk-OTZT3MC2.cjs.map +0 -1
  175. package/dist/chunk-SBRMWDWM.js +0 -357
  176. package/dist/chunk-SBRMWDWM.js.map +0 -1
  177. package/dist/chunk-SRXJLAKG.cjs.map +0 -1
  178. package/dist/chunk-T4J6TI55.js.map +0 -1
  179. package/dist/chunk-TVV7ZI7C.cjs.map +0 -1
  180. package/dist/chunk-XVMXWV3C.cjs +0 -167
  181. package/dist/chunk-XVMXWV3C.cjs.map +0 -1
  182. package/dist/chunk-YYQ4IK5V.cjs.map +0 -1
  183. package/dist/chunk-ZDNCF642.js +0 -1058
  184. package/dist/chunk-ZDNCF642.js.map +0 -1
  185. package/dist/chunk-ZWBUEHKF.js +0 -385
  186. package/dist/chunk-ZWBUEHKF.js.map +0 -1
@@ -0,0 +1,351 @@
1
+ import {
2
+ radial_wipe_animation_default
3
+ } from "./chunk-KXRWNFQJ.js";
4
+ import {
5
+ ChartHTML,
6
+ ChartSVG,
7
+ useChartChildren
8
+ } from "./chunk-6CCZL2JJ.js";
9
+ import {
10
+ BaseTooltip
11
+ } from "./chunk-BPYKWMI7.js";
12
+ import {
13
+ withResponsive
14
+ } from "./chunk-TYIH5LMV.js";
15
+ import {
16
+ GlobalChartsContext,
17
+ GlobalChartsProvider,
18
+ Legend,
19
+ SingleChartContext,
20
+ useChartId,
21
+ useChartLegendItems,
22
+ useChartRegistration,
23
+ useElementHeight,
24
+ useGlobalChartsContext,
25
+ useInteractiveLegendData,
26
+ usePrefersReducedMotion
27
+ } from "./chunk-32ESS4MV.js";
28
+ import {
29
+ attachSubComponents
30
+ } from "./chunk-TE63Y5PX.js";
31
+
32
+ // src/charts/pie-semi-circle-chart/pie-semi-circle-chart.tsx
33
+ import { Group } from "@visx/group";
34
+ import { Pie } from "@visx/shape";
35
+ import { Text } from "@visx/text";
36
+ import { useTooltip, useTooltipInPortal } from "@visx/tooltip";
37
+ import { __ } from "@wordpress/i18n";
38
+ import clsx from "clsx";
39
+ import { useCallback, useContext, useMemo } from "react";
40
+
41
+ // src/charts/pie-semi-circle-chart/pie-semi-circle-chart.module.scss
42
+ var pie_semi_circle_chart_module_default = {
43
+ "pie-semi-circle-chart": "a8ccharts-8tyaQj",
44
+ "pie-semi-circle-chart--legend-top": "a8ccharts-M1lF7A",
45
+ "label": "a8ccharts-EKZS3j",
46
+ "note": "a8ccharts-v85A8-"
47
+ };
48
+
49
+ // src/charts/pie-semi-circle-chart/pie-semi-circle-chart.tsx
50
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
51
+ var renderDefaultPieSemiCircleTooltip = ({
52
+ tooltipData
53
+ }) => {
54
+ return /* @__PURE__ */ _jsx(BaseTooltip, {
55
+ data: tooltipData,
56
+ top: 0,
57
+ left: 0,
58
+ renderContainer: false
59
+ });
60
+ };
61
+ var PAD_ANGLE = 0.03;
62
+ var validateData = (data) => {
63
+ if (!data.length) {
64
+ return {
65
+ isValid: false,
66
+ message: "No data available"
67
+ };
68
+ }
69
+ const hasNegativeValues = data.some((item) => item.percentage < 0 || item.value < 0);
70
+ if (hasNegativeValues) {
71
+ return {
72
+ isValid: false,
73
+ message: "Invalid data: Negative values are not allowed"
74
+ };
75
+ }
76
+ const totalPercentage = data.reduce((sum, item) => sum + item.percentage, 0);
77
+ if (totalPercentage <= 0) {
78
+ return {
79
+ isValid: false,
80
+ message: "Invalid percentage total: Must be greater than 0"
81
+ };
82
+ }
83
+ return {
84
+ isValid: true,
85
+ message: ""
86
+ };
87
+ };
88
+ var PieSemiCircleChartInternal = ({
89
+ data,
90
+ chartId: providedChartId,
91
+ width = 400,
92
+ thickness = 0.4,
93
+ clockwise = true,
94
+ withTooltips = false,
95
+ showLegend = false,
96
+ legendOrientation = "horizontal",
97
+ legendPosition = "bottom",
98
+ legendAlignment = "center",
99
+ legendMaxWidth,
100
+ legendTextOverflow = "wrap",
101
+ legendItemClassName,
102
+ legendShape = "circle",
103
+ legendValueDisplay = "percentage",
104
+ legendInteractive = false,
105
+ label,
106
+ animation,
107
+ note,
108
+ className,
109
+ children,
110
+ tooltipOffsetX = 0,
111
+ tooltipOffsetY = -15,
112
+ renderTooltip = renderDefaultPieSemiCircleTooltip
113
+ }) => {
114
+ const chartId = useChartId(providedChartId);
115
+ const [legendRef, legendHeight] = useElementHeight();
116
+ const {
117
+ tooltipOpen,
118
+ tooltipLeft,
119
+ tooltipTop,
120
+ tooltipData,
121
+ hideTooltip,
122
+ showTooltip
123
+ } = useTooltip();
124
+ const {
125
+ containerRef,
126
+ TooltipInPortal,
127
+ containerBounds
128
+ } = useTooltipInPortal({
129
+ detectBounds: true,
130
+ scroll: true,
131
+ debounce: 0
132
+ });
133
+ const handleMouseMove = useCallback((event, arc) => {
134
+ if (containerBounds.width === 0 || containerBounds.height === 0) {
135
+ return;
136
+ }
137
+ showTooltip({
138
+ tooltipData: arc.data,
139
+ tooltipLeft: event.clientX - containerBounds.left + tooltipOffsetX,
140
+ tooltipTop: event.clientY - containerBounds.top + tooltipOffsetY
141
+ });
142
+ }, [containerBounds.width, containerBounds.height, containerBounds.left, containerBounds.top, showTooltip, tooltipOffsetX, tooltipOffsetY]);
143
+ const handleMouseLeave = useCallback(() => {
144
+ hideTooltip();
145
+ }, [hideTooltip]);
146
+ const handleArcMouseMove = useCallback((arc) => (event) => {
147
+ handleMouseMove(event, arc);
148
+ }, [handleMouseMove]);
149
+ const {
150
+ isValid,
151
+ message
152
+ } = validateData(data);
153
+ const {
154
+ getElementStyles,
155
+ isSeriesVisible
156
+ } = useGlobalChartsContext();
157
+ const {
158
+ visibleData,
159
+ allSegmentsHidden,
160
+ legendData
161
+ } = useInteractiveLegendData({
162
+ data,
163
+ chartId,
164
+ legendInteractive,
165
+ isSeriesVisible
166
+ });
167
+ const accessors = useMemo(() => ({
168
+ value: (d) => d.value,
169
+ sort: (a, b) => b.value - a.value,
170
+ fill: (d) => getElementStyles({
171
+ data: d,
172
+ index: d.index
173
+ }).color
174
+ }), [getElementStyles]);
175
+ const legendOptions = useMemo(() => ({
176
+ showValues: true,
177
+ legendValueDisplay
178
+ }), [legendValueDisplay]);
179
+ const legendItems = useChartLegendItems(legendData, legendOptions);
180
+ const {
181
+ svgChildren,
182
+ htmlChildren,
183
+ otherChildren
184
+ } = useChartChildren(children, "PieSemiCircleChart");
185
+ const chartMetadata = useMemo(() => ({
186
+ thickness,
187
+ clockwise
188
+ }), [thickness, clockwise]);
189
+ useChartRegistration({
190
+ chartId,
191
+ legendItems,
192
+ chartType: "pie-semi-circle",
193
+ isDataValid: isValid,
194
+ metadata: chartMetadata
195
+ });
196
+ const prefersReducedMotion = usePrefersReducedMotion();
197
+ if (!isValid) {
198
+ return /* @__PURE__ */ _jsx("div", {
199
+ className: pie_semi_circle_chart_module_default["pie-semi-circle-chart"],
200
+ children: /* @__PURE__ */ _jsx("svg", {
201
+ width,
202
+ height: width / 2,
203
+ children: /* @__PURE__ */ _jsx("text", {
204
+ x: "50%",
205
+ y: "50%",
206
+ textAnchor: "middle",
207
+ className: pie_semi_circle_chart_module_default.error,
208
+ children: message
209
+ })
210
+ })
211
+ });
212
+ }
213
+ const height = width / 2;
214
+ const chartHeight = height - (showLegend && legendPosition === "top" ? legendHeight : 0);
215
+ const radius = Math.min(width / 2, chartHeight);
216
+ const innerRadius = radius * (1 - thickness);
217
+ const dataWithIndex = visibleData.map((d) => {
218
+ const originalIndex = data.findIndex((item) => item.label === d.label);
219
+ return {
220
+ ...d,
221
+ index: originalIndex >= 0 ? originalIndex : 0
222
+ };
223
+ });
224
+ const startAngle = clockwise ? -Math.PI / 2 : Math.PI / 2;
225
+ const endAngle = clockwise ? Math.PI / 2 : -Math.PI / 2;
226
+ return /* @__PURE__ */ _jsx(SingleChartContext.Provider, {
227
+ value: {
228
+ chartId,
229
+ chartWidth: width,
230
+ chartHeight: radius
231
+ },
232
+ children: /* @__PURE__ */ _jsxs("div", {
233
+ ref: containerRef,
234
+ className: clsx("pie-semi-circle-chart", pie_semi_circle_chart_module_default["pie-semi-circle-chart"], {
235
+ [pie_semi_circle_chart_module_default["pie-semi-circle-chart--legend-top"]]: showLegend && legendPosition === "top"
236
+ }, className),
237
+ children: [/* @__PURE__ */ _jsxs("svg", {
238
+ width,
239
+ height: radius,
240
+ viewBox: `0 0 ${width} ${chartHeight}`,
241
+ children: [/* @__PURE__ */ _jsx("defs", {
242
+ children: /* @__PURE__ */ _jsx(radial_wipe_animation_default, {
243
+ id: `radial-wipe-${chartId}`,
244
+ radius,
245
+ innerRadius,
246
+ startAngle: "-180deg",
247
+ wipePercentage: 50
248
+ })
249
+ }), /* @__PURE__ */ _jsx(Group, {
250
+ top: chartHeight,
251
+ left: width / 2,
252
+ mask: animation && !prefersReducedMotion ? `url(#radial-wipe-${chartId})` : null,
253
+ children: allSegmentsHidden ? /* @__PURE__ */ _jsx("text", {
254
+ textAnchor: "middle",
255
+ y: -radius / 2,
256
+ fill: "#ccc",
257
+ fontSize: "14",
258
+ fontFamily: "-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif",
259
+ children: __("All segments are hidden. Click legend items to show data.", "jetpack-charts")
260
+ }) : /* @__PURE__ */ _jsxs(_Fragment, {
261
+ children: [/* @__PURE__ */ _jsx(Pie, {
262
+ data: dataWithIndex,
263
+ pieValue: accessors.value,
264
+ outerRadius: radius,
265
+ innerRadius,
266
+ cornerRadius: 3,
267
+ padAngle: PAD_ANGLE,
268
+ startAngle,
269
+ endAngle,
270
+ pieSort: accessors.sort,
271
+ children: (pie) => {
272
+ return pie.arcs.map((arc) => /* @__PURE__ */ _jsx("g", {
273
+ onMouseMove: withTooltips ? handleArcMouseMove(arc) : void 0,
274
+ onMouseLeave: withTooltips ? handleMouseLeave : void 0,
275
+ children: /* @__PURE__ */ _jsx("path", {
276
+ d: pie.path(arc) || "",
277
+ fill: accessors.fill(arc.data)
278
+ })
279
+ }, arc.data.label));
280
+ }
281
+ }), /* @__PURE__ */ _jsxs(Group, {
282
+ children: [/* @__PURE__ */ _jsx(Text, {
283
+ textAnchor: "middle",
284
+ verticalAnchor: "start",
285
+ y: -40,
286
+ className: pie_semi_circle_chart_module_default.label,
287
+ children: label
288
+ }), /* @__PURE__ */ _jsx(Text, {
289
+ textAnchor: "middle",
290
+ verticalAnchor: "start",
291
+ y: -20,
292
+ className: pie_semi_circle_chart_module_default.note,
293
+ children: note
294
+ })]
295
+ }), !allSegmentsHidden && svgChildren]
296
+ })
297
+ })]
298
+ }), withTooltips && tooltipOpen && tooltipData && /* @__PURE__ */ _jsx(TooltipInPortal, {
299
+ top: tooltipTop || 0,
300
+ left: tooltipLeft || 0,
301
+ children: /* @__PURE__ */ _jsx("div", {
302
+ role: "tooltip",
303
+ children: renderTooltip({
304
+ tooltipData
305
+ })
306
+ })
307
+ }), showLegend && /* @__PURE__ */ _jsx(Legend, {
308
+ orientation: legendOrientation,
309
+ position: legendPosition,
310
+ alignment: legendAlignment,
311
+ maxWidth: legendMaxWidth,
312
+ textOverflow: legendTextOverflow,
313
+ legendItemClassName,
314
+ shape: legendShape,
315
+ ref: legendRef,
316
+ chartId,
317
+ interactive: legendInteractive
318
+ }), htmlChildren, otherChildren]
319
+ })
320
+ });
321
+ };
322
+ var PieSemiCircleChartWithProvider = (props) => {
323
+ const existingContext = useContext(GlobalChartsContext);
324
+ if (existingContext) {
325
+ return /* @__PURE__ */ _jsx(PieSemiCircleChartInternal, {
326
+ ...props
327
+ });
328
+ }
329
+ return /* @__PURE__ */ _jsx(GlobalChartsProvider, {
330
+ children: /* @__PURE__ */ _jsx(PieSemiCircleChartInternal, {
331
+ ...props
332
+ })
333
+ });
334
+ };
335
+ PieSemiCircleChartWithProvider.displayName = "PieSemiCircleChart";
336
+ var PieSemiCircleChart = attachSubComponents(PieSemiCircleChartWithProvider, {
337
+ Legend,
338
+ SVG: ChartSVG,
339
+ HTML: ChartHTML
340
+ });
341
+ var PieSemiCircleChartResponsive = attachSubComponents(withResponsive(PieSemiCircleChartWithProvider), {
342
+ Legend,
343
+ SVG: ChartSVG,
344
+ HTML: ChartHTML
345
+ });
346
+
347
+ export {
348
+ PieSemiCircleChart,
349
+ PieSemiCircleChartResponsive
350
+ };
351
+ //# sourceMappingURL=chunk-7TQSPLIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/pie-semi-circle-chart/pie-semi-circle-chart.tsx","../src/charts/pie-semi-circle-chart/pie-semi-circle-chart.module.scss"],"sourcesContent":["import { Group } from '@visx/group';\nimport { Pie } from '@visx/shape';\nimport { Text } from '@visx/text';\nimport { useTooltip, useTooltipInPortal } from '@visx/tooltip';\nimport { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport { useCallback, useContext, useMemo } from 'react';\nimport { Legend, useChartLegendItems } from '../../components/legend';\nimport { BaseTooltip } from '../../components/tooltip';\nimport { useElementHeight, useInteractiveLegendData, usePrefersReducedMotion } from '../../hooks';\nimport { GlobalChartsProvider, useChartId, useChartRegistration, useGlobalChartsContext, GlobalChartsContext } from '../../providers';\nimport { attachSubComponents } from '../../utils';\nimport { ChartSVG, ChartHTML, useChartChildren } from '../private/chart-composition';\nimport { RadialWipeAnimation } from '../private/radial-wipe-animation';\nimport { SingleChartContext } from '../private/single-chart-context';\nimport { withResponsive } from '../private/with-responsive';\nimport styles from './pie-semi-circle-chart.module.scss';\n\n/**\n * Parameters passed to the renderTooltip function for semi-circle charts.\n */\nimport { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\n/**\n * Default tooltip renderer for semi-circle pie charts.\n * Renders a BaseTooltip with the hovered segment's data.\n *\n * @param {PieSemiCircleChartRenderTooltipParams} params - The tooltip parameters containing the hovered data point\n * @return {ReactNode} The rendered tooltip content\n */\nconst renderDefaultPieSemiCircleTooltip = ({\n tooltipData\n}) => {\n return /*#__PURE__*/_jsx(BaseTooltip, {\n data: tooltipData,\n top: 0,\n left: 0,\n renderContainer: false\n });\n};\nconst PAD_ANGLE = 0.03; // Padding between segments\n\n// Base props type with optional responsive properties\n\n// Composition API types\n\n/**\n * Validates the semi-circle pie chart data\n * @param data - The data to validate\n * @return Object containing validation result and error message\n */\nconst validateData = data => {\n if (!data.length) {\n return {\n isValid: false,\n message: 'No data available'\n };\n }\n\n // Check for negative values\n const hasNegativeValues = data.some(item => item.percentage < 0 || item.value < 0);\n if (hasNegativeValues) {\n return {\n isValid: false,\n message: 'Invalid data: Negative values are not allowed'\n };\n }\n\n // Validate total percentage is greater than 0\n const totalPercentage = data.reduce((sum, item) => sum + item.percentage, 0);\n if (totalPercentage <= 0) {\n return {\n isValid: false,\n message: 'Invalid percentage total: Must be greater than 0'\n };\n }\n return {\n isValid: true,\n message: ''\n };\n};\nconst PieSemiCircleChartInternal = ({\n data,\n chartId: providedChartId,\n width = 400,\n thickness = 0.4,\n clockwise = true,\n withTooltips = false,\n showLegend = false,\n legendOrientation = 'horizontal',\n legendPosition = 'bottom',\n legendAlignment = 'center',\n legendMaxWidth,\n legendTextOverflow = 'wrap',\n legendItemClassName,\n legendShape = 'circle',\n legendValueDisplay = 'percentage',\n legendInteractive = false,\n label,\n animation,\n note,\n className,\n children,\n tooltipOffsetX = 0,\n tooltipOffsetY = -15,\n renderTooltip = renderDefaultPieSemiCircleTooltip\n}) => {\n const chartId = useChartId(providedChartId);\n const [legendRef, legendHeight] = useElementHeight();\n const {\n tooltipOpen,\n tooltipLeft,\n tooltipTop,\n tooltipData,\n hideTooltip,\n showTooltip\n } = useTooltip();\n\n // Set up portal tooltip for better z-index handling\n // We get containerBounds to cancel out stale offsets in the position calculation\n const {\n containerRef,\n TooltipInPortal,\n containerBounds\n } = useTooltipInPortal({\n detectBounds: true,\n scroll: true,\n debounce: 0\n });\n const handleMouseMove = useCallback((event, arc) => {\n // Don't show tooltip until container bounds are measured\n if (containerBounds.width === 0 || containerBounds.height === 0) {\n return;\n }\n\n // Use clientX/Y and subtract containerBounds to cancel out any stale offset.\n // TooltipInPortal calculates: tooltipLeft + containerBounds.left + scrollX\n // By passing (clientX - containerBounds.left), we get:\n // (clientX - containerBounds.left) + containerBounds.left + scrollX = clientX + scrollX\n // This gives correct page coordinates regardless of stale bounds.\n showTooltip({\n tooltipData: arc.data,\n tooltipLeft: event.clientX - containerBounds.left + tooltipOffsetX,\n tooltipTop: event.clientY - containerBounds.top + tooltipOffsetY\n });\n }, [containerBounds.width, containerBounds.height, containerBounds.left, containerBounds.top, showTooltip, tooltipOffsetX, tooltipOffsetY]);\n const handleMouseLeave = useCallback(() => {\n hideTooltip();\n }, [hideTooltip]);\n const handleArcMouseMove = useCallback(arc => event => {\n handleMouseMove(event, arc);\n }, [handleMouseMove]);\n\n // Validate data first to get validation result\n const {\n isValid,\n message\n } = validateData(data);\n const {\n getElementStyles,\n isSeriesVisible\n } = useGlobalChartsContext();\n\n // Filter and recalculate data for interactive legends\n const {\n visibleData,\n allSegmentsHidden,\n legendData\n } = useInteractiveLegendData({\n data,\n chartId,\n legendInteractive,\n isSeriesVisible\n });\n\n // Define accessors with useMemo to avoid changing dependencies\n const accessors = useMemo(() => ({\n value: d => d.value,\n sort: (a, b) => b.value - a.value,\n fill: d => getElementStyles({\n data: d,\n index: d.index\n }).color\n }), [getElementStyles]);\n\n // Memoize legend options to prevent unnecessary re-calculations\n const legendOptions = useMemo(() => ({\n showValues: true,\n legendValueDisplay\n }), [legendValueDisplay]);\n\n // Create legend items using legendData (has recalculated percentages for visible items)\n const legendItems = useChartLegendItems(legendData, legendOptions);\n\n // Process children to extract compound components\n const {\n svgChildren,\n htmlChildren,\n otherChildren\n } = useChartChildren(children, 'PieSemiCircleChart');\n\n // Memoize metadata to prevent unnecessary re-registration\n const chartMetadata = useMemo(() => ({\n thickness,\n clockwise\n }), [thickness, clockwise]);\n\n // Register chart with context only if data is valid\n useChartRegistration({\n chartId,\n legendItems,\n chartType: 'pie-semi-circle',\n isDataValid: isValid,\n metadata: chartMetadata\n });\n const prefersReducedMotion = usePrefersReducedMotion();\n if (!isValid) {\n return /*#__PURE__*/_jsx(\"div\", {\n className: styles['pie-semi-circle-chart'],\n children: /*#__PURE__*/_jsx(\"svg\", {\n width: width,\n height: width / 2,\n children: /*#__PURE__*/_jsx(\"text\", {\n x: \"50%\",\n y: \"50%\",\n textAnchor: \"middle\",\n className: styles.error,\n children: message\n })\n })\n });\n }\n\n // Calculate chart dimensions\n // TODO: we might want to accept height as a prop in the future, because the height of container might not always be enough.\n const height = width / 2;\n // The chart only takes the height minus the legend height.\n const chartHeight = height - (showLegend && legendPosition === 'top' ? legendHeight : 0);\n const radius = Math.min(width / 2, chartHeight);\n const innerRadius = radius * (1 - thickness);\n\n // Map data with index for color assignment\n // When interactive, we need to find the original index to maintain consistent colors\n const dataWithIndex = visibleData.map(d => {\n const originalIndex = data.findIndex(item => item.label === d.label);\n return {\n ...d,\n index: originalIndex >= 0 ? originalIndex : 0\n };\n });\n\n // Configure pie angles based on clockwise direction\n const startAngle = clockwise ? -Math.PI / 2 : Math.PI / 2;\n const endAngle = clockwise ? Math.PI / 2 : -Math.PI / 2;\n return /*#__PURE__*/_jsx(SingleChartContext.Provider, {\n value: {\n chartId,\n chartWidth: width,\n chartHeight: radius\n },\n children: /*#__PURE__*/_jsxs(\"div\", {\n ref: containerRef,\n className: clsx('pie-semi-circle-chart', styles['pie-semi-circle-chart'], {\n [styles['pie-semi-circle-chart--legend-top']]: showLegend && legendPosition === 'top'\n }, className),\n children: [/*#__PURE__*/_jsxs(\"svg\", {\n width: width,\n height: radius,\n viewBox: `0 0 ${width} ${chartHeight}`,\n children: [/*#__PURE__*/_jsx(\"defs\", {\n children: /*#__PURE__*/_jsx(RadialWipeAnimation, {\n id: `radial-wipe-${chartId}`,\n radius: radius,\n innerRadius: innerRadius,\n startAngle: \"-180deg\",\n wipePercentage: 50\n })\n }), /*#__PURE__*/_jsx(Group, {\n top: chartHeight,\n left: width / 2,\n mask: animation && !prefersReducedMotion ? `url(#radial-wipe-${chartId})` : null,\n children: allSegmentsHidden ? /*#__PURE__*/_jsx(\"text\", {\n textAnchor: \"middle\",\n y: -radius / 2,\n fill: \"#ccc\",\n fontSize: \"14\",\n fontFamily: \"-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif\",\n children: __('All segments are hidden. Click legend items to show data.', 'jetpack-charts')\n }) : /*#__PURE__*/_jsxs(_Fragment, {\n children: [/*#__PURE__*/_jsx(Pie, {\n data: dataWithIndex,\n pieValue: accessors.value,\n outerRadius: radius,\n innerRadius: innerRadius,\n cornerRadius: 3,\n padAngle: PAD_ANGLE,\n startAngle: startAngle,\n endAngle: endAngle,\n pieSort: accessors.sort,\n children: pie => {\n return pie.arcs.map(arc => /*#__PURE__*/_jsx(\"g\", {\n onMouseMove: withTooltips ? handleArcMouseMove(arc) : undefined,\n onMouseLeave: withTooltips ? handleMouseLeave : undefined,\n children: /*#__PURE__*/_jsx(\"path\", {\n d: pie.path(arc) || '',\n fill: accessors.fill(arc.data)\n })\n }, arc.data.label));\n }\n }), /*#__PURE__*/_jsxs(Group, {\n children: [/*#__PURE__*/_jsx(Text, {\n textAnchor: \"middle\",\n verticalAnchor: \"start\",\n y: -40 // Position above the chart with space for note\n ,\n className: styles.label,\n children: label\n }), /*#__PURE__*/_jsx(Text, {\n textAnchor: \"middle\",\n verticalAnchor: \"start\",\n y: -20 // Position between label and chart\n ,\n className: styles.note,\n children: note\n })]\n }), !allSegmentsHidden && svgChildren]\n })\n })]\n }), withTooltips && tooltipOpen && tooltipData && /*#__PURE__*/_jsx(TooltipInPortal, {\n top: tooltipTop || 0,\n left: tooltipLeft || 0,\n children: /*#__PURE__*/_jsx(\"div\", {\n role: \"tooltip\",\n children: renderTooltip({\n tooltipData\n })\n })\n }), showLegend && /*#__PURE__*/_jsx(Legend, {\n orientation: legendOrientation,\n position: legendPosition,\n alignment: legendAlignment,\n maxWidth: legendMaxWidth,\n textOverflow: legendTextOverflow,\n legendItemClassName: legendItemClassName,\n shape: legendShape,\n ref: legendRef,\n chartId: chartId,\n interactive: legendInteractive\n }), htmlChildren, otherChildren]\n })\n });\n};\nconst PieSemiCircleChartWithProvider = props => {\n const existingContext = useContext(GlobalChartsContext);\n\n // If we're already in a GlobalChartsProvider context, don't create a new one\n if (existingContext) {\n return /*#__PURE__*/_jsx(PieSemiCircleChartInternal, {\n ...props\n });\n }\n\n // Otherwise, create our own GlobalChartsProvider\n return /*#__PURE__*/_jsx(GlobalChartsProvider, {\n children: /*#__PURE__*/_jsx(PieSemiCircleChartInternal, {\n ...props\n })\n });\n};\nPieSemiCircleChartWithProvider.displayName = 'PieSemiCircleChart';\n\n// Create PieSemiCircleChart with composition API\nconst PieSemiCircleChart = attachSubComponents(PieSemiCircleChartWithProvider, {\n Legend: Legend,\n SVG: ChartSVG,\n HTML: ChartHTML\n});\n\n// Create responsive PieSemiCircleChart with composition API\nconst PieSemiCircleChartResponsive = attachSubComponents(withResponsive(PieSemiCircleChartWithProvider), {\n Legend: Legend,\n SVG: ChartSVG,\n HTML: ChartHTML\n});\nexport { PieSemiCircleChartResponsive as default, PieSemiCircleChart as PieSemiCircleChartUnresponsive };","import 'css-chunk:src/charts/pie-semi-circle-chart/pie-semi-circle-chart.module.scss';export default {\n \"pie-semi-circle-chart\": \"a8ccharts-8tyaQj\",\n \"pie-semi-circle-chart--legend-top\": \"a8ccharts-M1lF7A\",\n \"label\": \"a8ccharts-EKZS3j\",\n \"note\": \"a8ccharts-v85A8-\"\n};"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  BarChart
3
- } from "./chunk-2VPPTJS2.js";
3
+ } from "./chunk-KXSLMOW5.js";
4
4
  import {
5
5
  withResponsive
6
- } from "./chunk-C33AQZEC.js";
6
+ } from "./chunk-TYIH5LMV.js";
7
7
  import {
8
8
  GlobalChartsContext,
9
9
  GlobalChartsProvider
10
- } from "./chunk-H34CJSR6.js";
10
+ } from "./chunk-32ESS4MV.js";
11
11
 
12
12
  // src/charts/bar-list-chart/bar-list-chart.tsx
13
13
  import { formatNumberCompact } from "@automattic/number-formatters";
@@ -15,16 +15,41 @@ import { Group } from "@visx/group";
15
15
  import { createScale, scaleBand } from "@visx/scale";
16
16
  import { Text } from "@visx/text";
17
17
  import { useContext, useMemo } from "react";
18
- import { jsx, jsxs } from "react/jsx-runtime";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
19
  var getScaleBandwidth = (scale) => {
20
20
  const s = scale;
21
21
  return s && "bandwidth" in s ? s?.bandwidth() ?? 0 : 0;
22
22
  };
23
- var DefaultLabelComponent = ({ textProps, x, y, label, formatter }) => {
24
- return /* @__PURE__ */ jsx(Text, { ...textProps, textAnchor: "start", x, y, children: formatter(label) });
23
+ var DefaultLabelComponent = ({
24
+ textProps,
25
+ x,
26
+ y,
27
+ label,
28
+ formatter
29
+ }) => {
30
+ return /* @__PURE__ */ _jsx(Text, {
31
+ ...textProps,
32
+ textAnchor: "start",
33
+ x,
34
+ y,
35
+ children: formatter(label)
36
+ });
25
37
  };
26
- var DefaultValueComponent = ({ textProps, x, y, value, formatter }) => {
27
- return /* @__PURE__ */ jsx(Text, { ...textProps, textAnchor: "end", x, y, fontWeight: 500, children: formatter(value) });
38
+ var DefaultValueComponent = ({
39
+ textProps,
40
+ x,
41
+ y,
42
+ value,
43
+ formatter
44
+ }) => {
45
+ return /* @__PURE__ */ _jsx(Text, {
46
+ ...textProps,
47
+ textAnchor: "end",
48
+ x,
49
+ y,
50
+ fontWeight: 500,
51
+ children: formatter(value)
52
+ });
28
53
  };
29
54
  var AxisRenderer = ({
30
55
  ticks,
@@ -41,49 +66,47 @@ var AxisRenderer = ({
41
66
  if (ticks.length === 0) {
42
67
  return null;
43
68
  }
44
- const allTickLabelProps = ticks.map(
45
- ({ value, index }) => typeof tickLabelProps === "function" ? tickLabelProps(value, index, ticks) : {}
46
- );
47
- return ticks.map(({ from, formattedValue }, index) => {
69
+ const allTickLabelProps = ticks.map(({
70
+ value,
71
+ index
72
+ }) => typeof tickLabelProps === "function" ? tickLabelProps(value, index, ticks) : {});
73
+ return ticks.map(({
74
+ from,
75
+ formattedValue
76
+ }, index) => {
48
77
  const textProps = allTickLabelProps[index] ?? {};
49
78
  delete textProps.textAnchor;
50
79
  delete textProps.dx;
51
- const sum = data.reduce(
52
- (acc, { data: seriesData }) => acc + (seriesData[index]?.value ?? 0),
53
- 0
54
- );
80
+ const sum = data.reduce((acc, {
81
+ data: seriesData
82
+ }) => acc + (seriesData[index]?.value ?? 0), 0);
55
83
  const y = from.y + yOffset;
56
- return /* @__PURE__ */ jsxs(Group, { children: [
57
- /* @__PURE__ */ jsx(
58
- LabelComponent,
59
- {
60
- textProps,
61
- x: labelPosition,
62
- y,
63
- label: formattedValue,
64
- formatter: labelFormatter
65
- }
66
- ),
67
- /* @__PURE__ */ jsx(
68
- ValueComponent,
69
- {
70
- textProps,
71
- x: valuePosition,
72
- y,
73
- value: sum,
74
- formatter: valueFormatter,
75
- data,
76
- index
77
- }
78
- )
79
- ] }, index);
84
+ return /* @__PURE__ */ _jsxs(Group, {
85
+ children: [/* @__PURE__ */ _jsx(LabelComponent, {
86
+ textProps,
87
+ x: labelPosition,
88
+ y,
89
+ label: formattedValue,
90
+ formatter: labelFormatter
91
+ }), /* @__PURE__ */ _jsx(ValueComponent, {
92
+ textProps,
93
+ x: valuePosition,
94
+ y,
95
+ value: sum,
96
+ formatter: valueFormatter,
97
+ data,
98
+ index
99
+ })]
100
+ }, index);
80
101
  });
81
102
  };
82
103
  var getDefaultYOffset = (data, yScaleConfig, height, isMultiSeries) => {
83
104
  if (!isMultiSeries) {
84
105
  return 0;
85
106
  }
86
- const dataKeys = data.map(({ label }) => label);
107
+ const dataKeys = data.map(({
108
+ label
109
+ }) => label);
87
110
  const yScale = createScale({
88
111
  type: "band",
89
112
  range: [0, height],
@@ -141,50 +164,50 @@ var BarListChartInternal = ({
141
164
  yOffset: options.yOffset ?? getDefaultYOffset(data, yScale, height, isMultiSeries)
142
165
  };
143
166
  }, [options, width, data, height]);
144
- return /* @__PURE__ */ jsx(
145
- BarChart,
146
- {
147
- orientation: "horizontal",
148
- gridVisibility: "none",
149
- data,
150
- width,
151
- height,
152
- margin,
153
- options: {
154
- axis: {
155
- y: {
156
- children: (renderProps) => /* @__PURE__ */ jsx(
157
- AxisRenderer,
158
- {
159
- ...renderProps,
160
- data,
161
- yOffset: chartOptions.yOffset,
162
- labelPosition: chartOptions.labelPosition,
163
- valuePosition: chartOptions.valuePosition,
164
- labelFormatter: chartOptions.labelFormatter,
165
- valueFormatter: chartOptions.valueFormatter,
166
- LabelComponent: options.labelComponent,
167
- ValueComponent: options.valueComponent
168
- }
169
- )
170
- },
171
- x: {
172
- children: () => null
173
- }
167
+ return /* @__PURE__ */ _jsx(BarChart, {
168
+ orientation: "horizontal",
169
+ gridVisibility: "none",
170
+ data,
171
+ width,
172
+ height,
173
+ margin,
174
+ options: {
175
+ axis: {
176
+ y: {
177
+ children: (renderProps) => /* @__PURE__ */ _jsx(AxisRenderer, {
178
+ ...renderProps,
179
+ data,
180
+ yOffset: chartOptions.yOffset,
181
+ labelPosition: chartOptions.labelPosition,
182
+ valuePosition: chartOptions.valuePosition,
183
+ labelFormatter: chartOptions.labelFormatter,
184
+ valueFormatter: chartOptions.valueFormatter,
185
+ LabelComponent: options.labelComponent,
186
+ ValueComponent: options.valueComponent
187
+ })
174
188
  },
175
- xScale: chartOptions.xScale,
176
- yScale: chartOptions.yScale
189
+ x: {
190
+ children: () => null
191
+ }
177
192
  },
178
- ...rest
179
- }
180
- );
193
+ xScale: chartOptions.xScale,
194
+ yScale: chartOptions.yScale
195
+ },
196
+ ...rest
197
+ });
181
198
  };
182
199
  var BarListChart = (props) => {
183
200
  const existingContext = useContext(GlobalChartsContext);
184
201
  if (existingContext) {
185
- return /* @__PURE__ */ jsx(BarListChartInternal, { ...props });
202
+ return /* @__PURE__ */ _jsx(BarListChartInternal, {
203
+ ...props
204
+ });
186
205
  }
187
- return /* @__PURE__ */ jsx(GlobalChartsProvider, { children: /* @__PURE__ */ jsx(BarListChartInternal, { ...props }) });
206
+ return /* @__PURE__ */ _jsx(GlobalChartsProvider, {
207
+ children: /* @__PURE__ */ _jsx(BarListChartInternal, {
208
+ ...props
209
+ })
210
+ });
188
211
  };
189
212
  BarListChart.displayName = "BarListChart";
190
213
  var BarListChartResponsive = withResponsive(BarListChart);
@@ -193,4 +216,4 @@ export {
193
216
  BarListChart,
194
217
  BarListChartResponsive
195
218
  };
196
- //# sourceMappingURL=chunk-T4J6TI55.js.map
219
+ //# sourceMappingURL=chunk-AFWQR3SM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/bar-list-chart/bar-list-chart.tsx"],"sourcesContent":["import { formatNumberCompact } from '@automattic/number-formatters';\nimport { Group } from '@visx/group';\nimport { createScale, scaleBand } from '@visx/scale';\nimport { Text } from '@visx/text';\nimport { useContext, useMemo } from 'react';\nimport { GlobalChartsContext, GlobalChartsProvider } from '../../providers';\nimport { BarChartUnresponsive } from '../bar-chart';\nimport { withResponsive } from '../private/with-responsive';\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * Get the bandwidth of a scale\n * @param scale - The scale to get the bandwidth of\n * @return The bandwidth of the scale\n */\nconst getScaleBandwidth = scale => {\n // Broaden type before using 'xxx' in s as typeguard.\n const s = scale;\n return s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0;\n};\nconst DefaultLabelComponent = ({\n textProps,\n x,\n y,\n label,\n formatter\n}) => {\n return /*#__PURE__*/_jsx(Text, {\n ...textProps,\n textAnchor: \"start\",\n x: x,\n y: y,\n children: formatter(label)\n });\n};\nconst DefaultValueComponent = ({\n textProps,\n x,\n y,\n value,\n formatter\n}) => {\n return /*#__PURE__*/_jsx(Text, {\n ...textProps,\n textAnchor: \"end\",\n x: x,\n y: y,\n fontWeight: 500,\n children: formatter(value)\n });\n};\nconst AxisRenderer = ({\n ticks,\n tickLabelProps,\n yOffset,\n labelPosition,\n valuePosition,\n data,\n labelFormatter,\n valueFormatter,\n LabelComponent = DefaultLabelComponent,\n ValueComponent = DefaultValueComponent\n}) => {\n if (ticks.length === 0) {\n return null;\n }\n\n // compute the max tick label size to compute label offset\n const allTickLabelProps = ticks.map(({\n value,\n index\n }) => typeof tickLabelProps === 'function' ? tickLabelProps(value, index, ticks) : {});\n return ticks.map(({\n from,\n formattedValue\n }, index) => {\n const textProps = allTickLabelProps[index] ?? {};\n // No need to pass textAnchor and dx. It will be handled by the component.\n delete textProps.textAnchor;\n delete textProps.dx;\n const sum = data.reduce((acc, {\n data: seriesData\n }) => acc + (seriesData[index]?.value ?? 0), 0);\n const y = from.y + yOffset;\n return /*#__PURE__*/_jsxs(Group, {\n children: [/*#__PURE__*/_jsx(LabelComponent, {\n textProps: textProps,\n x: labelPosition,\n y: y,\n label: formattedValue,\n formatter: labelFormatter\n }), /*#__PURE__*/_jsx(ValueComponent, {\n textProps: textProps,\n x: valuePosition,\n y: y,\n value: sum,\n formatter: valueFormatter,\n data: data,\n index: index\n })]\n }, index);\n });\n};\n\n/**\n * Calculate the default y offset for the bar list chart.\n * @param data - The data to calculate the default y offset for.\n * @param yScaleConfig - The y scale configuration.\n * @param height - The height of the chart.\n * @param isMultiSeries - Whether the chart is a multi series chart.\n * @return The default y offset.\n */\nconst getDefaultYOffset = (data, yScaleConfig, height, isMultiSeries) => {\n if (!isMultiSeries) {\n return 0;\n }\n const dataKeys = data.map(({\n label\n }) => label);\n const yScale = createScale({\n type: 'band',\n range: [0, height],\n domain: dataKeys,\n ...yScaleConfig\n });\n const groupScale = scaleBand({\n domain: dataKeys,\n range: [0, getScaleBandwidth(yScale)],\n padding: yScaleConfig.paddingInner\n });\n const GAP_BETWEEN_BARS = 6;\n const barThickness = getScaleBandwidth(groupScale);\n\n // Use negative value to move the label up.\n return -(barThickness + GAP_BETWEEN_BARS);\n};\nconst BarListChartInternal = ({\n data,\n width,\n height,\n options = {},\n margin = {\n left: 0,\n right: 20,\n bottom: 0,\n top: 0\n },\n ...rest\n}) => {\n const chartOptions = useMemo(() => {\n const isMultiSeries = data.length > 1;\n const defaultYScale = {\n // For multi series, set default padding larger to look better.\n paddingInner: isMultiSeries ? 0.3 : 0.1,\n padding: isMultiSeries ? 0.3 : 0.1\n };\n const defaultXScale = {\n // Always begin at zero since the x axis is hidden.\n zero: true\n };\n const yScale = {\n ...defaultYScale,\n ...(options.yScale ?? {})\n };\n const xScale = {\n ...defaultXScale,\n ...(options.xScale ?? {})\n };\n return {\n yScale,\n xScale,\n labelPosition: options.labelPosition ?? (isMultiSeries ? 0 : 10),\n valueFormatter: options.valueFormatter ?? (value => formatNumberCompact(value)),\n labelFormatter: options.labelFormatter ?? (value => String(value)),\n valuePosition: options.valuePosition ?? width,\n yOffset: options.yOffset ?? getDefaultYOffset(data, yScale, height, isMultiSeries)\n };\n }, [options, width, data, height]);\n return /*#__PURE__*/_jsx(BarChartUnresponsive, {\n orientation: \"horizontal\",\n gridVisibility: 'none',\n data: data,\n width: width,\n height: height,\n margin: margin,\n options: {\n axis: {\n y: {\n children: renderProps => /*#__PURE__*/_jsx(AxisRenderer, {\n ...renderProps,\n data: data,\n yOffset: chartOptions.yOffset,\n labelPosition: chartOptions.labelPosition,\n valuePosition: chartOptions.valuePosition,\n labelFormatter: chartOptions.labelFormatter,\n valueFormatter: chartOptions.valueFormatter,\n LabelComponent: options.labelComponent,\n ValueComponent: options.valueComponent\n })\n },\n x: {\n children: () => null\n }\n },\n xScale: chartOptions.xScale,\n yScale: chartOptions.yScale\n },\n ...rest\n });\n};\nconst BarListChart = props => {\n const existingContext = useContext(GlobalChartsContext);\n\n // If we're already in a GlobalChartsProvider context, render the core component directly\n if (existingContext) {\n return /*#__PURE__*/_jsx(BarListChartInternal, {\n ...props\n });\n }\n\n // Otherwise, wrap with our own GlobalChartsProvider\n return /*#__PURE__*/_jsx(GlobalChartsProvider, {\n children: /*#__PURE__*/_jsx(BarListChartInternal, {\n ...props\n })\n });\n};\nBarListChart.displayName = 'BarListChart';\nconst BarListChartResponsive = withResponsive(BarListChart);\nexport { BarListChartResponsive as default, BarListChart as BarListChartUnresponsive };"],"mappings":"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","names":[]}