@primeui/chart-core 0.0.1-alpha.1

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 (299) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +1 -0
  3. package/dist/animations/index.d.mts +136 -0
  4. package/dist/animations/index.mjs +18 -0
  5. package/dist/annotation.utils-Bm0lOO1o.d.mts +290 -0
  6. package/dist/borderRadius.utils-Cz73LLR_.d.mts +54 -0
  7. package/dist/canvas-D4vigq47.d.mts +34 -0
  8. package/dist/canvas.utils-D2WHi2gL.d.mts +167 -0
  9. package/dist/cartesian/index.d.mts +94 -0
  10. package/dist/cartesian/index.mjs +93 -0
  11. package/dist/chunk-22ST6YPP.mjs +304 -0
  12. package/dist/chunk-2QK2KOBN.mjs +10 -0
  13. package/dist/chunk-2QRS4YQ5.mjs +18 -0
  14. package/dist/chunk-3FFJEX4A.mjs +261 -0
  15. package/dist/chunk-3IYSJ2U7.mjs +567 -0
  16. package/dist/chunk-3OZLP4I4.mjs +190 -0
  17. package/dist/chunk-3WEMHXZI.mjs +198 -0
  18. package/dist/chunk-3Z62EUJN.mjs +138 -0
  19. package/dist/chunk-4C6EVJ54.mjs +362 -0
  20. package/dist/chunk-53HW45JB.mjs +102 -0
  21. package/dist/chunk-55Y3WI6S.mjs +186 -0
  22. package/dist/chunk-5JCI2DEB.mjs +97 -0
  23. package/dist/chunk-66T4MRC5.mjs +113 -0
  24. package/dist/chunk-6HSEJLSR.mjs +376 -0
  25. package/dist/chunk-6STOLMCA.mjs +187 -0
  26. package/dist/chunk-7CMVDIOU.mjs +54 -0
  27. package/dist/chunk-7QQ6ETB4.mjs +228 -0
  28. package/dist/chunk-A6ZQZFL2.mjs +272 -0
  29. package/dist/chunk-ADKLH73T.mjs +1 -0
  30. package/dist/chunk-AGU3NG6D.mjs +22 -0
  31. package/dist/chunk-AHYIS6EB.mjs +230 -0
  32. package/dist/chunk-AP3UYWYT.mjs +4 -0
  33. package/dist/chunk-ARB5T6MP.mjs +326 -0
  34. package/dist/chunk-ARRGOEFX.mjs +585 -0
  35. package/dist/chunk-AUF4CHDP.mjs +422 -0
  36. package/dist/chunk-B4FTADAZ.mjs +561 -0
  37. package/dist/chunk-BABQKA6K.mjs +339 -0
  38. package/dist/chunk-BETFQBM2.mjs +197 -0
  39. package/dist/chunk-BKP26M4K.mjs +413 -0
  40. package/dist/chunk-BZN2QHGP.mjs +200 -0
  41. package/dist/chunk-C36VWQ7A.mjs +86 -0
  42. package/dist/chunk-CHW4RKY3.mjs +16 -0
  43. package/dist/chunk-CINXJIRR.mjs +120 -0
  44. package/dist/chunk-DN6AXQYZ.mjs +667 -0
  45. package/dist/chunk-DP2IZNN3.mjs +92 -0
  46. package/dist/chunk-DTWTCFRG.mjs +119 -0
  47. package/dist/chunk-EAMUNLRU.mjs +172 -0
  48. package/dist/chunk-EDAKJLNA.mjs +17 -0
  49. package/dist/chunk-ERVQB2VZ.mjs +59 -0
  50. package/dist/chunk-FFMT6OCO.mjs +92 -0
  51. package/dist/chunk-FHTC2YDB.mjs +102 -0
  52. package/dist/chunk-FRST55HY.mjs +16 -0
  53. package/dist/chunk-HDFGCN2F.mjs +132 -0
  54. package/dist/chunk-IEGLX7VL.mjs +42 -0
  55. package/dist/chunk-ILUWFYGY.mjs +220 -0
  56. package/dist/chunk-IXOWSEHO.mjs +114 -0
  57. package/dist/chunk-J4RI2C2G.mjs +172 -0
  58. package/dist/chunk-J65DBT4R.mjs +13 -0
  59. package/dist/chunk-JGOVWSKH.mjs +179 -0
  60. package/dist/chunk-JO7VACY2.mjs +25 -0
  61. package/dist/chunk-JWFBOPM6.mjs +122 -0
  62. package/dist/chunk-KNDZP446.mjs +895 -0
  63. package/dist/chunk-KP2TWD4Z.mjs +90 -0
  64. package/dist/chunk-KQIFO5I3.mjs +225 -0
  65. package/dist/chunk-KVDEROP6.mjs +59 -0
  66. package/dist/chunk-LKC7MZKK.mjs +87 -0
  67. package/dist/chunk-LVMDQ4OJ.mjs +305 -0
  68. package/dist/chunk-M7B3JF43.mjs +90 -0
  69. package/dist/chunk-MTGMXRNF.mjs +136 -0
  70. package/dist/chunk-N3TIT3OH.mjs +1040 -0
  71. package/dist/chunk-NHRK5KU2.mjs +890 -0
  72. package/dist/chunk-NKUYIWAP.mjs +243 -0
  73. package/dist/chunk-NPDZLYIF.mjs +238 -0
  74. package/dist/chunk-O2X6FF45.mjs +499 -0
  75. package/dist/chunk-OGJ6IIBW.mjs +176 -0
  76. package/dist/chunk-OHGCZZPZ.mjs +403 -0
  77. package/dist/chunk-OWW3K55O.mjs +351 -0
  78. package/dist/chunk-OXTFAWSK.mjs +60 -0
  79. package/dist/chunk-PLSDU3C2.mjs +890 -0
  80. package/dist/chunk-PRDVPOZX.mjs +223 -0
  81. package/dist/chunk-Q6PPVIHU.mjs +21 -0
  82. package/dist/chunk-QQBXUDM4.mjs +885 -0
  83. package/dist/chunk-QS76E3TD.mjs +111 -0
  84. package/dist/chunk-QWQ6HY4I.mjs +209 -0
  85. package/dist/chunk-R6Y3R7EW.mjs +135 -0
  86. package/dist/chunk-RBLZRT5K.mjs +190 -0
  87. package/dist/chunk-RO4N6YFS.mjs +167 -0
  88. package/dist/chunk-RQ3CKQOX.mjs +984 -0
  89. package/dist/chunk-SALTGZFR.mjs +208 -0
  90. package/dist/chunk-SANZPAJ4.mjs +14 -0
  91. package/dist/chunk-SDBPQ5CF.mjs +624 -0
  92. package/dist/chunk-SSLTFJ3U.mjs +364 -0
  93. package/dist/chunk-SXHVDJGF.mjs +77 -0
  94. package/dist/chunk-TA4MVAEX.mjs +243 -0
  95. package/dist/chunk-TAHCOZHF.mjs +1772 -0
  96. package/dist/chunk-TQ6S34QZ.mjs +152 -0
  97. package/dist/chunk-UPRXABX5.mjs +90 -0
  98. package/dist/chunk-VGLSBZDN.mjs +71 -0
  99. package/dist/chunk-VN7CKCSE.mjs +364 -0
  100. package/dist/chunk-VVI3OBPJ.mjs +524 -0
  101. package/dist/chunk-VWF57TS3.mjs +62 -0
  102. package/dist/chunk-WA3OVISZ.mjs +179 -0
  103. package/dist/chunk-WCG35U6M.mjs +964 -0
  104. package/dist/chunk-WFTX4AQJ.mjs +194 -0
  105. package/dist/chunk-WFVOQ2QZ.mjs +18 -0
  106. package/dist/chunk-WH3C3Y7P.mjs +149 -0
  107. package/dist/chunk-WPFUV7K3.mjs +488 -0
  108. package/dist/chunk-WRULPWHD.mjs +492 -0
  109. package/dist/chunk-WS64BZXT.mjs +1 -0
  110. package/dist/chunk-WY4AURRE.mjs +2419 -0
  111. package/dist/chunk-WYLILAOO.mjs +167 -0
  112. package/dist/chunk-X4D7FKUS.mjs +62 -0
  113. package/dist/chunk-X7T34OLW.mjs +139 -0
  114. package/dist/chunk-XIHBK5D3.mjs +68 -0
  115. package/dist/chunk-XQQCGFYB.mjs +50 -0
  116. package/dist/chunk-XTVE4P3L.mjs +214 -0
  117. package/dist/chunk-XUAASRXW.mjs +579 -0
  118. package/dist/chunk-Y3L3D4GQ.mjs +685 -0
  119. package/dist/chunk-YBJ56XJS.mjs +132 -0
  120. package/dist/chunk-ZQFK6CAE.mjs +1 -0
  121. package/dist/chunk-ZT2Z7ERM.mjs +874 -0
  122. package/dist/chunk-ZTL2FQEW.mjs +714 -0
  123. package/dist/circular/arc/index.d.mts +8 -0
  124. package/dist/circular/arc/index.mjs +3 -0
  125. package/dist/circular/index.d.mts +44 -0
  126. package/dist/circular/index.mjs +13 -0
  127. package/dist/collect.utils-DiKB4ciO.d.mts +12 -0
  128. package/dist/computeChartState-BTVIqwyO.d.mts +304 -0
  129. package/dist/controller-BJE1AZ3q.d.mts +82 -0
  130. package/dist/controller-BoNigQJr.d.mts +63 -0
  131. package/dist/controllers/index.d.mts +16 -0
  132. package/dist/controllers/index.mjs +110 -0
  133. package/dist/datalabel.utils-CkjGeB8S.d.mts +122 -0
  134. package/dist/decimation.utils-CcvJVhI4.d.mts +244 -0
  135. package/dist/geometry-DUUQJXVM.d.mts +60 -0
  136. package/dist/index-DseIZa1j.d.mts +167 -0
  137. package/dist/index.d.mts +88 -0
  138. package/dist/index.mjs +110 -0
  139. package/dist/orchestrator/index.d.mts +264 -0
  140. package/dist/orchestrator/index.mjs +33 -0
  141. package/dist/plugins/index.d.mts +18 -0
  142. package/dist/plugins/index.mjs +1 -0
  143. package/dist/property-animations-D433wXzz.d.mts +580 -0
  144. package/dist/property-store-NORUWFND.d.mts +17 -0
  145. package/dist/radial/index.d.mts +14 -0
  146. package/dist/radial/index.mjs +37 -0
  147. package/dist/renderers/axis/index.d.mts +39 -0
  148. package/dist/renderers/axis/index.mjs +8 -0
  149. package/dist/renderers/circular/index.d.mts +13 -0
  150. package/dist/renderers/circular/index.mjs +13 -0
  151. package/dist/renderers/index.d.mts +83 -0
  152. package/dist/renderers/index.mjs +75 -0
  153. package/dist/renderers/navigator/index.d.mts +103 -0
  154. package/dist/renderers/navigator/index.mjs +8 -0
  155. package/dist/resize.utils-D_2qm6rv.d.mts +142 -0
  156. package/dist/ring.utils-DXvrxMkU.d.mts +138 -0
  157. package/dist/scale-KFv30jqZ.d.mts +307 -0
  158. package/dist/scales-Drf8AIhL.d.mts +75 -0
  159. package/dist/series/bar/canvas/index.d.mts +8 -0
  160. package/dist/series/bar/canvas/index.mjs +10 -0
  161. package/dist/series/bar/controller/index.d.mts +105 -0
  162. package/dist/series/bar/controller/index.mjs +44 -0
  163. package/dist/series/bar/controller-canvas/index.d.mts +7 -0
  164. package/dist/series/bar/controller-canvas/index.mjs +49 -0
  165. package/dist/series/bar/controller-svg/index.d.mts +7 -0
  166. package/dist/series/bar/controller-svg/index.mjs +49 -0
  167. package/dist/series/bar/index.d.mts +60 -0
  168. package/dist/series/bar/index.mjs +13 -0
  169. package/dist/series/bar/svg/index.d.mts +8 -0
  170. package/dist/series/bar/svg/index.mjs +11 -0
  171. package/dist/series/candlestick/canvas/index.d.mts +8 -0
  172. package/dist/series/candlestick/canvas/index.mjs +8 -0
  173. package/dist/series/candlestick/controller/index.d.mts +123 -0
  174. package/dist/series/candlestick/controller/index.mjs +40 -0
  175. package/dist/series/candlestick/controller-canvas/index.d.mts +7 -0
  176. package/dist/series/candlestick/controller-canvas/index.mjs +45 -0
  177. package/dist/series/candlestick/controller-svg/index.d.mts +7 -0
  178. package/dist/series/candlestick/controller-svg/index.mjs +45 -0
  179. package/dist/series/candlestick/index.d.mts +11 -0
  180. package/dist/series/candlestick/index.mjs +10 -0
  181. package/dist/series/candlestick/svg/index.d.mts +8 -0
  182. package/dist/series/candlestick/svg/index.mjs +8 -0
  183. package/dist/series/heatmap/canvas/index.d.mts +16 -0
  184. package/dist/series/heatmap/canvas/index.mjs +9 -0
  185. package/dist/series/heatmap/controller/index.d.mts +110 -0
  186. package/dist/series/heatmap/controller/index.mjs +23 -0
  187. package/dist/series/heatmap/controller-canvas/index.d.mts +7 -0
  188. package/dist/series/heatmap/controller-canvas/index.mjs +28 -0
  189. package/dist/series/heatmap/controller-svg/index.d.mts +7 -0
  190. package/dist/series/heatmap/controller-svg/index.mjs +28 -0
  191. package/dist/series/heatmap/index.d.mts +34 -0
  192. package/dist/series/heatmap/index.mjs +13 -0
  193. package/dist/series/heatmap/svg/index.d.mts +15 -0
  194. package/dist/series/heatmap/svg/index.mjs +10 -0
  195. package/dist/series/line/canvas/index.d.mts +6 -0
  196. package/dist/series/line/canvas/index.mjs +9 -0
  197. package/dist/series/line/controller/index.d.mts +111 -0
  198. package/dist/series/line/controller/index.mjs +47 -0
  199. package/dist/series/line/controller-canvas/index.d.mts +7 -0
  200. package/dist/series/line/controller-canvas/index.mjs +54 -0
  201. package/dist/series/line/controller-svg/index.d.mts +7 -0
  202. package/dist/series/line/controller-svg/index.mjs +54 -0
  203. package/dist/series/line/index.d.mts +49 -0
  204. package/dist/series/line/index.mjs +13 -0
  205. package/dist/series/line/svg/index.d.mts +6 -0
  206. package/dist/series/line/svg/index.mjs +9 -0
  207. package/dist/series/pie/canvas/index.d.mts +8 -0
  208. package/dist/series/pie/canvas/index.mjs +10 -0
  209. package/dist/series/pie/controller/index.d.mts +174 -0
  210. package/dist/series/pie/controller/index.mjs +110 -0
  211. package/dist/series/pie/controller-canvas/index.d.mts +8 -0
  212. package/dist/series/pie/controller-canvas/index.mjs +119 -0
  213. package/dist/series/pie/controller-svg/index.d.mts +8 -0
  214. package/dist/series/pie/controller-svg/index.mjs +118 -0
  215. package/dist/series/pie/index.d.mts +59 -0
  216. package/dist/series/pie/index.mjs +15 -0
  217. package/dist/series/pie/svg/index.d.mts +6 -0
  218. package/dist/series/pie/svg/index.mjs +11 -0
  219. package/dist/series/polar/canvas/index.d.mts +6 -0
  220. package/dist/series/polar/canvas/index.mjs +7 -0
  221. package/dist/series/polar/controller/index.d.mts +102 -0
  222. package/dist/series/polar/controller/index.mjs +46 -0
  223. package/dist/series/polar/controller-canvas/index.d.mts +8 -0
  224. package/dist/series/polar/controller-canvas/index.mjs +52 -0
  225. package/dist/series/polar/controller-svg/index.d.mts +8 -0
  226. package/dist/series/polar/controller-svg/index.mjs +52 -0
  227. package/dist/series/polar/index.d.mts +25 -0
  228. package/dist/series/polar/index.mjs +16 -0
  229. package/dist/series/polar/svg/index.d.mts +10 -0
  230. package/dist/series/polar/svg/index.mjs +8 -0
  231. package/dist/series/radar/canvas/index.d.mts +6 -0
  232. package/dist/series/radar/canvas/index.mjs +8 -0
  233. package/dist/series/radar/controller/index.d.mts +121 -0
  234. package/dist/series/radar/controller/index.mjs +43 -0
  235. package/dist/series/radar/controller-canvas/index.d.mts +8 -0
  236. package/dist/series/radar/controller-canvas/index.mjs +51 -0
  237. package/dist/series/radar/controller-svg/index.d.mts +8 -0
  238. package/dist/series/radar/controller-svg/index.mjs +51 -0
  239. package/dist/series/radar/index.d.mts +40 -0
  240. package/dist/series/radar/index.mjs +13 -0
  241. package/dist/series/radar/svg/index.d.mts +12 -0
  242. package/dist/series/radar/svg/index.mjs +9 -0
  243. package/dist/series/scatter/canvas/index.d.mts +8 -0
  244. package/dist/series/scatter/canvas/index.mjs +11 -0
  245. package/dist/series/scatter/controller/index.d.mts +124 -0
  246. package/dist/series/scatter/controller/index.mjs +44 -0
  247. package/dist/series/scatter/controller-canvas/index.d.mts +7 -0
  248. package/dist/series/scatter/controller-canvas/index.mjs +51 -0
  249. package/dist/series/scatter/controller-svg/index.d.mts +7 -0
  250. package/dist/series/scatter/controller-svg/index.mjs +51 -0
  251. package/dist/series/scatter/index.d.mts +25 -0
  252. package/dist/series/scatter/index.mjs +14 -0
  253. package/dist/series/scatter/svg/index.d.mts +8 -0
  254. package/dist/series/scatter/svg/index.mjs +12 -0
  255. package/dist/series/treemap/canvas/index.d.mts +50 -0
  256. package/dist/series/treemap/canvas/index.mjs +10 -0
  257. package/dist/series/treemap/controller/index.d.mts +130 -0
  258. package/dist/series/treemap/controller/index.mjs +20 -0
  259. package/dist/series/treemap/controller-canvas/index.d.mts +7 -0
  260. package/dist/series/treemap/controller-canvas/index.mjs +25 -0
  261. package/dist/series/treemap/controller-svg/index.d.mts +7 -0
  262. package/dist/series/treemap/controller-svg/index.mjs +25 -0
  263. package/dist/series/treemap/index.d.mts +15 -0
  264. package/dist/series/treemap/index.mjs +12 -0
  265. package/dist/series/treemap/svg/index.d.mts +15 -0
  266. package/dist/series/treemap/svg/index.mjs +9 -0
  267. package/dist/slices-DtewiwJx.d.mts +72 -0
  268. package/dist/spatialIndex.utils-B_GJkotZ.d.mts +5 -0
  269. package/dist/squarify.utils-B9CQBpa1.d.mts +50 -0
  270. package/dist/stacking-CChuAcLN.d.mts +319 -0
  271. package/dist/streaming.utils-DH-g1gNP.d.mts +49 -0
  272. package/dist/sync/index.d.mts +130 -0
  273. package/dist/sync/index.mjs +5 -0
  274. package/dist/tooltip.renderer-D5wpSlBa.d.mts +210 -0
  275. package/dist/utils/color/index.d.mts +58 -0
  276. package/dist/utils/color/index.mjs +4 -0
  277. package/dist/utils/data/index.d.mts +180 -0
  278. package/dist/utils/data/index.mjs +7 -0
  279. package/dist/utils/export/index.d.mts +14 -0
  280. package/dist/utils/export/index.mjs +6 -0
  281. package/dist/utils/index.d.mts +49 -0
  282. package/dist/utils/index.mjs +29 -0
  283. package/dist/utils/interaction/index.d.mts +255 -0
  284. package/dist/utils/interaction/index.mjs +9 -0
  285. package/dist/utils/layout/index.d.mts +3 -0
  286. package/dist/utils/layout/index.mjs +10 -0
  287. package/dist/utils/math/index.d.mts +162 -0
  288. package/dist/utils/math/index.mjs +1 -0
  289. package/dist/utils/render/index.d.mts +19 -0
  290. package/dist/utils/render/index.mjs +3 -0
  291. package/dist/utils/specialized/index.d.mts +37 -0
  292. package/dist/utils/specialized/index.mjs +66 -0
  293. package/dist/utils/text/index.d.mts +39 -0
  294. package/dist/utils/text/index.mjs +8 -0
  295. package/dist/utils/theme/index.d.mts +295 -0
  296. package/dist/utils/theme/index.mjs +5 -0
  297. package/dist/utils/zoom/index.d.mts +90 -0
  298. package/dist/utils/zoom/index.mjs +3 -0
  299. package/package.json +56 -0
@@ -0,0 +1,561 @@
1
+ import { computeSliceGeometry, buildPieDataLabelLayout, drawCanvasStraightLeaderLine, drawCanvasLeaderLine, drawCanvasLabelLines } from './chunk-4C6EVJ54.mjs';
2
+ import { buildSvgArcPath, CLIP_PIXEL_MARGIN } from './chunk-LVMDQ4OJ.mjs';
3
+ import { computeSliceHoverEffects, applySvgHoverFill, applySvgHoverStroke, computeLeaderLineHoverEffects } from './chunk-BZN2QHGP.mjs';
4
+ import { createDrawImage } from './chunk-7CMVDIOU.mjs';
5
+ import { DEFAULT_FALLBACK_COLOR, DEFAULT_HOVER_BRIGHTNESS } from './chunk-NKUYIWAP.mjs';
6
+ import { getDefaultColor, makeItemContext, resolveAccessor, getColor, isGradientColor, remapStopsForDonut, createSvgGradientFromColor } from './chunk-O2X6FF45.mjs';
7
+ import { adjustBrightness, svgNode, svgClass, withCanvasState, brightenGradientStops } from './chunk-SSLTFJ3U.mjs';
8
+ import { toRad, pointOnCircle } from './chunk-RQ3CKQOX.mjs';
9
+
10
+ // src/renderers/circular/svg.ts
11
+ function buildSliceRenderContext(slice, renderInfo, position, geo, theme, chartCenter, fontFamily) {
12
+ const item = renderInfo.data[slice.originalIndex];
13
+ const angle = slice.endAngle - slice.rotation;
14
+ const sliceCtx = makeItemContext(item, slice.originalIndex);
15
+ const originalValue = Number(resolveAccessor(renderInfo.props.valueField, sliceCtx)) || slice.value;
16
+ const sliceLabel = String(resolveAccessor(renderInfo.props.categoryField, sliceCtx) ?? "");
17
+ return {
18
+ index: slice.originalIndex,
19
+ data: item,
20
+ value: originalValue,
21
+ percentage: slice.percentage,
22
+ label: sliceLabel,
23
+ color: slice.color ?? getColor(renderInfo.props, slice.originalIndex, item, theme, { value: originalValue, category: sliceLabel }),
24
+ center: chartCenter ?? position,
25
+ x: position.x,
26
+ y: position.y,
27
+ angle: geo.midAngle,
28
+ isHovered: geo.isHovered,
29
+ isVisible: angle > 0.1,
30
+ fontFamily: fontFamily ?? "sans-serif"
31
+ };
32
+ }
33
+ function applyGradientBrightness(pathEl, brightness) {
34
+ const fill = pathEl.getAttribute("fill") || "";
35
+ const match = fill.match(/url\(#([^)]+)\)/);
36
+ if (!match) return;
37
+ const svgEl = pathEl.ownerSVGElement;
38
+ const gradientEl = svgEl?.querySelector(`#${match[1]}`);
39
+ if (!gradientEl) return;
40
+ const stops = gradientEl.querySelectorAll("stop");
41
+ stops.forEach((stop) => {
42
+ if (!stop.hasAttribute("data-original-color")) {
43
+ stop.setAttribute("data-original-color", stop.getAttribute("stop-color") || "");
44
+ }
45
+ const originalColor = stop.getAttribute("data-original-color") || "";
46
+ if (originalColor) {
47
+ stop.setAttribute("stop-color", adjustBrightness(originalColor, brightness));
48
+ }
49
+ });
50
+ }
51
+ function restoreGradientBrightness(pathEl) {
52
+ const fill = pathEl.getAttribute("data-original-fill") || pathEl.getAttribute("fill") || "";
53
+ const match = fill.match(/url\(#([^)]+)\)/);
54
+ if (!match) return;
55
+ const svgEl = pathEl.ownerSVGElement;
56
+ const gradientEl = svgEl?.querySelector(`#${match[1]}`);
57
+ if (!gradientEl) return;
58
+ const stops = gradientEl.querySelectorAll("stop");
59
+ stops.forEach((stop) => {
60
+ const originalColor = stop.getAttribute("data-original-color");
61
+ if (originalColor) {
62
+ stop.setAttribute("stop-color", originalColor);
63
+ }
64
+ });
65
+ }
66
+ function updateSvgSlices(frame, refs, hoverConfig, theme, fontFamily) {
67
+ const { slices, center, fullCircle, hoverState } = frame;
68
+ const hasAnyHover = hoverState.index !== null;
69
+ const activeCustomKeys = /* @__PURE__ */ new Set();
70
+ for (const slice of slices) {
71
+ const key = `${slice.datasetIndex}-${slice.originalIndex}`;
72
+ const angle = slice.endAngle - slice.rotation;
73
+ const geo = computeSliceGeometry(slice, slice.rotation, frame);
74
+ const pathEl = refs.pathElements.get(key);
75
+ if (pathEl && angle > 1e-3) {
76
+ const pathD = buildSvgArcPath(
77
+ {
78
+ rotation: geo.renderRotation,
79
+ endAngle: geo.renderRotation + geo.renderAngle,
80
+ outerRadius: geo.sliceOuterRadius,
81
+ innerRadius: geo.sliceInnerRadius,
82
+ borderRadius: slice.borderRadius
83
+ },
84
+ fullCircle
85
+ );
86
+ pathEl.setAttribute("d", pathD);
87
+ const sliceGroup2 = refs.sliceGroups.get(key);
88
+ if (sliceGroup2) {
89
+ const strokePath = sliceGroup2.querySelector("[data-stroke-path]");
90
+ if (strokePath) {
91
+ strokePath.setAttribute("d", pathD);
92
+ const {
93
+ borderStrokeWidth: bw,
94
+ borderColor: computedBorderColor,
95
+ borderDash: hoverBorderDash
96
+ } = computeSliceHoverEffects(slice.color ?? DEFAULT_FALLBACK_COLOR, slice.borderColor ?? "transparent", slice.borderStrokeWidth ?? 0, geo.isHovered, hasAnyHover, hoverConfig, theme);
97
+ const bc = geo.isHovered && slice.hoverBorderColor ? slice.hoverBorderColor : computedBorderColor;
98
+ const isInner = (frame.borderAlign ?? "inner") === "inner";
99
+ if (bw > 0 && bc !== "transparent") {
100
+ const joinStyle = frame.borderJoinStyle ?? "miter";
101
+ strokePath.setAttribute("stroke", bc);
102
+ strokePath.setAttribute("stroke-width", String(isInner ? bw * 2 : bw));
103
+ strokePath.setAttribute("stroke-linejoin", joinStyle);
104
+ const bd = hoverBorderDash ?? slice.borderDash;
105
+ if (bd && bd.length > 0) {
106
+ strokePath.setAttribute("stroke-dasharray", bd.join(" "));
107
+ strokePath.setAttribute("stroke-dashoffset", String(slice.borderDashOffset ?? 0));
108
+ } else {
109
+ strokePath.removeAttribute("stroke-dasharray");
110
+ strokePath.removeAttribute("stroke-dashoffset");
111
+ }
112
+ if (isInner) {
113
+ const clipId = strokePath.getAttribute("data-clip-id");
114
+ if (clipId && !strokePath.getAttribute("clip-path")) {
115
+ strokePath.setAttribute("clip-path", `url(#${clipId})`);
116
+ }
117
+ } else {
118
+ strokePath.removeAttribute("clip-path");
119
+ }
120
+ } else {
121
+ strokePath.setAttribute("stroke", "transparent");
122
+ strokePath.setAttribute("stroke-width", "0");
123
+ strokePath.removeAttribute("stroke-dasharray");
124
+ strokePath.removeAttribute("stroke-dashoffset");
125
+ }
126
+ const clipRef = strokePath.getAttribute("clip-path");
127
+ const clipMatch = clipRef?.match(/url\(#([^)]+)\)/);
128
+ if (clipMatch) {
129
+ const svgEl = strokePath.ownerSVGElement;
130
+ const clipPathEl = svgEl?.querySelector(`#${clipMatch[1]} path`);
131
+ if (clipPathEl) {
132
+ const PIXEL_MARGIN = CLIP_PIXEL_MARGIN;
133
+ const angleDelta = geo.sliceOuterRadius > 0 ? PIXEL_MARGIN / geo.sliceOuterRadius * (180 / Math.PI) : 0;
134
+ const expandedPath = buildSvgArcPath(
135
+ {
136
+ rotation: geo.renderRotation - angleDelta,
137
+ endAngle: geo.renderRotation + geo.renderAngle + angleDelta,
138
+ outerRadius: geo.sliceOuterRadius,
139
+ innerRadius: geo.sliceInnerRadius,
140
+ borderRadius: slice.borderRadius
141
+ },
142
+ fullCircle
143
+ );
144
+ clipPathEl.setAttribute("d", expandedPath);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ }
150
+ const sliceGroup = refs.sliceGroups.get(key);
151
+ if (sliceGroup) {
152
+ sliceGroup.style.opacity = angle < 0.1 ? "0" : String(slice.userOpacity ?? 1);
153
+ const hasOffset = geo.offsetX !== 0 || geo.offsetY !== 0;
154
+ const hasScale = geo.scale !== 1;
155
+ if (hasOffset || hasScale) {
156
+ const parts = [];
157
+ if (hasOffset) parts.push(`translate(${geo.offsetX}, ${geo.offsetY})`);
158
+ if (hasScale) parts.push(`scale(${geo.scale})`);
159
+ sliceGroup.setAttribute("transform", parts.join(" "));
160
+ } else {
161
+ sliceGroup.removeAttribute("transform");
162
+ }
163
+ if (pathEl) {
164
+ const fillHoverConfig = geo.isHovered && slice.hoverColor ? { ...hoverConfig, backgroundColor: slice.hoverColor } : hoverConfig;
165
+ applySvgHoverFill(pathEl, geo.isHovered, hasAnyHover, fillHoverConfig, applyGradientBrightness, restoreGradientBrightness, theme);
166
+ applySvgHoverStroke(pathEl, geo.isHovered, hoverConfig);
167
+ }
168
+ }
169
+ const contentSlot = refs.contentSlots.get(key);
170
+ if (contentSlot) {
171
+ const x = Math.cos(toRad(geo.midAngle)) * geo.midRadius;
172
+ const y = Math.sin(toRad(geo.midAngle)) * geo.midRadius;
173
+ contentSlot.setAttribute("transform", `translate(${x}, ${y})`);
174
+ contentSlot.style.opacity = angle < 0.1 ? "0" : "1";
175
+ }
176
+ const customEl = refs.customContent.get(key);
177
+ if (customEl) {
178
+ const pt = pointOnCircle(center.x + geo.offsetX, center.y + geo.offsetY, geo.midAngle, geo.midRadius);
179
+ customEl.setAttribute("transform", `translate(${pt.x}, ${pt.y})`);
180
+ customEl.style.opacity = String(Math.min(1, angle / 10));
181
+ activeCustomKeys.add(key);
182
+ let renderInfo;
183
+ for (const [, info] of refs.renderFns) {
184
+ if (info.datasetIndex === slice.datasetIndex) {
185
+ renderInfo = info;
186
+ break;
187
+ }
188
+ }
189
+ if (renderInfo && renderInfo.data[slice.originalIndex]) {
190
+ const result = renderInfo.fn(buildSliceRenderContext(slice, renderInfo, pt, geo, theme, void 0, fontFamily));
191
+ if (result && typeof result === "object" && "text" in result) {
192
+ const textEl = customEl.querySelector("text");
193
+ if (textEl) {
194
+ textEl.textContent = result.text;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ if (activeCustomKeys.size > 0) {
201
+ for (const [key, el] of refs.customContent) {
202
+ if (!activeCustomKeys.has(key)) {
203
+ el.style.opacity = "0";
204
+ }
205
+ }
206
+ }
207
+ }
208
+ function updatePieCustomContent(frame, refs, theme, fontFamily) {
209
+ const { slices, center } = frame;
210
+ const activeCustomKeys = /* @__PURE__ */ new Set();
211
+ for (const slice of slices) {
212
+ const key = `${slice.datasetIndex}-${slice.originalIndex}`;
213
+ const angle = slice.endAngle - slice.rotation;
214
+ const geo = computeSliceGeometry(slice, slice.rotation, frame);
215
+ const customEl = refs.customContent.get(key);
216
+ if (!customEl) continue;
217
+ const pt = pointOnCircle(center.x + geo.offsetX, center.y + geo.offsetY, geo.midAngle, geo.midRadius);
218
+ customEl.setAttribute("transform", `translate(${pt.x}, ${pt.y})`);
219
+ customEl.style.opacity = String(Math.min(1, angle / 10));
220
+ activeCustomKeys.add(key);
221
+ let renderInfo;
222
+ for (const [, info] of refs.renderFns) {
223
+ if (info.datasetIndex === slice.datasetIndex) {
224
+ renderInfo = info;
225
+ break;
226
+ }
227
+ }
228
+ if (renderInfo && renderInfo.data[slice.originalIndex]) {
229
+ const result = renderInfo.fn(buildSliceRenderContext(slice, renderInfo, pt, geo, theme, void 0, fontFamily));
230
+ if (result && typeof result === "object" && "text" in result) {
231
+ const textEl = customEl.querySelector("text");
232
+ if (textEl) {
233
+ textEl.textContent = result.text;
234
+ }
235
+ }
236
+ }
237
+ }
238
+ if (activeCustomKeys.size > 0) {
239
+ for (const [key, el] of refs.customContent) {
240
+ if (!activeCustomKeys.has(key)) {
241
+ el.style.opacity = "0";
242
+ }
243
+ }
244
+ }
245
+ }
246
+ function resolveSliceFillDescriptor(slice, isHovered, hasAnyHover, hoverConfig, theme, gradientId, innerRadius, outerRadius) {
247
+ const colorValue = slice.colorValue;
248
+ const isGradient = colorValue !== void 0 && isGradientColor(colorValue);
249
+ let baseFill;
250
+ if (isGradient) {
251
+ baseFill = `url(#${gradientId})`;
252
+ } else if (typeof colorValue === "string") {
253
+ baseFill = colorValue;
254
+ } else if (typeof slice.color === "string") {
255
+ baseFill = slice.color;
256
+ } else {
257
+ baseFill = theme.series[slice.originalIndex % theme.series.length];
258
+ }
259
+ const originalFill = baseFill;
260
+ const fillHoverConfig = isHovered && slice.hoverColor ? { ...hoverConfig, backgroundColor: slice.hoverColor } : hoverConfig;
261
+ let fill = baseFill;
262
+ let opacityAttr;
263
+ let gradStops = isGradient ? colorValue.stops : void 0;
264
+ if (!fillHoverConfig) {
265
+ fill = baseFill;
266
+ } else {
267
+ const brightness = fillHoverConfig.brightness ?? theme.hoverBrightness ?? DEFAULT_HOVER_BRIGHTNESS;
268
+ if (isHovered) {
269
+ if (fillHoverConfig.backgroundColor) {
270
+ fill = fillHoverConfig.backgroundColor;
271
+ } else if (isGradient) {
272
+ gradStops = brightenGradientStops(colorValue, brightness).stops;
273
+ fill = baseFill;
274
+ } else {
275
+ fill = adjustBrightness(baseFill, brightness);
276
+ }
277
+ } else if (hasAnyHover && fillHoverConfig.dimOpacity !== void 0 && fillHoverConfig.dimOpacity < 1) {
278
+ opacityAttr = String(fillHoverConfig.dimOpacity);
279
+ fill = baseFill;
280
+ } else {
281
+ fill = baseFill;
282
+ }
283
+ }
284
+ let gradientDef;
285
+ if (isGradient) {
286
+ const cv = colorValue;
287
+ const remapped = innerRadius > 0 && cv.radialGradient ? remapStopsForDonut(gradStops ?? cv.stops, innerRadius / outerRadius) : gradStops ?? cv.stops;
288
+ const gradientColor = { ...cv, stops: remapped };
289
+ gradientDef = createSvgGradientFromColor(gradientColor, gradientId, { x: 0, y: 0 }, outerRadius);
290
+ }
291
+ return { fill, opacityAttr, originalFill, gradientDef };
292
+ }
293
+ function buildPieSvgChildren(frame, hoverConfig, theme, chartId, datasetIndex) {
294
+ const { fullCircle, hoverState } = frame;
295
+ const hasAnyHover = hoverState.index !== null;
296
+ const defsChildren = [];
297
+ const sliceGroups = [];
298
+ for (const slice of frame.slices) {
299
+ if (slice.datasetIndex !== datasetIndex) continue;
300
+ const dataIndex = slice.originalIndex;
301
+ const angle = slice.endAngle - slice.rotation;
302
+ const geo = computeSliceGeometry(slice, slice.rotation, frame);
303
+ const isHovered = geo.isHovered;
304
+ const gradientId = `${chartId}-pie-${datasetIndex}-grad-${dataIndex}`;
305
+ const clipId = `${chartId}-pie-${datasetIndex}-clip-${dataIndex}`;
306
+ const pathD = buildSvgArcPath(
307
+ {
308
+ rotation: geo.renderRotation,
309
+ endAngle: geo.renderRotation + geo.renderAngle,
310
+ outerRadius: geo.sliceOuterRadius,
311
+ innerRadius: geo.sliceInnerRadius,
312
+ borderRadius: slice.borderRadius
313
+ },
314
+ fullCircle
315
+ );
316
+ const PIXEL_MARGIN = CLIP_PIXEL_MARGIN;
317
+ const angleDelta = geo.sliceOuterRadius > 0 ? PIXEL_MARGIN / geo.sliceOuterRadius * (180 / Math.PI) : 0;
318
+ const expandedClipPath = buildSvgArcPath(
319
+ {
320
+ rotation: geo.renderRotation - angleDelta,
321
+ endAngle: geo.renderRotation + geo.renderAngle + angleDelta,
322
+ outerRadius: geo.sliceOuterRadius,
323
+ innerRadius: geo.sliceInnerRadius,
324
+ borderRadius: slice.borderRadius
325
+ },
326
+ fullCircle
327
+ );
328
+ defsChildren.push(svgNode("clipPath", { id: clipId }, [svgNode("path", { d: expandedClipPath })]));
329
+ const { fill, opacityAttr, originalFill, gradientDef } = resolveSliceFillDescriptor(slice, isHovered, hasAnyHover, hoverConfig, theme, gradientId, frame.innerRadius, frame.outerRadius);
330
+ if (gradientDef) defsChildren.push(gradientDef);
331
+ const {
332
+ borderStrokeWidth: bw,
333
+ borderColor: computedBorderColor,
334
+ borderDash: hoverBorderDash
335
+ } = computeSliceHoverEffects(slice.color ?? DEFAULT_FALLBACK_COLOR, slice.borderColor ?? "transparent", slice.borderStrokeWidth ?? 0, isHovered, hasAnyHover, hoverConfig, theme);
336
+ const bc = isHovered && slice.hoverBorderColor ? slice.hoverBorderColor : computedBorderColor;
337
+ const isInner = (frame.borderAlign ?? "inner") === "inner";
338
+ const joinStyle = frame.borderJoinStyle ?? "miter";
339
+ const strokeAttrs = {
340
+ d: pathD,
341
+ fill: "none",
342
+ "stroke-linejoin": joinStyle,
343
+ "data-stroke-path": "true",
344
+ "data-clip-id": clipId,
345
+ ...isInner ? { "clip-path": `url(#${clipId})` } : {}
346
+ };
347
+ if (bw > 0 && bc !== "transparent") {
348
+ strokeAttrs.stroke = bc;
349
+ strokeAttrs["stroke-width"] = String(isInner ? bw * 2 : bw);
350
+ const bd = hoverBorderDash ?? slice.borderDash;
351
+ if (bd && bd.length > 0) {
352
+ strokeAttrs["stroke-dasharray"] = bd.join(" ");
353
+ strokeAttrs["stroke-dashoffset"] = String(slice.borderDashOffset ?? 0);
354
+ }
355
+ } else {
356
+ strokeAttrs.stroke = "transparent";
357
+ strokeAttrs["stroke-width"] = "0";
358
+ }
359
+ const colorClassN = `p-chart-color-${dataIndex % 10}`;
360
+ const usesColorClass = slice.colorValue === getDefaultColor(slice.originalIndex, theme);
361
+ const fillCls = svgClass("p-chart-arc", `p-chart-series-${dataIndex}`, usesColorClass && colorClassN);
362
+ const fillAttrs = {
363
+ d: pathD,
364
+ fill,
365
+ "data-index": dataIndex,
366
+ class: fillCls,
367
+ "data-fill-path": "true",
368
+ // applySvgHoverFill / applySvgHoverStroke bookkeeping (only written when a hoverConfig is
369
+ // present). applySvgHoverStroke runs on the FILL path (updateSvgSlices:286); on its first
370
+ // call it seeds `data-original-stroke` / `data-original-stroke-width` from the fill path's
371
+ // (absent) stroke attrs → empty strings. `data-original-stroke-dasharray` is only seeded
372
+ // when a base dasharray exists (the fill path never has one), so it stays absent here.
373
+ ...hoverConfig ? { "data-original-fill": originalFill, "data-original-stroke": "", "data-original-stroke-width": "" } : {},
374
+ ...opacityAttr !== void 0 ? { opacity: opacityAttr } : {}
375
+ };
376
+ if (isHovered && hoverConfig && (hoverConfig.borderColor || hoverConfig.borderStrokeWidth !== void 0)) {
377
+ if (hoverConfig.borderColor) fillAttrs.stroke = hoverConfig.borderColor;
378
+ if (hoverConfig.borderStrokeWidth !== void 0) fillAttrs["stroke-width"] = String(hoverConfig.borderStrokeWidth * 2);
379
+ if (hoverConfig.borderDash) fillAttrs["stroke-dasharray"] = hoverConfig.borderDash.join(" ");
380
+ fillAttrs["paint-order"] = "stroke fill";
381
+ }
382
+ const fillPath = svgNode("path", fillAttrs);
383
+ const strokePath = svgNode("path", strokeAttrs);
384
+ const slotX = Math.cos(toRad(geo.midAngle)) * geo.midRadius;
385
+ const slotY = Math.sin(toRad(geo.midAngle)) * geo.midRadius;
386
+ const contentSlot = svgNode("g", {
387
+ class: "slice-content",
388
+ "data-content-index": dataIndex,
389
+ transform: `translate(${slotX}, ${slotY})`,
390
+ opacity: angle < 0.1 ? "0" : "1"
391
+ });
392
+ const hasOffset = geo.offsetX !== 0 || geo.offsetY !== 0;
393
+ const hasScale = geo.scale !== 1;
394
+ const transformParts = [];
395
+ if (hasOffset) transformParts.push(`translate(${geo.offsetX}, ${geo.offsetY})`);
396
+ if (hasScale) transformParts.push(`scale(${geo.scale})`);
397
+ const groupAttrs = {
398
+ "data-slice-index": dataIndex,
399
+ "data-index": dataIndex,
400
+ // userOpacity + span<0.1 hide, as an ATTRIBUTE (normalized vs style in the parity test).
401
+ opacity: angle < 0.1 ? "0" : String(slice.userOpacity ?? 1),
402
+ ...transformParts.length > 0 ? { transform: transformParts.join(" ") } : {}
403
+ };
404
+ sliceGroups.push(svgNode("g", groupAttrs, [fillPath, strokePath, contentSlot]));
405
+ }
406
+ return defsChildren.length > 0 ? [svgNode("defs", void 0, defsChildren), ...sliceGroups] : sliceGroups;
407
+ }
408
+
409
+ // src/renderers/circular/shared.ts
410
+ function buildSliceRenderContext2(slice, renderInfo, position, geo, chartCenter, fontFamily) {
411
+ const item = renderInfo.data[slice.originalIndex];
412
+ const angle = slice.endAngle - slice.rotation;
413
+ const sliceCtx = makeItemContext(item, slice.originalIndex);
414
+ const originalValue = Number(resolveAccessor(renderInfo.props.valueField, sliceCtx)) || slice.value;
415
+ return {
416
+ index: slice.originalIndex,
417
+ data: item,
418
+ value: originalValue,
419
+ percentage: slice.percentage,
420
+ label: String(resolveAccessor(renderInfo.props.categoryField, sliceCtx) ?? ""),
421
+ color: slice.color ?? getColor(renderInfo.props, slice.originalIndex, item),
422
+ center: chartCenter ?? position,
423
+ x: position.x,
424
+ y: position.y,
425
+ angle: geo.midAngle,
426
+ isHovered: geo.isHovered,
427
+ isVisible: angle > 0.1,
428
+ fontFamily: fontFamily ?? "sans-serif"
429
+ };
430
+ }
431
+
432
+ // src/renderers/circular/canvas.ts
433
+ function buildSliceRenderContext3(slice, renderInfo, position, geo, theme, chartCenter, fontFamily) {
434
+ const item = renderInfo.data[slice.originalIndex];
435
+ const angle = slice.endAngle - slice.rotation;
436
+ const sliceCtx = makeItemContext(item, slice.originalIndex);
437
+ const originalValue = Number(resolveAccessor(renderInfo.props.valueField, sliceCtx)) || slice.value;
438
+ const sliceLabel = String(resolveAccessor(renderInfo.props.categoryField, sliceCtx) ?? "");
439
+ return {
440
+ index: slice.originalIndex,
441
+ data: item,
442
+ value: originalValue,
443
+ percentage: slice.percentage,
444
+ label: sliceLabel,
445
+ color: slice.color ?? getColor(renderInfo.props, slice.originalIndex, item, theme, { value: originalValue, category: sliceLabel }),
446
+ center: position,
447
+ x: position.x,
448
+ y: position.y,
449
+ angle: geo.midAngle,
450
+ isHovered: geo.isHovered,
451
+ isVisible: angle > 0.1,
452
+ fontFamily: fontFamily ?? "sans-serif"
453
+ };
454
+ }
455
+ function renderCanvasDataLabels(ctx, frame, viewportBounds, labelConfig, textColor, datasetPropsMap, hoverConfig, theme, onImageLoad) {
456
+ const { center, hoverState } = frame;
457
+ const built = buildPieDataLabelLayout(frame, labelConfig, { width: viewportBounds.width, height: viewportBounds.height }, datasetPropsMap);
458
+ if (!built) return;
459
+ const { labelLayout, configsByIndex: labelConfigByIndex, labelSlices: sliceMap } = built;
460
+ const hasAnyHover = hoverState.index !== null;
461
+ const drawOptions = {
462
+ fontSize: labelConfig.fontSize,
463
+ fontFamily: labelConfig.fontFamily,
464
+ fontWeight: labelConfig.fontWeight,
465
+ lineHeight: labelConfig.lineHeight,
466
+ textOffset: labelConfig.textOffset,
467
+ centered: labelConfig.lineStyle === "none"
468
+ };
469
+ for (const labelItem of labelLayout.labels) {
470
+ const { index, color: lineColor, side } = labelItem;
471
+ const slice = sliceMap.get(index);
472
+ const isSliceHovered = slice ? hoverState.datasetIndex === slice.datasetIndex && hoverState.index === slice.originalIndex : false;
473
+ const { strokeColor, strokeWidth } = computeLeaderLineHoverEffects(lineColor, isSliceHovered, hasAnyHover, hoverConfig, theme);
474
+ const absLeaderLine = {
475
+ x1: center.x + labelItem.leaderLine.x1,
476
+ y1: center.y + labelItem.leaderLine.y1,
477
+ x2: center.x + labelItem.leaderLine.x2,
478
+ y2: center.y + labelItem.leaderLine.y2,
479
+ x3: center.x + labelItem.leaderLine.x3,
480
+ y3: center.y + labelItem.leaderLine.y3
481
+ };
482
+ if (labelConfig.render) {
483
+ const originalConfig = labelConfigByIndex.get(index);
484
+ const textX = center.x + labelItem.x + (side === "right" ? drawOptions.textOffset : -drawOptions.textOffset);
485
+ const textY = center.y + labelItem.y;
486
+ let handled = false;
487
+ withCanvasState(ctx, () => {
488
+ ctx.translate(textX, textY);
489
+ const renderContext = {
490
+ index,
491
+ value: originalConfig?.value ?? 0,
492
+ percentage: originalConfig?.percentage ?? 0,
493
+ formattedText: originalConfig?.text ?? "",
494
+ label: originalConfig?.label ?? "",
495
+ // Per-label color override wins over the leader-line/slice color in the custom render context.
496
+ color: labelItem.textColor ?? textColor ?? lineColor,
497
+ x: textX,
498
+ y: textY,
499
+ side,
500
+ leaderLine: absLeaderLine,
501
+ center: { x: center.x, y: center.y },
502
+ ctx,
503
+ drawImage: onImageLoad ? createDrawImage(ctx, onImageLoad) : void 0
504
+ };
505
+ labelConfig.render(renderContext);
506
+ handled = true;
507
+ });
508
+ if (handled) continue;
509
+ }
510
+ const lineStrokeColor = labelItem.connectorColor ?? strokeColor;
511
+ const lineStrokeWidth = labelItem.connectorWidth ?? strokeWidth;
512
+ if (labelConfig.lineStyle === "straight") {
513
+ drawCanvasStraightLeaderLine(ctx, labelItem, center.x, center.y, lineStrokeColor, lineStrokeWidth);
514
+ } else if (labelConfig.lineStyle !== "none") {
515
+ drawCanvasLeaderLine(ctx, labelItem, center.x, center.y, lineStrokeColor, lineStrokeWidth);
516
+ }
517
+ const perLabelDrawOptions = labelItem.fontSize !== void 0 ? { ...drawOptions, fontSize: labelItem.fontSize } : drawOptions;
518
+ const perLabelTextColor = labelItem.textColor ?? textColor;
519
+ drawCanvasLabelLines(ctx, labelItem, center.x, center.y, perLabelTextColor, perLabelDrawOptions);
520
+ }
521
+ }
522
+ function renderCanvasCustomContent(ctx, frame, canvasRenderFns, onImageLoad, theme, fontFamily) {
523
+ const { slices, center } = frame;
524
+ for (const slice of slices) {
525
+ let renderInfo;
526
+ for (const [, info] of canvasRenderFns) {
527
+ if (info.datasetIndex === slice.datasetIndex) {
528
+ renderInfo = info;
529
+ break;
530
+ }
531
+ }
532
+ if (renderInfo && renderInfo.data[slice.originalIndex]) {
533
+ const angle = slice.endAngle - slice.rotation;
534
+ const geo = computeSliceGeometry(slice, slice.rotation, frame);
535
+ const x = center.x + Math.cos(toRad(geo.midAngle)) * geo.midRadius + geo.offsetX;
536
+ const y = center.y + Math.sin(toRad(geo.midAngle)) * geo.midRadius + geo.offsetY;
537
+ const opacity = Math.min(1, angle / 10);
538
+ const renderContext = buildSliceRenderContext3(slice, renderInfo, { x, y }, geo, theme, void 0, fontFamily);
539
+ if (renderContext.isVisible) {
540
+ withCanvasState(ctx, () => {
541
+ ctx.globalAlpha = opacity;
542
+ ctx.translate(x, y);
543
+ renderContext.ctx = ctx;
544
+ renderContext.drawImage = createDrawImage(ctx, onImageLoad);
545
+ const result = renderInfo.fn(renderContext);
546
+ if (result && typeof result === "object" && "text" in result) {
547
+ const { text, style } = result;
548
+ const ff = style?.fontFamily ?? fontFamily ?? "sans-serif";
549
+ ctx.font = `${style?.fontWeight ?? "normal"} ${style?.fontSize ?? "12px"} ${ff}`;
550
+ ctx.fillStyle = style?.fill ?? style?.color ?? "#fff";
551
+ ctx.textAlign = "center";
552
+ ctx.textBaseline = "middle";
553
+ ctx.fillText(text, 0, 0);
554
+ }
555
+ });
556
+ }
557
+ }
558
+ }
559
+ }
560
+
561
+ export { applyGradientBrightness, buildPieSvgChildren, buildSliceRenderContext2 as buildSliceRenderContext, renderCanvasCustomContent, renderCanvasDataLabels, restoreGradientBrightness, updatePieCustomContent, updateSvgSlices };