@fluentui/react-charts 0.0.0-nightly-20250826-0412.1 → 0.0.0-nightly-20250827-0407.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 (34) hide show
  1. package/CHANGELOG.md +15 -15
  2. package/lib/components/ChartTable/ChartTable.js +87 -6
  3. package/lib/components/ChartTable/ChartTable.js.map +1 -1
  4. package/lib/components/DeclarativeChart/DeclarativeChart.js +11 -1
  5. package/lib/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
  6. package/lib/components/DeclarativeChart/PlotlyColorAdapter.js +19 -0
  7. package/lib/components/DeclarativeChart/PlotlyColorAdapter.js.map +1 -1
  8. package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js +202 -63
  9. package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
  10. package/lib/components/LineChart/LineChart.js +29 -4
  11. package/lib/components/LineChart/LineChart.js.map +1 -1
  12. package/lib/components/ScatterChart/ScatterChart.js +62 -45
  13. package/lib/components/ScatterChart/ScatterChart.js.map +1 -1
  14. package/lib/utilities/scatterpolar-utils.js +63 -0
  15. package/lib/utilities/scatterpolar-utils.js.map +1 -0
  16. package/lib/utilities/utilities.js +32 -8
  17. package/lib/utilities/utilities.js.map +1 -1
  18. package/lib-commonjs/components/ChartTable/ChartTable.js +87 -6
  19. package/lib-commonjs/components/ChartTable/ChartTable.js.map +1 -1
  20. package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js +11 -1
  21. package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
  22. package/lib-commonjs/components/DeclarativeChart/PlotlyColorAdapter.js +22 -0
  23. package/lib-commonjs/components/DeclarativeChart/PlotlyColorAdapter.js.map +1 -1
  24. package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js +201 -62
  25. package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
  26. package/lib-commonjs/components/LineChart/LineChart.js +28 -3
  27. package/lib-commonjs/components/LineChart/LineChart.js.map +1 -1
  28. package/lib-commonjs/components/ScatterChart/ScatterChart.js +61 -44
  29. package/lib-commonjs/components/ScatterChart/ScatterChart.js.map +1 -1
  30. package/lib-commonjs/utilities/scatterpolar-utils.js +78 -0
  31. package/lib-commonjs/utilities/scatterpolar-utils.js.map +1 -0
  32. package/lib-commonjs/utilities/utilities.js +28 -8
  33. package/lib-commonjs/utilities/utilities.js.map +1 -1
  34. package/package.json +12 -12
@@ -19,6 +19,7 @@ const _index1 = require("../../utilities/index");
19
19
  const _index2 = require("../../index");
20
20
  const _reacttheme = require("@fluentui/react-theme");
21
21
  const _imageexportutils = require("../../utilities/image-export-utils");
22
+ const _scatterpolarutils = require("../../utilities/scatterpolar-utils");
22
23
  const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
23
24
  var _props_legendProps, _props_legendProps1;
24
25
  const _circleId = (0, _reactutilities.useId)('circle');
@@ -60,6 +61,8 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
60
61
  const [isPopoverOpen, setPopoverOpen] = _react.useState(false);
61
62
  const [selectedLegends, setSelectedLegends] = _react.useState(((_props_legendProps = props.legendProps) === null || _props_legendProps === void 0 ? void 0 : _props_legendProps.selectedLegends) || []);
62
63
  const prevSelectedLegendsRef = _react.useRef(undefined);
64
+ const _isTextMode = _react.useRef(false);
65
+ const _isScatterPolarRef = _react.useRef(false);
63
66
  _react.useEffect(()=>{
64
67
  var _props_legendProps, _props_legendProps1;
65
68
  if (prevSelectedLegendsRef.current && !(0, _index1.areArraysEqual)(prevSelectedLegendsRef.current, (_props_legendProps = props.legendProps) === null || _props_legendProps === void 0 ? void 0 : _props_legendProps.selectedLegends)) {
@@ -154,6 +157,8 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
154
157
  function _initializeScatterChartData(xScale, yScale, containerHeight, containerWidth, xElement) {
155
158
  _xAxisScale = xScale;
156
159
  _yAxisScale = yScale;
160
+ _isTextMode.current = (0, _index1.isTextMode)(_points);
161
+ _isScatterPolarRef.current = (0, _index1.isScatterPolarSeries)(_points);
157
162
  renderSeries = _createPlot(xElement, containerHeight);
158
163
  }
159
164
  function _onHoverCardHide() {
@@ -249,25 +254,13 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
249
254
  let xMax = 0;
250
255
  if (_xAxisType === _index1.XAxisTypes.StringAxis) {
251
256
  _xBandwidth = _xAxisScale.bandwidth() / 2;
252
- } else if (_xAxisType === _index1.XAxisTypes.DateAxis) {
253
- xMin = (0, _d3array.min)(_points, (point)=>{
254
- return (0, _d3array.min)(point.data, (item)=>item.x);
255
- }).getTime();
256
- xMax = (0, _d3array.max)(_points, (point)=>{
257
- return (0, _d3array.max)(point.data, (item)=>{
258
- return item.x;
259
- });
260
- }).getTime();
261
- xPadding = (xMax - xMin) * 0.1;
262
257
  } else {
263
- xMin = (0, _d3array.min)(_points, (point)=>{
264
- return (0, _d3array.min)(point.data, (item)=>item.x);
265
- });
266
- xMax = (0, _d3array.max)(_points, (point)=>{
267
- return (0, _d3array.max)(point.data, (item)=>{
268
- return item.x;
269
- });
270
- });
258
+ const isDate = _xAxisType === _index1.XAxisTypes.DateAxis;
259
+ const getX = (item)=>isDate ? item.x : item.x;
260
+ const minVal = (0, _d3array.min)(_points, (point)=>(0, _d3array.min)(point.data, getX));
261
+ const maxVal = (0, _d3array.max)(_points, (point)=>(0, _d3array.max)(point.data, getX));
262
+ xMin = isDate ? minVal.getTime() : minVal;
263
+ xMax = isDate ? maxVal.getTime() : maxVal;
271
264
  xPadding = (xMax - xMin) * 0.1;
272
265
  }
273
266
  const maxMarkerSize = (0, _d3array.max)(_points, (point)=>{
@@ -293,31 +286,51 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
293
286
  const isLegendSelected = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;
294
287
  const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;
295
288
  const text = _points === null || _points === void 0 ? void 0 : (_points_i_data_j = _points[i].data[j]) === null || _points_i_data_j === void 0 ? void 0 : _points_i_data_j.text;
296
- pointsForSeries.push(/*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("circle", {
297
- id: circleId,
298
- key: circleId,
299
- r: Math.max(circleRadius, 4),
300
- cx: _xAxisScale(x) + _xBandwidth,
301
- cy: _yAxisScale(y),
302
- "data-is-focusable": isLegendSelected,
303
- onMouseOver: (event)=>_handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event),
304
- onMouseMove: (event)=>_handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event),
305
- onMouseOut: _handleMouseOut,
306
- onFocus: (event)=>_handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData),
307
- onBlur: _handleMouseOut,
308
- ..._getClickHandler(_points[i].data[j].onDataPointClick),
309
- opacity: isLegendSelected && !currentPointHidden ? 1 : 0.1,
310
- fill: _getPointFill(seriesColor, circleId, j, false),
311
- stroke: seriesColor,
312
- role: "img",
313
- "aria-label": _getAriaLabel(i, j),
314
- tabIndex: isLegendSelected ? 0 : undefined
315
- }), ",", text && /*#__PURE__*/ _react.createElement("text", {
316
- key: `${circleId}-label`,
317
- x: _xAxisScale(x) + _xBandwidth,
318
- y: _yAxisScale(y) + Math.max(circleRadius + 12, 16),
319
- className: classes.markerLabel
320
- }, text)));
289
+ if (!_isTextMode.current) {
290
+ pointsForSeries.push(/*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("circle", {
291
+ id: circleId,
292
+ key: circleId,
293
+ r: Math.max(circleRadius, 4),
294
+ cx: _xAxisScale(x) + _xBandwidth,
295
+ cy: _yAxisScale(y),
296
+ "data-is-focusable": isLegendSelected,
297
+ onMouseOver: (event)=>_handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event),
298
+ onMouseMove: (event)=>_handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event),
299
+ onMouseOut: _handleMouseOut,
300
+ onFocus: (event)=>_handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData),
301
+ onBlur: _handleMouseOut,
302
+ ..._getClickHandler(_points[i].data[j].onDataPointClick),
303
+ opacity: isLegendSelected && !currentPointHidden ? 1 : 0.1,
304
+ fill: _getPointFill(seriesColor, circleId, j, false),
305
+ stroke: seriesColor,
306
+ role: "img",
307
+ "aria-label": _getAriaLabel(i, j),
308
+ tabIndex: isLegendSelected ? 0 : undefined
309
+ }), ",", text && /*#__PURE__*/ _react.createElement("text", {
310
+ key: `${circleId}-label`,
311
+ x: _xAxisScale(x) + _xBandwidth,
312
+ y: _yAxisScale(y) + Math.max(circleRadius + 12, 16),
313
+ className: classes.markerLabel
314
+ }, text)));
315
+ }
316
+ }
317
+ if (_isScatterPolarRef.current) {
318
+ var _points_i;
319
+ // Render category labels for all series at once to avoid overlap
320
+ const allSeriesData = _points.map((s)=>({
321
+ data: s.data.filter((pt)=>typeof pt.x === 'number' && typeof pt.y === 'number').map((pt)=>({
322
+ x: pt.x,
323
+ y: pt.y,
324
+ text: pt.text
325
+ }))
326
+ }));
327
+ pointsForSeries.push(...(0, _scatterpolarutils.renderScatterPolarCategoryLabels)({
328
+ allSeriesData,
329
+ xAxisScale: _xAxisScale.current,
330
+ yAxisScale: _yAxisScale.current,
331
+ className: classes.markerLabel || '',
332
+ lineOptions: _points === null || _points === void 0 ? void 0 : (_points_i = _points[i]) === null || _points_i === void 0 ? void 0 : _points_i.lineOptions
333
+ }));
321
334
  }
322
335
  series.push(/*#__PURE__*/ _react.createElement("g", {
323
336
  key: `series_${i}`,
@@ -456,7 +469,7 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
456
469
  // reduce computation cost by only creating legendBars
457
470
  // if when hideLegend is false.
458
471
  // NOTE: they are rendered only when hideLegend is false in CartesianChart.
459
- if (!props.hideLegend) {
472
+ if (!props.hideLegend && !_isTextMode.current) {
460
473
  legendBars = _createLegends(_points); // ToDo: Memoize legends to improve performance.
461
474
  }
462
475
  var _props_culture;
@@ -500,6 +513,10 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
500
513
  enableFirstRenderOptimization: _firstRenderOptimization,
501
514
  datasetForXAxisDomain: _xAxisLabels,
502
515
  componentRef: cartesianChartRef,
516
+ ..._isScatterPolarRef.current ? {
517
+ yMaxValue: 1,
518
+ yMinValue: -1
519
+ } : {},
503
520
  /* eslint-disable react/jsx-no-bind */ // eslint-disable-next-line react/no-children-prop
504
521
  children: (props)=>{
505
522
  _xAxisScale = props.xScale;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ScatterChart/ScatterChart.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ScatterChartProps } from './ScatterChart.types';\nimport { useScatterChartStyles } from './useScatterChartStyles.styles';\nimport { Axis as D3Axis } from 'd3-axis';\nimport { select as d3Select } from 'd3-selection';\nimport { Legend, Legends } from '../Legends/index';\nimport { max as d3Max, min as d3Min } from 'd3-array';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport {\n areArraysEqual,\n createNumericYAxis,\n createStringYAxis,\n domainRangeOfDateForScatterChart,\n domainRangeOfNumericForScatterChart,\n domainRangeOfXStringAxis,\n find,\n findNumericMinMaxOfY,\n IDomainNRange,\n YAxisType,\n useRtl,\n} from '../../utilities/index';\nimport {\n AccessibilityProps,\n CartesianChart,\n ChildProps,\n CustomizedCalloutData,\n Margins,\n RefArrayData,\n ScatterChartDataPoint,\n Chart,\n ImageExportOptions,\n LegendContainer,\n ScatterChartPoints,\n} from '../../index';\nimport { tokens } from '@fluentui/react-theme';\nimport {\n calloutData,\n ChartTypes,\n XAxisTypes,\n tooltipOfAxislabels,\n getTypeOfAxis,\n getNextColor,\n getColorFromToken,\n formatDate,\n} from '../../utilities/index';\nimport { toImage } from '../../utilities/image-export-utils';\nimport { ScaleLinear } from 'd3-scale';\n\ntype NumericAxis = D3Axis<number | { valueOf(): number }>;\n\ntype ScatterChartDataWithIndex = ScatterChartPoints & { index: number };\n\n// Create a ScatterChart variant which uses these default styles and this styled subcomponent.\n/**\n * ScatterChart component\n * {@docCategory ScatterChart}\n */\nexport const ScatterChart: React.FunctionComponent<ScatterChartProps> = React.forwardRef<\n HTMLDivElement,\n ScatterChartProps\n>((props, forwardedRef) => {\n const _circleId: string = useId('circle');\n const _seriesId: string = useId('seriesID');\n const _verticalLine: string = useId('verticalLine');\n const _tooltipId: string = useId('ScatterChartTooltipId_');\n const _firstRenderOptimization = true;\n const _emptyChartId: string = useId('_ScatterChart_empty');\n let _points: ScatterChartDataWithIndex[] = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _calloutPoints: any[] = calloutData(_points) || [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xAxisScale: any = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _yAxisScale: any = '';\n let _uniqueCallOutID: string | null = '';\n let _refArray: RefArrayData[] = [];\n let margins: Margins;\n let renderSeries: JSXElement[];\n let _xAxisLabels: string[] = [];\n let xAxisCalloutAccessibilityData: AccessibilityProps = {};\n let _xBandwidth = 0;\n const cartesianChartRef = React.useRef<Chart>(null);\n const classes = useScatterChartStyles(props);\n const _legendsRef = React.useRef<LegendContainer>(null);\n const _isRTL: boolean = useRtl();\n\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [activeLegend, setActiveLegend] = React.useState<string>('');\n const [YValueHover, setYValueHover] = React.useState<[]>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [selectedLegendPoints, setSelectedLegendPoints] = React.useState<any[]>([]);\n const [isSelectedLegend, setIsSelectedLegend] = React.useState<boolean>(false);\n const [activePoint, setActivePoint] = React.useState<string>('');\n const [stackCalloutProps, setStackCalloutProps] = React.useState<CustomizedCalloutData>();\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const prevSelectedLegendsRef = React.useRef<string[] | undefined>(undefined);\n\n React.useEffect(() => {\n if (\n prevSelectedLegendsRef.current &&\n !areArraysEqual(prevSelectedLegendsRef.current, props.legendProps?.selectedLegends)\n ) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n prevSelectedLegendsRef.current = props.legendProps?.selectedLegends;\n }, [props.legendProps?.selectedLegends]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: cartesianChartRef.current?.chartContainer ?? null,\n toImage: (opts?: ImageExportOptions): Promise<string> => {\n return toImage(cartesianChartRef.current?.chartContainer, _legendsRef.current?.toSVG, _isRTL, opts);\n },\n }),\n [],\n );\n\n const _xAxisType: XAxisTypes =\n props.data.scatterChartData! &&\n props.data.scatterChartData!.length > 0 &&\n props.data.scatterChartData![0].data &&\n props.data.scatterChartData![0].data.length > 0\n ? (getTypeOfAxis(props.data.scatterChartData![0].data[0].x, true) as XAxisTypes)\n : XAxisTypes.StringAxis;\n\n const pointsRef = React.useRef<ScatterChartDataWithIndex[] | []>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const calloutPointsRef = React.useRef<any[]>([]);\n React.useEffect(() => {\n /** note that height and width are not used to resize or set as dimesions of the chart,\n * fitParentContainer is responisble for setting the height and width or resizing of the svg/chart\n */\n\n if (_points !== _injectIndexPropertyInScatterChartData(props.data.scatterChartData) || props.data !== _points) {\n pointsRef.current = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n calloutPointsRef.current = calloutData(pointsRef.current);\n }\n }, [props.height, props.width, props.data, _points]);\n\n function _injectIndexPropertyInScatterChartData(\n scatterChartData?: ScatterChartPoints[],\n ): ScatterChartDataWithIndex[] | [] {\n return scatterChartData\n ? scatterChartData.map((item: ScatterChartPoints, index: number) => {\n let color: string;\n if (typeof item.color === 'undefined') {\n color = getNextColor(index, 0);\n } else {\n color = getColorFromToken(item.color);\n }\n return {\n ...item,\n index: -1,\n color,\n };\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 _getNumericMinMaxOfY(\n points: ScatterChartPoints[],\n yAxisType?: YAxisType,\n ): { startValue: number; endValue: number } {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { startValue, endValue } = findNumericMinMaxOfY(points, yAxisType);\n let yPadding = 0;\n yPadding = (endValue - startValue) * 0.1;\n\n return {\n startValue: startValue - yPadding,\n endValue: endValue + yPadding,\n };\n }\n\n function _getDomainNRangeValues(\n points: any,\n margins: Margins,\n width: number,\n chartType: ChartTypes,\n isRTL: boolean,\n xAxisType: XAxisTypes,\n barWidth: number,\n tickValues: Date[] | number[] | undefined,\n shiftX: number,\n ) {\n let domainNRangeValue: IDomainNRange;\n if (xAxisType === XAxisTypes.NumericAxis) {\n domainNRangeValue = domainRangeOfNumericForScatterChart(points, margins, width, isRTL);\n } else if (xAxisType === XAxisTypes.DateAxis) {\n domainNRangeValue = domainRangeOfDateForScatterChart(points, margins, width, isRTL, tickValues! as Date[]);\n } else {\n domainNRangeValue = domainRangeOfXStringAxis(margins, width, isRTL);\n }\n return domainNRangeValue;\n }\n\n function _getMargins(_margins: Margins) {\n margins = _margins;\n }\n\n function _initializeScatterChartData(\n xScale: NumericAxis,\n yScale: NumericAxis,\n containerHeight: number,\n containerWidth: number,\n xElement: SVGElement | null,\n ) {\n _xAxisScale = xScale;\n _yAxisScale = yScale;\n renderSeries = _createPlot(xElement!, containerHeight!);\n }\n\n function _onHoverCardHide() {\n setSelectedLegendPoints([]);\n setIsSelectedLegend(false);\n }\n\n function _createLegends(data: ScatterChartDataWithIndex[]): JSXElement {\n const { legendProps } = props;\n const isLegendMultiSelectEnabled = !!(legendProps && !!legendProps.canSelectMultipleLegends);\n const mapLegendToPoints: Record<string, ScatterChartDataWithIndex[]> = {};\n data.forEach((point: ScatterChartDataWithIndex) => {\n if (point.legend) {\n if (!mapLegendToPoints[point.legend]) {\n mapLegendToPoints[point.legend] = [];\n }\n mapLegendToPoints[point.legend].push(point);\n }\n });\n const legendDataItems: Legend[] = Object.entries(mapLegendToPoints).map(([legendTitle, points]) => {\n const representativePoint = points[0];\n // mapping data to the format Legends component needs\n const legend: Legend = {\n title: legendTitle,\n color: representativePoint.color!,\n onMouseOutAction: () => {\n setActiveLegend('');\n },\n hoverAction: () => {\n _handleChartMouseLeave();\n setActiveLegend(legendTitle);\n },\n ...(representativePoint.legendShape && {\n shape: representativePoint.legendShape,\n }),\n };\n return legend;\n });\n\n return (\n <Legends\n legends={[...legendDataItems]}\n enabledWrapLines={props.enabledLegendsWrapLines}\n overflowText={props.legendsOverflowText}\n {...(isLegendMultiSelectEnabled && { onLegendHoverCardLeave: _onHoverCardHide })}\n {...props.legendProps}\n selectedLegends={selectedLegends}\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n );\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 function _getPointFill(seriesColor: string, pointId: string, pointIndex: number, isLastPoint: boolean) {\n if (activePoint === pointId) {\n return tokens.colorNeutralBackground1;\n } else {\n return seriesColor;\n }\n }\n\n function _getRangeForScatterMarkerSize(\n yScale: ScaleLinear<number, number>,\n yPadding: number,\n xMin: number,\n xMax: number,\n xPadding: number,\n ): number {\n const extraXPixels = _isRTL\n ? _xAxisScale(xMax - xPadding) - _xAxisScale(xMax)\n : _xAxisScale(xMin + xPadding) - _xAxisScale(xMin);\n\n const yMin = yScale.domain()[0];\n const extraYPixels = yScale(yMin) - yScale(yMin + yPadding);\n return Math.min(extraXPixels, extraYPixels);\n }\n\n function _createPlot(xElement: SVGElement, containerHeight: number): JSXElement[] {\n const series: JSXElement[] = [];\n if (isSelectedLegend) {\n _points = selectedLegendPoints;\n } else {\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n }\n\n const yMax = d3Max(points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.y)!;\n })!;\n const yMin = d3Min(points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.y)!;\n })!;\n const yPadding = (yMax - yMin) * 0.1;\n\n let xPadding = 0;\n let xMin: number = 0;\n let xMax: number = 0;\n if (_xAxisType === XAxisTypes.StringAxis) {\n _xBandwidth = _xAxisScale.bandwidth() / 2;\n } else if (_xAxisType === XAxisTypes.DateAxis) {\n xMin = d3Min(_points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.x as Date)!;\n })!.getTime();\n\n xMax = d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.x as Date;\n });\n })!.getTime();\n\n xPadding = (xMax - xMin) * 0.1;\n } else {\n xMin = d3Min(_points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.x as number)!;\n })!;\n\n xMax = d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.x as number;\n });\n })!;\n\n xPadding = (xMax - xMin) * 0.1;\n }\n\n const maxMarkerSize = d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n })!;\n\n for (let i = _points.length - 1; i >= 0; i--) {\n const pointsForSeries: JSXElement[] = [];\n\n const legendVal: string = _points[i].legend;\n const seriesColor: string = _points[i].color!;\n const verticaLineHeight = containerHeight - margins.bottom! + 6;\n\n for (let j = 0; j < _points[i].data.length; j++) {\n const seriesId = `${_seriesId}_${i}_${j}`;\n const circleId = `${_circleId}_${i}_${j}`;\n const { x, y, xAxisCalloutData, xAxisCalloutAccessibilityData } = _points[i].data[j];\n const pointMarkerSize = (_points[i].data[j] as ScatterChartDataPoint).markerSize;\n const extraMaxPixels =\n _xAxisType !== XAxisTypes.StringAxis\n ? _getRangeForScatterMarkerSize(_yAxisScale, yPadding, xMin, xMax, xPadding)\n : 0;\n const minPixel = 4;\n const maxPixel = 16;\n const circleRadius =\n pointMarkerSize && maxMarkerSize !== 0\n ? _xAxisType !== XAxisTypes.StringAxis\n ? (pointMarkerSize * extraMaxPixels) / maxMarkerSize\n : minPixel + ((pointMarkerSize - minPixel) / (maxMarkerSize - minPixel)) * (maxPixel - minPixel)\n : activePoint === circleId\n ? 6\n : 4;\n\n const isLegendSelected: boolean = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;\n\n const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;\n const text = _points?.[i].data[j]?.text;\n pointsForSeries.push(\n <>\n <circle\n id={circleId}\n key={circleId}\n r={Math.max(circleRadius, 4)}\n cx={_xAxisScale(x) + _xBandwidth}\n cy={_yAxisScale(y)}\n data-is-focusable={isLegendSelected}\n onMouseOver={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event)\n }\n onMouseMove={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(x, y, verticaLineHeight, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData, event)\n }\n onMouseOut={_handleMouseOut}\n onFocus={event =>\n _handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData)\n }\n onBlur={_handleMouseOut}\n {..._getClickHandler(_points[i].data[j].onDataPointClick)}\n opacity={isLegendSelected && !currentPointHidden ? 1 : 0.1}\n fill={_getPointFill(seriesColor, circleId, j, false)}\n stroke={seriesColor}\n role=\"img\"\n aria-label={_getAriaLabel(i, j)}\n tabIndex={isLegendSelected ? 0 : undefined}\n />\n ,\n {text && (\n <text\n key={`${circleId}-label`}\n x={_xAxisScale(x) + _xBandwidth}\n y={_yAxisScale(y) + Math.max(circleRadius + 12, 16)}\n className={classes.markerLabel}\n >\n {text}\n </text>\n )}\n </>,\n );\n }\n\n series.push(\n <g\n key={`series_${i}`}\n role=\"region\"\n aria-label={`${legendVal}, series ${i + 1} of ${_points.length} with ${_points[i].data.length} data points.`}\n >\n {pointsForSeries}\n </g>,\n );\n }\n // Removing un wanted tooltip div from DOM, when prop not provided.\n if (!props.showXAxisLablesTooltip) {\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n // Used to display tooltip at x axis labels.\n if (!props.wrapXAxisLables && props.showXAxisLablesTooltip) {\n const xAxisElement = d3Select(xElement).call(_xAxisScale);\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n // eslint-disable-next-line no-empty\n } catch (e) {}\n const tooltipProps = {\n tooltipCls: classes.tooltip!,\n id: _tooltipId,\n axis: xAxisElement,\n };\n xAxisElement && tooltipOfAxislabels(tooltipProps);\n }\n return series;\n }\n\n function _handleFocus(\n event: React.FocusEvent<SVGCircleElement, Element>,\n seriesId: string,\n x: number | Date | string,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData?: AccessibilityProps,\n ) {\n let cx = 0;\n let cy = 0;\n\n const targetRect = (event.target as SVGCircleElement).getBoundingClientRect();\n cx = targetRect.left + targetRect.width / 2;\n cy = targetRect.top + targetRect.height / 2;\n updatePosition(cx, cy);\n _uniqueCallOutID = circleId;\n const formattedData = x instanceof Date ? formatDate(x, props.useUTC) : x;\n const xVal = x instanceof Date ? x.getTime() : x;\n const found = find(_calloutPoints, (element: { x: string | number }) => element.x === xVal);\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, 0)`)\n .attr('visibility', 'visibility');\n _refArray.forEach((obj: RefArrayData) => {\n if (obj.index === seriesId) {\n setPopoverOpen(true);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setActivePoint(circleId);\n }\n });\n } else {\n setActivePoint(circleId);\n }\n }\n\n function _handleHover(\n x: number | Date | string,\n y: number | Date,\n lineHeight: number,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData: AccessibilityProps | undefined,\n mouseEvent: React.MouseEvent<SVGElement>,\n ) {\n mouseEvent?.persist();\n const formattedData = x instanceof Date ? formatDate(x, props.useUTC) : x;\n const xVal = x instanceof Date ? x.getTime() : x;\n const found = find(_calloutPoints, (element: { x: string | number }) => element.x === xVal);\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, ${_yAxisScale(y)})`)\n .attr('visibility', 'visibility')\n .attr('y2', `${lineHeight - _yAxisScale(y)}`);\n\n if (_uniqueCallOutID !== circleId) {\n _uniqueCallOutID = circleId;\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setActivePoint(circleId);\n }\n } else {\n setActivePoint(circleId);\n }\n }\n\n /**\n * Screen readers announce an element as clickable if the onClick attribute is set.\n * This function sets the attribute only when a click event handler is provided.*/\n\n function _getClickHandler(func?: () => void): { onClick?: () => void } {\n if (func) {\n return {\n onClick: func,\n };\n }\n\n return {};\n }\n\n function _handleMouseOut() {\n d3Select(`#${_verticalLine}`).attr('visibility', 'hidden');\n }\n\n function _handleChartMouseLeave() {\n _uniqueCallOutID = null;\n setActivePoint('');\n if (isPopoverOpen) {\n setPopoverOpen(false);\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): boolean {\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(): boolean {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend(): string[] {\n return selectedLegends.length > 0 ? selectedLegends : activeLegend ? [activeLegend] : [];\n }\n\n function _getAriaLabel(seriesIndex: number, pointIndex: number): string {\n const series = _points[seriesIndex];\n const point = series.data[pointIndex];\n const formattedDate = point.x instanceof Date ? formatDate(point.x, props.useUTC) : point.x;\n const xValue = point.xAxisCalloutData || formattedDate;\n const legend = series.legend;\n const yValue = point.yAxisCalloutData || point.y;\n return point.callOutAccessibilityData?.ariaLabel || `${xValue}. ${legend}, ${yValue}.`;\n }\n\n function _isChartEmpty(): boolean {\n return !(\n props.data &&\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData.filter((item: ScatterChartPoints) => item.data.length).length > 0\n );\n }\n\n const _getMinMaxofXAxis = React.useCallback(\n (points: ScatterChartPoints[], yAxisType: YAxisType | undefined) =>\n _getNumericMinMaxOfY(points as ScatterChartPoints[], yAxisType),\n [],\n );\n\n const { legendProps, tickValues, tickFormat } = props;\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n\n let points = _points as ScatterChartPoints[];\n if (legendProps && !!legendProps.canSelectMultipleLegends) {\n points = selectedLegendPoints.length >= 1 ? selectedLegendPoints : _points;\n _calloutPoints = calloutData(points);\n }\n\n let legendBars = null;\n // reduce computation cost by only creating legendBars\n // if when hideLegend is false.\n // NOTE: they are rendered only when hideLegend is false in CartesianChart.\n if (!props.hideLegend) {\n legendBars = _createLegends(_points!); // ToDo: Memoize legends to improve performance.\n }\n const calloutProps = {\n YValueHover,\n hoverXValue,\n descriptionMessage:\n props.getCalloutDescriptionMessage && stackCalloutProps\n ? props.getCalloutDescriptionMessage(stackCalloutProps)\n : undefined,\n 'data-is-focusable': true,\n xAxisCalloutAccessibilityData,\n ...props.calloutProps,\n clickPosition,\n isPopoverOpen,\n isCalloutForStack: true,\n culture: props.culture ?? 'en-us',\n isCartesian: true,\n };\n const tickParams = {\n tickValues,\n tickFormat,\n };\n\n const xAxisLabels: string[] = _points\n .map((point: ScatterChartDataWithIndex) => point.data.map((dp: ScatterChartDataPoint) => dp.x as string))\n .flat();\n\n _xAxisLabels = [...new Set(xAxisLabels)];\n\n return !_isChartEmpty() ? (\n <CartesianChart\n {...props}\n chartTitle={props.data.chartTitle}\n points={points}\n chartType={ChartTypes.ScatterChart}\n calloutProps={calloutProps}\n tickParams={tickParams}\n legendBars={legendBars}\n getmargins={_getMargins}\n getGraphData={_initializeScatterChartData}\n xAxisType={_xAxisType}\n getMinMaxOfYAxis={_getMinMaxofXAxis}\n getDomainNRangeValues={_getDomainNRangeValues}\n createYAxis={createNumericYAxis}\n createStringYAxis={createStringYAxis}\n onChartMouseLeave={_handleChartMouseLeave}\n enableFirstRenderOptimization={_firstRenderOptimization}\n datasetForXAxisDomain={_xAxisLabels}\n componentRef={cartesianChartRef}\n /* eslint-disable react/jsx-no-bind */\n // eslint-disable-next-line react/no-children-prop\n children={(props: ChildProps) => {\n _xAxisScale = props.xScale!;\n _yAxisScale = props.yScalePrimary!;\n return (\n <>\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={props.containerHeight}\n stroke={'#323130'}\n id={_verticalLine}\n visibility={'hidden'}\n strokeDasharray={'5,5'}\n />\n <g>{renderSeries}</g>\n </g>\n </>\n );\n }}\n />\n ) : (\n <div id={_emptyChartId} role={'alert'} style={{ opacity: '0' }} aria-label={'Graph has no data to display'} />\n );\n});\nScatterChart.displayName = 'ScatterChart';\n"],"names":["React","useScatterChartStyles","select","d3Select","Legends","max","d3Max","min","d3Min","useId","areArraysEqual","createNumericYAxis","createStringYAxis","domainRangeOfDateForScatterChart","domainRangeOfNumericForScatterChart","domainRangeOfXStringAxis","find","findNumericMinMaxOfY","useRtl","CartesianChart","tokens","calloutData","ChartTypes","XAxisTypes","tooltipOfAxislabels","getTypeOfAxis","getNextColor","getColorFromToken","formatDate","toImage","ScatterChart","forwardRef","props","forwardedRef","_circleId","_seriesId","_verticalLine","_tooltipId","_firstRenderOptimization","_emptyChartId","_points","_injectIndexPropertyInScatterChartData","data","scatterChartData","_calloutPoints","_xAxisScale","_yAxisScale","_uniqueCallOutID","_refArray","margins","renderSeries","_xAxisLabels","xAxisCalloutAccessibilityData","_xBandwidth","cartesianChartRef","useRef","classes","_legendsRef","_isRTL","hoverXValue","setHoverXValue","useState","activeLegend","setActiveLegend","YValueHover","setYValueHover","selectedLegendPoints","setSelectedLegendPoints","isSelectedLegend","setIsSelectedLegend","activePoint","setActivePoint","stackCalloutProps","setStackCalloutProps","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","selectedLegends","setSelectedLegends","legendProps","prevSelectedLegendsRef","undefined","useEffect","current","useImperativeHandle","componentRef","chartContainer","opts","toSVG","_xAxisType","length","StringAxis","pointsRef","calloutPointsRef","height","width","map","item","index","color","updatePosition","newX","newY","threshold","distance","Math","sqrt","pow","_getNumericMinMaxOfY","points","yAxisType","startValue","endValue","yPadding","_getDomainNRangeValues","chartType","isRTL","xAxisType","barWidth","tickValues","shiftX","domainNRangeValue","NumericAxis","DateAxis","_getMargins","_margins","_initializeScatterChartData","xScale","yScale","containerHeight","containerWidth","xElement","_createPlot","_onHoverCardHide","_createLegends","isLegendMultiSelectEnabled","canSelectMultipleLegends","mapLegendToPoints","forEach","point","legend","push","legendDataItems","Object","entries","legendTitle","representativePoint","title","onMouseOutAction","hoverAction","_handleChartMouseLeave","legendShape","shape","legends","enabledWrapLines","enabledLegendsWrapLines","overflowText","legendsOverflowText","onLegendHoverCardLeave","onChange","_onLegendSelectionChange","legendRef","legendsSelected","event","currentLegend","slice","_getPointFill","seriesColor","pointId","pointIndex","isLastPoint","colorNeutralBackground1","_getRangeForScatterMarkerSize","xMin","xMax","xPadding","extraXPixels","yMin","domain","extraYPixels","series","yMax","bandwidth","getTime","maxMarkerSize","markerSize","i","pointsForSeries","legendVal","verticaLineHeight","bottom","j","seriesId","circleId","xAxisCalloutData","pointMarkerSize","extraMaxPixels","minPixel","maxPixel","circleRadius","isLegendSelected","_legendHighlighted","_noLegendHighlighted","currentPointHidden","hideNonActiveDots","text","circle","id","key","r","cx","cy","data-is-focusable","onMouseOver","_handleHover","onMouseMove","onMouseOut","_handleMouseOut","onFocus","_handleFocus","onBlur","_getClickHandler","onDataPointClick","opacity","fill","stroke","role","aria-label","_getAriaLabel","tabIndex","className","markerLabel","g","showXAxisLablesTooltip","document","getElementById","remove","e","wrapXAxisLables","xAxisElement","call","tooltipProps","tooltipCls","tooltip","axis","targetRect","target","getBoundingClientRect","left","top","formattedData","Date","useUTC","xVal","found","element","attr","obj","values","lineHeight","mouseEvent","persist","clientX","clientY","func","onClick","_getHighlightedLegend","includes","seriesIndex","formattedDate","xValue","yValue","yAxisCalloutData","callOutAccessibilityData","ariaLabel","_isChartEmpty","filter","_getMinMaxofXAxis","useCallback","tickFormat","legendBars","hideLegend","calloutProps","descriptionMessage","getCalloutDescriptionMessage","isCalloutForStack","culture","isCartesian","tickParams","xAxisLabels","dp","flat","Set","chartTitle","getmargins","getGraphData","getMinMaxOfYAxis","getDomainNRangeValues","createYAxis","onChartMouseLeave","enableFirstRenderOptimization","datasetForXAxisDomain","children","yScalePrimary","line","x1","y1","x2","y2","visibility","strokeDasharray","div","style","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/components/ScatterChart/ScatterChart.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ScatterChartProps } from './ScatterChart.types';\nimport { useScatterChartStyles } from './useScatterChartStyles.styles';\nimport { Axis as D3Axis } from 'd3-axis';\nimport { select as d3Select } from 'd3-selection';\nimport { Legend, Legends } from '../Legends/index';\nimport { max as d3Max, min as d3Min } from 'd3-array';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport {\n areArraysEqual,\n createNumericYAxis,\n createStringYAxis,\n domainRangeOfDateForScatterChart,\n domainRangeOfNumericForScatterChart,\n domainRangeOfXStringAxis,\n find,\n findNumericMinMaxOfY,\n IDomainNRange,\n YAxisType,\n useRtl,\n isTextMode,\n isScatterPolarSeries,\n} from '../../utilities/index';\nimport {\n AccessibilityProps,\n CartesianChart,\n ChildProps,\n CustomizedCalloutData,\n Margins,\n RefArrayData,\n ScatterChartDataPoint,\n Chart,\n ImageExportOptions,\n LegendContainer,\n ScatterChartPoints,\n} from '../../index';\nimport { tokens } from '@fluentui/react-theme';\nimport {\n calloutData,\n ChartTypes,\n XAxisTypes,\n tooltipOfAxislabels,\n getTypeOfAxis,\n getNextColor,\n getColorFromToken,\n formatDate,\n} from '../../utilities/index';\nimport { LineChartPoints } from '../../types/DataPoint';\nimport { toImage } from '../../utilities/image-export-utils';\nimport { ScaleLinear } from 'd3-scale';\nimport { renderScatterPolarCategoryLabels } from '../../utilities/scatterpolar-utils';\n\ntype NumericAxis = D3Axis<number | { valueOf(): number }>;\n\ntype ScatterChartDataWithIndex = ScatterChartPoints & { index: number };\n\n// Create a ScatterChart variant which uses these default styles and this styled subcomponent.\n/**\n * ScatterChart component\n * {@docCategory ScatterChart}\n */\nexport const ScatterChart: React.FunctionComponent<ScatterChartProps> = React.forwardRef<\n HTMLDivElement,\n ScatterChartProps\n>((props, forwardedRef) => {\n const _circleId: string = useId('circle');\n const _seriesId: string = useId('seriesID');\n const _verticalLine: string = useId('verticalLine');\n const _tooltipId: string = useId('ScatterChartTooltipId_');\n const _firstRenderOptimization = true;\n const _emptyChartId: string = useId('_ScatterChart_empty');\n let _points: ScatterChartDataWithIndex[] = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _calloutPoints: any[] = calloutData(_points) || [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xAxisScale: any = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _yAxisScale: any = '';\n let _uniqueCallOutID: string | null = '';\n let _refArray: RefArrayData[] = [];\n let margins: Margins;\n let renderSeries: JSXElement[];\n let _xAxisLabels: string[] = [];\n let xAxisCalloutAccessibilityData: AccessibilityProps = {};\n let _xBandwidth = 0;\n const cartesianChartRef = React.useRef<Chart>(null);\n const classes = useScatterChartStyles(props);\n const _legendsRef = React.useRef<LegendContainer>(null);\n const _isRTL: boolean = useRtl();\n\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [activeLegend, setActiveLegend] = React.useState<string>('');\n const [YValueHover, setYValueHover] = React.useState<[]>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [selectedLegendPoints, setSelectedLegendPoints] = React.useState<any[]>([]);\n const [isSelectedLegend, setIsSelectedLegend] = React.useState<boolean>(false);\n const [activePoint, setActivePoint] = React.useState<string>('');\n const [stackCalloutProps, setStackCalloutProps] = React.useState<CustomizedCalloutData>();\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const prevSelectedLegendsRef = React.useRef<string[] | undefined>(undefined);\n const _isTextMode = React.useRef(false);\n const _isScatterPolarRef = React.useRef(false);\n\n React.useEffect(() => {\n if (\n prevSelectedLegendsRef.current &&\n !areArraysEqual(prevSelectedLegendsRef.current, props.legendProps?.selectedLegends)\n ) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n prevSelectedLegendsRef.current = props.legendProps?.selectedLegends;\n }, [props.legendProps?.selectedLegends]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: cartesianChartRef.current?.chartContainer ?? null,\n toImage: (opts?: ImageExportOptions): Promise<string> => {\n return toImage(cartesianChartRef.current?.chartContainer, _legendsRef.current?.toSVG, _isRTL, opts);\n },\n }),\n [],\n );\n\n const _xAxisType: XAxisTypes =\n props.data.scatterChartData! &&\n props.data.scatterChartData!.length > 0 &&\n props.data.scatterChartData![0].data &&\n props.data.scatterChartData![0].data.length > 0\n ? (getTypeOfAxis(props.data.scatterChartData![0].data[0].x, true) as XAxisTypes)\n : XAxisTypes.StringAxis;\n\n const pointsRef = React.useRef<ScatterChartDataWithIndex[] | []>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const calloutPointsRef = React.useRef<any[]>([]);\n React.useEffect(() => {\n /** note that height and width are not used to resize or set as dimesions of the chart,\n * fitParentContainer is responisble for setting the height and width or resizing of the svg/chart\n */\n\n if (_points !== _injectIndexPropertyInScatterChartData(props.data.scatterChartData) || props.data !== _points) {\n pointsRef.current = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n calloutPointsRef.current = calloutData(pointsRef.current);\n }\n }, [props.height, props.width, props.data, _points]);\n\n function _injectIndexPropertyInScatterChartData(\n scatterChartData?: ScatterChartPoints[],\n ): ScatterChartDataWithIndex[] | [] {\n return scatterChartData\n ? scatterChartData.map((item: ScatterChartPoints, index: number) => {\n let color: string;\n if (typeof item.color === 'undefined') {\n color = getNextColor(index, 0);\n } else {\n color = getColorFromToken(item.color);\n }\n return {\n ...item,\n index: -1,\n color,\n };\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 _getNumericMinMaxOfY(\n points: ScatterChartPoints[],\n yAxisType?: YAxisType,\n ): { startValue: number; endValue: number } {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { startValue, endValue } = findNumericMinMaxOfY(points, yAxisType);\n let yPadding = 0;\n yPadding = (endValue - startValue) * 0.1;\n\n return {\n startValue: startValue - yPadding,\n endValue: endValue + yPadding,\n };\n }\n\n function _getDomainNRangeValues(\n points: any,\n margins: Margins,\n width: number,\n chartType: ChartTypes,\n isRTL: boolean,\n xAxisType: XAxisTypes,\n barWidth: number,\n tickValues: Date[] | number[] | undefined,\n shiftX: number,\n ) {\n let domainNRangeValue: IDomainNRange;\n if (xAxisType === XAxisTypes.NumericAxis) {\n domainNRangeValue = domainRangeOfNumericForScatterChart(points, margins, width, isRTL);\n } else if (xAxisType === XAxisTypes.DateAxis) {\n domainNRangeValue = domainRangeOfDateForScatterChart(points, margins, width, isRTL, tickValues! as Date[]);\n } else {\n domainNRangeValue = domainRangeOfXStringAxis(margins, width, isRTL);\n }\n return domainNRangeValue;\n }\n\n function _getMargins(_margins: Margins) {\n margins = _margins;\n }\n\n function _initializeScatterChartData(\n xScale: NumericAxis,\n yScale: NumericAxis,\n containerHeight: number,\n containerWidth: number,\n xElement: SVGElement | null,\n ) {\n _xAxisScale = xScale;\n _yAxisScale = yScale;\n _isTextMode.current = isTextMode(_points);\n _isScatterPolarRef.current = isScatterPolarSeries(_points);\n renderSeries = _createPlot(xElement!, containerHeight!);\n }\n\n function _onHoverCardHide() {\n setSelectedLegendPoints([]);\n setIsSelectedLegend(false);\n }\n\n function _createLegends(data: ScatterChartDataWithIndex[]): JSXElement {\n const { legendProps } = props;\n const isLegendMultiSelectEnabled = !!(legendProps && !!legendProps.canSelectMultipleLegends);\n const mapLegendToPoints: Record<string, ScatterChartDataWithIndex[]> = {};\n data.forEach((point: ScatterChartDataWithIndex) => {\n if (point.legend) {\n if (!mapLegendToPoints[point.legend]) {\n mapLegendToPoints[point.legend] = [];\n }\n mapLegendToPoints[point.legend].push(point);\n }\n });\n const legendDataItems: Legend[] = Object.entries(mapLegendToPoints).map(([legendTitle, points]) => {\n const representativePoint = points[0];\n // mapping data to the format Legends component needs\n const legend: Legend = {\n title: legendTitle,\n color: representativePoint.color!,\n onMouseOutAction: () => {\n setActiveLegend('');\n },\n hoverAction: () => {\n _handleChartMouseLeave();\n setActiveLegend(legendTitle);\n },\n ...(representativePoint.legendShape && {\n shape: representativePoint.legendShape,\n }),\n };\n return legend;\n });\n\n return (\n <Legends\n legends={[...legendDataItems]}\n enabledWrapLines={props.enabledLegendsWrapLines}\n overflowText={props.legendsOverflowText}\n {...(isLegendMultiSelectEnabled && { onLegendHoverCardLeave: _onHoverCardHide })}\n {...props.legendProps}\n selectedLegends={selectedLegends}\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n );\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 function _getPointFill(seriesColor: string, pointId: string, pointIndex: number, isLastPoint: boolean) {\n if (activePoint === pointId) {\n return tokens.colorNeutralBackground1;\n } else {\n return seriesColor;\n }\n }\n\n function _getRangeForScatterMarkerSize(\n yScale: ScaleLinear<number, number>,\n yPadding: number,\n xMin: number,\n xMax: number,\n xPadding: number,\n ): number {\n const extraXPixels = _isRTL\n ? _xAxisScale(xMax - xPadding) - _xAxisScale(xMax)\n : _xAxisScale(xMin + xPadding) - _xAxisScale(xMin);\n\n const yMin = yScale.domain()[0];\n const extraYPixels = yScale(yMin) - yScale(yMin + yPadding);\n return Math.min(extraXPixels, extraYPixels);\n }\n\n function _createPlot(xElement: SVGElement, containerHeight: number): JSXElement[] {\n const series: JSXElement[] = [];\n if (isSelectedLegend) {\n _points = selectedLegendPoints;\n } else {\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n }\n\n const yMax = d3Max(points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.y)!;\n })!;\n const yMin = d3Min(points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => item.y)!;\n })!;\n const yPadding = (yMax - yMin) * 0.1;\n\n let xPadding = 0;\n let xMin: number = 0;\n let xMax: number = 0;\n if (_xAxisType === XAxisTypes.StringAxis) {\n _xBandwidth = _xAxisScale.bandwidth() / 2;\n } else {\n const isDate = _xAxisType === XAxisTypes.DateAxis;\n const getX = (item: ScatterChartDataPoint) => (isDate ? (item.x as Date) : (item.x as number));\n\n const minVal = d3Min(_points, (point: ScatterChartPoints) => d3Min(point.data as ScatterChartDataPoint[], getX));\n const maxVal = d3Max(_points, (point: ScatterChartPoints) => d3Max(point.data as ScatterChartDataPoint[], getX));\n\n xMin = isDate ? (minVal as Date).getTime() : (minVal as number);\n xMax = isDate ? (maxVal as Date).getTime() : (maxVal as number);\n\n xPadding = (xMax - xMin) * 0.1;\n }\n\n const maxMarkerSize = d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n })!;\n\n for (let i = _points.length - 1; i >= 0; i--) {\n const pointsForSeries: JSXElement[] = [];\n\n const legendVal: string = _points[i].legend;\n const seriesColor: string = _points[i].color!;\n const verticaLineHeight = containerHeight - margins.bottom! + 6;\n\n for (let j = 0; j < _points[i].data.length; j++) {\n const seriesId = `${_seriesId}_${i}_${j}`;\n const circleId = `${_circleId}_${i}_${j}`;\n const { x, y, xAxisCalloutData, xAxisCalloutAccessibilityData } = _points[i].data[j];\n const pointMarkerSize = (_points[i].data[j] as ScatterChartDataPoint).markerSize;\n const extraMaxPixels =\n _xAxisType !== XAxisTypes.StringAxis\n ? _getRangeForScatterMarkerSize(_yAxisScale, yPadding, xMin, xMax, xPadding)\n : 0;\n const minPixel = 4;\n const maxPixel = 16;\n const circleRadius =\n pointMarkerSize && maxMarkerSize !== 0\n ? _xAxisType !== XAxisTypes.StringAxis\n ? (pointMarkerSize * extraMaxPixels) / maxMarkerSize\n : minPixel + ((pointMarkerSize - minPixel) / (maxMarkerSize - minPixel)) * (maxPixel - minPixel)\n : activePoint === circleId\n ? 6\n : 4;\n\n const isLegendSelected: boolean = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;\n\n const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;\n const text = _points?.[i].data[j]?.text;\n if (!_isTextMode.current) {\n pointsForSeries.push(\n <>\n <circle\n id={circleId}\n key={circleId}\n r={Math.max(circleRadius, 4)}\n cx={_xAxisScale(x) + _xBandwidth}\n cy={_yAxisScale(y)}\n data-is-focusable={isLegendSelected}\n onMouseOver={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseMove={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseOut={_handleMouseOut}\n onFocus={event =>\n _handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData)\n }\n onBlur={_handleMouseOut}\n {..._getClickHandler(_points[i].data[j].onDataPointClick)}\n opacity={isLegendSelected && !currentPointHidden ? 1 : 0.1}\n fill={_getPointFill(seriesColor, circleId, j, false)}\n stroke={seriesColor}\n role=\"img\"\n aria-label={_getAriaLabel(i, j)}\n tabIndex={isLegendSelected ? 0 : undefined}\n />\n ,\n {text && (\n <text\n key={`${circleId}-label`}\n x={_xAxisScale(x) + _xBandwidth}\n y={_yAxisScale(y) + Math.max(circleRadius + 12, 16)}\n className={classes.markerLabel}\n >\n {text}\n </text>\n )}\n </>,\n );\n }\n }\n\n if (_isScatterPolarRef.current) {\n // Render category labels for all series at once to avoid overlap\n const allSeriesData = _points.map(s => ({\n data: s.data\n .filter(pt => typeof pt.x === 'number' && typeof pt.y === 'number')\n .map(pt => ({ x: pt.x as number, y: pt.y as number, text: pt.text })),\n }));\n pointsForSeries.push(\n ...renderScatterPolarCategoryLabels({\n allSeriesData,\n xAxisScale: _xAxisScale.current,\n yAxisScale: _yAxisScale.current,\n className: classes.markerLabel || '',\n lineOptions: (_points?.[i] as Partial<LineChartPoints>)?.lineOptions,\n }),\n );\n }\n\n series.push(\n <g\n key={`series_${i}`}\n role=\"region\"\n aria-label={`${legendVal}, series ${i + 1} of ${_points.length} with ${_points[i].data.length} data points.`}\n >\n {pointsForSeries}\n </g>,\n );\n }\n // Removing un wanted tooltip div from DOM, when prop not provided.\n if (!props.showXAxisLablesTooltip) {\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n // Used to display tooltip at x axis labels.\n if (!props.wrapXAxisLables && props.showXAxisLablesTooltip) {\n const xAxisElement = d3Select(xElement).call(_xAxisScale);\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n // eslint-disable-next-line no-empty\n } catch (e) {}\n const tooltipProps = {\n tooltipCls: classes.tooltip!,\n id: _tooltipId,\n axis: xAxisElement,\n };\n xAxisElement && tooltipOfAxislabels(tooltipProps);\n }\n return series;\n }\n\n function _handleFocus(\n event: React.FocusEvent<SVGCircleElement, Element>,\n seriesId: string,\n x: number | Date | string,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData?: AccessibilityProps,\n ) {\n let cx = 0;\n let cy = 0;\n\n const targetRect = (event.target as SVGCircleElement).getBoundingClientRect();\n cx = targetRect.left + targetRect.width / 2;\n cy = targetRect.top + targetRect.height / 2;\n updatePosition(cx, cy);\n _uniqueCallOutID = circleId;\n const formattedData = x instanceof Date ? formatDate(x, props.useUTC) : x;\n const xVal = x instanceof Date ? x.getTime() : x;\n const found = find(_calloutPoints, (element: { x: string | number }) => element.x === xVal);\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, 0)`)\n .attr('visibility', 'visibility');\n _refArray.forEach((obj: RefArrayData) => {\n if (obj.index === seriesId) {\n setPopoverOpen(true);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setActivePoint(circleId);\n }\n });\n } else {\n setActivePoint(circleId);\n }\n }\n\n function _handleHover(\n x: number | Date | string,\n y: number | Date,\n lineHeight: number,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData: AccessibilityProps | undefined,\n mouseEvent: React.MouseEvent<SVGElement>,\n ) {\n mouseEvent?.persist();\n const formattedData = x instanceof Date ? formatDate(x, props.useUTC) : x;\n const xVal = x instanceof Date ? x.getTime() : x;\n const found = find(_calloutPoints, (element: { x: string | number }) => element.x === xVal);\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, ${_yAxisScale(y)})`)\n .attr('visibility', 'visibility')\n .attr('y2', `${lineHeight - _yAxisScale(y)}`);\n\n if (_uniqueCallOutID !== circleId) {\n _uniqueCallOutID = circleId;\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setActivePoint(circleId);\n }\n } else {\n setActivePoint(circleId);\n }\n }\n\n /**\n * Screen readers announce an element as clickable if the onClick attribute is set.\n * This function sets the attribute only when a click event handler is provided.*/\n\n function _getClickHandler(func?: () => void): { onClick?: () => void } {\n if (func) {\n return {\n onClick: func,\n };\n }\n\n return {};\n }\n\n function _handleMouseOut() {\n d3Select(`#${_verticalLine}`).attr('visibility', 'hidden');\n }\n\n function _handleChartMouseLeave() {\n _uniqueCallOutID = null;\n setActivePoint('');\n if (isPopoverOpen) {\n setPopoverOpen(false);\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): boolean {\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(): boolean {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend(): string[] {\n return selectedLegends.length > 0 ? selectedLegends : activeLegend ? [activeLegend] : [];\n }\n\n function _getAriaLabel(seriesIndex: number, pointIndex: number): string {\n const series = _points[seriesIndex];\n const point = series.data[pointIndex];\n const formattedDate = point.x instanceof Date ? formatDate(point.x, props.useUTC) : point.x;\n const xValue = point.xAxisCalloutData || formattedDate;\n const legend = series.legend;\n const yValue = point.yAxisCalloutData || point.y;\n return point.callOutAccessibilityData?.ariaLabel || `${xValue}. ${legend}, ${yValue}.`;\n }\n\n function _isChartEmpty(): boolean {\n return !(\n props.data &&\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData.filter((item: ScatterChartPoints) => item.data.length).length > 0\n );\n }\n\n const _getMinMaxofXAxis = React.useCallback(\n (points: ScatterChartPoints[], yAxisType: YAxisType | undefined) =>\n _getNumericMinMaxOfY(points as ScatterChartPoints[], yAxisType),\n [],\n );\n\n const { legendProps, tickValues, tickFormat } = props;\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n\n let points = _points as ScatterChartPoints[];\n if (legendProps && !!legendProps.canSelectMultipleLegends) {\n points = selectedLegendPoints.length >= 1 ? selectedLegendPoints : _points;\n _calloutPoints = calloutData(points);\n }\n\n let legendBars = null;\n // reduce computation cost by only creating legendBars\n // if when hideLegend is false.\n // NOTE: they are rendered only when hideLegend is false in CartesianChart.\n if (!props.hideLegend && !_isTextMode.current) {\n legendBars = _createLegends(_points!); // ToDo: Memoize legends to improve performance.\n }\n const calloutProps = {\n YValueHover,\n hoverXValue,\n descriptionMessage:\n props.getCalloutDescriptionMessage && stackCalloutProps\n ? props.getCalloutDescriptionMessage(stackCalloutProps)\n : undefined,\n 'data-is-focusable': true,\n xAxisCalloutAccessibilityData,\n ...props.calloutProps,\n clickPosition,\n isPopoverOpen,\n isCalloutForStack: true,\n culture: props.culture ?? 'en-us',\n isCartesian: true,\n };\n const tickParams = {\n tickValues,\n tickFormat,\n };\n\n const xAxisLabels: string[] = _points\n .map((point: ScatterChartDataWithIndex) => point.data.map((dp: ScatterChartDataPoint) => dp.x as string))\n .flat();\n\n _xAxisLabels = [...new Set(xAxisLabels)];\n\n return !_isChartEmpty() ? (\n <CartesianChart\n {...props}\n chartTitle={props.data.chartTitle}\n points={points}\n chartType={ChartTypes.ScatterChart}\n calloutProps={calloutProps}\n tickParams={tickParams}\n legendBars={legendBars}\n getmargins={_getMargins}\n getGraphData={_initializeScatterChartData}\n xAxisType={_xAxisType}\n getMinMaxOfYAxis={_getMinMaxofXAxis}\n getDomainNRangeValues={_getDomainNRangeValues}\n createYAxis={createNumericYAxis}\n createStringYAxis={createStringYAxis}\n onChartMouseLeave={_handleChartMouseLeave}\n enableFirstRenderOptimization={_firstRenderOptimization}\n datasetForXAxisDomain={_xAxisLabels}\n componentRef={cartesianChartRef}\n {...(_isScatterPolarRef.current ? { yMaxValue: 1, yMinValue: -1 } : {})}\n /* eslint-disable react/jsx-no-bind */\n // eslint-disable-next-line react/no-children-prop\n children={(props: ChildProps) => {\n _xAxisScale = props.xScale!;\n _yAxisScale = props.yScalePrimary!;\n return (\n <>\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={props.containerHeight}\n stroke={'#323130'}\n id={_verticalLine}\n visibility={'hidden'}\n strokeDasharray={'5,5'}\n />\n <g>{renderSeries}</g>\n </g>\n </>\n );\n }}\n />\n ) : (\n <div id={_emptyChartId} role={'alert'} style={{ opacity: '0' }} aria-label={'Graph has no data to display'} />\n );\n});\nScatterChart.displayName = 'ScatterChart';\n"],"names":["React","useScatterChartStyles","select","d3Select","Legends","max","d3Max","min","d3Min","useId","areArraysEqual","createNumericYAxis","createStringYAxis","domainRangeOfDateForScatterChart","domainRangeOfNumericForScatterChart","domainRangeOfXStringAxis","find","findNumericMinMaxOfY","useRtl","isTextMode","isScatterPolarSeries","CartesianChart","tokens","calloutData","ChartTypes","XAxisTypes","tooltipOfAxislabels","getTypeOfAxis","getNextColor","getColorFromToken","formatDate","toImage","renderScatterPolarCategoryLabels","ScatterChart","forwardRef","props","forwardedRef","_circleId","_seriesId","_verticalLine","_tooltipId","_firstRenderOptimization","_emptyChartId","_points","_injectIndexPropertyInScatterChartData","data","scatterChartData","_calloutPoints","_xAxisScale","_yAxisScale","_uniqueCallOutID","_refArray","margins","renderSeries","_xAxisLabels","xAxisCalloutAccessibilityData","_xBandwidth","cartesianChartRef","useRef","classes","_legendsRef","_isRTL","hoverXValue","setHoverXValue","useState","activeLegend","setActiveLegend","YValueHover","setYValueHover","selectedLegendPoints","setSelectedLegendPoints","isSelectedLegend","setIsSelectedLegend","activePoint","setActivePoint","stackCalloutProps","setStackCalloutProps","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","selectedLegends","setSelectedLegends","legendProps","prevSelectedLegendsRef","undefined","_isTextMode","_isScatterPolarRef","useEffect","current","useImperativeHandle","componentRef","chartContainer","opts","toSVG","_xAxisType","length","StringAxis","pointsRef","calloutPointsRef","height","width","map","item","index","color","updatePosition","newX","newY","threshold","distance","Math","sqrt","pow","_getNumericMinMaxOfY","points","yAxisType","startValue","endValue","yPadding","_getDomainNRangeValues","chartType","isRTL","xAxisType","barWidth","tickValues","shiftX","domainNRangeValue","NumericAxis","DateAxis","_getMargins","_margins","_initializeScatterChartData","xScale","yScale","containerHeight","containerWidth","xElement","_createPlot","_onHoverCardHide","_createLegends","isLegendMultiSelectEnabled","canSelectMultipleLegends","mapLegendToPoints","forEach","point","legend","push","legendDataItems","Object","entries","legendTitle","representativePoint","title","onMouseOutAction","hoverAction","_handleChartMouseLeave","legendShape","shape","legends","enabledWrapLines","enabledLegendsWrapLines","overflowText","legendsOverflowText","onLegendHoverCardLeave","onChange","_onLegendSelectionChange","legendRef","legendsSelected","event","currentLegend","slice","_getPointFill","seriesColor","pointId","pointIndex","isLastPoint","colorNeutralBackground1","_getRangeForScatterMarkerSize","xMin","xMax","xPadding","extraXPixels","yMin","domain","extraYPixels","series","yMax","bandwidth","isDate","getX","minVal","maxVal","getTime","maxMarkerSize","markerSize","i","pointsForSeries","legendVal","verticaLineHeight","bottom","j","seriesId","circleId","xAxisCalloutData","pointMarkerSize","extraMaxPixels","minPixel","maxPixel","circleRadius","isLegendSelected","_legendHighlighted","_noLegendHighlighted","currentPointHidden","hideNonActiveDots","text","circle","id","key","r","cx","cy","data-is-focusable","onMouseOver","_handleHover","onMouseMove","onMouseOut","_handleMouseOut","onFocus","_handleFocus","onBlur","_getClickHandler","onDataPointClick","opacity","fill","stroke","role","aria-label","_getAriaLabel","tabIndex","className","markerLabel","allSeriesData","s","filter","pt","xAxisScale","yAxisScale","lineOptions","g","showXAxisLablesTooltip","document","getElementById","remove","e","wrapXAxisLables","xAxisElement","call","tooltipProps","tooltipCls","tooltip","axis","targetRect","target","getBoundingClientRect","left","top","formattedData","Date","useUTC","xVal","found","element","attr","obj","values","lineHeight","mouseEvent","persist","clientX","clientY","func","onClick","_getHighlightedLegend","includes","seriesIndex","formattedDate","xValue","yValue","yAxisCalloutData","callOutAccessibilityData","ariaLabel","_isChartEmpty","_getMinMaxofXAxis","useCallback","tickFormat","legendBars","hideLegend","calloutProps","descriptionMessage","getCalloutDescriptionMessage","isCalloutForStack","culture","isCartesian","tickParams","xAxisLabels","dp","flat","Set","chartTitle","getmargins","getGraphData","getMinMaxOfYAxis","getDomainNRangeValues","createYAxis","onChartMouseLeave","enableFirstRenderOptimization","datasetForXAxisDomain","yMaxValue","yMinValue","children","yScalePrimary","line","x1","y1","x2","y2","visibility","strokeDasharray","div","style","displayName"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ extractMaybeLineOptions: function() {
13
+ return extractMaybeLineOptions;
14
+ },
15
+ renderScatterPolarCategoryLabels: function() {
16
+ return renderScatterPolarCategoryLabels;
17
+ }
18
+ });
19
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
20
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
21
+ function renderScatterPolarCategoryLabels({ allSeriesData, xAxisScale, yAxisScale, className, lineOptions, minPixelGap = 40 }) {
22
+ const maybeLineOptions = extractMaybeLineOptions(lineOptions);
23
+ // 1. Aggregate all data points from all series
24
+ const allLabels = [];
25
+ allSeriesData.forEach((series)=>{
26
+ series.data.forEach((pt)=>{
27
+ if (pt.text) {
28
+ allLabels.push({
29
+ x: pt.x,
30
+ y: pt.y,
31
+ text: pt.text
32
+ });
33
+ }
34
+ });
35
+ });
36
+ // 2. Deduplicate by text (angle label)
37
+ const uniqueTexts = Array.from(new Set(allLabels.map((l)=>l.text)));
38
+ // 3. Place labels at equal angles
39
+ const renderedLabels = [];
40
+ const placedPositions = [];
41
+ const labelRadius = 0.7; // You can adjust this value for more/less offset
42
+ const numLabels = uniqueTexts.length;
43
+ // Respect schema or prop rotation and direction (default ccw, 0°)
44
+ const dirMultiplier = (maybeLineOptions === null || maybeLineOptions === void 0 ? void 0 : maybeLineOptions.direction) === 'clockwise' ? -1 : 1;
45
+ var _maybeLineOptions_rotation;
46
+ const rotationRad = ((_maybeLineOptions_rotation = maybeLineOptions === null || maybeLineOptions === void 0 ? void 0 : maybeLineOptions.rotation) !== null && _maybeLineOptions_rotation !== void 0 ? _maybeLineOptions_rotation : 0) * Math.PI / 180;
47
+ uniqueTexts.forEach((text, i)=>{
48
+ const angle = rotationRad + dirMultiplier * (2 * Math.PI / numLabels) * i;
49
+ const originXOffset = (maybeLineOptions === null || maybeLineOptions === void 0 ? void 0 : maybeLineOptions.originXOffset) || 0;
50
+ const x = xAxisScale(labelRadius * Math.cos(angle) - originXOffset / 2);
51
+ const y = yAxisScale(labelRadius * Math.sin(angle));
52
+ // Check distance from all previously placed labels
53
+ const isFarEnough = placedPositions.every((pos)=>Math.sqrt((x - pos.x) ** 2 + (y - pos.y) ** 2) >= minPixelGap);
54
+ if (renderedLabels.length === 0 || isFarEnough) {
55
+ renderedLabels.push(/*#__PURE__*/ _react.createElement("text", {
56
+ key: `scatterpolar-label-${text}`,
57
+ x: x,
58
+ y: y,
59
+ className: className,
60
+ textAnchor: "middle",
61
+ alignmentBaseline: "middle",
62
+ opacity: 1
63
+ }, text));
64
+ placedPositions.push({
65
+ x,
66
+ y
67
+ });
68
+ }
69
+ });
70
+ return renderedLabels;
71
+ }
72
+ function extractMaybeLineOptions(lineOptions) {
73
+ return lineOptions ? {
74
+ originXOffset: lineOptions.originXOffset,
75
+ direction: lineOptions.direction === 'clockwise' || lineOptions.direction === 'counterclockwise' ? lineOptions.direction : undefined,
76
+ rotation: lineOptions.rotation
77
+ } : undefined;
78
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utilities/scatterpolar-utils.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ScaleLinear } from 'd3-scale';\nimport { JSXElement } from '@fluentui/react-utilities';\n\n/**\n * Helper to render categorical labels for scatterpolar charts with improved overlap logic across all series\n * Now places labels at equal angles for all unique texts, regardless of data positions.\n */\nexport function renderScatterPolarCategoryLabels({\n allSeriesData,\n xAxisScale,\n yAxisScale,\n className,\n lineOptions,\n minPixelGap = 40,\n}: {\n allSeriesData: { data: { x: number; y: number; text?: string }[] }[];\n xAxisScale: ScaleLinear<number, number>;\n yAxisScale: ScaleLinear<number, number>;\n className: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lineOptions?: any;\n minPixelGap?: number;\n}): JSXElement[] {\n const maybeLineOptions = extractMaybeLineOptions(lineOptions);\n\n // 1. Aggregate all data points from all series\n const allLabels: { x: number; y: number; text: string }[] = [];\n allSeriesData.forEach(series => {\n series.data.forEach(pt => {\n if (pt.text) {\n allLabels.push({ x: pt.x, y: pt.y, text: pt.text });\n }\n });\n });\n\n // 2. Deduplicate by text (angle label)\n const uniqueTexts = Array.from(new Set(allLabels.map(l => l.text)));\n\n // 3. Place labels at equal angles\n const renderedLabels: JSXElement[] = [];\n const placedPositions: { x: number; y: number }[] = [];\n const labelRadius = 0.7; // You can adjust this value for more/less offset\n const numLabels = uniqueTexts.length;\n\n // Respect schema or prop rotation and direction (default ccw, 0°)\n const dirMultiplier = maybeLineOptions?.direction === 'clockwise' ? -1 : 1;\n const rotationRad = ((maybeLineOptions?.rotation ?? 0) * Math.PI) / 180;\n\n uniqueTexts.forEach((text, i) => {\n const angle = rotationRad + dirMultiplier * ((2 * Math.PI) / numLabels) * i;\n const originXOffset = maybeLineOptions?.originXOffset || 0;\n const x = xAxisScale(labelRadius * Math.cos(angle) - originXOffset / 2);\n const y = yAxisScale(labelRadius * Math.sin(angle));\n\n // Check distance from all previously placed labels\n const isFarEnough = placedPositions.every(pos => Math.sqrt((x - pos.x) ** 2 + (y - pos.y) ** 2) >= minPixelGap);\n\n if (renderedLabels.length === 0 || isFarEnough) {\n renderedLabels.push(\n <text\n key={`scatterpolar-label-${text}`}\n x={x}\n y={y}\n className={className}\n textAnchor=\"middle\"\n alignmentBaseline=\"middle\"\n opacity={1}\n >\n {text}\n </text>,\n );\n placedPositions.push({ x, y });\n }\n });\n\n return renderedLabels;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractMaybeLineOptions(lineOptions: any):\n | {\n originXOffset?: number;\n direction?: 'clockwise' | 'counterclockwise';\n rotation?: number;\n }\n | undefined {\n return lineOptions\n ? {\n originXOffset: lineOptions.originXOffset,\n direction:\n lineOptions.direction === 'clockwise' || lineOptions.direction === 'counterclockwise'\n ? lineOptions.direction\n : undefined,\n rotation: lineOptions.rotation,\n }\n : undefined;\n}\n"],"names":["React","renderScatterPolarCategoryLabels","allSeriesData","xAxisScale","yAxisScale","className","lineOptions","minPixelGap","maybeLineOptions","extractMaybeLineOptions","allLabels","forEach","series","data","pt","text","push","x","y","uniqueTexts","Array","from","Set","map","l","renderedLabels","placedPositions","labelRadius","numLabels","length","dirMultiplier","direction","rotationRad","rotation","Math","PI","i","angle","originXOffset","cos","sin","isFarEnough","every","pos","sqrt","key","textAnchor","alignmentBaseline","opacity","undefined"],"mappings":";;;;;;;;;;;IAgFgBS,uBAAAA;;;IAxEAR,gCAAAA;;;;;iEARO,QAAQ;AAQxB,0CAA0C,EAC/CC,aAAa,EACbC,UAAU,EACVC,UAAU,EACVC,SAAS,EACTC,WAAW,EACXC,cAAc,EAAE,EASjB;IACC,MAAMC,mBAAmBC,wBAAwBH;IAEjD,+CAA+C;IAC/C,MAAMI,YAAsD,EAAE;IAC9DR,cAAcS,OAAO,CAACC,CAAAA;QACpBA,OAAOC,IAAI,CAACF,OAAO,CAACG,CAAAA;YAClB,IAAIA,GAAGC,IAAI,EAAE;gBACXL,UAAUM,IAAI,CAAC;oBAAEC,GAAGH,GAAGG,CAAC;oBAAEC,GAAGJ,GAAGI,CAAC;oBAAEH,MAAMD,GAAGC,IAAI;gBAAC;YACnD;QACF;IACF;IAEA,uCAAuC;IACvC,MAAMI,cAAcC,MAAMC,IAAI,CAAC,IAAIC,IAAIZ,UAAUa,GAAG,CAACC,CAAAA,IAAKA,EAAET,IAAI;IAEhE,kCAAkC;IAClC,MAAMU,iBAA+B,EAAE;IACvC,MAAMC,kBAA8C,EAAE;IACtD,MAAMC,cAAc,KAAK,iDAAiD;IAC1E,MAAMC,YAAYT,YAAYU,MAAM;IAEpC,kEAAkE;IAClE,MAAMC,gBAAgBtB,CAAAA,qBAAAA,QAAAA,qBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,iBAAkBuB,SAAAA,AAAS,MAAK,cAAc,CAAC,IAAI;QACnDvB;IAAtB,MAAMwB,cAAgBxB,CAAAA,CAAAA,6BAAAA,qBAAAA,QAAAA,qBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,iBAAkByB,QAAAA,AAAQ,MAAA,QAA1BzB,+BAAAA,KAAAA,IAAAA,8BAA8B,CAAA,GAAK0B,KAAKC,EAAE,GAAI;IAEpEhB,YAAYR,OAAO,CAAC,CAACI,MAAMqB;QACzB,MAAMC,QAAQL,cAAcF,gBAAiB,CAAC,IAAII,KAAKC,EAAE,GAAIP,SAAAA,CAAQ,GAAKQ;QAC1E,MAAME,gBAAgB9B,sBAAAA,QAAAA,qBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,iBAAkB8B,aAAAA,AAAa,KAAI;QACzD,MAAMrB,IAAId,WAAWwB,cAAcO,KAAKK,GAAG,CAACF,SAASC,gBAAgB;QACrE,MAAMpB,IAAId,WAAWuB,cAAcO,KAAKM,GAAG,CAACH;QAE5C,mDAAmD;QACnD,MAAMI,cAAcf,gBAAgBgB,KAAK,CAACC,CAAAA,MAAOT,KAAKU,IAAI,CAAE3B,CAAAA,IAAI0B,KAAI1B,KAAM,IAAKC,CAAAA,IAAIyB,KAAIzB,KAAM,MAAMX;QAEnG,IAAIkB,eAAeI,MAAM,KAAK,KAAKY,aAAa;YAC9ChB,eAAeT,IAAI,CAAA,WAAA,GACjB,OAAA,aAAA,CAACD,QAAAA;gBACC8B,KAAK,CAAC,mBAAmB,EAAE9B,MAAM;gBACjCE,GAAGA;gBACHC,GAAGA;gBACHb,WAAWA;gBACXyC,YAAW;gBACXC,mBAAkB;gBAClBC,SAAS;eAERjC;YAGLW,gBAAgBV,IAAI,CAAC;gBAAEC;gBAAGC;YAAE;QAC9B;IACF;IAEA,OAAOO;AACT;AAGO,iCAAiCnB,WAAgB;IAOtD,OAAOA,cACH;QACEgC,eAAehC,YAAYgC,aAAa;QACxCP,WACEzB,YAAYyB,SAAS,KAAK,eAAezB,YAAYyB,SAAS,KAAK,qBAC/DzB,YAAYyB,SAAS,GACrBkB;QACNhB,UAAU3B,YAAY2B,QAAQ;IAChC,IACAgB;AACN"}
@@ -171,6 +171,12 @@ _export(exports, {
171
171
  isScalePaddingDefined: function() {
172
172
  return isScalePaddingDefined;
173
173
  },
174
+ isScatterPolarSeries: function() {
175
+ return isScatterPolarSeries;
176
+ },
177
+ isTextMode: function() {
178
+ return isTextMode;
179
+ },
174
180
  pointTypes: function() {
175
181
  return pointTypes;
176
182
  },
@@ -970,6 +976,7 @@ function getXAxisType(points) {
970
976
  return isXAxisDateType;
971
977
  }
972
978
  function domainRangeOfNumericForAreaChart(points, margins, width, isRTL) {
979
+ const isScatterPolar = isScatterPolarSeries(points);
973
980
  const xMin = (0, _d3array.min)(points, (point)=>{
974
981
  return (0, _d3array.min)(point.data, (item)=>item.x);
975
982
  });
@@ -981,18 +988,19 @@ function domainRangeOfNumericForAreaChart(points, margins, width, isRTL) {
981
988
  const rStartValue = margins.left;
982
989
  const rEndValue = width - margins.right;
983
990
  return isRTL ? {
984
- dStartValue: xMax,
985
- dEndValue: xMin,
991
+ dStartValue: isScatterPolar ? 1 : xMax,
992
+ dEndValue: isScatterPolar ? -1 : xMin,
986
993
  rStartValue,
987
994
  rEndValue
988
995
  } : {
989
- dStartValue: xMin,
990
- dEndValue: xMax,
996
+ dStartValue: isScatterPolar ? -1 : xMin,
997
+ dEndValue: isScatterPolar ? 1 : xMax,
991
998
  rStartValue,
992
999
  rEndValue
993
1000
  };
994
1001
  }
995
1002
  function domainRangeOfNumericForScatterChart(points, margins, width, isRTL) {
1003
+ const isScatterPolar = isScatterPolarSeries(points);
996
1004
  let xMin = (0, _d3array.min)(points, (point)=>{
997
1005
  return (0, _d3array.min)(point.data, (item)=>item.x);
998
1006
  });
@@ -1007,13 +1015,13 @@ function domainRangeOfNumericForScatterChart(points, margins, width, isRTL) {
1007
1015
  const rStartValue = margins.left;
1008
1016
  const rEndValue = width - margins.right;
1009
1017
  return isRTL ? {
1010
- dStartValue: xMax,
1011
- dEndValue: xMin,
1018
+ dStartValue: isScatterPolar ? 1 : xMax,
1019
+ dEndValue: isScatterPolar ? -1 : xMin,
1012
1020
  rStartValue,
1013
1021
  rEndValue
1014
1022
  } : {
1015
- dStartValue: xMin,
1016
- dEndValue: xMax,
1023
+ dStartValue: isScatterPolar ? -1 : xMin,
1024
+ dEndValue: isScatterPolar ? 1 : xMax,
1017
1025
  rStartValue,
1018
1026
  rEndValue
1019
1027
  };
@@ -1585,3 +1593,15 @@ const createMeasurementSpan = (text, className, parentElement)=>{
1585
1593
  measurementSpan.textContent = `${text}`;
1586
1594
  return measurementSpan;
1587
1595
  };
1596
+ function isScatterPolarSeries(points) {
1597
+ return points.some((item)=>{
1598
+ var _item_lineOptions;
1599
+ return typeof ((_item_lineOptions = item.lineOptions) === null || _item_lineOptions === void 0 ? void 0 : _item_lineOptions.mode) === 'string' && item.lineOptions.mode === 'scatterpolar';
1600
+ });
1601
+ }
1602
+ function isTextMode(points) {
1603
+ return points.some((item)=>{
1604
+ var _item_lineOptions;
1605
+ return typeof ((_item_lineOptions = item.lineOptions) === null || _item_lineOptions === void 0 ? void 0 : _item_lineOptions.mode) === 'string' && item.lineOptions.mode === 'text';
1606
+ });
1607
+ }