@fluentui/react-charts 9.2.3 → 9.2.4

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 (194) hide show
  1. package/CHANGELOG.md +49 -10
  2. package/dist/index.d.ts +98 -5
  3. package/lib/components/AreaChart/AreaChart.js +3 -3
  4. package/lib/components/AreaChart/AreaChart.js.map +1 -1
  5. package/lib/components/AreaChart/useAreaChartStyles.styles.js +2 -2
  6. package/lib/components/AreaChart/useAreaChartStyles.styles.js.map +1 -1
  7. package/lib/components/AreaChart/useAreaChartStyles.styles.raw.js +3 -15
  8. package/lib/components/AreaChart/useAreaChartStyles.styles.raw.js.map +1 -1
  9. package/lib/components/ChartTable/ChartTable.js +89 -6
  10. package/lib/components/ChartTable/ChartTable.js.map +1 -1
  11. package/lib/components/CommonComponents/CartesianChart.js +38 -34
  12. package/lib/components/CommonComponents/CartesianChart.js.map +1 -1
  13. package/lib/components/CommonComponents/CartesianChart.types.js.map +1 -1
  14. package/lib/components/CommonComponents/useCartesianChartStyles.styles.js +17 -14
  15. package/lib/components/CommonComponents/useCartesianChartStyles.styles.js.map +1 -1
  16. package/lib/components/CommonComponents/useCartesianChartStyles.styles.raw.js +6 -33
  17. package/lib/components/CommonComponents/useCartesianChartStyles.styles.raw.js.map +1 -1
  18. package/lib/components/DeclarativeChart/DeclarativeChart.js +55 -16
  19. package/lib/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
  20. package/lib/components/DeclarativeChart/PlotlyColorAdapter.js +19 -0
  21. package/lib/components/DeclarativeChart/PlotlyColorAdapter.js.map +1 -1
  22. package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js +1058 -291
  23. package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
  24. package/lib/components/DonutChart/Arc/useArcStyles.styles.js +8 -3
  25. package/lib/components/DonutChart/Arc/useArcStyles.styles.js.map +1 -1
  26. package/lib/components/DonutChart/Arc/useArcStyles.styles.raw.js +6 -2
  27. package/lib/components/DonutChart/Arc/useArcStyles.styles.raw.js.map +1 -1
  28. package/lib/components/DonutChart/DonutChart.js +6 -1
  29. package/lib/components/DonutChart/DonutChart.js.map +1 -1
  30. package/lib/components/DonutChart/DonutChart.types.js.map +1 -1
  31. package/lib/components/DonutChart/useDonutChartStyles.styles.js +21 -4
  32. package/lib/components/DonutChart/useDonutChartStyles.styles.js.map +1 -1
  33. package/lib/components/DonutChart/useDonutChartStyles.styles.raw.js +8 -4
  34. package/lib/components/DonutChart/useDonutChartStyles.styles.raw.js.map +1 -1
  35. package/lib/components/FunnelChart/FunnelChart.js +4 -2
  36. package/lib/components/FunnelChart/FunnelChart.js.map +1 -1
  37. package/lib/components/FunnelChart/funnelGeometry.js.map +1 -1
  38. package/lib/components/GaugeChart/GaugeChart.js +1 -2
  39. package/lib/components/GaugeChart/GaugeChart.js.map +1 -1
  40. package/lib/components/GroupedVerticalBarChart/GroupedVerticalBarChart.js +2 -2
  41. package/lib/components/GroupedVerticalBarChart/GroupedVerticalBarChart.js.map +1 -1
  42. package/lib/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.js +4 -17
  43. package/lib/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.js.map +1 -1
  44. package/lib/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.raw.js +4 -21
  45. package/lib/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.raw.js.map +1 -1
  46. package/lib/components/HorizontalBarChart/HorizontalBarChart.js +1 -1
  47. package/lib/components/HorizontalBarChart/HorizontalBarChart.js.map +1 -1
  48. package/lib/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.js +7 -3
  49. package/lib/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.js.map +1 -1
  50. package/lib/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.raw.js +5 -2
  51. package/lib/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.raw.js.map +1 -1
  52. package/lib/components/LineChart/LineChart.js +271 -271
  53. package/lib/components/LineChart/LineChart.js.map +1 -1
  54. package/lib/components/LineChart/LineChart.types.js.map +1 -1
  55. package/lib/components/LineChart/useLineChartStyles.styles.js +23 -10
  56. package/lib/components/LineChart/useLineChartStyles.styles.js.map +1 -1
  57. package/lib/components/LineChart/useLineChartStyles.styles.raw.js +4 -21
  58. package/lib/components/LineChart/useLineChartStyles.styles.raw.js.map +1 -1
  59. package/lib/components/ResponsiveContainer/withResponsiveContainer.js.map +1 -1
  60. package/lib/components/SankeyChart/SankeyChart.js.map +1 -1
  61. package/lib/components/SankeyChart/useSankeyChartStyles.styles.js +12 -25
  62. package/lib/components/SankeyChart/useSankeyChartStyles.styles.js.map +1 -1
  63. package/lib/components/SankeyChart/useSankeyChartStyles.styles.raw.js +2 -12
  64. package/lib/components/SankeyChart/useSankeyChartStyles.styles.raw.js.map +1 -1
  65. package/lib/components/ScatterChart/ScatterChart.js +114 -75
  66. package/lib/components/ScatterChart/ScatterChart.js.map +1 -1
  67. package/lib/components/ScatterChart/ScatterChart.types.js.map +1 -1
  68. package/lib/components/ScatterChart/useScatterChartStyles.styles.js +11 -7
  69. package/lib/components/ScatterChart/useScatterChartStyles.styles.js.map +1 -1
  70. package/lib/components/ScatterChart/useScatterChartStyles.styles.raw.js +4 -22
  71. package/lib/components/ScatterChart/useScatterChartStyles.styles.raw.js.map +1 -1
  72. package/lib/components/VerticalBarChart/VerticalBarChart.js +2 -2
  73. package/lib/components/VerticalBarChart/VerticalBarChart.js.map +1 -1
  74. package/lib/components/VerticalBarChart/useVerticalBarChartStyles.styles.js +8 -6
  75. package/lib/components/VerticalBarChart/useVerticalBarChartStyles.styles.js.map +1 -1
  76. package/lib/components/VerticalBarChart/useVerticalBarChartStyles.styles.raw.js +5 -19
  77. package/lib/components/VerticalBarChart/useVerticalBarChartStyles.styles.raw.js.map +1 -1
  78. package/lib/components/VerticalStackedBarChart/VerticalStackedBarChart.js +2 -2
  79. package/lib/components/VerticalStackedBarChart/VerticalStackedBarChart.js.map +1 -1
  80. package/lib/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.js +7 -6
  81. package/lib/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.js.map +1 -1
  82. package/lib/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.raw.js +4 -19
  83. package/lib/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.raw.js.map +1 -1
  84. package/lib/types/DataPoint.js +3 -1
  85. package/lib/types/DataPoint.js.map +1 -1
  86. package/lib/utilities/Common.styles.js +47 -0
  87. package/lib/utilities/Common.styles.js.map +1 -0
  88. package/lib/utilities/Common.styles.raw.js +47 -0
  89. package/lib/utilities/Common.styles.raw.js.map +1 -0
  90. package/lib/utilities/SVGTooltipText.js.map +1 -1
  91. package/lib/utilities/image-export-utils.js.map +1 -1
  92. package/lib/utilities/index.js +1 -0
  93. package/lib/utilities/index.js.map +1 -1
  94. package/lib/utilities/scatterpolar-utils.js +52 -0
  95. package/lib/utilities/scatterpolar-utils.js.map +1 -0
  96. package/lib/utilities/utilities.js +309 -142
  97. package/lib/utilities/utilities.js.map +1 -1
  98. package/lib/utilities/vbc-utils.js.map +1 -1
  99. package/lib-commonjs/components/AreaChart/AreaChart.js +2 -2
  100. package/lib-commonjs/components/AreaChart/AreaChart.js.map +1 -1
  101. package/lib-commonjs/components/AreaChart/useAreaChartStyles.styles.js.map +1 -1
  102. package/lib-commonjs/components/AreaChart/useAreaChartStyles.styles.raw.js +2 -14
  103. package/lib-commonjs/components/AreaChart/useAreaChartStyles.styles.raw.js.map +1 -1
  104. package/lib-commonjs/components/ChartTable/ChartTable.js +89 -6
  105. package/lib-commonjs/components/ChartTable/ChartTable.js.map +1 -1
  106. package/lib-commonjs/components/CommonComponents/CartesianChart.js +38 -34
  107. package/lib-commonjs/components/CommonComponents/CartesianChart.js.map +1 -1
  108. package/lib-commonjs/components/CommonComponents/CartesianChart.types.js.map +1 -1
  109. package/lib-commonjs/components/CommonComponents/useCartesianChartStyles.styles.js +15 -13
  110. package/lib-commonjs/components/CommonComponents/useCartesianChartStyles.styles.js.map +1 -1
  111. package/lib-commonjs/components/CommonComponents/useCartesianChartStyles.styles.raw.js +4 -32
  112. package/lib-commonjs/components/CommonComponents/useCartesianChartStyles.styles.raw.js.map +1 -1
  113. package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js +58 -19
  114. package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
  115. package/lib-commonjs/components/DeclarativeChart/PlotlyColorAdapter.js +22 -0
  116. package/lib-commonjs/components/DeclarativeChart/PlotlyColorAdapter.js.map +1 -1
  117. package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js +1070 -291
  118. package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
  119. package/lib-commonjs/components/DonutChart/Arc/useArcStyles.styles.js +12 -3
  120. package/lib-commonjs/components/DonutChart/Arc/useArcStyles.styles.js.map +1 -1
  121. package/lib-commonjs/components/DonutChart/Arc/useArcStyles.styles.raw.js +6 -2
  122. package/lib-commonjs/components/DonutChart/Arc/useArcStyles.styles.raw.js.map +1 -1
  123. package/lib-commonjs/components/DonutChart/DonutChart.js +6 -1
  124. package/lib-commonjs/components/DonutChart/DonutChart.js.map +1 -1
  125. package/lib-commonjs/components/DonutChart/DonutChart.types.js.map +1 -1
  126. package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.js +32 -4
  127. package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.js.map +1 -1
  128. package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.raw.js +8 -4
  129. package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.raw.js.map +1 -1
  130. package/lib-commonjs/components/FunnelChart/FunnelChart.js +4 -2
  131. package/lib-commonjs/components/FunnelChart/FunnelChart.js.map +1 -1
  132. package/lib-commonjs/components/FunnelChart/funnelGeometry.js.map +1 -1
  133. package/lib-commonjs/components/GaugeChart/GaugeChart.js +1 -2
  134. package/lib-commonjs/components/GaugeChart/GaugeChart.js.map +1 -1
  135. package/lib-commonjs/components/GroupedVerticalBarChart/GroupedVerticalBarChart.js +2 -2
  136. package/lib-commonjs/components/GroupedVerticalBarChart/GroupedVerticalBarChart.js.map +1 -1
  137. package/lib-commonjs/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.js +2 -19
  138. package/lib-commonjs/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.js.map +1 -1
  139. package/lib-commonjs/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.raw.js +3 -20
  140. package/lib-commonjs/components/GroupedVerticalBarChart/useGroupedVerticalBarChartStyles.styles.raw.js.map +1 -1
  141. package/lib-commonjs/components/HorizontalBarChart/HorizontalBarChart.js +1 -1
  142. package/lib-commonjs/components/HorizontalBarChart/HorizontalBarChart.js.map +1 -1
  143. package/lib-commonjs/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.js +10 -3
  144. package/lib-commonjs/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.js.map +1 -1
  145. package/lib-commonjs/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.raw.js +5 -2
  146. package/lib-commonjs/components/HorizontalBarChart/useHorizontalBarChartStyles.styles.raw.js.map +1 -1
  147. package/lib-commonjs/components/LineChart/LineChart.js +269 -269
  148. package/lib-commonjs/components/LineChart/LineChart.js.map +1 -1
  149. package/lib-commonjs/components/LineChart/LineChart.types.js.map +1 -1
  150. package/lib-commonjs/components/LineChart/useLineChartStyles.styles.js +30 -9
  151. package/lib-commonjs/components/LineChart/useLineChartStyles.styles.js.map +1 -1
  152. package/lib-commonjs/components/LineChart/useLineChartStyles.styles.raw.js +2 -20
  153. package/lib-commonjs/components/LineChart/useLineChartStyles.styles.raw.js.map +1 -1
  154. package/lib-commonjs/components/ResponsiveContainer/withResponsiveContainer.js.map +1 -1
  155. package/lib-commonjs/components/SankeyChart/SankeyChart.js.map +1 -1
  156. package/lib-commonjs/components/SankeyChart/useSankeyChartStyles.styles.js +23 -33
  157. package/lib-commonjs/components/SankeyChart/useSankeyChartStyles.styles.js.map +1 -1
  158. package/lib-commonjs/components/SankeyChart/useSankeyChartStyles.styles.raw.js +1 -12
  159. package/lib-commonjs/components/SankeyChart/useSankeyChartStyles.styles.raw.js.map +1 -1
  160. package/lib-commonjs/components/ScatterChart/ScatterChart.js +112 -73
  161. package/lib-commonjs/components/ScatterChart/ScatterChart.js.map +1 -1
  162. package/lib-commonjs/components/ScatterChart/ScatterChart.types.js.map +1 -1
  163. package/lib-commonjs/components/ScatterChart/useScatterChartStyles.styles.js +13 -7
  164. package/lib-commonjs/components/ScatterChart/useScatterChartStyles.styles.js.map +1 -1
  165. package/lib-commonjs/components/ScatterChart/useScatterChartStyles.styles.raw.js +2 -20
  166. package/lib-commonjs/components/ScatterChart/useScatterChartStyles.styles.raw.js.map +1 -1
  167. package/lib-commonjs/components/VerticalBarChart/VerticalBarChart.js +1 -1
  168. package/lib-commonjs/components/VerticalBarChart/VerticalBarChart.js.map +1 -1
  169. package/lib-commonjs/components/VerticalBarChart/useVerticalBarChartStyles.styles.js +5 -3
  170. package/lib-commonjs/components/VerticalBarChart/useVerticalBarChartStyles.styles.js.map +1 -1
  171. package/lib-commonjs/components/VerticalBarChart/useVerticalBarChartStyles.styles.raw.js +3 -17
  172. package/lib-commonjs/components/VerticalBarChart/useVerticalBarChartStyles.styles.raw.js.map +1 -1
  173. package/lib-commonjs/components/VerticalStackedBarChart/VerticalStackedBarChart.js +1 -1
  174. package/lib-commonjs/components/VerticalStackedBarChart/VerticalStackedBarChart.js.map +1 -1
  175. package/lib-commonjs/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.js +5 -3
  176. package/lib-commonjs/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.js.map +1 -1
  177. package/lib-commonjs/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.raw.js +3 -18
  178. package/lib-commonjs/components/VerticalStackedBarChart/useVerticalStackedBarChartStyles.styles.raw.js.map +1 -1
  179. package/lib-commonjs/types/DataPoint.js +3 -1
  180. package/lib-commonjs/types/DataPoint.js.map +1 -1
  181. package/lib-commonjs/utilities/Common.styles.js +71 -0
  182. package/lib-commonjs/utilities/Common.styles.js.map +1 -0
  183. package/lib-commonjs/utilities/Common.styles.raw.js +71 -0
  184. package/lib-commonjs/utilities/Common.styles.raw.js.map +1 -0
  185. package/lib-commonjs/utilities/SVGTooltipText.js.map +1 -1
  186. package/lib-commonjs/utilities/image-export-utils.js.map +1 -1
  187. package/lib-commonjs/utilities/index.js +1 -0
  188. package/lib-commonjs/utilities/index.js.map +1 -1
  189. package/lib-commonjs/utilities/scatterpolar-utils.js +67 -0
  190. package/lib-commonjs/utilities/scatterpolar-utils.js.map +1 -0
  191. package/lib-commonjs/utilities/utilities.js +322 -133
  192. package/lib-commonjs/utilities/utilities.js.map +1 -1
  193. package/lib-commonjs/utilities/vbc-utils.js.map +1 -1
  194. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/FunnelChart/funnelGeometry.ts"],"sourcesContent":["import * as React from 'react';\nimport { FunnelChartDataPoint } from './FunnelChart.types';\n\nexport interface FunnelSegmentGeometry {\n pathD: string;\n textX: number;\n textY: number;\n availableWidth: number;\n}\n\nexport interface StackedFunnelSegmentGeometry {\n pathD: string;\n textX: number;\n textY: number;\n availableWidth: number;\n}\n\ninterface SubValue {\n category: string;\n value: number;\n color: string;\n}\n\ninterface Stage {\n subValues: SubValue[];\n}\n\nexport function getVerticalFunnelSegmentGeometry({\n d,\n i,\n data,\n funnelWidth,\n funnelHeight,\n isRTL,\n}: {\n d: FunnelChartDataPoint;\n i: number;\n data: FunnelChartDataPoint[];\n funnelWidth: number;\n funnelHeight: number;\n isRTL: boolean;\n}): FunnelSegmentGeometry {\n const segmentHeight = funnelHeight / data.length;\n const widthScale = (value: number) => (value / Math.max(...data.map(dataPoint => dataPoint.value!))) * funnelWidth;\n const topWidth = widthScale(d.value!);\n const bottomWidth = i < data.length - 1 ? widthScale(data[i + 1].value!) : 0;\n const xOffset = (funnelWidth - topWidth) / 2;\n const nextXOffset = (funnelWidth - bottomWidth) / 2;\n const xStart = isRTL ? funnelWidth - xOffset : xOffset;\n const xEnd = isRTL ? funnelWidth - nextXOffset : nextXOffset;\n\n const isLastSegment = i === data.length - 1;\n const textY = isLastSegment ? i * segmentHeight + segmentHeight * 0.33 : i * segmentHeight + segmentHeight / 2;\n\n const textX = funnelWidth / 2;\n let availableWidth = topWidth;\n if (isLastSegment) {\n const yFromTop = textY - i * segmentHeight;\n const widthAtY = topWidth * (1 - yFromTop / segmentHeight);\n availableWidth = Math.max(widthAtY * 0.8, 0);\n } else {\n availableWidth = Math.min(topWidth, bottomWidth) * 0.9;\n }\n const pathD = `M${xStart},${i * segmentHeight}\n L${funnelWidth - xStart},${i * segmentHeight}\n L${funnelWidth - xEnd},${(i + 1) * segmentHeight}\n L${xEnd},${(i + 1) * segmentHeight}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getHorizontalFunnelSegmentGeometry({\n d,\n i,\n data,\n funnelWidth,\n funnelHeight,\n isRTL,\n}: {\n d: FunnelChartDataPoint;\n i: number;\n data: FunnelChartDataPoint[];\n funnelWidth: number;\n funnelHeight: number;\n isRTL: boolean;\n}): FunnelSegmentGeometry {\n const segmentWidth = funnelWidth / data.length;\n const heightScale = (value: number) => (value / Math.max(...data.map(dataPoint => dataPoint.value!))) * funnelHeight;\n const leftHeight = heightScale(d.value!);\n const rightHeight = i < data.length - 1 ? heightScale(data[i + 1].value!) : 0;\n const yOffset = (funnelHeight - leftHeight) / 2;\n const nextYOffset = (funnelHeight - rightHeight) / 2;\n const x0 = i * segmentWidth;\n const x1 = (i + 1) * segmentWidth;\n\n const isLastSegment = i === data.length - 1;\n let textX: number;\n let textY: number;\n let availableWidth = segmentWidth * 0.8;\n\n if (isLastSegment) {\n // For the triangular last segment, position text at 1/4 from the left edge\n textX = x0 + (x1 - x0) * 0.25;\n textY = funnelHeight / 2;\n\n // For triangular segments, we need to check both height and width constraints\n // The segment needs to be large enough to contain text\n const segmentArea = (leftHeight * segmentWidth) / 2; // Area of triangle\n const minAreaForText = 800; // Minimum area needed to show text\n\n if (leftHeight < 40 || segmentArea < minAreaForText) {\n // Hide text if height is too small or area is insufficient\n availableWidth = 0;\n } else {\n // Calculate available width at text position\n const widthAtTextPosition = (x1 - x0) * 0.75;\n availableWidth = widthAtTextPosition * 0.6;\n }\n } else {\n textX = (x0 + x1) / 2;\n textY = funnelHeight / 2;\n const minHeight = Math.min(leftHeight, rightHeight);\n availableWidth = minHeight > 20 ? segmentWidth * 0.8 : 0;\n }\n\n const pathD = `M${x0},${yOffset}\n L${x1},${nextYOffset}\n L${x1},${funnelHeight - nextYOffset}\n L${x0},${funnelHeight - yOffset}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getStackedVerticalFunnelSegmentGeometry({\n i,\n k,\n stages,\n totals,\n maxTotal,\n funnelWidth,\n funnelHeight,\n}: {\n i: number;\n k: number;\n stages: Stage[];\n totals: number[];\n maxTotal: number;\n funnelWidth: number;\n funnelHeight: number;\n}): StackedFunnelSegmentGeometry {\n const segmentHeight = funnelHeight / stages.length;\n const cur = stages[i];\n const next = stages[i + 1] || { subValues: [] };\n const curTotal = totals[i] || 1;\n const nextTotal = totals[i + 1] || 0;\n\n let cumTop = 0;\n let cumBot = 0;\n for (let idx = 0; idx < k; idx++) {\n const v = cur.subValues[idx];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n cumTop += (val / curTotal) * (curTotal / maxTotal) * funnelWidth;\n cumBot += (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelWidth;\n }\n const v = cur.subValues[k];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n const topW = (val / curTotal) * (curTotal / maxTotal) * funnelWidth;\n const botW = (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelWidth;\n const topStart = (funnelWidth - (curTotal / maxTotal) * funnelWidth) / 2 + cumTop;\n const topEnd = topStart + topW;\n const botStart = (funnelWidth - (nextTotal / maxTotal) * funnelWidth) / 2 + cumBot;\n const botEnd = botStart + botW;\n const textX = (topStart + topEnd + botStart + botEnd) / 4;\n\n const isLastSegment = i === stages.length - 1;\n const textY = isLastSegment ? i * segmentHeight + segmentHeight * 0.33 : (i + 0.5) * segmentHeight;\n\n // Calculate available width based on this specific segment's width\n let availableWidth: number;\n if (isLastSegment) {\n // For triangular last segment, use the width at text Y position\n const yFromTop = textY - i * segmentHeight;\n const widthRatio = 1 - yFromTop / segmentHeight;\n availableWidth = topW * widthRatio;\n } else {\n // For trapezoidal segments, use the actual segment width\n availableWidth = Math.min(topW, botW);\n }\n\n const pathD = `M${topStart},${i * segmentHeight}\n L${topEnd},${i * segmentHeight}\n L${botEnd},${(i + 1) * segmentHeight}\n L${botStart},${(i + 1) * segmentHeight}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getStackedHorizontalFunnelSegmentGeometry({\n i,\n k,\n stages,\n totals,\n maxTotal,\n funnelWidth,\n funnelHeight,\n}: {\n i: number;\n k: number;\n stages: Stage[];\n totals: number[];\n maxTotal: number;\n funnelWidth: number;\n funnelHeight: number;\n}): StackedFunnelSegmentGeometry {\n const segmentWidth = funnelWidth / stages.length;\n const cur = stages[i];\n const next = stages[i + 1] || { subValues: [] };\n const curTotal = totals[i] || 1;\n const nextTotal = totals[i + 1] || 0;\n\n let cumTop = 0;\n let cumBot = 0;\n for (let idx = 0; idx < k; idx++) {\n const v = cur.subValues[idx];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n cumTop += (val / curTotal) * (curTotal / maxTotal) * funnelHeight;\n cumBot += (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelHeight;\n }\n const v = cur.subValues[k];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n const topH = (val / curTotal) * (curTotal / maxTotal) * funnelHeight;\n const botH = (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelHeight;\n const leftStart = i * segmentWidth;\n const leftEnd = (i + 1) * segmentWidth;\n const topStart = (funnelHeight - (curTotal / maxTotal) * funnelHeight) / 2 + cumTop;\n const topEnd = topStart + topH;\n const botStart = (funnelHeight - (nextTotal / maxTotal) * funnelHeight) / 2 + cumBot;\n const botEnd = botStart + botH;\n\n const isLastSegment = i === stages.length - 1;\n let textX: number;\n let textY: number;\n let availableWidth: number;\n\n if (isLastSegment) {\n textX = leftStart + (leftEnd - leftStart) * 0.25;\n textY = (topStart + topEnd) / 2;\n // For triangular segments, calculate available width at text position\n const segmentWidthAtTextPos = (leftEnd - leftStart) * 0.5;\n availableWidth = segmentWidthAtTextPos * 0.8;\n\n // For triangular last segments, also check if there's enough height\n // The segment area should be large enough to contain text\n const segmentArea = (topH * segmentWidth) / 2;\n if (topH < 24 || segmentArea < 600) {\n availableWidth = 0;\n }\n } else {\n textX = (leftStart + leftEnd) / 2;\n textY = (topStart + topEnd + botStart + botEnd) / 4;\n // For trapezoidal segments, use full segment width\n availableWidth = Math.abs(leftEnd - leftStart) * 0.9;\n\n // Check if the segment has sufficient height for text\n // For non-last segments, we need to ensure there's enough vertical space\n const avgHeight = (topH + botH) / 2;\n if (avgHeight < 20) {\n availableWidth = 0;\n }\n }\n\n const pathD = `M${leftStart},${topStart}\n L${leftEnd},${botStart}\n L${leftEnd},${botEnd}\n L${leftStart},${topEnd}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getSegmentTextProps({\n availableWidth,\n minTextWidth = 24,\n textX,\n textY,\n value,\n culture,\n onMouseOver,\n onMouseMove,\n onMouseOut,\n}: {\n availableWidth: number;\n minTextWidth?: number;\n textX: number;\n textY: number;\n value: number;\n culture: string | undefined;\n onMouseOver: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseMove: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseOut: (() => void) | undefined;\n}) {\n return {\n show: availableWidth > minTextWidth && availableWidth > 0,\n x: textX,\n y: textY,\n value,\n culture,\n onMouseOver,\n onMouseMove,\n onMouseOut,\n };\n}\n"],"names":["React","getVerticalFunnelSegmentGeometry","d","i","data","funnelWidth","funnelHeight","isRTL","segmentHeight","length","widthScale","value","Math","max","map","dataPoint","topWidth","bottomWidth","xOffset","nextXOffset","xStart","xEnd","isLastSegment","textY","textX","availableWidth","yFromTop","widthAtY","min","pathD","getHorizontalFunnelSegmentGeometry","segmentWidth","heightScale","leftHeight","rightHeight","yOffset","nextYOffset","x0","x1","segmentArea","minAreaForText","widthAtTextPosition","minHeight","getStackedVerticalFunnelSegmentGeometry","k","stages","totals","maxTotal","next","cur","subValues","curTotal","nextTotal","cumTop","cumBot","idx","v","vNext","find","x","category","val","nextVal","topW","botW","topStart","topEnd","botStart","botEnd","widthRatio","getStackedHorizontalFunnelSegmentGeometry","topH","botH","leftStart","leftEnd","segmentWidthAtTextPos","abs","avgHeight","getSegmentTextProps","minTextWidth","culture","onMouseOver","onMouseMove","onMouseOut","show","y"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/components/FunnelChart/funnelGeometry.ts"],"sourcesContent":["import * as React from 'react';\nimport { FunnelChartDataPoint } from './FunnelChart.types';\n\nexport interface FunnelSegmentGeometry {\n pathD: string;\n textX: number;\n textY: number;\n availableWidth: number;\n}\n\nexport interface StackedFunnelSegmentGeometry {\n pathD: string;\n textX: number;\n textY: number;\n availableWidth: number;\n}\n\ninterface SubValue {\n category: string;\n value: number;\n color: string;\n}\n\ninterface Stage {\n subValues: SubValue[];\n}\n\nexport function getVerticalFunnelSegmentGeometry({\n d,\n i,\n data,\n funnelWidth,\n funnelHeight,\n isRTL,\n}: {\n d: FunnelChartDataPoint;\n i: number;\n data: FunnelChartDataPoint[];\n funnelWidth: number;\n funnelHeight: number;\n isRTL: boolean;\n}): FunnelSegmentGeometry {\n const segmentHeight = funnelHeight / data.length;\n const widthScale = (value: number) => (value / Math.max(...data.map(dataPoint => dataPoint.value!))) * funnelWidth;\n const topWidth = widthScale(d.value!);\n const bottomWidth = i < data.length - 1 ? widthScale(data[i + 1].value!) : 0;\n const xOffset = (funnelWidth - topWidth) / 2;\n const nextXOffset = (funnelWidth - bottomWidth) / 2;\n const xStart = isRTL ? funnelWidth - xOffset : xOffset;\n const xEnd = isRTL ? funnelWidth - nextXOffset : nextXOffset;\n\n const isLastSegment = i === data.length - 1;\n const textY = isLastSegment ? i * segmentHeight + segmentHeight * 0.33 : i * segmentHeight + segmentHeight / 2;\n\n const textX = funnelWidth / 2;\n let availableWidth = topWidth;\n if (isLastSegment) {\n const yFromTop = textY - i * segmentHeight;\n const widthAtY = topWidth * (1 - yFromTop / segmentHeight);\n availableWidth = Math.max(widthAtY * 0.8, 0);\n } else {\n availableWidth = Math.min(topWidth, bottomWidth) * 0.9;\n }\n const pathD = `M${xStart},${i * segmentHeight}\n L${funnelWidth - xStart},${i * segmentHeight}\n L${funnelWidth - xEnd},${(i + 1) * segmentHeight}\n L${xEnd},${(i + 1) * segmentHeight}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getHorizontalFunnelSegmentGeometry({\n d,\n i,\n data,\n funnelWidth,\n funnelHeight,\n isRTL,\n}: {\n d: FunnelChartDataPoint;\n i: number;\n data: FunnelChartDataPoint[];\n funnelWidth: number;\n funnelHeight: number;\n isRTL: boolean;\n}): FunnelSegmentGeometry {\n const segmentWidth = funnelWidth / data.length;\n const heightScale = (value: number) => (value / Math.max(...data.map(dataPoint => dataPoint.value!))) * funnelHeight;\n const leftHeight = heightScale(d.value!);\n const rightHeight = i < data.length - 1 ? heightScale(data[i + 1].value!) : 0;\n const yOffset = (funnelHeight - leftHeight) / 2;\n const nextYOffset = (funnelHeight - rightHeight) / 2;\n const x0 = i * segmentWidth;\n const x1 = (i + 1) * segmentWidth;\n\n const isLastSegment = i === data.length - 1;\n let textX: number;\n let textY: number;\n let availableWidth = segmentWidth * 0.8;\n\n if (isLastSegment) {\n // For the triangular last segment, position text at 1/4 from the left edge\n textX = x0 + (x1 - x0) * 0.25;\n textY = funnelHeight / 2;\n\n // For triangular segments, we need to check both height and width constraints\n // The segment needs to be large enough to contain text\n const segmentArea = (leftHeight * segmentWidth) / 2; // Area of triangle\n const minAreaForText = 800; // Minimum area needed to show text\n\n if (leftHeight < 40 || segmentArea < minAreaForText) {\n // Hide text if height is too small or area is insufficient\n availableWidth = 0;\n } else {\n // Calculate available width at text position\n const widthAtTextPosition = (x1 - x0) * 0.75;\n availableWidth = widthAtTextPosition * 0.6;\n }\n } else {\n textX = (x0 + x1) / 2;\n textY = funnelHeight / 2;\n const minHeight = Math.min(leftHeight, rightHeight);\n availableWidth = minHeight > 20 ? segmentWidth * 0.8 : 0;\n }\n\n const pathD = `M${x0},${yOffset}\n L${x1},${nextYOffset}\n L${x1},${funnelHeight - nextYOffset}\n L${x0},${funnelHeight - yOffset}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getStackedVerticalFunnelSegmentGeometry({\n i,\n k,\n stages,\n totals,\n maxTotal,\n funnelWidth,\n funnelHeight,\n}: {\n i: number;\n k: number;\n stages: Stage[];\n totals: number[];\n maxTotal: number;\n funnelWidth: number;\n funnelHeight: number;\n}): StackedFunnelSegmentGeometry {\n const segmentHeight = funnelHeight / stages.length;\n const cur = stages[i];\n const next = stages[i + 1] || { subValues: [] };\n const curTotal = totals[i] || 1;\n const nextTotal = totals[i + 1] || 0;\n\n let cumTop = 0;\n let cumBot = 0;\n for (let idx = 0; idx < k; idx++) {\n const v = cur.subValues[idx];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n cumTop += (val / curTotal) * (curTotal / maxTotal) * funnelWidth;\n cumBot += (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelWidth;\n }\n const v = cur.subValues[k];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n const topW = (val / curTotal) * (curTotal / maxTotal) * funnelWidth;\n const botW = (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelWidth;\n const topStart = (funnelWidth - (curTotal / maxTotal) * funnelWidth) / 2 + cumTop;\n const topEnd = topStart + topW;\n const botStart = (funnelWidth - (nextTotal / maxTotal) * funnelWidth) / 2 + cumBot;\n const botEnd = botStart + botW;\n const textX = (topStart + topEnd + botStart + botEnd) / 4;\n\n const isLastSegment = i === stages.length - 1;\n const textY = isLastSegment ? i * segmentHeight + segmentHeight * 0.33 : (i + 0.5) * segmentHeight;\n\n // Calculate available width based on this specific segment's width\n let availableWidth: number;\n if (isLastSegment) {\n // For triangular last segment, use the width at text Y position\n const yFromTop = textY - i * segmentHeight;\n const widthRatio = 1 - yFromTop / segmentHeight;\n availableWidth = topW * widthRatio;\n } else {\n // For trapezoidal segments, use the actual segment width\n availableWidth = Math.min(topW, botW);\n }\n\n const pathD = `M${topStart},${i * segmentHeight}\n L${topEnd},${i * segmentHeight}\n L${botEnd},${(i + 1) * segmentHeight}\n L${botStart},${(i + 1) * segmentHeight}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getStackedHorizontalFunnelSegmentGeometry({\n i,\n k,\n stages,\n totals,\n maxTotal,\n funnelWidth,\n funnelHeight,\n}: {\n i: number;\n k: number;\n stages: Stage[];\n totals: number[];\n maxTotal: number;\n funnelWidth: number;\n funnelHeight: number;\n}): StackedFunnelSegmentGeometry {\n const segmentWidth = funnelWidth / stages.length;\n const cur = stages[i];\n const next = stages[i + 1] || { subValues: [] };\n const curTotal = totals[i] || 1;\n const nextTotal = totals[i + 1] || 0;\n\n let cumTop = 0;\n let cumBot = 0;\n for (let idx = 0; idx < k; idx++) {\n const v = cur.subValues[idx];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n cumTop += (val / curTotal) * (curTotal / maxTotal) * funnelHeight;\n cumBot += (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelHeight;\n }\n const v = cur.subValues[k];\n const vNext = next.subValues?.find((x: SubValue) => x.category === v.category);\n const val = v.value;\n const nextVal = vNext ? vNext.value : 0;\n const topH = (val / curTotal) * (curTotal / maxTotal) * funnelHeight;\n const botH = (nextVal / nextTotal || 0) * (nextTotal / maxTotal) * funnelHeight;\n const leftStart = i * segmentWidth;\n const leftEnd = (i + 1) * segmentWidth;\n const topStart = (funnelHeight - (curTotal / maxTotal) * funnelHeight) / 2 + cumTop;\n const topEnd = topStart + topH;\n const botStart = (funnelHeight - (nextTotal / maxTotal) * funnelHeight) / 2 + cumBot;\n const botEnd = botStart + botH;\n\n const isLastSegment = i === stages.length - 1;\n let textX: number;\n let textY: number;\n let availableWidth: number;\n\n if (isLastSegment) {\n textX = leftStart + (leftEnd - leftStart) * 0.25;\n textY = (topStart + topEnd) / 2;\n // For triangular segments, calculate available width at text position\n const segmentWidthAtTextPos = (leftEnd - leftStart) * 0.5;\n availableWidth = segmentWidthAtTextPos * 0.8;\n\n // For triangular last segments, also check if there's enough height\n // The segment area should be large enough to contain text\n const segmentArea = (topH * segmentWidth) / 2;\n if (topH < 24 || segmentArea < 600) {\n availableWidth = 0;\n }\n } else {\n textX = (leftStart + leftEnd) / 2;\n textY = (topStart + topEnd + botStart + botEnd) / 4;\n // For trapezoidal segments, use full segment width\n availableWidth = Math.abs(leftEnd - leftStart) * 0.9;\n\n // Check if the segment has sufficient height for text\n // For non-last segments, we need to ensure there's enough vertical space\n const avgHeight = (topH + botH) / 2;\n if (avgHeight < 20) {\n availableWidth = 0;\n }\n }\n\n const pathD = `M${leftStart},${topStart}\n L${leftEnd},${botStart}\n L${leftEnd},${botEnd}\n L${leftStart},${topEnd}\n Z`;\n return { pathD, textX, textY, availableWidth };\n}\n\nexport function getSegmentTextProps({\n availableWidth,\n minTextWidth = 24,\n textX,\n textY,\n value,\n culture,\n onMouseOver,\n onMouseMove,\n onMouseOut,\n}: {\n availableWidth: number;\n minTextWidth?: number;\n textX: number;\n textY: number;\n value: number;\n culture: string | undefined;\n onMouseOver: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseMove: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseOut: (() => void) | undefined;\n}): {\n show: boolean;\n x: number;\n y: number;\n value: number;\n culture: string | undefined;\n onMouseOver: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseMove: ((event: React.MouseEvent<SVGElement>) => void) | undefined;\n onMouseOut: (() => void) | undefined;\n} {\n return {\n show: availableWidth > minTextWidth && availableWidth > 0,\n x: textX,\n y: textY,\n value,\n culture,\n onMouseOver,\n onMouseMove,\n onMouseOut,\n };\n}\n"],"names":["React","getVerticalFunnelSegmentGeometry","d","i","data","funnelWidth","funnelHeight","isRTL","segmentHeight","length","widthScale","value","Math","max","map","dataPoint","topWidth","bottomWidth","xOffset","nextXOffset","xStart","xEnd","isLastSegment","textY","textX","availableWidth","yFromTop","widthAtY","min","pathD","getHorizontalFunnelSegmentGeometry","segmentWidth","heightScale","leftHeight","rightHeight","yOffset","nextYOffset","x0","x1","segmentArea","minAreaForText","widthAtTextPosition","minHeight","getStackedVerticalFunnelSegmentGeometry","k","stages","totals","maxTotal","next","cur","subValues","curTotal","nextTotal","cumTop","cumBot","idx","v","vNext","find","x","category","val","nextVal","topW","botW","topStart","topEnd","botStart","botEnd","widthRatio","getStackedHorizontalFunnelSegmentGeometry","topH","botH","leftStart","leftEnd","segmentWidthAtTextPos","abs","avgHeight","getSegmentTextProps","minTextWidth","culture","onMouseOver","onMouseMove","onMouseOut","show","y"],"mappings":"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"}
@@ -554,8 +554,7 @@ export const GaugeChart = /*#__PURE__*/ React.forwardRef((props, forwardedRef)=>
554
554
  onMouseEnter: (e)=>_handleMouseOver(e, segment.legend),
555
555
  onMouseLeave: (e)=>_handleCalloutDismiss(),
556
556
  onMouseMove: (e)=>_handleMouseOver(e, segment.legend),
557
- "data-is-focusable": _legendHighlighted(segment.legend) || _noLegendHighlighted(),
558
- tabIndex: segment.legend !== '' ? 0 : undefined
557
+ tabIndex: _legendHighlighted(segment.legend) || _noLegendHighlighted() ? 0 : undefined
559
558
  }));
560
559
  }), _renderNeedle(), /*#__PURE__*/ React.createElement("g", {
561
560
  onMouseEnter: (e)=>_handleMouseOver(e, 'Chart value'),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/GaugeChart/GaugeChart.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useGaugeChartStyles } from './useGaugeChartStyles.styles';\nimport { select as d3Select } from 'd3-selection';\nimport { arc as d3Arc } from 'd3-shape';\nimport { YValueHover } from '../../index';\nimport {\n Points,\n areArraysEqual,\n formatScientificLimitWidth,\n getAccessibleDataObject,\n getColorFromToken,\n getNextColor,\n pointTypes,\n useRtl,\n} from '../../utilities/index';\nimport { formatToLocaleString } from '@fluentui/chart-utilities';\nimport { SVGTooltipText } from '../../utilities/SVGTooltipText';\nimport { Legend, LegendShape, Legends, Shape, LegendContainer } from '../Legends/index';\nimport { GaugeChartVariant, GaugeValueFormat, GaugeChartProps, GaugeChartSegment } from './GaugeChart.types';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { ChartPopover } from '../CommonComponents/ChartPopover';\nimport { ImageExportOptions } from '../../types/index';\nimport { toImage } from '../../utilities/image-export-utils';\n\nconst GAUGE_MARGIN = 16;\nconst LABEL_WIDTH = 36;\nconst LABEL_HEIGHT = 16;\nconst LABEL_OFFSET = 4;\nconst TITLE_OFFSET = 11;\nconst EXTRA_NEEDLE_LENGTH = 4;\nexport const ARC_PADDING = 2;\nexport const BREAKPOINTS = [\n { minRadius: 52, arcWidth: 12, fontSize: 20 },\n { minRadius: 70, arcWidth: 16, fontSize: 24 },\n { minRadius: 88, arcWidth: 20, fontSize: 32 },\n { minRadius: 106, arcWidth: 24, fontSize: 32 },\n { minRadius: 124, arcWidth: 28, fontSize: 40 },\n { minRadius: 142, arcWidth: 32, fontSize: 40 },\n];\n\nexport const calcNeedleRotation = (chartValue: number, minValue: number, maxValue: number) => {\n let needleRotation = ((chartValue - minValue) / (maxValue - minValue)) * 180;\n if (needleRotation < 0) {\n needleRotation = 0;\n } else if (needleRotation > 180) {\n needleRotation = 180;\n }\n\n return needleRotation;\n};\n\nexport const getSegmentLabel = (\n segment: ExtendedSegment,\n minValue: number,\n maxValue: number,\n variant?: GaugeChartVariant,\n isAriaLabel: boolean = false,\n) => {\n if (isAriaLabel) {\n return minValue === 0 && variant === 'single-segment'\n ? `${segment.legend}, ${segment.size} out of ${maxValue} or ${((segment.size / maxValue) * 100).toFixed()}%`\n : `${segment.legend}, ${segment.start} to ${segment.end}`;\n }\n\n return minValue === 0 && variant === 'single-segment'\n ? `${segment.size} (${((segment.size / maxValue) * 100).toFixed()}%)`\n : `${segment.start} - ${segment.end}`;\n};\n\nexport const getChartValueLabel = (\n chartValue: number,\n minValue: number,\n maxValue: number,\n chartValueFormat?: GaugeValueFormat | ((sweepFraction: [number, number]) => string),\n forCallout: boolean = false,\n): string => {\n if (forCallout) {\n // When displaying the chart value as a percentage, use fractions in the callout, and vice versa.\n // This helps clarify the actual value and avoid repetition.\n return minValue !== 0\n ? chartValue.toString()\n : chartValueFormat === 'fraction'\n ? `${((chartValue / maxValue) * 100).toFixed()}%`\n : `${chartValue}/${maxValue}`;\n }\n\n return typeof chartValueFormat === 'function'\n ? chartValueFormat([chartValue - minValue, maxValue - minValue])\n : minValue !== 0\n ? chartValue.toString()\n : chartValueFormat === 'fraction'\n ? `${chartValue}/${maxValue}`\n : `${((chartValue / maxValue) * 100).toFixed()}%`;\n};\n\ninterface YValue extends Omit<YValueHover, 'y'> {\n y?: string | number;\n}\nexport interface ExtendedSegment extends GaugeChartSegment {\n start: number;\n end: number;\n}\n\nexport const GaugeChart: React.FunctionComponent<GaugeChartProps> = React.forwardRef<HTMLDivElement, GaugeChartProps>(\n (props, forwardedRef) => {\n const _legendsRef = React.useRef<LegendContainer>(null);\n const _getMargins = () => {\n const { hideMinMax, chartTitle, sublabel } = props;\n return {\n left: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n right: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n top: (chartTitle ? TITLE_OFFSET + LABEL_HEIGHT : EXTRA_NEEDLE_LENGTH / 2) + GAUGE_MARGIN,\n bottom: (sublabel ? LABEL_OFFSET + LABEL_HEIGHT : 0) + GAUGE_MARGIN,\n };\n };\n const _margins: { left: number; right: number; top: number; bottom: number } = _getMargins();\n const _legendsHeight: number = !props.hideLegend ? 32 : 0;\n const _rootElem = React.useRef<HTMLDivElement | null>(null);\n const _isRTL: boolean = useRtl();\n const [width, setWidth] = React.useState<number>(140 + _getMargins().left + _getMargins().right);\n const [height, setHeight] = React.useState<number>(70 + _getMargins().top + _getMargins().bottom + _legendsHeight);\n const [hoveredLegend, setHoveredLegend] = React.useState<string>('');\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const [focusedElement, setFocusedElement] = React.useState<string | undefined>('');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [hoverYValues, setHoverYValues] = React.useState<YValue[]>([]);\n const prevPropsRef = React.useRef<GaugeChartProps | null>(null);\n const _width = props.width || width;\n const _height = props.height || height;\n const _outerRadius: number = Math.min(\n (_width - (_margins.left + _margins.right)) / 2,\n _height - (_margins.top + _margins.bottom + _legendsHeight),\n );\n const { arcWidth, chartValueSize } = _getStylesBasedOnBreakpoint();\n const _innerRadius: number = _outerRadius - arcWidth;\n let _minValue!: number;\n let _maxValue!: number;\n let _segments!: ExtendedSegment[];\n let _calloutAnchor: string = '';\n\n React.useEffect(() => {\n if (_rootElem.current) {\n setWidth(_rootElem.current.clientWidth);\n setHeight(_rootElem.current.clientHeight);\n }\n }, []);\n\n React.useEffect(() => {\n if (prevPropsRef.current) {\n const prevProps = prevPropsRef.current;\n if (!areArraysEqual(prevProps.legendProps?.selectedLegends, props.legendProps?.selectedLegends)) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n }\n prevPropsRef.current = props;\n }, [props]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: _rootElem.current,\n toImage: (opts?: ImageExportOptions): Promise<string> => {\n return toImage(_rootElem.current, _legendsRef.current?.toSVG, _isRTL, opts);\n },\n }),\n [],\n );\n\n const classes = useGaugeChartStyles(props);\n function _getStylesBasedOnBreakpoint() {\n for (let index = BREAKPOINTS.length - 1; index >= 0; index -= 1) {\n if (_outerRadius >= BREAKPOINTS[index].minRadius) {\n return {\n arcWidth: BREAKPOINTS[index].arcWidth,\n chartValueSize: BREAKPOINTS[index].fontSize,\n };\n }\n }\n return {\n arcWidth: BREAKPOINTS[0].arcWidth,\n chartValueSize: BREAKPOINTS[0].fontSize,\n };\n }\n\n function _processProps() {\n const { minValue = 0, maxValue, segments, roundCorners } = props;\n\n let total = minValue;\n const processedSegments: ExtendedSegment[] = segments.map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (segment: { size: number; legend: any; color: string; accessibilityData: any }, index: number) => {\n const size = Math.max(segment.size, 0);\n total += size;\n return {\n legend: segment.legend,\n size,\n color:\n typeof segment.color !== 'undefined'\n ? getColorFromToken(segment.color, false)\n : getNextColor(index, 0, false),\n accessibilityData: segment.accessibilityData,\n start: total - size,\n end: total,\n };\n },\n );\n if (typeof maxValue !== 'undefined' && total < maxValue) {\n processedSegments.push({\n legend: 'Unknown',\n size: maxValue - total,\n color: 'neutralLight',\n start: total,\n end: maxValue,\n });\n total = maxValue;\n }\n\n const arcGenerator = d3Arc()\n .cornerRadius(roundCorners ? 3 : 0)\n .padAngle(ARC_PADDING / _outerRadius)\n .padRadius(_outerRadius);\n const rtlSafeSegments = _isRTL ? Array.from(processedSegments).reverse() : processedSegments;\n let prevAngle = -Math.PI / 2;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const arcs = rtlSafeSegments.map((segment, index) => {\n const endAngle = prevAngle + (segment.size / (total - minValue)) * Math.PI;\n const d = arcGenerator({\n innerRadius: _innerRadius,\n outerRadius: _outerRadius,\n startAngle: prevAngle,\n endAngle,\n })!;\n prevAngle = endAngle;\n return {\n d,\n segmentIndex: _isRTL ? processedSegments.length - 1 - index : index,\n startAngle: prevAngle - (segment.size / (total - minValue)) * Math.PI,\n endAngle,\n };\n });\n\n _minValue = minValue;\n _maxValue = total;\n _segments = processedSegments;\n\n return {\n arcs,\n };\n }\n\n function _renderNeedle() {\n const needleRotation = calcNeedleRotation(props.chartValue, _minValue, _maxValue);\n const rtlSafeNeedleRotation = _isRTL ? 180 - needleRotation : needleRotation;\n const strokeWidth = 2;\n const halfStrokeWidth = strokeWidth / 2;\n const needleLength = _outerRadius - _innerRadius + EXTRA_NEEDLE_LENGTH;\n\n return (\n <g transform={`rotate(${rtlSafeNeedleRotation}, 0, 0)`}>\n <path\n d={`\n M 0,${-halfStrokeWidth - 3}\n L ${-needleLength},${-halfStrokeWidth - 1}\n A ${halfStrokeWidth + 1},${halfStrokeWidth + 1},0,0,0,${-needleLength},${halfStrokeWidth + 1}\n L 0,${halfStrokeWidth + 3}\n A ${halfStrokeWidth + 3},${halfStrokeWidth + 3},0,0,0,0,${-halfStrokeWidth - 3}\n `}\n strokeWidth={strokeWidth}\n className={classes.needle}\n transform={`translate(${-_innerRadius + EXTRA_NEEDLE_LENGTH / 2})`}\n data-is-focusable={true}\n onFocus={e => _handleFocus(e, 'Needle')}\n onBlur={_handleBlur}\n onMouseEnter={e => _handleMouseOver(e, 'Needle')}\n onMouseMove={e => _handleMouseOver(e, 'Needle')}\n role=\"img\"\n aria-label={\n 'Current value: ' + getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat)\n }\n />\n </g>\n );\n }\n\n function _renderLegends() {\n if (props.hideLegend) {\n return null;\n }\n\n const legends: Legend[] = _segments.map((segment, index) => {\n const color: string = segment.color || getNextColor(index, 0, false);\n\n return {\n title: segment.legend,\n color,\n hoverAction: () => {\n setHoveredLegend(segment.legend);\n },\n onMouseOutAction: () => {\n setHoveredLegend('');\n },\n };\n });\n\n return (\n <div className={classes.legendsContainer}>\n <Legends\n legends={legends}\n centerLegends\n {...props.legendProps}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n </div>\n );\n }\n\n function _onLegendSelectionChange(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n selectedLegends: string[],\n event: React.MouseEvent<HTMLButtonElement>,\n currentLegend?: Legend,\n ): void {\n if (props.legendProps?.canSelectMultipleLegends) {\n setSelectedLegends(selectedLegends);\n } else {\n setSelectedLegends(selectedLegends.slice(-1));\n }\n if (props.legendProps?.onChange) {\n props.legendProps.onChange(selectedLegends, event, currentLegend);\n }\n }\n\n /**\n * This function checks if the given legend is highlighted or not.\n * A legend can be highlighted in 2 ways:\n * 1. selection: if the user clicks on it\n * 2. hovering: if there is no selected legend and the user hovers over it\n */\n function _legendHighlighted(legend: string) {\n return _getHighlightedLegend().includes(legend!);\n }\n\n /**\n * This function checks if none of the legends is selected or hovered.\n */\n function _noLegendHighlighted() {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend() {\n return selectedLegends.length > 0 ? selectedLegends : hoveredLegend ? [hoveredLegend] : [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n function _handleFocus(focusEvent: React.FocusEvent<SVGElement>, focusedElement: string) {\n _showCallout(focusEvent, focusedElement, true);\n }\n\n function _handleBlur() {\n _hideCallout(true);\n }\n\n function _handleMouseOver(mouseEvent: React.MouseEvent<SVGElement>, hoveredElement: string) {\n _showCallout(mouseEvent, hoveredElement, false);\n }\n\n function _handleMouseOut() {\n _hideCallout(false);\n }\n\n function _handleCalloutDismiss() {\n _hideCallout(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _showCallout(\n event: React.MouseEvent<SVGElement, MouseEvent> | React.FocusEvent<SVGElement, Element>,\n legend: string,\n isFocusEvent: boolean,\n ) {\n if (_calloutAnchor === legend) {\n return;\n }\n let clientX = 0;\n let clientY = 0;\n if ('clientX' in event) {\n clientX = event.clientX;\n clientY = event.clientY;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const target = event.currentTarget as HTMLElement | SVGElement;\n if (target && 'getBoundingClientRect' in target) {\n const boundingRect = target.getBoundingClientRect();\n clientX = boundingRect.left + boundingRect.width / 2;\n clientY = boundingRect.top + boundingRect.height / 2;\n }\n }\n _calloutAnchor = legend;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const hoverXValue: string =\n 'Current value is ' + getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat, true);\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const hoverYValues: YValue[] = _segments.map(segment => {\n const yValue: YValue = {\n legend: segment.legend,\n y: getSegmentLabel(segment, _minValue, _maxValue, props.variant),\n color: segment.color,\n };\n return yValue;\n });\n _updatePosition(clientX, clientY);\n setPopoverOpen(\n ['Needle', 'Chart value'].includes(legend) || _noLegendHighlighted() || _legendHighlighted(legend),\n );\n setHoverXValue(hoverXValue);\n setHoverYValues(hoverYValues);\n if (isFocusEvent) {\n setFocusedElement(legend);\n }\n }\n\n function _hideCallout(isBlurEvent?: boolean) {\n _calloutAnchor = '';\n setPopoverOpen(false);\n setHoverXValue('');\n setHoverYValues([]);\n if (isBlurEvent) {\n setFocusedElement('');\n }\n }\n\n function _wrapContent(content: string, id: string, maxWidth: number) {\n const textElement = d3Select<SVGTextElement, {}>(`#${id}`);\n textElement.text(content);\n if (!textElement.node()) {\n return false;\n }\n\n let isOverflowing = false;\n let textLength = textElement.node()!.getComputedTextLength();\n while (textLength > maxWidth && content.length > 0) {\n content = content.slice(0, -1);\n textElement.text(content + '...');\n isOverflowing = true;\n textLength = textElement.node()!.getComputedTextLength();\n }\n return isOverflowing;\n }\n\n // TO DO: Write a common functional component for Multi value callout and divide sub count method\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _multiValueCallout(calloutProps: any) {\n const yValueHoverSubCountsExists: boolean = _yValueHoverSubCountsExists(calloutProps.YValueHover);\n return (\n <div className={classes.calloutContentRoot}>\n <div\n className={classes.calloutDateTimeContainer}\n style={yValueHoverSubCountsExists ? { marginBottom: '11px' } : {}}\n >\n <div\n className={classes.calloutContentX}\n {...getAccessibleDataObject(calloutProps!.xAxisCalloutAccessibilityData, 'text', false)}\n >\n {formatToLocaleString(calloutProps!.hoverXValue, props.culture) as React.ReactNode}\n </div>\n </div>\n <div className={classes.calloutInfoContainer} style={yValueHoverSubCountsExists ? { display: 'flex' } : {}}>\n {calloutProps!.YValueHover &&\n calloutProps!.YValueHover.map((yValue: YValueHover, index: number, yValues: YValueHover[]) => {\n const isLast: boolean = index + 1 === yValues.length;\n const { shouldDrawBorderBottom = false } = yValue;\n return (\n <div\n {...getAccessibleDataObject(yValue.callOutAccessibilityData, 'text', false)}\n key={`callout-content-${index}`}\n style={\n yValueHoverSubCountsExists\n ? {\n display: 'inline-block',\n ...(shouldDrawBorderBottom && {\n paddingBottom: '10px',\n }),\n }\n : {\n ...(shouldDrawBorderBottom && {\n paddingBottom: '10px',\n }),\n }\n }\n >\n {_getCalloutContent(yValue, index, yValueHoverSubCountsExists, isLast)}\n </div>\n );\n })}\n {!!calloutProps.descriptionMessage && (\n <div className={classes.descriptionMessage}>{calloutProps.descriptionMessage}</div>\n )}\n </div>\n </div>\n );\n }\n\n function _yValueHoverSubCountsExists(yValueHover?: YValueHover[]) {\n if (yValueHover) {\n return yValueHover.some(\n (yValue: {\n legend?: string;\n y?: number;\n color?: string;\n yAxisCalloutData?: string | { [id: string]: number };\n }) => yValue.yAxisCalloutData && typeof yValue.yAxisCalloutData !== 'string',\n );\n }\n return false;\n }\n\n function _getCalloutContent(\n xValue: YValueHover,\n index: number,\n yValueHoverSubCountsExists: boolean,\n isLast: boolean,\n ): React.ReactNode {\n const marginStyle: React.CSSProperties = isLast ? {} : { marginRight: '16px' };\n const toDrawShape = xValue.index !== undefined && xValue.index !== -1;\n const { culture } = props;\n const yValue = formatToLocaleString(xValue.y, culture) as React.ReactNode;\n if (!xValue.yAxisCalloutData || typeof xValue.yAxisCalloutData === 'string') {\n return (\n <div style={yValueHoverSubCountsExists ? marginStyle : {}}>\n {yValueHoverSubCountsExists && (\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n )}\n <div\n id={`${index}_${xValue.y}`}\n className={classes.calloutBlockContainer}\n style={{ borderInlineStart: `4px solid ${xValue.color}` }}\n >\n {toDrawShape && (\n <Shape\n svgProps={{\n className: classes.shapeStyles,\n }}\n pathProps={{ fill: xValue.color }}\n shape={Points[xValue.index! % Object.keys(pointTypes).length] as LegendShape}\n style={{ display: 'flex' }}\n />\n )}\n <div>\n <div className={classes.calloutlegendText}> {xValue.legend}</div>\n <div className={classes.calloutContentY}>\n {\n formatToLocaleString(\n xValue.yAxisCalloutData ? xValue.yAxisCalloutData : xValue.y || xValue.data,\n culture,\n ) as React.ReactNode\n }\n </div>\n </div>\n </div>\n </div>\n );\n } else {\n const subcounts: { [id: string]: number } = xValue.yAxisCalloutData as { [id: string]: number };\n return (\n <div style={marginStyle}>\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n {Object.keys(subcounts).map((subcountName: string) => {\n return (\n <div key={subcountName} className={classes.calloutBlockContainer}>\n <div className={classes.calloutlegendText}>\n {' '}\n {formatToLocaleString(subcountName, culture) as React.ReactNode}\n </div>\n <div className={classes.calloutContentY}>\n {formatToLocaleString(subcounts[subcountName], culture) as React.ReactNode}\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n }\n\n function _updatePosition(newX: number, newY: number) {\n const threshold = 1; // Set a threshold for movement\n const { x, y } = clickPosition;\n // Calculate the distance moved\n const distance = Math.sqrt(Math.pow(newX - x, 2) + Math.pow(newY - y, 2));\n // Update the position only if the distance moved is greater than the threshold\n if (distance > threshold) {\n setClickPosition({ x: newX, y: newY });\n setPopoverOpen(true);\n }\n }\n\n function _getChartTitle(): string {\n const { chartTitle } = props;\n return (chartTitle ? `${chartTitle}. ` : '') + `Gauge chart with ${_segments.length} segments. `;\n }\n const { arcs } = _processProps();\n const focusAttributes = useFocusableGroup();\n return (\n <div className={classes.root} ref={el => (_rootElem.current = el)}>\n <div className={classes.chartWrapper} {...focusAttributes}>\n <svg\n className={classes.chart}\n width={_width}\n height={_height - _legendsHeight}\n role=\"region\"\n aria-label={_getChartTitle()}\n onMouseLeave={_handleMouseOut}\n >\n <g transform={`translate(${_width / 2}, ${_height - (_margins.bottom + _legendsHeight)})`}>\n {props.chartTitle && (\n <text\n x={0}\n y={-(_outerRadius + TITLE_OFFSET)}\n textAnchor=\"middle\"\n className={classes.chartTitle}\n aria-hidden={true}\n >\n {props.chartTitle}\n </text>\n )}\n {!props.hideMinMax && (\n <>\n <text\n x={(_isRTL ? 1 : -1) * (_outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"end\"\n className={classes.limits}\n role=\"img\"\n aria-label={`Min value: ${_minValue}`}\n >\n {formatScientificLimitWidth(_minValue)}\n </text>\n <text\n x={(_isRTL ? -1 : 1) * (_outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"start\"\n className={classes.limits}\n role=\"img\"\n aria-label={`Max value: ${_maxValue}`}\n >\n {formatScientificLimitWidth(_maxValue)}\n </text>\n </>\n )}\n {arcs.map((arc, index) => {\n const segment = _segments[arc.segmentIndex];\n return (\n <React.Fragment key={index}>\n <path\n d={arc.d}\n strokeWidth={focusedElement === segment.legend ? ARC_PADDING : 0}\n className={classes.segment}\n fill={segment.color}\n opacity={_legendHighlighted(segment.legend) || _noLegendHighlighted() ? 1 : 0.1}\n {...getAccessibleDataObject(\n {\n ariaLabel: getSegmentLabel(segment, _minValue, _maxValue, props.variant, true),\n ...segment.accessibilityData,\n },\n 'img',\n true,\n )}\n onFocus={e => _handleFocus(e, segment.legend)}\n onBlur={_handleBlur}\n onMouseEnter={e => _handleMouseOver(e, segment.legend)}\n onMouseLeave={e => _handleCalloutDismiss()}\n onMouseMove={e => _handleMouseOver(e, segment.legend)}\n data-is-focusable={_legendHighlighted(segment.legend) || _noLegendHighlighted()}\n tabIndex={segment.legend !== '' ? 0 : undefined}\n />\n </React.Fragment>\n );\n })}\n {_renderNeedle()}\n <g\n onMouseEnter={e => _handleMouseOver(e, 'Chart value')}\n onMouseMove={e => _handleMouseOver(e, 'Chart value')}\n >\n <SVGTooltipText\n content={getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat)}\n textProps={{\n x: 0,\n y: 0,\n textAnchor: 'middle',\n className: classes.chartValue,\n fontSize: chartValueSize,\n 'aria-hidden': 'true',\n }}\n maxWidth={_innerRadius * 2 - 24}\n wrapContent={_wrapContent}\n />\n </g>\n {props.sublabel && (\n <SVGTooltipText\n content={props.sublabel}\n textProps={{\n x: 0,\n y: 4,\n textAnchor: 'middle',\n dominantBaseline: 'hanging',\n className: classes.sublabel,\n }}\n maxWidth={_innerRadius * 2}\n wrapContent={_wrapContent}\n />\n )}\n </g>\n </svg>\n </div>\n {_renderLegends()}\n {!props.hideTooltip && isPopoverOpen && (\n <ChartPopover\n {...props.calloutProps}\n clickPosition={clickPosition}\n isPopoverOpen={isPopoverOpen}\n customCallout={{\n customizedCallout: _multiValueCallout({ hoverXValue: hoverXValue, YValueHover: hoverYValues }),\n }}\n />\n )}\n </div>\n );\n },\n);\nGaugeChart.displayName = 'GaugeChart';\n"],"names":["React","useGaugeChartStyles","select","d3Select","arc","d3Arc","Points","areArraysEqual","formatScientificLimitWidth","getAccessibleDataObject","getColorFromToken","getNextColor","pointTypes","useRtl","formatToLocaleString","SVGTooltipText","Legends","Shape","useFocusableGroup","ChartPopover","toImage","GAUGE_MARGIN","LABEL_WIDTH","LABEL_HEIGHT","LABEL_OFFSET","TITLE_OFFSET","EXTRA_NEEDLE_LENGTH","ARC_PADDING","BREAKPOINTS","minRadius","arcWidth","fontSize","calcNeedleRotation","chartValue","minValue","maxValue","needleRotation","getSegmentLabel","segment","variant","isAriaLabel","legend","size","toFixed","start","end","getChartValueLabel","chartValueFormat","forCallout","toString","GaugeChart","forwardRef","props","forwardedRef","_legendsRef","useRef","_getMargins","hideMinMax","chartTitle","sublabel","left","right","top","bottom","_margins","_legendsHeight","hideLegend","_rootElem","_isRTL","width","setWidth","useState","height","setHeight","hoveredLegend","setHoveredLegend","selectedLegends","setSelectedLegends","legendProps","focusedElement","setFocusedElement","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","hoverXValue","setHoverXValue","hoverYValues","setHoverYValues","prevPropsRef","_width","_height","_outerRadius","Math","min","chartValueSize","_getStylesBasedOnBreakpoint","_innerRadius","_minValue","_maxValue","_segments","_calloutAnchor","useEffect","current","clientWidth","clientHeight","prevProps","useImperativeHandle","componentRef","chartContainer","opts","toSVG","classes","index","length","_processProps","segments","roundCorners","total","processedSegments","map","max","color","accessibilityData","push","arcGenerator","cornerRadius","padAngle","padRadius","rtlSafeSegments","Array","from","reverse","prevAngle","PI","arcs","endAngle","d","innerRadius","outerRadius","startAngle","segmentIndex","_renderNeedle","rtlSafeNeedleRotation","strokeWidth","halfStrokeWidth","needleLength","g","transform","path","className","needle","data-is-focusable","onFocus","e","_handleFocus","onBlur","_handleBlur","onMouseEnter","_handleMouseOver","onMouseMove","role","aria-label","_renderLegends","legends","title","hoverAction","onMouseOutAction","div","legendsContainer","centerLegends","onChange","_onLegendSelectionChange","legendRef","event","currentLegend","canSelectMultipleLegends","slice","_legendHighlighted","_getHighlightedLegend","includes","_noLegendHighlighted","focusEvent","_showCallout","_hideCallout","mouseEvent","hoveredElement","_handleMouseOut","_handleCalloutDismiss","isFocusEvent","clientX","clientY","target","currentTarget","boundingRect","getBoundingClientRect","yValue","_updatePosition","isBlurEvent","_wrapContent","content","id","maxWidth","textElement","text","node","isOverflowing","textLength","getComputedTextLength","_multiValueCallout","calloutProps","yValueHoverSubCountsExists","_yValueHoverSubCountsExists","YValueHover","calloutContentRoot","calloutDateTimeContainer","style","marginBottom","calloutContentX","xAxisCalloutAccessibilityData","culture","calloutInfoContainer","display","yValues","isLast","shouldDrawBorderBottom","callOutAccessibilityData","key","paddingBottom","_getCalloutContent","descriptionMessage","yValueHover","some","yAxisCalloutData","xValue","marginStyle","marginRight","toDrawShape","undefined","calloutBlockContainer","borderInlineStart","svgProps","shapeStyles","pathProps","fill","shape","Object","keys","calloutlegendText","calloutContentY","data","subcounts","subcountName","newX","newY","threshold","distance","sqrt","pow","_getChartTitle","focusAttributes","root","ref","el","chartWrapper","svg","chart","onMouseLeave","textAnchor","aria-hidden","limits","Fragment","opacity","ariaLabel","tabIndex","textProps","wrapContent","dominantBaseline","hideTooltip","customCallout","customizedCallout","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/components/GaugeChart/GaugeChart.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useGaugeChartStyles } from './useGaugeChartStyles.styles';\nimport { select as d3Select } from 'd3-selection';\nimport { arc as d3Arc } from 'd3-shape';\nimport { YValueHover } from '../../index';\nimport {\n Points,\n areArraysEqual,\n formatScientificLimitWidth,\n getAccessibleDataObject,\n getColorFromToken,\n getNextColor,\n pointTypes,\n useRtl,\n} from '../../utilities/index';\nimport { formatToLocaleString } from '@fluentui/chart-utilities';\nimport { SVGTooltipText } from '../../utilities/SVGTooltipText';\nimport { Legend, LegendShape, Legends, Shape, LegendContainer } from '../Legends/index';\nimport { GaugeChartVariant, GaugeValueFormat, GaugeChartProps, GaugeChartSegment } from './GaugeChart.types';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { ChartPopover } from '../CommonComponents/ChartPopover';\nimport { ImageExportOptions } from '../../types/index';\nimport { toImage } from '../../utilities/image-export-utils';\n\nconst GAUGE_MARGIN = 16;\nconst LABEL_WIDTH = 36;\nconst LABEL_HEIGHT = 16;\nconst LABEL_OFFSET = 4;\nconst TITLE_OFFSET = 11;\nconst EXTRA_NEEDLE_LENGTH = 4;\nexport const ARC_PADDING = 2;\nexport const BREAKPOINTS = [\n { minRadius: 52, arcWidth: 12, fontSize: 20 },\n { minRadius: 70, arcWidth: 16, fontSize: 24 },\n { minRadius: 88, arcWidth: 20, fontSize: 32 },\n { minRadius: 106, arcWidth: 24, fontSize: 32 },\n { minRadius: 124, arcWidth: 28, fontSize: 40 },\n { minRadius: 142, arcWidth: 32, fontSize: 40 },\n];\n\nexport const calcNeedleRotation = (chartValue: number, minValue: number, maxValue: number): number => {\n let needleRotation = ((chartValue - minValue) / (maxValue - minValue)) * 180;\n if (needleRotation < 0) {\n needleRotation = 0;\n } else if (needleRotation > 180) {\n needleRotation = 180;\n }\n\n return needleRotation;\n};\n\nexport const getSegmentLabel = (\n segment: ExtendedSegment,\n minValue: number,\n maxValue: number,\n variant?: GaugeChartVariant,\n isAriaLabel: boolean = false,\n): string => {\n if (isAriaLabel) {\n return minValue === 0 && variant === 'single-segment'\n ? `${segment.legend}, ${segment.size} out of ${maxValue} or ${((segment.size / maxValue) * 100).toFixed()}%`\n : `${segment.legend}, ${segment.start} to ${segment.end}`;\n }\n\n return minValue === 0 && variant === 'single-segment'\n ? `${segment.size} (${((segment.size / maxValue) * 100).toFixed()}%)`\n : `${segment.start} - ${segment.end}`;\n};\n\nexport const getChartValueLabel = (\n chartValue: number,\n minValue: number,\n maxValue: number,\n chartValueFormat?: GaugeValueFormat | ((sweepFraction: [number, number]) => string),\n forCallout: boolean = false,\n): string => {\n if (forCallout) {\n // When displaying the chart value as a percentage, use fractions in the callout, and vice versa.\n // This helps clarify the actual value and avoid repetition.\n return minValue !== 0\n ? chartValue.toString()\n : chartValueFormat === 'fraction'\n ? `${((chartValue / maxValue) * 100).toFixed()}%`\n : `${chartValue}/${maxValue}`;\n }\n\n return typeof chartValueFormat === 'function'\n ? chartValueFormat([chartValue - minValue, maxValue - minValue])\n : minValue !== 0\n ? chartValue.toString()\n : chartValueFormat === 'fraction'\n ? `${chartValue}/${maxValue}`\n : `${((chartValue / maxValue) * 100).toFixed()}%`;\n};\n\ninterface YValue extends Omit<YValueHover, 'y'> {\n y?: string | number;\n}\nexport interface ExtendedSegment extends GaugeChartSegment {\n start: number;\n end: number;\n}\n\nexport const GaugeChart: React.FunctionComponent<GaugeChartProps> = React.forwardRef<HTMLDivElement, GaugeChartProps>(\n (props, forwardedRef) => {\n const _legendsRef = React.useRef<LegendContainer>(null);\n const _getMargins = () => {\n const { hideMinMax, chartTitle, sublabel } = props;\n return {\n left: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n right: (!hideMinMax ? LABEL_OFFSET + LABEL_WIDTH : 0) + GAUGE_MARGIN,\n top: (chartTitle ? TITLE_OFFSET + LABEL_HEIGHT : EXTRA_NEEDLE_LENGTH / 2) + GAUGE_MARGIN,\n bottom: (sublabel ? LABEL_OFFSET + LABEL_HEIGHT : 0) + GAUGE_MARGIN,\n };\n };\n const _margins: { left: number; right: number; top: number; bottom: number } = _getMargins();\n const _legendsHeight: number = !props.hideLegend ? 32 : 0;\n const _rootElem = React.useRef<HTMLDivElement | null>(null);\n const _isRTL: boolean = useRtl();\n const [width, setWidth] = React.useState<number>(140 + _getMargins().left + _getMargins().right);\n const [height, setHeight] = React.useState<number>(70 + _getMargins().top + _getMargins().bottom + _legendsHeight);\n const [hoveredLegend, setHoveredLegend] = React.useState<string>('');\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const [focusedElement, setFocusedElement] = React.useState<string | undefined>('');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [hoverYValues, setHoverYValues] = React.useState<YValue[]>([]);\n const prevPropsRef = React.useRef<GaugeChartProps | null>(null);\n const _width = props.width || width;\n const _height = props.height || height;\n const _outerRadius: number = Math.min(\n (_width - (_margins.left + _margins.right)) / 2,\n _height - (_margins.top + _margins.bottom + _legendsHeight),\n );\n const { arcWidth, chartValueSize } = _getStylesBasedOnBreakpoint();\n const _innerRadius: number = _outerRadius - arcWidth;\n let _minValue!: number;\n let _maxValue!: number;\n let _segments!: ExtendedSegment[];\n let _calloutAnchor: string = '';\n\n React.useEffect(() => {\n if (_rootElem.current) {\n setWidth(_rootElem.current.clientWidth);\n setHeight(_rootElem.current.clientHeight);\n }\n }, []);\n\n React.useEffect(() => {\n if (prevPropsRef.current) {\n const prevProps = prevPropsRef.current;\n if (!areArraysEqual(prevProps.legendProps?.selectedLegends, props.legendProps?.selectedLegends)) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n }\n prevPropsRef.current = props;\n }, [props]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: _rootElem.current,\n toImage: (opts?: ImageExportOptions): Promise<string> => {\n return toImage(_rootElem.current, _legendsRef.current?.toSVG, _isRTL, opts);\n },\n }),\n [],\n );\n\n const classes = useGaugeChartStyles(props);\n function _getStylesBasedOnBreakpoint() {\n for (let index = BREAKPOINTS.length - 1; index >= 0; index -= 1) {\n if (_outerRadius >= BREAKPOINTS[index].minRadius) {\n return {\n arcWidth: BREAKPOINTS[index].arcWidth,\n chartValueSize: BREAKPOINTS[index].fontSize,\n };\n }\n }\n return {\n arcWidth: BREAKPOINTS[0].arcWidth,\n chartValueSize: BREAKPOINTS[0].fontSize,\n };\n }\n\n function _processProps() {\n const { minValue = 0, maxValue, segments, roundCorners } = props;\n\n let total = minValue;\n const processedSegments: ExtendedSegment[] = segments.map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (segment: { size: number; legend: any; color: string; accessibilityData: any }, index: number) => {\n const size = Math.max(segment.size, 0);\n total += size;\n return {\n legend: segment.legend,\n size,\n color:\n typeof segment.color !== 'undefined'\n ? getColorFromToken(segment.color, false)\n : getNextColor(index, 0, false),\n accessibilityData: segment.accessibilityData,\n start: total - size,\n end: total,\n };\n },\n );\n if (typeof maxValue !== 'undefined' && total < maxValue) {\n processedSegments.push({\n legend: 'Unknown',\n size: maxValue - total,\n color: 'neutralLight',\n start: total,\n end: maxValue,\n });\n total = maxValue;\n }\n\n const arcGenerator = d3Arc()\n .cornerRadius(roundCorners ? 3 : 0)\n .padAngle(ARC_PADDING / _outerRadius)\n .padRadius(_outerRadius);\n const rtlSafeSegments = _isRTL ? Array.from(processedSegments).reverse() : processedSegments;\n let prevAngle = -Math.PI / 2;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const arcs = rtlSafeSegments.map((segment, index) => {\n const endAngle = prevAngle + (segment.size / (total - minValue)) * Math.PI;\n const d = arcGenerator({\n innerRadius: _innerRadius,\n outerRadius: _outerRadius,\n startAngle: prevAngle,\n endAngle,\n })!;\n prevAngle = endAngle;\n return {\n d,\n segmentIndex: _isRTL ? processedSegments.length - 1 - index : index,\n startAngle: prevAngle - (segment.size / (total - minValue)) * Math.PI,\n endAngle,\n };\n });\n\n _minValue = minValue;\n _maxValue = total;\n _segments = processedSegments;\n\n return {\n arcs,\n };\n }\n\n function _renderNeedle() {\n const needleRotation = calcNeedleRotation(props.chartValue, _minValue, _maxValue);\n const rtlSafeNeedleRotation = _isRTL ? 180 - needleRotation : needleRotation;\n const strokeWidth = 2;\n const halfStrokeWidth = strokeWidth / 2;\n const needleLength = _outerRadius - _innerRadius + EXTRA_NEEDLE_LENGTH;\n\n return (\n <g transform={`rotate(${rtlSafeNeedleRotation}, 0, 0)`}>\n <path\n d={`\n M 0,${-halfStrokeWidth - 3}\n L ${-needleLength},${-halfStrokeWidth - 1}\n A ${halfStrokeWidth + 1},${halfStrokeWidth + 1},0,0,0,${-needleLength},${halfStrokeWidth + 1}\n L 0,${halfStrokeWidth + 3}\n A ${halfStrokeWidth + 3},${halfStrokeWidth + 3},0,0,0,0,${-halfStrokeWidth - 3}\n `}\n strokeWidth={strokeWidth}\n className={classes.needle}\n transform={`translate(${-_innerRadius + EXTRA_NEEDLE_LENGTH / 2})`}\n data-is-focusable={true}\n onFocus={e => _handleFocus(e, 'Needle')}\n onBlur={_handleBlur}\n onMouseEnter={e => _handleMouseOver(e, 'Needle')}\n onMouseMove={e => _handleMouseOver(e, 'Needle')}\n role=\"img\"\n aria-label={\n 'Current value: ' + getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat)\n }\n />\n </g>\n );\n }\n\n function _renderLegends() {\n if (props.hideLegend) {\n return null;\n }\n\n const legends: Legend[] = _segments.map((segment, index) => {\n const color: string = segment.color || getNextColor(index, 0, false);\n\n return {\n title: segment.legend,\n color,\n hoverAction: () => {\n setHoveredLegend(segment.legend);\n },\n onMouseOutAction: () => {\n setHoveredLegend('');\n },\n };\n });\n\n return (\n <div className={classes.legendsContainer}>\n <Legends\n legends={legends}\n centerLegends\n {...props.legendProps}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n </div>\n );\n }\n\n function _onLegendSelectionChange(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n selectedLegends: string[],\n event: React.MouseEvent<HTMLButtonElement>,\n currentLegend?: Legend,\n ): void {\n if (props.legendProps?.canSelectMultipleLegends) {\n setSelectedLegends(selectedLegends);\n } else {\n setSelectedLegends(selectedLegends.slice(-1));\n }\n if (props.legendProps?.onChange) {\n props.legendProps.onChange(selectedLegends, event, currentLegend);\n }\n }\n\n /**\n * This function checks if the given legend is highlighted or not.\n * A legend can be highlighted in 2 ways:\n * 1. selection: if the user clicks on it\n * 2. hovering: if there is no selected legend and the user hovers over it\n */\n function _legendHighlighted(legend: string) {\n return _getHighlightedLegend().includes(legend!);\n }\n\n /**\n * This function checks if none of the legends is selected or hovered.\n */\n function _noLegendHighlighted() {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend() {\n return selectedLegends.length > 0 ? selectedLegends : hoveredLegend ? [hoveredLegend] : [];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n function _handleFocus(focusEvent: React.FocusEvent<SVGElement>, focusedElement: string) {\n _showCallout(focusEvent, focusedElement, true);\n }\n\n function _handleBlur() {\n _hideCallout(true);\n }\n\n function _handleMouseOver(mouseEvent: React.MouseEvent<SVGElement>, hoveredElement: string) {\n _showCallout(mouseEvent, hoveredElement, false);\n }\n\n function _handleMouseOut() {\n _hideCallout(false);\n }\n\n function _handleCalloutDismiss() {\n _hideCallout(false);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _showCallout(\n event: React.MouseEvent<SVGElement, MouseEvent> | React.FocusEvent<SVGElement, Element>,\n legend: string,\n isFocusEvent: boolean,\n ) {\n if (_calloutAnchor === legend) {\n return;\n }\n let clientX = 0;\n let clientY = 0;\n if ('clientX' in event) {\n clientX = event.clientX;\n clientY = event.clientY;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const target = event.currentTarget as HTMLElement | SVGElement;\n if (target && 'getBoundingClientRect' in target) {\n const boundingRect = target.getBoundingClientRect();\n clientX = boundingRect.left + boundingRect.width / 2;\n clientY = boundingRect.top + boundingRect.height / 2;\n }\n }\n _calloutAnchor = legend;\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const hoverXValue: string =\n 'Current value is ' + getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat, true);\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const hoverYValues: YValue[] = _segments.map(segment => {\n const yValue: YValue = {\n legend: segment.legend,\n y: getSegmentLabel(segment, _minValue, _maxValue, props.variant),\n color: segment.color,\n };\n return yValue;\n });\n _updatePosition(clientX, clientY);\n setPopoverOpen(\n ['Needle', 'Chart value'].includes(legend) || _noLegendHighlighted() || _legendHighlighted(legend),\n );\n setHoverXValue(hoverXValue);\n setHoverYValues(hoverYValues);\n if (isFocusEvent) {\n setFocusedElement(legend);\n }\n }\n\n function _hideCallout(isBlurEvent?: boolean) {\n _calloutAnchor = '';\n setPopoverOpen(false);\n setHoverXValue('');\n setHoverYValues([]);\n if (isBlurEvent) {\n setFocusedElement('');\n }\n }\n\n function _wrapContent(content: string, id: string, maxWidth: number) {\n const textElement = d3Select<SVGTextElement, {}>(`#${id}`);\n textElement.text(content);\n if (!textElement.node()) {\n return false;\n }\n\n let isOverflowing = false;\n let textLength = textElement.node()!.getComputedTextLength();\n while (textLength > maxWidth && content.length > 0) {\n content = content.slice(0, -1);\n textElement.text(content + '...');\n isOverflowing = true;\n textLength = textElement.node()!.getComputedTextLength();\n }\n return isOverflowing;\n }\n\n // TO DO: Write a common functional component for Multi value callout and divide sub count method\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _multiValueCallout(calloutProps: any) {\n const yValueHoverSubCountsExists: boolean = _yValueHoverSubCountsExists(calloutProps.YValueHover);\n return (\n <div className={classes.calloutContentRoot}>\n <div\n className={classes.calloutDateTimeContainer}\n style={yValueHoverSubCountsExists ? { marginBottom: '11px' } : {}}\n >\n <div\n className={classes.calloutContentX}\n {...getAccessibleDataObject(calloutProps!.xAxisCalloutAccessibilityData, 'text', false)}\n >\n {formatToLocaleString(calloutProps!.hoverXValue, props.culture) as React.ReactNode}\n </div>\n </div>\n <div className={classes.calloutInfoContainer} style={yValueHoverSubCountsExists ? { display: 'flex' } : {}}>\n {calloutProps!.YValueHover &&\n calloutProps!.YValueHover.map((yValue: YValueHover, index: number, yValues: YValueHover[]) => {\n const isLast: boolean = index + 1 === yValues.length;\n const { shouldDrawBorderBottom = false } = yValue;\n return (\n <div\n {...getAccessibleDataObject(yValue.callOutAccessibilityData, 'text', false)}\n key={`callout-content-${index}`}\n style={\n yValueHoverSubCountsExists\n ? {\n display: 'inline-block',\n ...(shouldDrawBorderBottom && {\n paddingBottom: '10px',\n }),\n }\n : {\n ...(shouldDrawBorderBottom && {\n paddingBottom: '10px',\n }),\n }\n }\n >\n {_getCalloutContent(yValue, index, yValueHoverSubCountsExists, isLast)}\n </div>\n );\n })}\n {!!calloutProps.descriptionMessage && (\n <div className={classes.descriptionMessage}>{calloutProps.descriptionMessage}</div>\n )}\n </div>\n </div>\n );\n }\n\n function _yValueHoverSubCountsExists(yValueHover?: YValueHover[]) {\n if (yValueHover) {\n return yValueHover.some(\n (yValue: {\n legend?: string;\n y?: number;\n color?: string;\n yAxisCalloutData?: string | { [id: string]: number };\n }) => yValue.yAxisCalloutData && typeof yValue.yAxisCalloutData !== 'string',\n );\n }\n return false;\n }\n\n function _getCalloutContent(\n xValue: YValueHover,\n index: number,\n yValueHoverSubCountsExists: boolean,\n isLast: boolean,\n ): React.ReactNode {\n const marginStyle: React.CSSProperties = isLast ? {} : { marginRight: '16px' };\n const toDrawShape = xValue.index !== undefined && xValue.index !== -1;\n const { culture } = props;\n const yValue = formatToLocaleString(xValue.y, culture) as React.ReactNode;\n if (!xValue.yAxisCalloutData || typeof xValue.yAxisCalloutData === 'string') {\n return (\n <div style={yValueHoverSubCountsExists ? marginStyle : {}}>\n {yValueHoverSubCountsExists && (\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n )}\n <div\n id={`${index}_${xValue.y}`}\n className={classes.calloutBlockContainer}\n style={{ borderInlineStart: `4px solid ${xValue.color}` }}\n >\n {toDrawShape && (\n <Shape\n svgProps={{\n className: classes.shapeStyles,\n }}\n pathProps={{ fill: xValue.color }}\n shape={Points[xValue.index! % Object.keys(pointTypes).length] as LegendShape}\n style={{ display: 'flex' }}\n />\n )}\n <div>\n <div className={classes.calloutlegendText}> {xValue.legend}</div>\n <div className={classes.calloutContentY}>\n {\n formatToLocaleString(\n xValue.yAxisCalloutData ? xValue.yAxisCalloutData : xValue.y || xValue.data,\n culture,\n ) as React.ReactNode\n }\n </div>\n </div>\n </div>\n </div>\n );\n } else {\n const subcounts: { [id: string]: number } = xValue.yAxisCalloutData as { [id: string]: number };\n return (\n <div style={marginStyle}>\n <div className=\"ms-fontWeight-semibold\" style={{ fontSize: '12pt' }}>\n {xValue.legend!} ({yValue})\n </div>\n {Object.keys(subcounts).map((subcountName: string) => {\n return (\n <div key={subcountName} className={classes.calloutBlockContainer}>\n <div className={classes.calloutlegendText}>\n {' '}\n {formatToLocaleString(subcountName, culture) as React.ReactNode}\n </div>\n <div className={classes.calloutContentY}>\n {formatToLocaleString(subcounts[subcountName], culture) as React.ReactNode}\n </div>\n </div>\n );\n })}\n </div>\n );\n }\n }\n\n function _updatePosition(newX: number, newY: number) {\n const threshold = 1; // Set a threshold for movement\n const { x, y } = clickPosition;\n // Calculate the distance moved\n const distance = Math.sqrt(Math.pow(newX - x, 2) + Math.pow(newY - y, 2));\n // Update the position only if the distance moved is greater than the threshold\n if (distance > threshold) {\n setClickPosition({ x: newX, y: newY });\n setPopoverOpen(true);\n }\n }\n\n function _getChartTitle(): string {\n const { chartTitle } = props;\n return (chartTitle ? `${chartTitle}. ` : '') + `Gauge chart with ${_segments.length} segments. `;\n }\n const { arcs } = _processProps();\n const focusAttributes = useFocusableGroup();\n return (\n <div className={classes.root} ref={el => (_rootElem.current = el)}>\n <div className={classes.chartWrapper} {...focusAttributes}>\n <svg\n className={classes.chart}\n width={_width}\n height={_height - _legendsHeight}\n role=\"region\"\n aria-label={_getChartTitle()}\n onMouseLeave={_handleMouseOut}\n >\n <g transform={`translate(${_width / 2}, ${_height - (_margins.bottom + _legendsHeight)})`}>\n {props.chartTitle && (\n <text\n x={0}\n y={-(_outerRadius + TITLE_OFFSET)}\n textAnchor=\"middle\"\n className={classes.chartTitle}\n aria-hidden={true}\n >\n {props.chartTitle}\n </text>\n )}\n {!props.hideMinMax && (\n <>\n <text\n x={(_isRTL ? 1 : -1) * (_outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"end\"\n className={classes.limits}\n role=\"img\"\n aria-label={`Min value: ${_minValue}`}\n >\n {formatScientificLimitWidth(_minValue)}\n </text>\n <text\n x={(_isRTL ? -1 : 1) * (_outerRadius + LABEL_OFFSET)}\n y={0}\n textAnchor=\"start\"\n className={classes.limits}\n role=\"img\"\n aria-label={`Max value: ${_maxValue}`}\n >\n {formatScientificLimitWidth(_maxValue)}\n </text>\n </>\n )}\n {arcs.map((arc, index) => {\n const segment = _segments[arc.segmentIndex];\n return (\n <React.Fragment key={index}>\n <path\n d={arc.d}\n strokeWidth={focusedElement === segment.legend ? ARC_PADDING : 0}\n className={classes.segment}\n fill={segment.color}\n opacity={_legendHighlighted(segment.legend) || _noLegendHighlighted() ? 1 : 0.1}\n {...getAccessibleDataObject(\n {\n ariaLabel: getSegmentLabel(segment, _minValue, _maxValue, props.variant, true),\n ...segment.accessibilityData,\n },\n 'img',\n true,\n )}\n onFocus={e => _handleFocus(e, segment.legend)}\n onBlur={_handleBlur}\n onMouseEnter={e => _handleMouseOver(e, segment.legend)}\n onMouseLeave={e => _handleCalloutDismiss()}\n onMouseMove={e => _handleMouseOver(e, segment.legend)}\n tabIndex={_legendHighlighted(segment.legend) || _noLegendHighlighted() ? 0 : undefined}\n />\n </React.Fragment>\n );\n })}\n {_renderNeedle()}\n <g\n onMouseEnter={e => _handleMouseOver(e, 'Chart value')}\n onMouseMove={e => _handleMouseOver(e, 'Chart value')}\n >\n <SVGTooltipText\n content={getChartValueLabel(props.chartValue, _minValue, _maxValue, props.chartValueFormat)}\n textProps={{\n x: 0,\n y: 0,\n textAnchor: 'middle',\n className: classes.chartValue,\n fontSize: chartValueSize,\n 'aria-hidden': 'true',\n }}\n maxWidth={_innerRadius * 2 - 24}\n wrapContent={_wrapContent}\n />\n </g>\n {props.sublabel && (\n <SVGTooltipText\n content={props.sublabel}\n textProps={{\n x: 0,\n y: 4,\n textAnchor: 'middle',\n dominantBaseline: 'hanging',\n className: classes.sublabel,\n }}\n maxWidth={_innerRadius * 2}\n wrapContent={_wrapContent}\n />\n )}\n </g>\n </svg>\n </div>\n {_renderLegends()}\n {!props.hideTooltip && isPopoverOpen && (\n <ChartPopover\n {...props.calloutProps}\n clickPosition={clickPosition}\n isPopoverOpen={isPopoverOpen}\n customCallout={{\n customizedCallout: _multiValueCallout({ hoverXValue: hoverXValue, YValueHover: hoverYValues }),\n }}\n />\n )}\n </div>\n );\n },\n);\nGaugeChart.displayName = 'GaugeChart';\n"],"names":["React","useGaugeChartStyles","select","d3Select","arc","d3Arc","Points","areArraysEqual","formatScientificLimitWidth","getAccessibleDataObject","getColorFromToken","getNextColor","pointTypes","useRtl","formatToLocaleString","SVGTooltipText","Legends","Shape","useFocusableGroup","ChartPopover","toImage","GAUGE_MARGIN","LABEL_WIDTH","LABEL_HEIGHT","LABEL_OFFSET","TITLE_OFFSET","EXTRA_NEEDLE_LENGTH","ARC_PADDING","BREAKPOINTS","minRadius","arcWidth","fontSize","calcNeedleRotation","chartValue","minValue","maxValue","needleRotation","getSegmentLabel","segment","variant","isAriaLabel","legend","size","toFixed","start","end","getChartValueLabel","chartValueFormat","forCallout","toString","GaugeChart","forwardRef","props","forwardedRef","_legendsRef","useRef","_getMargins","hideMinMax","chartTitle","sublabel","left","right","top","bottom","_margins","_legendsHeight","hideLegend","_rootElem","_isRTL","width","setWidth","useState","height","setHeight","hoveredLegend","setHoveredLegend","selectedLegends","setSelectedLegends","legendProps","focusedElement","setFocusedElement","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","hoverXValue","setHoverXValue","hoverYValues","setHoverYValues","prevPropsRef","_width","_height","_outerRadius","Math","min","chartValueSize","_getStylesBasedOnBreakpoint","_innerRadius","_minValue","_maxValue","_segments","_calloutAnchor","useEffect","current","clientWidth","clientHeight","prevProps","useImperativeHandle","componentRef","chartContainer","opts","toSVG","classes","index","length","_processProps","segments","roundCorners","total","processedSegments","map","max","color","accessibilityData","push","arcGenerator","cornerRadius","padAngle","padRadius","rtlSafeSegments","Array","from","reverse","prevAngle","PI","arcs","endAngle","d","innerRadius","outerRadius","startAngle","segmentIndex","_renderNeedle","rtlSafeNeedleRotation","strokeWidth","halfStrokeWidth","needleLength","g","transform","path","className","needle","data-is-focusable","onFocus","e","_handleFocus","onBlur","_handleBlur","onMouseEnter","_handleMouseOver","onMouseMove","role","aria-label","_renderLegends","legends","title","hoverAction","onMouseOutAction","div","legendsContainer","centerLegends","onChange","_onLegendSelectionChange","legendRef","event","currentLegend","canSelectMultipleLegends","slice","_legendHighlighted","_getHighlightedLegend","includes","_noLegendHighlighted","focusEvent","_showCallout","_hideCallout","mouseEvent","hoveredElement","_handleMouseOut","_handleCalloutDismiss","isFocusEvent","clientX","clientY","target","currentTarget","boundingRect","getBoundingClientRect","yValue","_updatePosition","isBlurEvent","_wrapContent","content","id","maxWidth","textElement","text","node","isOverflowing","textLength","getComputedTextLength","_multiValueCallout","calloutProps","yValueHoverSubCountsExists","_yValueHoverSubCountsExists","YValueHover","calloutContentRoot","calloutDateTimeContainer","style","marginBottom","calloutContentX","xAxisCalloutAccessibilityData","culture","calloutInfoContainer","display","yValues","isLast","shouldDrawBorderBottom","callOutAccessibilityData","key","paddingBottom","_getCalloutContent","descriptionMessage","yValueHover","some","yAxisCalloutData","xValue","marginStyle","marginRight","toDrawShape","undefined","calloutBlockContainer","borderInlineStart","svgProps","shapeStyles","pathProps","fill","shape","Object","keys","calloutlegendText","calloutContentY","data","subcounts","subcountName","newX","newY","threshold","distance","sqrt","pow","_getChartTitle","focusAttributes","root","ref","el","chartWrapper","svg","chart","onMouseLeave","textAnchor","aria-hidden","limits","Fragment","opacity","ariaLabel","tabIndex","textProps","wrapContent","dominantBaseline","hideTooltip","customCallout","customizedCallout","displayName"],"mappings":"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"}
@@ -405,7 +405,7 @@ export const GroupedVerticalBarChart = /*#__PURE__*/ React.forwardRef((props = {
405
405
  y: yPoint,
406
406
  opacity: barOpacity,
407
407
  fill: pointColor,
408
- rx: 0,
408
+ rx: props.roundCorners ? 3 : 0,
409
409
  onMouseOver: (event)=>onBarHover(pointData, singleSet, event),
410
410
  onMouseMove: (event)=>onBarHover(pointData, singleSet, event),
411
411
  onMouseOut: _onBarLeave,
@@ -418,7 +418,7 @@ export const GroupedVerticalBarChart = /*#__PURE__*/ React.forwardRef((props = {
418
418
  }));
419
419
  barTotalValue += pointData.data;
420
420
  });
421
- if (barTotalValue !== null && !props.hideLabels && _barWidth >= 16 && isLegendActive) {
421
+ if (barTotalValue !== null && !props.hideLabels && Math.ceil(_barWidth) >= 16 && isLegendActive) {
422
422
  barLabelsForGroup.push(/*#__PURE__*/ React.createElement("text", {
423
423
  key: `${singleSet.indexNum}-${legendIndex}`,
424
424
  x: xPoint + _barWidth / 2,