@fluentui/react-charts 0.0.0-nightly-20250722-0406.1 → 0.0.0-nightly-20250723-0406.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +15 -15
  2. package/dist/index.d.ts +133 -0
  3. package/lib/FunnelChart.js +1 -0
  4. package/lib/FunnelChart.js.map +1 -0
  5. package/lib/components/FunnelChart/FunnelChart.js +391 -0
  6. package/lib/components/FunnelChart/FunnelChart.js.map +1 -0
  7. package/lib/components/FunnelChart/FunnelChart.types.js +1 -0
  8. package/lib/components/FunnelChart/FunnelChart.types.js.map +1 -0
  9. package/lib/components/FunnelChart/funnelGeometry.js +220 -0
  10. package/lib/components/FunnelChart/funnelGeometry.js.map +1 -0
  11. package/lib/components/FunnelChart/index.js +2 -0
  12. package/lib/components/FunnelChart/index.js.map +1 -0
  13. package/lib/components/FunnelChart/useFunnelChartStyles.styles.js +59 -0
  14. package/lib/components/FunnelChart/useFunnelChartStyles.styles.js.map +1 -0
  15. package/lib/index.js +1 -0
  16. package/lib/index.js.map +1 -1
  17. package/lib/utilities/colors.js +12 -0
  18. package/lib/utilities/colors.js.map +1 -1
  19. package/lib-commonjs/FunnelChart.js +6 -0
  20. package/lib-commonjs/FunnelChart.js.map +1 -0
  21. package/lib-commonjs/components/FunnelChart/FunnelChart.js +402 -0
  22. package/lib-commonjs/components/FunnelChart/FunnelChart.js.map +1 -0
  23. package/lib-commonjs/components/FunnelChart/FunnelChart.types.js +6 -0
  24. package/lib-commonjs/components/FunnelChart/FunnelChart.types.js.map +1 -0
  25. package/lib-commonjs/components/FunnelChart/funnelGeometry.js +248 -0
  26. package/lib-commonjs/components/FunnelChart/funnelGeometry.js.map +1 -0
  27. package/lib-commonjs/components/FunnelChart/index.js +7 -0
  28. package/lib-commonjs/components/FunnelChart/index.js.map +1 -0
  29. package/lib-commonjs/components/FunnelChart/useFunnelChartStyles.styles.js +79 -0
  30. package/lib-commonjs/components/FunnelChart/useFunnelChartStyles.styles.js.map +1 -0
  31. package/lib-commonjs/index.js +1 -0
  32. package/lib-commonjs/index.js.map +1 -1
  33. package/lib-commonjs/utilities/colors.js +18 -0
  34. package/lib-commonjs/utilities/colors.js.map +1 -1
  35. package/package.json +12 -12
package/CHANGELOG.md CHANGED
@@ -1,28 +1,28 @@
1
1
  # Change Log - @fluentui/react-charts
2
2
 
3
- This log was last generated on Tue, 22 Jul 2025 04:20:41 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 23 Jul 2025 04:21:19 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## [0.0.0-nightly-20250722-0406.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts_v0.0.0-nightly-20250722-0406.1)
7
+ ## [0.0.0-nightly-20250723-0406.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts_v0.0.0-nightly-20250723-0406.1)
8
8
 
9
- Tue, 22 Jul 2025 04:20:41 GMT
10
- [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charts_v9.1.9..@fluentui/react-charts_v0.0.0-nightly-20250722-0406.1)
9
+ Wed, 23 Jul 2025 04:21:19 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charts_v9.1.9..@fluentui/react-charts_v0.0.0-nightly-20250723-0406.1)
11
11
 
12
12
  ### Changes
13
13
 
14
14
  - Release nightly v9 ([commit](https://github.com/microsoft/fluentui/commit/not available) by fluentui-internal@service.microsoft.com)
15
- - Bump @fluentui/react-button to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
16
- - Bump @fluentui/react-jsx-runtime to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
17
- - Bump @fluentui/react-overflow to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
18
- - Bump @fluentui/react-popover to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
19
- - Bump @fluentui/react-shared-contexts to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
20
- - Bump @fluentui/react-tabster to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
21
- - Bump @fluentui/react-theme to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
22
- - Bump @fluentui/react-tooltip to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
23
- - Bump @fluentui/react-utilities to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
24
- - Bump @fluentui/react-conformance to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
25
- - Bump @fluentui/react-conformance-griffel to v0.0.0-nightly-20250722-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/275174a14180bfd4a1dd09f3bea05d8805bb3532) by beachball)
15
+ - Bump @fluentui/react-button to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
16
+ - Bump @fluentui/react-jsx-runtime to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
17
+ - Bump @fluentui/react-overflow to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
18
+ - Bump @fluentui/react-popover to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
19
+ - Bump @fluentui/react-shared-contexts to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
20
+ - Bump @fluentui/react-tabster to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
21
+ - Bump @fluentui/react-theme to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
22
+ - Bump @fluentui/react-tooltip to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
23
+ - Bump @fluentui/react-utilities to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
24
+ - Bump @fluentui/react-conformance to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
25
+ - Bump @fluentui/react-conformance-griffel to v0.0.0-nightly-20250723-0406.1 ([commit](https://github.com/microsoft/fluentui/commit/efd51751d1469295d225869c94ed3a3937ad219a) by beachball)
26
26
 
27
27
  ## [9.1.9](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts_v9.1.9)
28
28
 
package/dist/index.d.ts CHANGED
@@ -967,6 +967,135 @@ export declare interface ExtendedSegment extends GaugeChartSegment {
967
967
  end: number;
968
968
  }
969
969
 
970
+ export declare const FunnelChart: React_2.FunctionComponent<FunnelChartProps>;
971
+
972
+ /**
973
+ * Data point for funnel chart
974
+ * {@docCategory FunnelChart}
975
+ */
976
+ export declare interface FunnelChartDataPoint {
977
+ /**
978
+ * Stage name or identifier
979
+ */
980
+ stage: string | number;
981
+ /**
982
+ * Sub-values for stacked funnel charts
983
+ * Each sub-value represents a category within the stage
984
+ */
985
+ subValues?: Array<{
986
+ category: string;
987
+ value: number;
988
+ color: string;
989
+ }>;
990
+ /**
991
+ * Value for the stage (used for non-stacked funnel charts)
992
+ */
993
+ value?: number;
994
+ /**
995
+ * Color for the stage (used for non-stacked funnel charts)
996
+ */
997
+ color?: string;
998
+ }
999
+
1000
+ /**
1001
+ * Funnel Chart component props
1002
+ * {@docCategory FunnelChart}
1003
+ */
1004
+ export declare interface FunnelChartProps {
1005
+ /**
1006
+ * Data points for the funnel chart
1007
+ */
1008
+ data: FunnelChartDataPoint[];
1009
+ /**
1010
+ * Title for the chart
1011
+ */
1012
+ chartTitle?: string;
1013
+ /**
1014
+ * Width of the chart
1015
+ */
1016
+ width?: number;
1017
+ /**
1018
+ * Height of the chart
1019
+ */
1020
+ height?: number;
1021
+ /**
1022
+ * Decides whether to show/hide legends
1023
+ * @defaultvalue false
1024
+ */
1025
+ hideLegend?: boolean;
1026
+ /**
1027
+ * Props for the legends in the chart
1028
+ */
1029
+ legendProps?: Partial<LegendsProps>;
1030
+ /**
1031
+ * Props for the callout in the chart
1032
+ */
1033
+ calloutProps?: ChartPopoverProps;
1034
+ /**
1035
+ * Call to provide customized styling that will layer on top of the variant rules
1036
+ */
1037
+ styles?: FunnelChartStyles;
1038
+ /**
1039
+ * Defines the culture to localize the numbers and dates
1040
+ */
1041
+ culture?: string;
1042
+ /**
1043
+ * Reference to the chart component
1044
+ */
1045
+ componentRef?: React_2.RefObject<any>;
1046
+ /**
1047
+ * Additional CSS class(es) to apply to the chart
1048
+ */
1049
+ className?: string;
1050
+ /**
1051
+ * Orientation of the funnel chart
1052
+ * @defaultvalue 'horizontal'
1053
+ */
1054
+ orientation?: 'horizontal' | 'vertical';
1055
+ }
1056
+
1057
+ /**
1058
+ * Funnel Chart style properties
1059
+ * {@docCategory FunnelChart}
1060
+ */
1061
+ export declare interface FunnelChartStyleProps {
1062
+ /**
1063
+ * Additional CSS class(es) to apply to the chart
1064
+ */
1065
+ className?: string;
1066
+ /**
1067
+ * Width of the chart
1068
+ */
1069
+ chartWidth: number;
1070
+ /**
1071
+ * Height of the chart
1072
+ */
1073
+ chartHeight: number;
1074
+ }
1075
+
1076
+ /**
1077
+ * Funnel Chart styles
1078
+ * {@docCategory FunnelChart}
1079
+ */
1080
+ export declare interface FunnelChartStyles {
1081
+ /**
1082
+ * Styles for the root element
1083
+ */
1084
+ root?: string;
1085
+ /**
1086
+ * Styles for the chart
1087
+ */
1088
+ chart?: string;
1089
+ /**
1090
+ * Styles for text elements
1091
+ */
1092
+ text?: string;
1093
+ /**
1094
+ * Styles for the callout root element
1095
+ */
1096
+ calloutContentRoot?: string;
1097
+ }
1098
+
970
1099
  export declare const GaugeChart: React_2.FunctionComponent<GaugeChartProps>;
971
1100
 
972
1101
  /**
@@ -1192,6 +1321,10 @@ export declare const getColorContrast: (c1: string, c2: string) => number;
1192
1321
 
1193
1322
  export declare const getColorFromToken: (token: string, isDarkTheme?: boolean) => string;
1194
1323
 
1324
+ export declare function getContrastTextColor(backgroundColor: string, isDarkTheme?: boolean): string;
1325
+
1326
+ export declare const getInvertedTextColor: (color: string, isDarkTheme?: boolean) => string;
1327
+
1195
1328
  export declare const getNextColor: (index: number, offset?: number, isDarkTheme?: boolean) => string;
1196
1329
 
1197
1330
  export declare const getSegmentLabel: (segment: ExtendedSegment, minValue: number, maxValue: number, variant?: GaugeChartVariant, isAriaLabel?: boolean) => string;
@@ -0,0 +1 @@
1
+ export * from './components/FunnelChart/index';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FunnelChart.ts"],"sourcesContent":["export * from './components/FunnelChart/index';\n"],"names":[],"rangeMappings":"","mappings":"AAAA,cAAc,iCAAiC"}
@@ -0,0 +1,391 @@
1
+ import * as React from 'react';
2
+ import { useId } from '@fluentui/react-utilities';
3
+ import { useRtl } from '../../utilities/index';
4
+ import { Legends } from '../Legends/index';
5
+ import { useFocusableGroup } from '@fluentui/react-tabster';
6
+ import { ChartPopover } from '../CommonComponents/ChartPopover';
7
+ import { formatToLocaleString } from '@fluentui/chart-utilities';
8
+ import { getContrastTextColor } from '../../utilities/colors';
9
+ import { useFunnelChartStyles } from './useFunnelChartStyles.styles';
10
+ import { getHorizontalFunnelSegmentGeometry, getVerticalFunnelSegmentGeometry, getSegmentTextProps, getStackedHorizontalFunnelSegmentGeometry, getStackedVerticalFunnelSegmentGeometry } from './funnelGeometry';
11
+ export const FunnelChart = /*#__PURE__*/ React.forwardRef((props, forwardedRef)=>{
12
+ var _props_legendProps;
13
+ const _emptyChartId = useId('_FunnelChart_empty');
14
+ const isRTL = useRtl();
15
+ const [hoveredStage, setHoveredStage] = React.useState(null);
16
+ const [calloutData, setCalloutData] = React.useState(null);
17
+ const [selectedLegends, setSelectedLegends] = React.useState([]);
18
+ const [clickPosition, setClickPosition] = React.useState({
19
+ x: 0,
20
+ y: 0
21
+ });
22
+ const [isPopoverOpen, setPopoverOpen] = React.useState(false);
23
+ const chartContainerRef = React.useRef(null);
24
+ const isStacked = isStackedFunnelData(props.data);
25
+ React.useEffect(()=>{
26
+ var _props_legendProps;
27
+ if ((_props_legendProps = props.legendProps) === null || _props_legendProps === void 0 ? void 0 : _props_legendProps.selectedLegends) {
28
+ setSelectedLegends(props.legendProps.selectedLegends);
29
+ }
30
+ }, [
31
+ (_props_legendProps = props.legendProps) === null || _props_legendProps === void 0 ? void 0 : _props_legendProps.selectedLegends
32
+ ]);
33
+ function _handleHover(data, mouseEvent) {
34
+ mouseEvent === null || mouseEvent === void 0 ? void 0 : mouseEvent.persist();
35
+ updatePosition(mouseEvent.clientX, mouseEvent.clientY);
36
+ setCalloutData(data);
37
+ setPopoverOpen(true);
38
+ }
39
+ function _handleFocus(data, focusEvent) {
40
+ focusEvent === null || focusEvent === void 0 ? void 0 : focusEvent.persist();
41
+ let x = 0;
42
+ let y = 0;
43
+ const targetRect = focusEvent.target.getBoundingClientRect();
44
+ x = targetRect.left + targetRect.width / 2;
45
+ y = targetRect.top + targetRect.height / 2;
46
+ updatePosition(x, y);
47
+ setCalloutData(data);
48
+ setPopoverOpen(true);
49
+ }
50
+ function _handleStackedHover(stage, subValue, mouseEvent) {
51
+ mouseEvent === null || mouseEvent === void 0 ? void 0 : mouseEvent.persist();
52
+ updatePosition(mouseEvent.clientX, mouseEvent.clientY);
53
+ setCalloutData({
54
+ stage,
55
+ value: subValue.value,
56
+ color: subValue.color,
57
+ category: subValue.category
58
+ });
59
+ setPopoverOpen(true);
60
+ }
61
+ function _handleStackedFocus(stage, subValue, focusEvent) {
62
+ focusEvent === null || focusEvent === void 0 ? void 0 : focusEvent.persist();
63
+ let x = 0;
64
+ let y = 0;
65
+ const targetRect = focusEvent.target.getBoundingClientRect();
66
+ x = targetRect.left + targetRect.width / 2;
67
+ y = targetRect.top + targetRect.height / 2;
68
+ updatePosition(x, y);
69
+ setCalloutData({
70
+ stage,
71
+ value: subValue.value,
72
+ color: subValue.color,
73
+ category: subValue.category
74
+ });
75
+ setPopoverOpen(true);
76
+ }
77
+ function _handleMouseOut() {
78
+ setHoveredStage(null);
79
+ setPopoverOpen(false);
80
+ setCalloutData(null);
81
+ }
82
+ function _onLegendSelectionChange(legendsSelected, event, currentLegend) {
83
+ var _props_legendProps, _props_legendProps1;
84
+ if ((_props_legendProps = props.legendProps) === null || _props_legendProps === void 0 ? void 0 : _props_legendProps.canSelectMultipleLegends) {
85
+ setSelectedLegends(legendsSelected);
86
+ } else {
87
+ setSelectedLegends(legendsSelected.slice(-1));
88
+ }
89
+ if ((_props_legendProps1 = props.legendProps) === null || _props_legendProps1 === void 0 ? void 0 : _props_legendProps1.onChange) {
90
+ props.legendProps.onChange(legendsSelected, event, currentLegend);
91
+ }
92
+ }
93
+ const _onLegendSelectionChangeCallback = React.useCallback(_onLegendSelectionChange, [
94
+ props.legendProps
95
+ ]);
96
+ function getHighlightedLegend() {
97
+ return selectedLegends.length > 0 ? selectedLegends : hoveredStage ? [
98
+ hoveredStage
99
+ ] : [];
100
+ }
101
+ function legendHighlighted(legend) {
102
+ return getHighlightedLegend().includes(legend);
103
+ }
104
+ function noLegendHighlighted() {
105
+ return getHighlightedLegend().length === 0;
106
+ }
107
+ function _getEventHandlerProps(data, opacity) {
108
+ if ('subValue' in data) {
109
+ return {
110
+ culture: props.culture,
111
+ onMouseOver: opacity == 1 ? (event)=>_handleStackedHover(data.stage, data.subValue, event) : undefined,
112
+ onMouseMove: opacity == 1 ? (event)=>_handleStackedHover(data.stage, data.subValue, event) : undefined,
113
+ onFocus: (event)=>_handleStackedFocus(data.stage, data.subValue, event),
114
+ onBlur: ()=>_handleMouseOut(),
115
+ onMouseOut: ()=>_handleMouseOut()
116
+ };
117
+ } else {
118
+ return {
119
+ culture: props.culture,
120
+ onMouseOver: opacity == 1 ? (event)=>_handleHover(data, event) : undefined,
121
+ onMouseMove: opacity == 1 ? (event)=>_handleHover(data, event) : undefined,
122
+ onFocus: (event)=>_handleFocus(data, event),
123
+ onBlur: ()=>_handleMouseOut(),
124
+ onMouseOut: ()=>_handleMouseOut()
125
+ };
126
+ }
127
+ }
128
+ function _renderSegmentText({ show, x, y, value, textColor }) {
129
+ if (!show) {
130
+ return null;
131
+ }
132
+ const textElement = /*#__PURE__*/ React.createElement("text", {
133
+ x: isRTL ? funnelWidth - x : x,
134
+ y: y,
135
+ textAnchor: "middle",
136
+ alignmentBaseline: "middle",
137
+ fill: textColor
138
+ }, formatToLocaleString(value.toString(), props.culture));
139
+ if (isRTL) {
140
+ return /*#__PURE__*/ React.createElement("g", {
141
+ transform: `scale(-1,1) translate(${-funnelWidth},0)`
142
+ }, textElement);
143
+ }
144
+ return textElement;
145
+ }
146
+ function _renderFunnelSegment({ key, pathD, fill, opacity, textProps, data, tabIndex }) {
147
+ const eventHandlers = _getEventHandlerProps(data, opacity);
148
+ const textColor = getContrastTextColor(fill);
149
+ return /*#__PURE__*/ React.createElement("g", {
150
+ key: key
151
+ }, /*#__PURE__*/ React.createElement("path", {
152
+ d: pathD,
153
+ fill: fill,
154
+ opacity: opacity,
155
+ ...eventHandlers,
156
+ tabIndex: tabIndex
157
+ }), textProps && /*#__PURE__*/ React.createElement("g", eventHandlers, _renderSegmentText({
158
+ ...textProps,
159
+ textColor
160
+ })));
161
+ }
162
+ function _createFunnel(containerHeight, containerWidth) {
163
+ const { data } = props;
164
+ const funnelWidth = containerWidth;
165
+ const funnelHeight = containerHeight * 0.8;
166
+ return data.map((d, i)=>{
167
+ const geometryProps = props.orientation === 'vertical' ? getVerticalFunnelSegmentGeometry({
168
+ d,
169
+ i,
170
+ data,
171
+ funnelWidth,
172
+ funnelHeight,
173
+ isRTL
174
+ }) : getHorizontalFunnelSegmentGeometry({
175
+ d,
176
+ i,
177
+ data,
178
+ funnelWidth,
179
+ funnelHeight,
180
+ isRTL
181
+ });
182
+ const { pathD, textX, textY, availableWidth } = geometryProps;
183
+ const minTextWidth = 16;
184
+ const eventHandlerProps = _getEventHandlerProps(d);
185
+ const textProps = getSegmentTextProps({
186
+ availableWidth,
187
+ minTextWidth,
188
+ textX,
189
+ textY,
190
+ value: d.value,
191
+ ...eventHandlerProps
192
+ });
193
+ return _renderFunnelSegment({
194
+ key: i,
195
+ pathD,
196
+ fill: d.color,
197
+ opacity: legendHighlighted(d.stage) || noLegendHighlighted() ? 1 : 0.1,
198
+ textProps,
199
+ data: d,
200
+ tabIndex: legendHighlighted(d.stage) || noLegendHighlighted() ? 0 : undefined
201
+ });
202
+ });
203
+ }
204
+ function isStackedFunnelData(data) {
205
+ return Array.isArray(data) && data.every((stage)=>Array.isArray(stage.subValues));
206
+ }
207
+ function _renderStackedSegment(stage, subValue, stageIndex, subValueIndex, geometryParams) {
208
+ // Ensure stages have subValues for geometry functions
209
+ const stagesWithSubValues = geometryParams.stages.map((s)=>({
210
+ ...s,
211
+ subValues: s.subValues || []
212
+ }));
213
+ const geom = props.orientation === 'vertical' ? getStackedVerticalFunnelSegmentGeometry({
214
+ ...geometryParams,
215
+ stages: stagesWithSubValues,
216
+ i: stageIndex,
217
+ k: subValueIndex
218
+ }) : getStackedHorizontalFunnelSegmentGeometry({
219
+ ...geometryParams,
220
+ stages: stagesWithSubValues,
221
+ i: stageIndex,
222
+ k: subValueIndex
223
+ });
224
+ const minTextWidth = 16;
225
+ const eventHandlerProps = _getEventHandlerProps({
226
+ stage: stage.stage,
227
+ subValue
228
+ });
229
+ const textProps = getSegmentTextProps({
230
+ availableWidth: geom.availableWidth,
231
+ minTextWidth,
232
+ textX: geom.textX,
233
+ textY: geom.textY,
234
+ value: subValue.value,
235
+ ...eventHandlerProps
236
+ });
237
+ return _renderFunnelSegment({
238
+ key: `${stageIndex}-${subValueIndex}`,
239
+ pathD: geom.pathD,
240
+ fill: subValue.color,
241
+ opacity: isStackedFunnelData(props.data) && legendHighlighted(subValue.category) || noLegendHighlighted() ? 1 : 0.1,
242
+ textProps,
243
+ data: {
244
+ stage: stage.stage,
245
+ subValue
246
+ },
247
+ tabIndex: legendHighlighted(subValue.category) || noLegendHighlighted() ? 0 : undefined
248
+ });
249
+ }
250
+ function _createStackedFunnel(containerHeight, containerWidth) {
251
+ const { data } = props;
252
+ const stages = data;
253
+ const totals = stages.map((s)=>{
254
+ var _s_subValues;
255
+ var _s_subValues_reduce;
256
+ return (_s_subValues_reduce = s === null || s === void 0 ? void 0 : (_s_subValues = s.subValues) === null || _s_subValues === void 0 ? void 0 : _s_subValues.reduce((sum, subValue)=>sum + subValue.value, 0)) !== null && _s_subValues_reduce !== void 0 ? _s_subValues_reduce : 0;
257
+ });
258
+ const maxTotal = Math.max(...totals);
259
+ const funnelWidth = containerWidth;
260
+ const funnelHeight = containerHeight * 0.8;
261
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
262
+ const paths = [];
263
+ const geometryParams = {
264
+ stages,
265
+ totals,
266
+ maxTotal,
267
+ funnelWidth,
268
+ funnelHeight,
269
+ isRTL
270
+ };
271
+ for(let i = 0; i < stages.length; i++){
272
+ const cur = stages[i];
273
+ var _cur_subValues;
274
+ for(let k = 0; k < ((_cur_subValues = cur.subValues) !== null && _cur_subValues !== void 0 ? _cur_subValues : []).length; k++){
275
+ var _cur_subValues1;
276
+ const v = (_cur_subValues1 = cur.subValues) === null || _cur_subValues1 === void 0 ? void 0 : _cur_subValues1[k];
277
+ if (!v) {
278
+ continue;
279
+ }
280
+ paths.push(_renderStackedSegment(cur, v, i, k, geometryParams));
281
+ }
282
+ }
283
+ return paths;
284
+ }
285
+ function _renderLegends() {
286
+ if (props.hideLegend) {
287
+ return /*#__PURE__*/ React.createElement(React.Fragment, null);
288
+ }
289
+ let legends;
290
+ if (isStacked) {
291
+ // Collect unique categories and their color
292
+ const categoryMap = {};
293
+ props.data.forEach((stage)=>{
294
+ (stage.subValues || []).forEach((sub)=>{
295
+ if (!(sub.category in categoryMap)) {
296
+ categoryMap[sub.category] = sub.color;
297
+ }
298
+ });
299
+ });
300
+ legends = Object.entries(categoryMap).map(([category, color])=>({
301
+ title: category,
302
+ color,
303
+ hoverAction: ()=>setHoveredStage(category),
304
+ onMouseOutAction: ()=>setHoveredStage(null)
305
+ }));
306
+ } else {
307
+ legends = props.data.map((d)=>({
308
+ title: d.stage,
309
+ color: d.color,
310
+ hoverAction: ()=>setHoveredStage(d.stage),
311
+ onMouseOutAction: ()=>setHoveredStage(null)
312
+ }));
313
+ }
314
+ return /*#__PURE__*/ React.createElement("div", {
315
+ style: {
316
+ display: 'flex',
317
+ justifyContent: 'center'
318
+ }
319
+ }, /*#__PURE__*/ React.createElement(Legends, {
320
+ legends: legends,
321
+ centerLegends: true,
322
+ onChange: _onLegendSelectionChangeCallback,
323
+ ...props.legendProps
324
+ }));
325
+ }
326
+ function _isChartEmpty() {
327
+ return !(props.data && props.data.length > 0);
328
+ }
329
+ function updatePosition(newX, newY) {
330
+ const threshold = 1; // Set a threshold for movement
331
+ const { x, y } = clickPosition;
332
+ // Calculate the distance moved
333
+ const distance = Math.sqrt(Math.pow(newX - x, 2) + Math.pow(newY - y, 2));
334
+ // Update the position only if the distance moved is greater than the threshold
335
+ if (distance > threshold) {
336
+ setClickPosition({
337
+ x: newX,
338
+ y: newY
339
+ });
340
+ setPopoverOpen(true);
341
+ }
342
+ }
343
+ const classes = useFunnelChartStyles(props);
344
+ const calloutProps = {
345
+ ...props.calloutProps,
346
+ color: calloutData === null || calloutData === void 0 ? void 0 : calloutData.color,
347
+ hoverXValue: calloutData === null || calloutData === void 0 ? void 0 : calloutData.stage,
348
+ YValue: calloutData === null || calloutData === void 0 ? void 0 : calloutData.value
349
+ };
350
+ const width = props.width || 350;
351
+ const height = props.height || 500;
352
+ const funnelMarginTop = 40;
353
+ const funnelWidth = width * 0.8;
354
+ const funnelOffsetX = (width - funnelWidth) / 2;
355
+ const focusAttributes = useFocusableGroup();
356
+ var _props_culture;
357
+ return !_isChartEmpty() ? /*#__PURE__*/ React.createElement("div", {
358
+ ref: chartContainerRef,
359
+ className: classes.root,
360
+ ...focusAttributes
361
+ }, /*#__PURE__*/ React.createElement("svg", {
362
+ width: width,
363
+ height: height,
364
+ className: classes.chart,
365
+ role: 'img',
366
+ "aria-label": props.chartTitle
367
+ }, /*#__PURE__*/ React.createElement("g", {
368
+ transform: isRTL ? `translate(${funnelOffsetX + funnelWidth}, ${funnelMarginTop}) scale(-1,1)` : `translate(${funnelOffsetX}, ${funnelMarginTop})`
369
+ }, isStacked ? _createStackedFunnel(height - funnelMarginTop, funnelWidth) : _createFunnel(height - funnelMarginTop, funnelWidth))), isPopoverOpen && /*#__PURE__*/ React.createElement(ChartPopover, {
370
+ ...props.calloutProps,
371
+ XValue: calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.hoverXValue,
372
+ yCalloutValue: calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.YValue,
373
+ culture: (_props_culture = props.culture) !== null && _props_culture !== void 0 ? _props_culture : 'en-us',
374
+ clickPosition: clickPosition,
375
+ isPopoverOpen: isPopoverOpen,
376
+ color: calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.color,
377
+ isCartesian: false
378
+ }), _renderLegends()) : /*#__PURE__*/ React.createElement("div", {
379
+ id: _emptyChartId,
380
+ role: 'alert',
381
+ style: {
382
+ opacity: '0'
383
+ },
384
+ "aria-label": 'Graph has no data to display'
385
+ });
386
+ });
387
+ FunnelChart.displayName = 'FunnelChart';
388
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
389
+ FunnelChart.defaultProps = {
390
+ orientation: 'vertical'
391
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["FunnelChart.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useId } from '@fluentui/react-utilities';\nimport { useRtl } from '../../utilities/index';\nimport { FunnelChartDataPoint, FunnelChartProps } from './FunnelChart.types';\nimport { Legend, Legends } from '../Legends/index';\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { ChartPopover } from '../CommonComponents/ChartPopover';\nimport { formatToLocaleString } from '@fluentui/chart-utilities';\nimport { getContrastTextColor } from '../../utilities/colors';\nimport { useFunnelChartStyles } from './useFunnelChartStyles.styles';\nimport {\n getHorizontalFunnelSegmentGeometry,\n getVerticalFunnelSegmentGeometry,\n getSegmentTextProps,\n getStackedHorizontalFunnelSegmentGeometry,\n getStackedVerticalFunnelSegmentGeometry,\n} from './funnelGeometry';\nimport { ChartPopoverProps } from '../../index';\n\nexport const FunnelChart: React.FunctionComponent<FunnelChartProps> = React.forwardRef<\n HTMLDivElement,\n FunnelChartProps\n>((props, forwardedRef) => {\n const _emptyChartId: string = useId('_FunnelChart_empty');\n const isRTL = useRtl();\n\n const [hoveredStage, setHoveredStage] = React.useState<string | null>(null);\n const [calloutData, setCalloutData] = React.useState<FunnelChartDataPoint | null>(null);\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>([]);\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const chartContainerRef = React.useRef<HTMLDivElement | null>(null);\n const isStacked = isStackedFunnelData(props.data);\n\n React.useEffect(() => {\n if (props.legendProps?.selectedLegends) {\n setSelectedLegends(props.legendProps.selectedLegends);\n }\n }, [props.legendProps?.selectedLegends]);\n\n function _handleHover(data: FunnelChartDataPoint, mouseEvent: React.MouseEvent<SVGElement>) {\n mouseEvent?.persist();\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n setCalloutData(data);\n setPopoverOpen(true);\n }\n\n function _handleFocus(data: FunnelChartDataPoint, focusEvent: React.FocusEvent<SVGPathElement>) {\n focusEvent?.persist();\n let x = 0;\n let y = 0;\n const targetRect = (focusEvent.target as SVGPathElement).getBoundingClientRect();\n x = targetRect.left + targetRect.width / 2;\n y = targetRect.top + targetRect.height / 2;\n\n updatePosition(x, y);\n setCalloutData(data);\n setPopoverOpen(true);\n }\n\n function _handleStackedHover(\n stage: string,\n subValue: { category: string; value: number; color: string },\n mouseEvent: React.MouseEvent<SVGElement>,\n ) {\n mouseEvent?.persist();\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n setCalloutData({\n stage,\n value: subValue.value,\n color: subValue.color,\n category: subValue.category,\n } as FunnelChartDataPoint);\n setPopoverOpen(true);\n }\n\n function _handleStackedFocus(\n stage: string,\n subValue: { category: string; value: number; color: string },\n focusEvent: React.FocusEvent<SVGPathElement>,\n ) {\n focusEvent?.persist();\n let x = 0;\n let y = 0;\n const targetRect = (focusEvent.target as SVGPathElement).getBoundingClientRect();\n x = targetRect.left + targetRect.width / 2;\n y = targetRect.top + targetRect.height / 2;\n\n updatePosition(x, y);\n setCalloutData({\n stage,\n value: subValue.value,\n color: subValue.color,\n category: subValue.category,\n } as FunnelChartDataPoint);\n setPopoverOpen(true);\n }\n\n function _handleMouseOut() {\n setHoveredStage(null);\n setPopoverOpen(false);\n setCalloutData(null);\n }\n\n function _onLegendSelectionChange(\n legendsSelected: string[],\n event: React.MouseEvent<HTMLButtonElement>,\n currentLegend?: Legend,\n ): void {\n if (props.legendProps?.canSelectMultipleLegends) {\n setSelectedLegends(legendsSelected);\n } else {\n setSelectedLegends(legendsSelected.slice(-1));\n }\n\n if (props.legendProps?.onChange) {\n props.legendProps.onChange(legendsSelected, event, currentLegend);\n }\n }\n\n const _onLegendSelectionChangeCallback = React.useCallback(_onLegendSelectionChange, [props.legendProps]);\n\n function getHighlightedLegend(): string[] {\n return selectedLegends.length > 0 ? selectedLegends : hoveredStage ? [hoveredStage] : [];\n }\n\n function legendHighlighted(legend: string): boolean {\n return getHighlightedLegend().includes(legend);\n }\n\n function noLegendHighlighted(): boolean {\n return getHighlightedLegend().length === 0;\n }\n\n function _getEventHandlerProps(\n data: FunnelChartDataPoint | { stage: string; subValue: { category: string; value: number; color: string } },\n opacity?: number,\n ) {\n if ('subValue' in data) {\n return {\n culture: props.culture,\n onMouseOver:\n opacity == 1\n ? (event: React.MouseEvent<SVGElement>) => _handleStackedHover(data.stage, data.subValue, event)\n : undefined,\n onMouseMove:\n opacity == 1\n ? (event: React.MouseEvent<SVGElement>) => _handleStackedHover(data.stage, data.subValue, event)\n : undefined,\n onFocus: (event: React.FocusEvent<SVGPathElement>) => _handleStackedFocus(data.stage, data.subValue, event),\n onBlur: () => _handleMouseOut(),\n onMouseOut: () => _handleMouseOut(),\n };\n } else {\n return {\n culture: props.culture,\n onMouseOver: opacity == 1 ? (event: React.MouseEvent<SVGElement>) => _handleHover(data, event) : undefined,\n onMouseMove: opacity == 1 ? (event: React.MouseEvent<SVGElement>) => _handleHover(data, event) : undefined,\n onFocus: (event: React.FocusEvent<SVGPathElement>) => _handleFocus(data, event),\n onBlur: () => _handleMouseOut(),\n onMouseOut: () => _handleMouseOut(),\n };\n }\n }\n\n function _renderSegmentText({\n show,\n x,\n y,\n value,\n textColor,\n }: {\n show: boolean;\n x: number;\n y: number;\n value: number;\n textColor: string;\n }) {\n if (!show) {\n return null;\n }\n\n const textElement = (\n <text x={isRTL ? funnelWidth - x : x} y={y} textAnchor=\"middle\" alignmentBaseline=\"middle\" fill={textColor}>\n {formatToLocaleString(value.toString(), props.culture) as React.ReactNode}\n </text>\n );\n\n if (isRTL) {\n return <g transform={`scale(-1,1) translate(${-funnelWidth},0)`}>{textElement}</g>;\n }\n return textElement;\n }\n\n function _renderFunnelSegment({\n key,\n pathD,\n fill,\n opacity,\n textProps,\n data,\n tabIndex,\n }: {\n key: string | number;\n pathD: string;\n fill: string;\n opacity: number;\n textProps?: {\n show: boolean;\n x: number;\n y: number;\n value: number;\n };\n data: FunnelChartDataPoint | { stage: string; subValue: { category: string; value: number; color: string } };\n tabIndex?: number;\n }) {\n const eventHandlers = _getEventHandlerProps(data, opacity);\n const textColor = getContrastTextColor(fill);\n\n return (\n <g key={key}>\n <path d={pathD} fill={fill} opacity={opacity} {...eventHandlers} tabIndex={tabIndex} />\n {textProps && <g {...eventHandlers}>{_renderSegmentText({ ...textProps, textColor })}</g>}\n </g>\n );\n }\n\n function _createFunnel(\n containerHeight: number,\n containerWidth: number,\n ): // eslint-disable-next-line @typescript-eslint/no-deprecated\n JSX.Element[] {\n const { data } = props;\n const funnelWidth = containerWidth;\n const funnelHeight = containerHeight * 0.8;\n\n return data.map((d, i) => {\n const geometryProps =\n props.orientation === 'vertical'\n ? getVerticalFunnelSegmentGeometry({ d, i, data, funnelWidth, funnelHeight, isRTL })\n : getHorizontalFunnelSegmentGeometry({ d, i, data, funnelWidth, funnelHeight, isRTL });\n\n const { pathD, textX, textY, availableWidth } = geometryProps;\n const minTextWidth = 16;\n const eventHandlerProps = _getEventHandlerProps(d);\n const textProps = getSegmentTextProps({\n availableWidth,\n minTextWidth,\n textX,\n textY,\n value: d.value!,\n ...eventHandlerProps,\n });\n\n return _renderFunnelSegment({\n key: i,\n pathD,\n fill: d.color!,\n opacity: legendHighlighted(d.stage as string) || noLegendHighlighted() ? 1 : 0.1,\n textProps,\n data: d,\n tabIndex: legendHighlighted(d.stage as string) || noLegendHighlighted() ? 0 : undefined,\n });\n });\n }\n\n function isStackedFunnelData(data: FunnelChartDataPoint[]): boolean {\n return Array.isArray(data) && data.every(stage => Array.isArray(stage.subValues));\n }\n\n function _renderStackedSegment(\n stage: FunnelChartDataPoint,\n subValue: { value: number; color: string; category: string },\n stageIndex: number,\n subValueIndex: number,\n geometryParams: {\n stages: FunnelChartDataPoint[];\n totals: number[];\n maxTotal: number;\n funnelWidth: number;\n funnelHeight: number;\n isRTL: boolean;\n },\n ): // eslint-disable-next-line @typescript-eslint/no-deprecated\n JSX.Element {\n // Ensure stages have subValues for geometry functions\n const stagesWithSubValues = geometryParams.stages.map(s => ({\n ...s,\n subValues: s.subValues || [],\n }));\n const geom =\n props.orientation === 'vertical'\n ? getStackedVerticalFunnelSegmentGeometry({\n ...geometryParams,\n stages: stagesWithSubValues,\n i: stageIndex,\n k: subValueIndex,\n })\n : getStackedHorizontalFunnelSegmentGeometry({\n ...geometryParams,\n stages: stagesWithSubValues,\n i: stageIndex,\n k: subValueIndex,\n });\n\n const minTextWidth = 16;\n const eventHandlerProps = _getEventHandlerProps({ stage: stage.stage as string, subValue });\n const textProps = getSegmentTextProps({\n availableWidth: geom.availableWidth,\n minTextWidth,\n textX: geom.textX,\n textY: geom.textY,\n value: subValue.value,\n ...eventHandlerProps,\n });\n\n return _renderFunnelSegment({\n key: `${stageIndex}-${subValueIndex}`,\n pathD: geom.pathD,\n fill: subValue.color,\n opacity:\n (isStackedFunnelData(props.data) && legendHighlighted(subValue.category)) || noLegendHighlighted() ? 1 : 0.1,\n textProps,\n data: { stage: stage.stage as string, subValue },\n tabIndex: legendHighlighted(subValue.category) || noLegendHighlighted() ? 0 : undefined,\n });\n }\n\n function _createStackedFunnel(\n containerHeight: number,\n containerWidth: number,\n ): // eslint-disable-next-line @typescript-eslint/no-deprecated\n JSX.Element[] {\n const { data } = props;\n\n const stages = data;\n const totals = stages.map(s => s?.subValues?.reduce((sum, subValue) => sum + subValue.value, 0) ?? 0);\n const maxTotal = Math.max(...totals);\n\n const funnelWidth = containerWidth;\n const funnelHeight = containerHeight * 0.8;\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const paths: JSX.Element[] = [];\n\n const geometryParams = {\n stages,\n totals,\n maxTotal,\n funnelWidth,\n funnelHeight,\n isRTL,\n };\n\n for (let i = 0; i < stages.length; i++) {\n const cur = stages[i];\n for (let k = 0; k < (cur.subValues ?? []).length; k++) {\n const v = cur.subValues?.[k];\n if (!v) {\n continue;\n }\n paths.push(_renderStackedSegment(cur, v, i, k, geometryParams));\n }\n }\n return paths;\n }\n\n function _renderLegends(): // eslint-disable-next-line @typescript-eslint/no-deprecated\n JSX.Element {\n if (props.hideLegend) {\n return <></>;\n }\n let legends: Legend[];\n\n if (isStacked) {\n // Collect unique categories and their color\n const categoryMap: Record<string, string> = {};\n props.data.forEach((stage: FunnelChartDataPoint) => {\n (stage.subValues || []).forEach(sub => {\n if (!(sub.category in categoryMap)) {\n categoryMap[sub.category] = sub.color;\n }\n });\n });\n legends = Object.entries(categoryMap).map(([category, color]) => ({\n title: category,\n color,\n hoverAction: () => setHoveredStage(category),\n onMouseOutAction: () => setHoveredStage(null),\n }));\n } else {\n legends = props.data.map((d: FunnelChartDataPoint) => ({\n title: d.stage as string,\n color: d.color!,\n hoverAction: () => setHoveredStage(d.stage as string),\n onMouseOutAction: () => setHoveredStage(null),\n }));\n }\n\n return (\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <Legends\n legends={legends}\n centerLegends={true}\n onChange={_onLegendSelectionChangeCallback}\n {...props.legendProps}\n />\n </div>\n );\n }\n\n function _isChartEmpty(): boolean {\n return !(props.data && props.data.length > 0);\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 const classes = useFunnelChartStyles(props);\n\n const calloutProps: ChartPopoverProps = {\n ...props.calloutProps,\n color: calloutData?.color,\n hoverXValue: calloutData?.stage,\n YValue: calloutData?.value,\n };\n\n const width = props.width || 350;\n const height = props.height || 500;\n\n const funnelMarginTop = 40;\n const funnelWidth = width * 0.8;\n const funnelOffsetX = (width - funnelWidth) / 2;\n const focusAttributes = useFocusableGroup();\n\n return !_isChartEmpty() ? (\n <div ref={chartContainerRef} className={classes.root} {...focusAttributes}>\n <svg width={width} height={height} className={classes.chart} role={'img'} aria-label={props.chartTitle}>\n <g\n transform={\n isRTL\n ? `translate(${funnelOffsetX + funnelWidth}, ${funnelMarginTop}) scale(-1,1)`\n : `translate(${funnelOffsetX}, ${funnelMarginTop})`\n }\n >\n {isStacked\n ? _createStackedFunnel(height - funnelMarginTop, funnelWidth)\n : _createFunnel(height - funnelMarginTop, funnelWidth)}\n </g>\n </svg>\n {isPopoverOpen && (\n <ChartPopover\n {...props.calloutProps}\n XValue={calloutProps?.hoverXValue as string}\n yCalloutValue={calloutProps?.YValue as string}\n culture={props.culture ?? 'en-us'}\n clickPosition={clickPosition}\n isPopoverOpen={isPopoverOpen}\n color={calloutProps?.color}\n isCartesian={false}\n />\n )}\n {_renderLegends()}\n </div>\n ) : (\n <div id={_emptyChartId} role={'alert'} style={{ opacity: '0' }} aria-label={'Graph has no data to display'} />\n );\n});\nFunnelChart.displayName = 'FunnelChart';\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nFunnelChart.defaultProps = {\n orientation: 'vertical',\n};\n"],"names":["React","useId","useRtl","Legends","useFocusableGroup","ChartPopover","formatToLocaleString","getContrastTextColor","useFunnelChartStyles","getHorizontalFunnelSegmentGeometry","getVerticalFunnelSegmentGeometry","getSegmentTextProps","getStackedHorizontalFunnelSegmentGeometry","getStackedVerticalFunnelSegmentGeometry","FunnelChart","forwardRef","props","forwardedRef","_emptyChartId","isRTL","hoveredStage","setHoveredStage","useState","calloutData","setCalloutData","selectedLegends","setSelectedLegends","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","chartContainerRef","useRef","isStacked","isStackedFunnelData","data","useEffect","legendProps","_handleHover","mouseEvent","persist","updatePosition","clientX","clientY","_handleFocus","focusEvent","targetRect","target","getBoundingClientRect","left","width","top","height","_handleStackedHover","stage","subValue","value","color","category","_handleStackedFocus","_handleMouseOut","_onLegendSelectionChange","legendsSelected","event","currentLegend","canSelectMultipleLegends","slice","onChange","_onLegendSelectionChangeCallback","useCallback","getHighlightedLegend","length","legendHighlighted","legend","includes","noLegendHighlighted","_getEventHandlerProps","opacity","culture","onMouseOver","undefined","onMouseMove","onFocus","onBlur","onMouseOut","_renderSegmentText","show","textColor","textElement","text","funnelWidth","textAnchor","alignmentBaseline","fill","toString","g","transform","_renderFunnelSegment","key","pathD","textProps","tabIndex","eventHandlers","path","d","_createFunnel","containerHeight","containerWidth","funnelHeight","map","i","geometryProps","orientation","textX","textY","availableWidth","minTextWidth","eventHandlerProps","Array","isArray","every","subValues","_renderStackedSegment","stageIndex","subValueIndex","geometryParams","stagesWithSubValues","stages","s","geom","k","_createStackedFunnel","totals","reduce","sum","maxTotal","Math","max","paths","cur","v","push","_renderLegends","hideLegend","legends","categoryMap","forEach","sub","Object","entries","title","hoverAction","onMouseOutAction","div","style","display","justifyContent","centerLegends","_isChartEmpty","newX","newY","threshold","distance","sqrt","pow","classes","calloutProps","hoverXValue","YValue","funnelMarginTop","funnelOffsetX","focusAttributes","ref","className","root","svg","chart","role","aria-label","chartTitle","XValue","yCalloutValue","isCartesian","id","displayName","defaultProps"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -0,0 +1 @@
1
+ import * as React from 'react';