@automattic/charts 0.57.0 → 0.59.0

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 (267) hide show
  1. package/CHANGELOG.md +36 -2
  2. package/README.md +7 -54
  3. package/dist/index.cjs +9607 -21
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.css +32 -49
  6. package/dist/index.css.map +1 -1
  7. package/dist/index.d.cts +1612 -33
  8. package/dist/index.d.ts +1612 -33
  9. package/dist/index.js +9640 -54
  10. package/dist/index.js.map +1 -1
  11. package/package.json +9 -126
  12. package/src/charts/bar-chart/bar-chart.module.scss +0 -5
  13. package/src/charts/bar-chart/bar-chart.tsx +142 -149
  14. package/src/charts/bar-chart/test/bar-chart.test.tsx +48 -31
  15. package/src/charts/leaderboard-chart/leaderboard-chart.tsx +54 -74
  16. package/src/charts/leaderboard-chart/test/leaderboard-chart.test.tsx +4 -5
  17. package/src/charts/leaderboard-chart/types.ts +1 -11
  18. package/src/charts/line-chart/line-chart.module.scss +0 -5
  19. package/src/charts/line-chart/line-chart.tsx +202 -193
  20. package/src/charts/line-chart/private/line-chart-annotations-overlay.tsx +1 -2
  21. package/src/charts/line-chart/test/line-chart.test.tsx +49 -27
  22. package/src/charts/line-chart/types.ts +0 -1
  23. package/src/charts/pie-chart/pie-chart.module.scss +2 -10
  24. package/src/charts/pie-chart/pie-chart.tsx +212 -212
  25. package/src/charts/pie-chart/test/composition-api.test.tsx +44 -3
  26. package/src/charts/pie-chart/test/pie-chart.test.tsx +51 -44
  27. package/src/charts/pie-semi-circle-chart/pie-semi-circle-chart.module.scss +2 -8
  28. package/src/charts/pie-semi-circle-chart/pie-semi-circle-chart.tsx +166 -168
  29. package/src/charts/pie-semi-circle-chart/test/pie-semi-circle-chart.test.tsx +58 -30
  30. package/src/charts/private/chart-composition/index.ts +2 -0
  31. package/src/charts/private/chart-composition/render-legend-slot.ts +22 -0
  32. package/src/charts/private/chart-composition/test/render-legend-slot.test.tsx +60 -0
  33. package/src/charts/private/chart-composition/test/use-chart-children.test.tsx +91 -0
  34. package/src/charts/private/chart-composition/use-chart-children.ts +34 -2
  35. package/src/charts/private/chart-layout/chart-layout.module.scss +7 -0
  36. package/src/charts/private/chart-layout/chart-layout.tsx +106 -0
  37. package/src/charts/private/chart-layout/index.ts +2 -0
  38. package/src/charts/private/chart-layout/test/chart-layout.test.tsx +167 -0
  39. package/src/charts/private/single-chart-context/single-chart-context.tsx +2 -2
  40. package/src/charts/private/svg-empty-state/index.ts +1 -0
  41. package/src/charts/private/svg-empty-state/svg-empty-state.module.scss +7 -0
  42. package/src/charts/private/svg-empty-state/svg-empty-state.tsx +40 -0
  43. package/src/components/legend/hooks/test/use-chart-legend-items.test.tsx +12 -8
  44. package/src/components/legend/hooks/use-chart-legend-items.ts +12 -13
  45. package/src/components/legend/index.ts +1 -8
  46. package/src/components/legend/legend.tsx +33 -8
  47. package/src/components/legend/private/base-legend.module.scss +19 -37
  48. package/src/components/legend/private/base-legend.tsx +0 -2
  49. package/src/components/legend/test/legend.test.tsx +93 -1
  50. package/src/components/legend/types.ts +7 -34
  51. package/src/hooks/index.ts +1 -1
  52. package/src/hooks/use-data-with-percentages.ts +24 -0
  53. package/src/hooks/use-interactive-legend-data.ts +18 -15
  54. package/src/index.ts +66 -9
  55. package/src/providers/chart-context/global-charts-provider.tsx +7 -1
  56. package/src/providers/chart-context/hooks/use-chart-registration.ts +2 -1
  57. package/src/providers/chart-context/types.ts +2 -2
  58. package/src/types.ts +110 -45
  59. package/src/utils/date-parsing.ts +10 -1
  60. package/src/utils/test/date-parsing.test.ts +12 -0
  61. package/src/utils/test/resolve-css-var.test.ts +4 -2
  62. package/tsup.config.ts +1 -1
  63. package/dist/base-tooltip-DOq93wjU.d.cts +0 -38
  64. package/dist/base-tooltip-DOq93wjU.d.ts +0 -38
  65. package/dist/charts/bar-chart/index.cjs +0 -15
  66. package/dist/charts/bar-chart/index.cjs.map +0 -1
  67. package/dist/charts/bar-chart/index.css +0 -153
  68. package/dist/charts/bar-chart/index.css.map +0 -1
  69. package/dist/charts/bar-chart/index.d.cts +0 -37
  70. package/dist/charts/bar-chart/index.d.ts +0 -37
  71. package/dist/charts/bar-chart/index.js +0 -15
  72. package/dist/charts/bar-chart/index.js.map +0 -1
  73. package/dist/charts/bar-list-chart/index.cjs +0 -16
  74. package/dist/charts/bar-list-chart/index.cjs.map +0 -1
  75. package/dist/charts/bar-list-chart/index.css +0 -153
  76. package/dist/charts/bar-list-chart/index.css.map +0 -1
  77. package/dist/charts/bar-list-chart/index.d.cts +0 -92
  78. package/dist/charts/bar-list-chart/index.d.ts +0 -92
  79. package/dist/charts/bar-list-chart/index.js +0 -16
  80. package/dist/charts/bar-list-chart/index.js.map +0 -1
  81. package/dist/charts/conversion-funnel-chart/index.cjs +0 -11
  82. package/dist/charts/conversion-funnel-chart/index.cjs.map +0 -1
  83. package/dist/charts/conversion-funnel-chart/index.css +0 -251
  84. package/dist/charts/conversion-funnel-chart/index.css.map +0 -1
  85. package/dist/charts/conversion-funnel-chart/index.d.cts +0 -97
  86. package/dist/charts/conversion-funnel-chart/index.d.ts +0 -97
  87. package/dist/charts/conversion-funnel-chart/index.js +0 -11
  88. package/dist/charts/conversion-funnel-chart/index.js.map +0 -1
  89. package/dist/charts/geo-chart/index.cjs +0 -13
  90. package/dist/charts/geo-chart/index.cjs.map +0 -1
  91. package/dist/charts/geo-chart/index.css +0 -117
  92. package/dist/charts/geo-chart/index.css.map +0 -1
  93. package/dist/charts/geo-chart/index.d.cts +0 -67
  94. package/dist/charts/geo-chart/index.d.ts +0 -67
  95. package/dist/charts/geo-chart/index.js +0 -13
  96. package/dist/charts/geo-chart/index.js.map +0 -1
  97. package/dist/charts/leaderboard-chart/index.cjs +0 -20
  98. package/dist/charts/leaderboard-chart/index.cjs.map +0 -1
  99. package/dist/charts/leaderboard-chart/index.css +0 -172
  100. package/dist/charts/leaderboard-chart/index.css.map +0 -1
  101. package/dist/charts/leaderboard-chart/index.d.cts +0 -46
  102. package/dist/charts/leaderboard-chart/index.d.ts +0 -46
  103. package/dist/charts/leaderboard-chart/index.js +0 -20
  104. package/dist/charts/leaderboard-chart/index.js.map +0 -1
  105. package/dist/charts/line-chart/index.cjs +0 -15
  106. package/dist/charts/line-chart/index.cjs.map +0 -1
  107. package/dist/charts/line-chart/index.css +0 -225
  108. package/dist/charts/line-chart/index.css.map +0 -1
  109. package/dist/charts/line-chart/index.d.cts +0 -99
  110. package/dist/charts/line-chart/index.d.ts +0 -99
  111. package/dist/charts/line-chart/index.js +0 -15
  112. package/dist/charts/line-chart/index.js.map +0 -1
  113. package/dist/charts/pie-chart/index.cjs +0 -18
  114. package/dist/charts/pie-chart/index.cjs.map +0 -1
  115. package/dist/charts/pie-chart/index.css +0 -143
  116. package/dist/charts/pie-chart/index.css.map +0 -1
  117. package/dist/charts/pie-chart/index.d.cts +0 -97
  118. package/dist/charts/pie-chart/index.d.ts +0 -97
  119. package/dist/charts/pie-chart/index.js +0 -18
  120. package/dist/charts/pie-chart/index.js.map +0 -1
  121. package/dist/charts/pie-semi-circle-chart/index.cjs +0 -17
  122. package/dist/charts/pie-semi-circle-chart/index.cjs.map +0 -1
  123. package/dist/charts/pie-semi-circle-chart/index.css +0 -144
  124. package/dist/charts/pie-semi-circle-chart/index.css.map +0 -1
  125. package/dist/charts/pie-semi-circle-chart/index.d.cts +0 -94
  126. package/dist/charts/pie-semi-circle-chart/index.d.ts +0 -94
  127. package/dist/charts/pie-semi-circle-chart/index.js +0 -17
  128. package/dist/charts/pie-semi-circle-chart/index.js.map +0 -1
  129. package/dist/charts/sparkline/index.cjs +0 -16
  130. package/dist/charts/sparkline/index.cjs.map +0 -1
  131. package/dist/charts/sparkline/index.css +0 -242
  132. package/dist/charts/sparkline/index.css.map +0 -1
  133. package/dist/charts/sparkline/index.d.cts +0 -113
  134. package/dist/charts/sparkline/index.d.ts +0 -113
  135. package/dist/charts/sparkline/index.js +0 -16
  136. package/dist/charts/sparkline/index.js.map +0 -1
  137. package/dist/chunk-2A34OA5O.cjs +0 -51
  138. package/dist/chunk-2A34OA5O.cjs.map +0 -1
  139. package/dist/chunk-2NCY7R4G.js +0 -3897
  140. package/dist/chunk-2NCY7R4G.js.map +0 -1
  141. package/dist/chunk-32DH6JDF.js +0 -1263
  142. package/dist/chunk-32DH6JDF.js.map +0 -1
  143. package/dist/chunk-4OPFE4RM.js +0 -614
  144. package/dist/chunk-4OPFE4RM.js.map +0 -1
  145. package/dist/chunk-6CCZL2JJ.js +0 -63
  146. package/dist/chunk-6CCZL2JJ.js.map +0 -1
  147. package/dist/chunk-77OKCVQN.cjs +0 -421
  148. package/dist/chunk-77OKCVQN.cjs.map +0 -1
  149. package/dist/chunk-7FQX4ALL.cjs +0 -219
  150. package/dist/chunk-7FQX4ALL.cjs.map +0 -1
  151. package/dist/chunk-ASLARV7L.cjs +0 -81
  152. package/dist/chunk-ASLARV7L.cjs.map +0 -1
  153. package/dist/chunk-BCX5THDQ.js +0 -403
  154. package/dist/chunk-BCX5THDQ.js.map +0 -1
  155. package/dist/chunk-BPYKWMI7.js +0 -194
  156. package/dist/chunk-BPYKWMI7.js.map +0 -1
  157. package/dist/chunk-CZGYJKG6.js +0 -421
  158. package/dist/chunk-CZGYJKG6.js.map +0 -1
  159. package/dist/chunk-D2UH4CFE.cjs +0 -120
  160. package/dist/chunk-D2UH4CFE.cjs.map +0 -1
  161. package/dist/chunk-DAU3HNEG.js +0 -344
  162. package/dist/chunk-DAU3HNEG.js.map +0 -1
  163. package/dist/chunk-H2V4JMSA.js +0 -219
  164. package/dist/chunk-H2V4JMSA.js.map +0 -1
  165. package/dist/chunk-I2276W3I.cjs +0 -66
  166. package/dist/chunk-I2276W3I.cjs.map +0 -1
  167. package/dist/chunk-I35UYJJR.cjs +0 -468
  168. package/dist/chunk-I35UYJJR.cjs.map +0 -1
  169. package/dist/chunk-IU4DYUAV.js +0 -120
  170. package/dist/chunk-IU4DYUAV.js.map +0 -1
  171. package/dist/chunk-KXRWNFQJ.js +0 -51
  172. package/dist/chunk-KXRWNFQJ.js.map +0 -1
  173. package/dist/chunk-OP6PHB2U.js +0 -81
  174. package/dist/chunk-OP6PHB2U.js.map +0 -1
  175. package/dist/chunk-PXLEMUGJ.js +0 -165
  176. package/dist/chunk-PXLEMUGJ.js.map +0 -1
  177. package/dist/chunk-RCY6XLGU.cjs +0 -63
  178. package/dist/chunk-RCY6XLGU.cjs.map +0 -1
  179. package/dist/chunk-RHHVEJHJ.cjs +0 -1263
  180. package/dist/chunk-RHHVEJHJ.cjs.map +0 -1
  181. package/dist/chunk-TO3OQBXG.cjs +0 -165
  182. package/dist/chunk-TO3OQBXG.cjs.map +0 -1
  183. package/dist/chunk-V36ERY7Y.js +0 -375
  184. package/dist/chunk-V36ERY7Y.js.map +0 -1
  185. package/dist/chunk-VJM5XCB4.cjs +0 -614
  186. package/dist/chunk-VJM5XCB4.cjs.map +0 -1
  187. package/dist/chunk-VTS3PNMS.cjs +0 -344
  188. package/dist/chunk-VTS3PNMS.cjs.map +0 -1
  189. package/dist/chunk-WLODYNLB.js +0 -1067
  190. package/dist/chunk-WLODYNLB.js.map +0 -1
  191. package/dist/chunk-XKRJL2QT.cjs +0 -375
  192. package/dist/chunk-XKRJL2QT.cjs.map +0 -1
  193. package/dist/chunk-XWYZIFZW.js +0 -66
  194. package/dist/chunk-XWYZIFZW.js.map +0 -1
  195. package/dist/chunk-Y3NNQMAX.cjs +0 -194
  196. package/dist/chunk-Y3NNQMAX.cjs.map +0 -1
  197. package/dist/chunk-YE2T52VZ.cjs +0 -1067
  198. package/dist/chunk-YE2T52VZ.cjs.map +0 -1
  199. package/dist/chunk-Z26M4V2M.js +0 -468
  200. package/dist/chunk-Z26M4V2M.js.map +0 -1
  201. package/dist/chunk-Z45KX47P.cjs +0 -3897
  202. package/dist/chunk-Z45KX47P.cjs.map +0 -1
  203. package/dist/chunk-ZH4F5RMG.cjs +0 -403
  204. package/dist/chunk-ZH4F5RMG.cjs.map +0 -1
  205. package/dist/components/legend/index.cjs +0 -11
  206. package/dist/components/legend/index.cjs.map +0 -1
  207. package/dist/components/legend/index.css +0 -103
  208. package/dist/components/legend/index.css.map +0 -1
  209. package/dist/components/legend/index.d.cts +0 -37
  210. package/dist/components/legend/index.d.ts +0 -37
  211. package/dist/components/legend/index.js +0 -11
  212. package/dist/components/legend/index.js.map +0 -1
  213. package/dist/components/tooltip/index.cjs +0 -12
  214. package/dist/components/tooltip/index.cjs.map +0 -1
  215. package/dist/components/tooltip/index.css +0 -13
  216. package/dist/components/tooltip/index.css.map +0 -1
  217. package/dist/components/tooltip/index.d.cts +0 -71
  218. package/dist/components/tooltip/index.d.ts +0 -71
  219. package/dist/components/tooltip/index.js +0 -12
  220. package/dist/components/tooltip/index.js.map +0 -1
  221. package/dist/components/trend-indicator/index.cjs +0 -8
  222. package/dist/components/trend-indicator/index.cjs.map +0 -1
  223. package/dist/components/trend-indicator/index.css +0 -27
  224. package/dist/components/trend-indicator/index.css.map +0 -1
  225. package/dist/components/trend-indicator/index.d.cts +0 -44
  226. package/dist/components/trend-indicator/index.d.ts +0 -44
  227. package/dist/components/trend-indicator/index.js +0 -8
  228. package/dist/components/trend-indicator/index.js.map +0 -1
  229. package/dist/format-metric-value-MXm5DtQ_.d.cts +0 -24
  230. package/dist/format-metric-value-MXm5DtQ_.d.ts +0 -24
  231. package/dist/hooks/index.cjs +0 -31
  232. package/dist/hooks/index.cjs.map +0 -1
  233. package/dist/hooks/index.css +0 -103
  234. package/dist/hooks/index.css.map +0 -1
  235. package/dist/hooks/index.d.cts +0 -272
  236. package/dist/hooks/index.d.ts +0 -272
  237. package/dist/hooks/index.js +0 -31
  238. package/dist/hooks/index.js.map +0 -1
  239. package/dist/leaderboard-chart-BKYYXcg2.d.ts +0 -83
  240. package/dist/leaderboard-chart-DR7CGb0L.d.cts +0 -83
  241. package/dist/legend-C2grwnWk.d.cts +0 -9
  242. package/dist/legend-Cj0xM5dU.d.ts +0 -9
  243. package/dist/providers/index.cjs +0 -21
  244. package/dist/providers/index.cjs.map +0 -1
  245. package/dist/providers/index.css +0 -103
  246. package/dist/providers/index.css.map +0 -1
  247. package/dist/providers/index.d.cts +0 -28
  248. package/dist/providers/index.d.ts +0 -28
  249. package/dist/providers/index.js +0 -21
  250. package/dist/providers/index.js.map +0 -1
  251. package/dist/themes-BmVGrYnF.d.ts +0 -67
  252. package/dist/themes-CyjKm-P_.d.cts +0 -67
  253. package/dist/types-CuUEszrM.d.ts +0 -19
  254. package/dist/types-DZordNiO.d.cts +0 -505
  255. package/dist/types-DZordNiO.d.ts +0 -505
  256. package/dist/types-I67mddpr.d.cts +0 -78
  257. package/dist/types-I67mddpr.d.ts +0 -78
  258. package/dist/types-KtOPPzPX.d.cts +0 -19
  259. package/dist/utils/index.cjs +0 -44
  260. package/dist/utils/index.cjs.map +0 -1
  261. package/dist/utils/index.d.cts +0 -226
  262. package/dist/utils/index.d.ts +0 -226
  263. package/dist/utils/index.js +0 -44
  264. package/dist/utils/index.js.map +0 -1
  265. package/dist/with-responsive-CNfhzAUu.d.cts +0 -18
  266. package/dist/with-responsive-CNfhzAUu.d.ts +0 -18
  267. package/src/hooks/use-has-legend-child.ts +0 -22
@@ -7,8 +7,8 @@ describe( 'PieChart', () => {
7
7
  const defaultProps = {
8
8
  size: 500,
9
9
  data: [
10
- { label: 'A', percentage: 50, value: 50 },
11
- { label: 'B', percentage: 50, value: 50 },
10
+ { label: 'A', value: 50 },
11
+ { label: 'B', value: 50 },
12
12
  ],
13
13
  };
14
14
 
@@ -21,21 +21,21 @@ describe( 'PieChart', () => {
21
21
  };
22
22
 
23
23
  describe( 'Data Validation', () => {
24
- test( 'validates total percentage equals 100', () => {
24
+ test( 'validates total value is greater than 0', () => {
25
25
  renderWithTheme( {
26
26
  data: [
27
- { label: 'A', percentage: 60, value: 60 },
28
- { label: 'B', percentage: 50, value: 50 },
27
+ { label: 'A', value: 0 },
28
+ { label: 'B', value: 0 },
29
29
  ],
30
30
  } );
31
- expect( screen.getByText( /invalid percentage total/i ) ).toBeInTheDocument();
31
+ expect( screen.getByText( /invalid data/i ) ).toBeInTheDocument();
32
32
  } );
33
33
 
34
34
  test( 'handles negative values', () => {
35
35
  renderWithTheme( {
36
36
  data: [
37
- { label: 'A', percentage: -30, value: -30 },
38
- { label: 'B', percentage: 130, value: 130 },
37
+ { label: 'A', value: -30 },
38
+ { label: 'B', value: 130 },
39
39
  ],
40
40
  } );
41
41
  expect( screen.getByText( /invalid data/i ) ).toBeInTheDocument();
@@ -48,7 +48,7 @@ describe( 'PieChart', () => {
48
48
 
49
49
  test( 'handles single data point', () => {
50
50
  renderWithTheme( {
51
- data: [ { label: 'A', percentage: 100, value: 100 } ],
51
+ data: [ { label: 'A', value: 100 } ],
52
52
  } );
53
53
  // Use getAllByText since 'A' appears in both chart and legend
54
54
  const labels = screen.getAllByText( 'A' );
@@ -60,7 +60,7 @@ describe( 'PieChart', () => {
60
60
  test( 'renders legend when showLegend is true', () => {
61
61
  renderWithTheme( {
62
62
  showLegend: true,
63
- legendPosition: 'top',
63
+ legend: { position: 'top' },
64
64
  } );
65
65
 
66
66
  // Check that legend container is rendered using accessible queries
@@ -72,7 +72,7 @@ describe( 'PieChart', () => {
72
72
  test( 'renders correct number of legend items', () => {
73
73
  renderWithTheme( {
74
74
  showLegend: true,
75
- legendPosition: 'top',
75
+ legend: { position: 'top' },
76
76
  } );
77
77
 
78
78
  // Use getAllByTestId to find legend items
@@ -83,7 +83,7 @@ describe( 'PieChart', () => {
83
83
  test( 'chart renders with legend at top position', () => {
84
84
  renderWithTheme( {
85
85
  showLegend: true,
86
- legendPosition: 'top',
86
+ legend: { position: 'top' },
87
87
  } );
88
88
 
89
89
  // Verify the chart renders without errors when legend is at top
@@ -98,7 +98,7 @@ describe( 'PieChart', () => {
98
98
  test( 'chart renders with legend at bottom position', () => {
99
99
  renderWithTheme( {
100
100
  showLegend: true,
101
- legendPosition: 'bottom',
101
+ legend: { position: 'bottom' },
102
102
  } );
103
103
 
104
104
  // Verify the chart renders without errors when legend is at bottom
@@ -157,10 +157,11 @@ describe( 'PieChart', () => {
157
157
  } );
158
158
 
159
159
  describe( 'Legend Value Display', () => {
160
+ // Values that give clean percentages: 60/100=60%, 23/100=23%, 17/100=17%
160
161
  const testData = [
161
- { label: 'Windows', value: 80000, valueDisplay: '80K', percentage: 60 },
162
- { label: 'MacOS', value: 30000, valueDisplay: '30K', percentage: 23 },
163
- { label: 'Linux', value: 22000, valueDisplay: '22K', percentage: 17 },
162
+ { label: 'Windows', value: 60, valueDisplay: '60' },
163
+ { label: 'MacOS', value: 23, valueDisplay: '23' },
164
+ { label: 'Linux', value: 17, valueDisplay: '17' },
164
165
  ];
165
166
 
166
167
  test( 'shows percentage values by default when showLegend and showValues are enabled', () => {
@@ -170,7 +171,7 @@ describe( 'PieChart', () => {
170
171
  // legendValueDisplay defaults to 'percentage'
171
172
  } );
172
173
 
173
- // Should display percentage values (using formatPercentage which shows "60%", "23%", "17%")
174
+ // Should display calculated percentages from values
174
175
  expect( screen.getByText( '60%' ) ).toBeInTheDocument();
175
176
  expect( screen.getByText( '23%' ) ).toBeInTheDocument();
176
177
  expect( screen.getByText( '17%' ) ).toBeInTheDocument();
@@ -184,9 +185,9 @@ describe( 'PieChart', () => {
184
185
  } );
185
186
 
186
187
  // Should display localized numeric values
187
- expect( screen.getByText( '80,000' ) ).toBeInTheDocument();
188
- expect( screen.getByText( '30,000' ) ).toBeInTheDocument();
189
- expect( screen.getByText( '22,000' ) ).toBeInTheDocument();
188
+ expect( screen.getByText( '60' ) ).toBeInTheDocument();
189
+ expect( screen.getByText( '23' ) ).toBeInTheDocument();
190
+ expect( screen.getByText( '17' ) ).toBeInTheDocument();
190
191
  } );
191
192
 
192
193
  test( 'shows formatted values when legendValueDisplay is set to "valueDisplay"', () => {
@@ -197,9 +198,9 @@ describe( 'PieChart', () => {
197
198
  } );
198
199
 
199
200
  // Should display formatted values (valueDisplay field)
200
- expect( screen.getByText( '80K' ) ).toBeInTheDocument();
201
- expect( screen.getByText( '30K' ) ).toBeInTheDocument();
202
- expect( screen.getByText( '22K' ) ).toBeInTheDocument();
201
+ expect( screen.getByText( '60' ) ).toBeInTheDocument();
202
+ expect( screen.getByText( '23' ) ).toBeInTheDocument();
203
+ expect( screen.getByText( '17' ) ).toBeInTheDocument();
203
204
  } );
204
205
 
205
206
  test( 'shows no values when legendValueDisplay is set to "none"', () => {
@@ -222,9 +223,12 @@ describe( 'PieChart', () => {
222
223
  } );
223
224
 
224
225
  describe( 'Tooltip Functionality', () => {
226
+ // Values: 80000 + 30000 = 110000
227
+ // Windows: 80000/110000 = 72.727...%
228
+ // MacOS: 30000/110000 = 27.272...%
225
229
  const testData = [
226
- { label: 'Windows', value: 80000, valueDisplay: '80K', percentage: 70 },
227
- { label: 'MacOS', value: 30000, valueDisplay: '30K', percentage: 30 },
230
+ { label: 'Windows', value: 80000, valueDisplay: '80K' },
231
+ { label: 'MacOS', value: 30000, valueDisplay: '30K' },
228
232
  ];
229
233
 
230
234
  test( 'does not show tooltip when withTooltips is false', async () => {
@@ -314,7 +318,7 @@ describe( 'PieChart', () => {
314
318
 
315
319
  test( 'tooltip shows valueDisplay when available, falls back to value', async () => {
316
320
  const user = userEvent.setup();
317
- const dataWithoutValueDisplay = [ { label: 'Test', value: 42, percentage: 100 } ];
321
+ const dataWithoutValueDisplay = [ { label: 'Test', value: 42 } ];
318
322
 
319
323
  renderWithTheme( {
320
324
  data: dataWithoutValueDisplay,
@@ -356,15 +360,18 @@ describe( 'PieChart', () => {
356
360
  expect( customTooltipRenderer ).toHaveBeenCalled();
357
361
 
358
362
  // Verify the renderer received correct parameters
363
+ // Percentage is calculated from values: 80000 / (80000 + 30000) = 72.727...%
359
364
  expect( customTooltipRenderer ).toHaveBeenCalledWith(
360
365
  expect.objectContaining( {
361
366
  tooltipData: expect.objectContaining( {
362
367
  label: 'Windows',
363
368
  value: 80000,
364
- percentage: 70,
365
369
  } ),
366
370
  } )
367
371
  );
372
+ // Verify percentage is calculated (approximately 72.73%)
373
+ const callArgs = customTooltipRenderer.mock.calls[ 0 ][ 0 ];
374
+ expect( callArgs.tooltipData.percentage ).toBeCloseTo( 72.73, 1 );
368
375
  } );
369
376
  } );
370
377
 
@@ -372,14 +379,14 @@ describe( 'PieChart', () => {
372
379
  test( 'filters segments when interactive legend is enabled and segment is toggled', async () => {
373
380
  const user = userEvent.setup();
374
381
  const testData = [
375
- { label: 'Segment A', value: 50, percentage: 50 },
376
- { label: 'Segment B', value: 50, percentage: 50 },
382
+ { label: 'Segment A', value: 50 },
383
+ { label: 'Segment B', value: 50 },
377
384
  ];
378
385
 
379
386
  renderWithTheme( {
380
387
  data: testData,
381
388
  showLegend: true,
382
- legendInteractive: true,
389
+ legend: { interactive: true },
383
390
  chartId: 'test-interactive-pie-chart',
384
391
  } );
385
392
 
@@ -404,14 +411,14 @@ describe( 'PieChart', () => {
404
411
  test( 'shows empty state when all segments are hidden', async () => {
405
412
  const user = userEvent.setup();
406
413
  const testData = [
407
- { label: 'Segment A', value: 50, percentage: 50 },
408
- { label: 'Segment B', value: 50, percentage: 50 },
414
+ { label: 'Segment A', value: 50 },
415
+ { label: 'Segment B', value: 50 },
409
416
  ];
410
417
 
411
418
  renderWithTheme( {
412
419
  data: testData,
413
420
  showLegend: true,
414
- legendInteractive: true,
421
+ legend: { interactive: true },
415
422
  chartId: 'test-all-hidden-pie-chart',
416
423
  } );
417
424
 
@@ -443,14 +450,14 @@ describe( 'PieChart', () => {
443
450
 
444
451
  test( 'does not filter segments when legendInteractive is false', () => {
445
452
  const testData = [
446
- { label: 'Segment A', value: 50, percentage: 50 },
447
- { label: 'Segment B', value: 50, percentage: 50 },
453
+ { label: 'Segment A', value: 50 },
454
+ { label: 'Segment B', value: 50 },
448
455
  ];
449
456
 
450
457
  renderWithTheme( {
451
458
  data: testData,
452
459
  showLegend: true,
453
- legendInteractive: false,
460
+ legend: { interactive: false },
454
461
  chartId: 'test-non-interactive-pie-chart',
455
462
  } );
456
463
 
@@ -466,15 +473,15 @@ describe( 'PieChart', () => {
466
473
  test( 'maintains consistent colors when segments are hidden', async () => {
467
474
  const user = userEvent.setup();
468
475
  const testData = [
469
- { label: 'Segment A', value: 30, percentage: 30 },
470
- { label: 'Segment B', value: 40, percentage: 40 },
471
- { label: 'Segment C', value: 30, percentage: 30 },
476
+ { label: 'Segment A', value: 30 },
477
+ { label: 'Segment B', value: 40 },
478
+ { label: 'Segment C', value: 30 },
472
479
  ];
473
480
 
474
481
  renderWithTheme( {
475
482
  data: testData,
476
483
  showLegend: true,
477
- legendInteractive: true,
484
+ legend: { interactive: true },
478
485
  chartId: 'test-color-consistency-pie-chart',
479
486
  } );
480
487
 
@@ -498,15 +505,15 @@ describe( 'PieChart', () => {
498
505
  test( 'recalculates legend percentages when segments are hidden', async () => {
499
506
  const user = userEvent.setup();
500
507
  const testData = [
501
- { label: 'Segment A', value: 25, percentage: 25 },
502
- { label: 'Segment B', value: 50, percentage: 50 },
503
- { label: 'Segment C', value: 25, percentage: 25 },
508
+ { label: 'Segment A', value: 25 },
509
+ { label: 'Segment B', value: 50 },
510
+ { label: 'Segment C', value: 25 },
504
511
  ];
505
512
 
506
513
  renderWithTheme( {
507
514
  data: testData,
508
515
  showLegend: true,
509
- legendInteractive: true,
516
+ legend: { interactive: true },
510
517
  legendValueDisplay: 'percentage',
511
518
  chartId: 'test-percentage-recalc-pie-chart',
512
519
  } );
@@ -5,15 +5,9 @@
5
5
  width: 100%;
6
6
  }
7
7
 
8
- // Flex wrapper that fills remaining Stack space and measures the SVG area
9
- &__svg-wrapper {
10
- flex: 1;
11
- min-height: 0; // Required for flex shrinking
12
- min-width: 0; // Required for flex shrinking
8
+ &__centering {
13
9
  width: 100%;
14
- display: flex;
15
- align-items: center;
16
- justify-content: center;
10
+ height: 100%;
17
11
  }
18
12
 
19
13
  .label {