@automattic/charts 0.50.2 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/charts/bar-chart/index.cjs +15 -0
- package/dist/charts/bar-chart/index.cjs.map +1 -0
- package/dist/{components/bar-list-chart → charts/bar-chart}/index.css +11 -11
- package/dist/charts/bar-chart/index.css.map +1 -0
- package/dist/{components → charts}/bar-chart/index.d.cts +1 -1
- package/dist/{components → charts}/bar-chart/index.d.ts +1 -1
- package/dist/{components → charts}/bar-chart/index.js +4 -4
- package/dist/charts/bar-list-chart/index.cjs +16 -0
- package/dist/charts/bar-list-chart/index.cjs.map +1 -0
- package/dist/{components/bar-chart → charts/bar-list-chart}/index.css +11 -11
- package/dist/charts/bar-list-chart/index.css.map +1 -0
- package/dist/{components → charts}/bar-list-chart/index.d.cts +1 -1
- package/dist/{components → charts}/bar-list-chart/index.d.ts +1 -1
- package/dist/{components → charts}/bar-list-chart/index.js +5 -5
- package/dist/charts/conversion-funnel-chart/index.cjs +10 -0
- package/dist/charts/conversion-funnel-chart/index.cjs.map +1 -0
- package/dist/{components → charts}/conversion-funnel-chart/index.css +23 -23
- package/dist/charts/conversion-funnel-chart/index.css.map +1 -0
- package/dist/{components → charts}/conversion-funnel-chart/index.d.cts +1 -1
- package/dist/{components → charts}/conversion-funnel-chart/index.d.ts +1 -1
- package/dist/{components → charts}/conversion-funnel-chart/index.js +2 -2
- package/dist/charts/leaderboard-chart/index.cjs +20 -0
- package/dist/charts/leaderboard-chart/index.cjs.map +1 -0
- package/dist/{components → charts}/leaderboard-chart/index.css +16 -16
- package/dist/charts/leaderboard-chart/index.css.map +1 -0
- package/dist/{components → charts}/leaderboard-chart/index.d.cts +2 -2
- package/dist/{components → charts}/leaderboard-chart/index.d.ts +2 -2
- package/dist/{components → charts}/leaderboard-chart/index.js +5 -5
- package/dist/charts/line-chart/index.cjs +15 -0
- package/dist/charts/line-chart/index.cjs.map +1 -0
- package/dist/{components → charts}/line-chart/index.css +21 -21
- package/dist/charts/line-chart/index.css.map +1 -0
- package/dist/{components → charts}/line-chart/index.d.cts +1 -1
- package/dist/{components → charts}/line-chart/index.d.ts +1 -1
- package/dist/{components → charts}/line-chart/index.js +4 -4
- package/dist/charts/pie-chart/index.cjs +18 -0
- package/dist/charts/pie-chart/index.cjs.map +1 -0
- package/dist/{components → charts}/pie-chart/index.css +3 -3
- package/dist/charts/pie-chart/index.css.map +1 -0
- package/dist/{components → charts}/pie-chart/index.d.cts +7 -7
- package/dist/{components → charts}/pie-chart/index.d.ts +7 -7
- package/dist/{components → charts}/pie-chart/index.js +6 -6
- package/dist/charts/pie-semi-circle-chart/index.cjs +17 -0
- package/dist/charts/pie-semi-circle-chart/index.cjs.map +1 -0
- package/dist/{components → charts}/pie-semi-circle-chart/index.css +5 -5
- package/dist/charts/pie-semi-circle-chart/index.css.map +1 -0
- package/dist/{components → charts}/pie-semi-circle-chart/index.d.cts +7 -7
- package/dist/{components → charts}/pie-semi-circle-chart/index.d.ts +7 -7
- package/dist/{components → charts}/pie-semi-circle-chart/index.js +6 -6
- package/dist/{chunk-N4ZDNOPY.cjs → chunk-44EBMDFI.cjs} +107 -236
- package/dist/chunk-44EBMDFI.cjs.map +1 -0
- package/dist/{chunk-XVMWJANV.js → chunk-624IQX64.js} +27 -27
- package/dist/chunk-624IQX64.js.map +1 -0
- package/dist/{chunk-BZQFCAX7.cjs → chunk-67BAKCI2.cjs} +9 -9
- package/dist/chunk-67BAKCI2.cjs.map +1 -0
- package/dist/{chunk-3OVXJFQY.js → chunk-A3AEEGKR.js} +2 -2
- package/dist/chunk-A3AEEGKR.js.map +1 -0
- package/dist/{chunk-6SGGF26Z.js → chunk-AI6GM6HS.js} +40 -37
- package/dist/chunk-AI6GM6HS.js.map +1 -0
- package/dist/{chunk-EKVFMS3A.cjs → chunk-BMWFTOSR.cjs} +38 -38
- package/dist/chunk-BMWFTOSR.cjs.map +1 -0
- package/dist/{chunk-D3DZT2EK.js → chunk-CEZGL6YP.js} +4 -4
- package/dist/chunk-CEZGL6YP.js.map +1 -0
- package/dist/{chunk-EKVLCYHS.js → chunk-DILKZ4MP.js} +5 -5
- package/dist/chunk-DILKZ4MP.js.map +1 -0
- package/dist/{chunk-VOWX5TBY.js → chunk-E6VKSUGP.js} +16 -16
- package/dist/chunk-E6VKSUGP.js.map +1 -0
- package/dist/{chunk-7OWIZ5S7.js → chunk-EELV2LG7.js} +4 -4
- package/dist/chunk-EELV2LG7.js.map +1 -0
- package/dist/{chunk-HA7WACBI.cjs → chunk-GOZNZD3N.cjs} +9 -9
- package/dist/chunk-GOZNZD3N.cjs.map +1 -0
- package/dist/{chunk-PTEEI2QM.js → chunk-GSG54JGM.js} +19 -19
- package/dist/chunk-GSG54JGM.js.map +1 -0
- package/dist/{chunk-3Z526IL2.cjs → chunk-HIWNB5PK.cjs} +4 -4
- package/dist/chunk-HIWNB5PK.cjs.map +1 -0
- package/dist/{chunk-6WQWN5BF.js → chunk-IDTLZ7KT.js} +17 -17
- package/dist/chunk-IDTLZ7KT.js.map +1 -0
- package/dist/{chunk-6UZHWL6W.cjs → chunk-JSGCFUVQ.cjs} +34 -34
- package/dist/chunk-JSGCFUVQ.cjs.map +1 -0
- package/dist/{chunk-5NI3TGRD.cjs → chunk-MUUSZ7J5.cjs} +2 -2
- package/dist/{chunk-D3E235JJ.js.map → chunk-MUUSZ7J5.cjs.map} +1 -1
- package/dist/{chunk-3PRIZR7Y.cjs → chunk-N4NZ4VJK.cjs} +34 -34
- package/dist/chunk-N4NZ4VJK.cjs.map +1 -0
- package/dist/{chunk-D3E235JJ.js → chunk-NONODB3K.js} +2 -2
- package/dist/chunk-NONODB3K.js.map +1 -0
- package/dist/{chunk-SDNRKKBP.cjs → chunk-OTZT3MC2.cjs} +2 -2
- package/dist/chunk-OTZT3MC2.cjs.map +1 -0
- package/dist/{chunk-RUG2O62B.js → chunk-S5UDYA4M.js} +22 -22
- package/dist/chunk-S5UDYA4M.js.map +1 -0
- package/dist/{chunk-KE4EDAQI.cjs → chunk-UJIP7ICA.cjs} +34 -34
- package/dist/chunk-UJIP7ICA.cjs.map +1 -0
- package/dist/{chunk-MRCTAUHL.js → chunk-ULRFJ3IU.js} +128 -257
- package/dist/chunk-ULRFJ3IU.js.map +1 -0
- package/dist/{chunk-SLO4NLKC.cjs → chunk-VEJIPJN7.cjs} +56 -53
- package/dist/chunk-VEJIPJN7.cjs.map +1 -0
- package/dist/{chunk-PEUZZ3WY.cjs → chunk-ZOCE4WND.cjs} +34 -34
- package/dist/chunk-ZOCE4WND.cjs.map +1 -0
- package/dist/components/legend/index.cjs +3 -3
- package/dist/components/legend/index.d.cts +1 -1
- package/dist/components/legend/index.d.ts +1 -1
- package/dist/components/legend/index.js +2 -2
- package/dist/components/tooltip/index.d.cts +1 -1
- package/dist/components/tooltip/index.d.ts +1 -1
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.d.cts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +188 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +96 -79
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +111 -12
- package/dist/index.d.ts +111 -12
- package/dist/index.js +179 -29
- package/dist/index.js.map +1 -1
- package/dist/{leaderboard-chart-BlBexVz4.d.cts → leaderboard-chart-Bf7z7SoM.d.cts} +1 -1
- package/dist/{leaderboard-chart-B3dPiEl8.d.ts → leaderboard-chart-Bh8M5JWL.d.ts} +1 -1
- package/dist/providers/index.cjs +2 -6
- package/dist/providers/index.cjs.map +1 -1
- package/dist/providers/index.d.cts +2 -2
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +3 -7
- package/dist/{themes-CNy453Lb.d.ts → themes-09M-mQE6.d.ts} +2 -10
- package/dist/{themes-Dv70Dz7B.d.cts → themes-DYhtyXtJ.d.cts} +2 -10
- package/dist/{types-4wyyzjot.d.cts → types-BtYG-Fdk.d.cts} +19 -0
- package/dist/{types-4wyyzjot.d.ts → types-BtYG-Fdk.d.ts} +19 -0
- package/dist/utils/index.d.cts +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/package.json +38 -30
- package/src/{components → charts}/bar-chart/bar-chart.tsx +2 -2
- package/src/{components → charts}/conversion-funnel-chart/test/conversion-funnel-chart.test.tsx +0 -1
- package/src/charts/index.ts +8 -0
- package/src/{components → charts}/leaderboard-chart/hooks/use-leaderboard-legend-items.ts +1 -1
- package/src/{components → charts}/leaderboard-chart/leaderboard-chart.tsx +1 -1
- package/src/{components → charts}/line-chart/line-chart.tsx +8 -5
- package/src/{components → charts}/line-chart/test/line-chart.test.tsx +7 -9
- package/src/{components → charts}/pie-chart/pie-chart.tsx +3 -3
- package/src/{components → charts}/pie-semi-circle-chart/pie-semi-circle-chart.tsx +3 -3
- package/src/{components → charts}/private/chart-composition/types.ts +1 -1
- package/src/charts/sparkline/index.ts +2 -0
- package/src/charts/sparkline/sparkline.module.scss +18 -0
- package/src/charts/sparkline/sparkline.tsx +200 -0
- package/src/charts/sparkline/test/sparkline.test.tsx +196 -0
- package/src/charts/sparkline/types.ts +92 -0
- package/src/components/index.ts +2 -0
- package/src/components/legend/legend.tsx +1 -1
- package/src/compositions/index.ts +2 -0
- package/src/index.ts +12 -14
- package/src/providers/chart-context/test/chart-context.test.tsx +0 -35
- package/src/providers/chart-context/test/use-global-charts-theme.test.tsx +1 -23
- package/src/providers/chart-context/themes.ts +5 -127
- package/src/types.ts +19 -0
- package/dist/chunk-3OVXJFQY.js.map +0 -1
- package/dist/chunk-3PRIZR7Y.cjs.map +0 -1
- package/dist/chunk-3Z526IL2.cjs.map +0 -1
- package/dist/chunk-5NI3TGRD.cjs.map +0 -1
- package/dist/chunk-6SGGF26Z.js.map +0 -1
- package/dist/chunk-6UZHWL6W.cjs.map +0 -1
- package/dist/chunk-6WQWN5BF.js.map +0 -1
- package/dist/chunk-7OWIZ5S7.js.map +0 -1
- package/dist/chunk-BZQFCAX7.cjs.map +0 -1
- package/dist/chunk-D3DZT2EK.js.map +0 -1
- package/dist/chunk-EKVFMS3A.cjs.map +0 -1
- package/dist/chunk-EKVLCYHS.js.map +0 -1
- package/dist/chunk-HA7WACBI.cjs.map +0 -1
- package/dist/chunk-KE4EDAQI.cjs.map +0 -1
- package/dist/chunk-MRCTAUHL.js.map +0 -1
- package/dist/chunk-N4ZDNOPY.cjs.map +0 -1
- package/dist/chunk-PEUZZ3WY.cjs.map +0 -1
- package/dist/chunk-PTEEI2QM.js.map +0 -1
- package/dist/chunk-RUG2O62B.js.map +0 -1
- package/dist/chunk-SDNRKKBP.cjs.map +0 -1
- package/dist/chunk-SLO4NLKC.cjs.map +0 -1
- package/dist/chunk-VOWX5TBY.js.map +0 -1
- package/dist/chunk-XVMWJANV.js.map +0 -1
- package/dist/components/bar-chart/index.cjs +0 -15
- package/dist/components/bar-chart/index.cjs.map +0 -1
- package/dist/components/bar-chart/index.css.map +0 -1
- package/dist/components/bar-list-chart/index.cjs +0 -16
- package/dist/components/bar-list-chart/index.cjs.map +0 -1
- package/dist/components/bar-list-chart/index.css.map +0 -1
- package/dist/components/conversion-funnel-chart/index.cjs +0 -10
- package/dist/components/conversion-funnel-chart/index.cjs.map +0 -1
- package/dist/components/conversion-funnel-chart/index.css.map +0 -1
- package/dist/components/leaderboard-chart/index.cjs +0 -20
- package/dist/components/leaderboard-chart/index.cjs.map +0 -1
- package/dist/components/leaderboard-chart/index.css.map +0 -1
- package/dist/components/line-chart/index.cjs +0 -15
- package/dist/components/line-chart/index.cjs.map +0 -1
- package/dist/components/line-chart/index.css.map +0 -1
- package/dist/components/pie-chart/index.cjs +0 -18
- package/dist/components/pie-chart/index.cjs.map +0 -1
- package/dist/components/pie-chart/index.css.map +0 -1
- package/dist/components/pie-semi-circle-chart/index.cjs +0 -17
- package/dist/components/pie-semi-circle-chart/index.cjs.map +0 -1
- package/dist/components/pie-semi-circle-chart/index.css.map +0 -1
- /package/dist/{components → charts}/bar-chart/index.js.map +0 -0
- /package/dist/{components → charts}/bar-list-chart/index.js.map +0 -0
- /package/dist/{components → charts}/conversion-funnel-chart/index.js.map +0 -0
- /package/dist/{components → charts}/leaderboard-chart/index.js.map +0 -0
- /package/dist/{components → charts}/line-chart/index.js.map +0 -0
- /package/dist/{components → charts}/pie-chart/index.js.map +0 -0
- /package/dist/{components → charts}/pie-semi-circle-chart/index.js.map +0 -0
- /package/src/{components → charts}/bar-chart/bar-chart.module.scss +0 -0
- /package/src/{components → charts}/bar-chart/index.ts +0 -0
- /package/src/{components → charts}/bar-chart/private/index.ts +0 -0
- /package/src/{components → charts}/bar-chart/private/use-bar-chart-options.ts +0 -0
- /package/src/{components → charts}/bar-chart/test/bar-chart.test.tsx +0 -0
- /package/src/{components → charts}/bar-list-chart/bar-list-chart.tsx +0 -0
- /package/src/{components → charts}/bar-list-chart/index.ts +0 -0
- /package/src/{components → charts}/bar-list-chart/test/bar-list-chart.test.tsx +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/conversion-funnel-chart.module.scss +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/conversion-funnel-chart.tsx +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/index.ts +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/private/index.ts +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/private/use-funnel-selection.ts +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/test/use-funnel-selection.test.ts +0 -0
- /package/src/{components → charts}/conversion-funnel-chart/types.ts +0 -0
- /package/src/{components → charts}/leaderboard-chart/hooks/index.ts +0 -0
- /package/src/{components → charts}/leaderboard-chart/index.ts +0 -0
- /package/src/{components → charts}/leaderboard-chart/leaderboard-chart.module.scss +0 -0
- /package/src/{components → charts}/leaderboard-chart/test/leaderboard-chart.test.tsx +0 -0
- /package/src/{components → charts}/leaderboard-chart/test/use-leaderboard-legend-items.test.tsx +0 -0
- /package/src/{components → charts}/leaderboard-chart/types.ts +0 -0
- /package/src/{components → charts}/line-chart/index.ts +0 -0
- /package/src/{components → charts}/line-chart/line-chart.module.scss +0 -0
- /package/src/{components → charts}/line-chart/private/index.ts +0 -0
- /package/src/{components → charts}/line-chart/private/line-chart-annotation-label-popover.tsx +0 -0
- /package/src/{components → charts}/line-chart/private/line-chart-annotation.tsx +0 -0
- /package/src/{components → charts}/line-chart/private/line-chart-annotations-overlay.tsx +0 -0
- /package/src/{components → charts}/line-chart/private/line-chart-glyph.tsx +0 -0
- /package/src/{components → charts}/line-chart/test/line-chart-annotation-label-popover.test.tsx +0 -0
- /package/src/{components → charts}/line-chart/test/line-chart-annotation.test.tsx +0 -0
- /package/src/{components → charts}/line-chart/types.ts +0 -0
- /package/src/{components → charts}/pie-chart/index.ts +0 -0
- /package/src/{components → charts}/pie-chart/pie-chart.module.scss +0 -0
- /package/src/{components → charts}/pie-chart/test/composition-api.test.tsx +0 -0
- /package/src/{components → charts}/pie-chart/test/pie-chart.test.tsx +0 -0
- /package/src/{components → charts}/pie-semi-circle-chart/index.ts +0 -0
- /package/src/{components → charts}/pie-semi-circle-chart/pie-semi-circle-chart.module.scss +0 -0
- /package/src/{components → charts}/pie-semi-circle-chart/test/pie-semi-circle-chart.test.tsx +0 -0
- /package/src/{components → charts}/private/chart-composition/chart-html.tsx +0 -0
- /package/src/{components → charts}/private/chart-composition/chart-svg.tsx +0 -0
- /package/src/{components → charts}/private/chart-composition/index.ts +0 -0
- /package/src/{components → charts}/private/chart-composition/test/use-chart-children.test.tsx +0 -0
- /package/src/{components → charts}/private/chart-composition/use-chart-children.ts +0 -0
- /package/src/{components → charts}/private/default-glyph/default-glyph.tsx +0 -0
- /package/src/{components → charts}/private/default-glyph/index.ts +0 -0
- /package/src/{components → charts}/private/grid-control/grid-control.module.scss +0 -0
- /package/src/{components → charts}/private/grid-control/grid-control.tsx +0 -0
- /package/src/{components → charts}/private/grid-control/index.ts +0 -0
- /package/src/{components → charts}/private/grid-control/test/grid-control.test.tsx +0 -0
- /package/src/{components → charts}/private/radial-wipe-animation/index.ts +0 -0
- /package/src/{components → charts}/private/radial-wipe-animation/radial-wipe-animation.tsx +0 -0
- /package/src/{components → charts}/private/single-chart-context/index.ts +0 -0
- /package/src/{components → charts}/private/single-chart-context/single-chart-context.tsx +0 -0
- /package/src/{components → charts}/private/single-chart-context/use-single-chart-context.ts +0 -0
- /package/src/{components → charts}/private/with-responsive/index.ts +0 -0
- /package/src/{components → charts}/private/with-responsive/test/with-responsive.test.tsx +0 -0
- /package/src/{components → charts}/private/with-responsive/with-responsive.tsx +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/bar-list-chart/bar-list-chart.tsx"],"sourcesContent":["import { formatNumberCompact } from '@automattic/number-formatters';\nimport { Group } from '@visx/group';\nimport { createScale, scaleBand } from '@visx/scale';\nimport { Text, type TextProps } from '@visx/text';\nimport { useContext, useMemo } from 'react';\nimport { GlobalChartsContext, GlobalChartsProvider } from '../../providers';\nimport { BarChart } from '../bar-chart';\nimport { withResponsive } from '../private/with-responsive';\nimport type { SeriesData } from '../..';\nimport type { ScaleOptions } from '../../types';\nimport type { BarChartProps } from '../bar-chart/bar-chart';\nimport type { AxisRendererProps, AxisScale } from '@visx/axis';\nimport type { AnyD3Scale } from '@visx/scale';\nimport type { ComponentType, FC } from 'react';\n\nexport interface BarListChartProps\n\textends Exclude< BarChartProps, 'orientation' | 'size' | 'gridVisibility' > {\n\toptions?: {\n\t\t/**\n\t\t * Scale for the y axis. Exclude the type property.\n\t\t */\n\t\tyScale: Omit< ScaleOptions, 'type' >;\n\t\t/**\n\t\t * Scale for the x axis. Exclude the type property.\n\t\t */\n\t\txScale: Omit< ScaleOptions, 'type' >;\n\t\t/**\n\t\t * Formatter for the label.\n\t\t */\n\t\tlabelFormatter?: ( value: string ) => string;\n\t\t/**\n\t\t * Formatter for the value.\n\t\t */\n\t\tvalueFormatter?: ( value: number ) => string;\n\t\t/**\n\t\t * y offset of the label and value. Default is based on the number of series, automatically computed.\n\t\t */\n\t\tyOffset?: number;\n\t\t/**\n\t\t * x position of the label.\n\t\t */\n\t\tlabelPosition?: number;\n\t\t/**\n\t\t * x position of the value.\n\t\t */\n\t\tvaluePosition?: number;\n\t\t/**\n\t\t * Custom render function for the label.\n\t\t */\n\t\tlabelComponent?: ComponentType< RenderLabelProps >;\n\t\t/**\n\t\t * Custom render function for the value.\n\t\t */\n\t\tvalueComponent?: ComponentType< RenderValueProps >;\n\t};\n}\n\nexport interface RenderLabelProps {\n\ttextProps: TextProps;\n\tx: number;\n\ty: number;\n\tlabel: string;\n\tformatter: ( value: string ) => string;\n}\n\nexport interface RenderValueProps {\n\ttextProps: TextProps;\n\tx: number;\n\ty: number;\n\tvalue: number;\n\t/**\n\t * Original data\n\t */\n\tdata: SeriesData[];\n\t/**\n\t * Index of the data point\n\t */\n\tindex: number;\n\tformatter: ( value: number ) => string;\n}\n\n/**\n * Get the bandwidth of a scale\n * @param scale - The scale to get the bandwidth of\n * @return The bandwidth of the scale\n */\nconst getScaleBandwidth = < Scale extends AxisScale >( scale?: Scale ) => {\n\t// Broaden type before using 'xxx' in s as typeguard.\n\tconst s = scale as AxisScale;\n\treturn s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0;\n};\n\nconst DefaultLabelComponent = ( { textProps, x, y, label, formatter } ) => {\n\treturn (\n\t\t<Text { ...textProps } textAnchor=\"start\" x={ x } y={ y }>\n\t\t\t{ formatter( label ) }\n\t\t</Text>\n\t);\n};\n\nconst DefaultValueComponent = ( { textProps, x, y, value, formatter }: RenderValueProps ) => {\n\treturn (\n\t\t<Text { ...textProps } textAnchor=\"end\" x={ x } y={ y } fontWeight={ 500 }>\n\t\t\t{ formatter( value ) }\n\t\t</Text>\n\t);\n};\n\nconst AxisRenderer = ( {\n\tticks,\n\ttickLabelProps,\n\tyOffset,\n\tlabelPosition,\n\tvaluePosition,\n\tdata,\n\tlabelFormatter,\n\tvalueFormatter,\n\tLabelComponent = DefaultLabelComponent,\n\tValueComponent = DefaultValueComponent,\n}: AxisRendererProps< AnyD3Scale > & {\n\tyOffset: number;\n\tlabelPosition: number;\n\tvaluePosition: number;\n\tdata: SeriesData[];\n\tlabelFormatter?: ( value: string ) => string;\n\tvalueFormatter?: ( value: number ) => string;\n\tLabelComponent?: ComponentType< RenderLabelProps >;\n\tValueComponent?: ComponentType< RenderValueProps >;\n} ) => {\n\tif ( ticks.length === 0 ) {\n\t\treturn null;\n\t}\n\n\t// compute the max tick label size to compute label offset\n\tconst allTickLabelProps = ticks.map( ( { value, index } ) =>\n\t\ttypeof tickLabelProps === 'function' ? tickLabelProps( value, index, ticks ) : {}\n\t);\n\n\treturn ticks.map( ( { from, formattedValue }, index ) => {\n\t\tconst textProps = allTickLabelProps[ index ] ?? {};\n\t\t// No need to pass textAnchor and dx. It will be handled by the component.\n\t\tdelete textProps.textAnchor;\n\t\tdelete textProps.dx;\n\n\t\tconst sum = data.reduce(\n\t\t\t( acc, { data: seriesData } ) => acc + ( seriesData[ index ]?.value ?? 0 ),\n\t\t\t0\n\t\t);\n\t\tconst y = from.y + yOffset;\n\n\t\treturn (\n\t\t\t<Group key={ index }>\n\t\t\t\t<LabelComponent\n\t\t\t\t\ttextProps={ textProps }\n\t\t\t\t\tx={ labelPosition }\n\t\t\t\t\ty={ y }\n\t\t\t\t\tlabel={ formattedValue }\n\t\t\t\t\tformatter={ labelFormatter }\n\t\t\t\t/>\n\t\t\t\t<ValueComponent\n\t\t\t\t\ttextProps={ textProps }\n\t\t\t\t\tx={ valuePosition }\n\t\t\t\t\ty={ y }\n\t\t\t\t\tvalue={ sum }\n\t\t\t\t\tformatter={ valueFormatter }\n\t\t\t\t\tdata={ data }\n\t\t\t\t\tindex={ index }\n\t\t\t\t/>\n\t\t\t</Group>\n\t\t);\n\t} );\n};\n\n/**\n * Calculate the default y offset for the bar list chart.\n * @param data - The data to calculate the default y offset for.\n * @param yScaleConfig - The y scale configuration.\n * @param height - The height of the chart.\n * @param isMultiSeries - Whether the chart is a multi series chart.\n * @return The default y offset.\n */\nconst getDefaultYOffset = (\n\tdata: SeriesData[],\n\tyScaleConfig: Omit< ScaleOptions, 'type' >,\n\theight: number,\n\tisMultiSeries: boolean\n) => {\n\tif ( ! isMultiSeries ) {\n\t\treturn 0;\n\t}\n\n\tconst dataKeys = data.map( ( { label } ) => label );\n\n\tconst yScale = createScale< string >( {\n\t\ttype: 'band' as const,\n\t\trange: [ 0, height ],\n\t\tdomain: dataKeys,\n\t\t...yScaleConfig,\n\t} );\n\n\tconst groupScale = scaleBand< string >( {\n\t\tdomain: dataKeys,\n\t\trange: [ 0, getScaleBandwidth( yScale ) ],\n\t\tpadding: yScaleConfig.paddingInner,\n\t} );\n\n\tconst GAP_BETWEEN_BARS = 6;\n\tconst barThickness = getScaleBandwidth( groupScale );\n\n\t// Use negative value to move the label up.\n\treturn -( barThickness + GAP_BETWEEN_BARS );\n};\n\nconst BarListChartInternal: FC< BarListChartProps > = ( {\n\tdata,\n\twidth,\n\theight,\n\toptions = {},\n\tmargin = {\n\t\tleft: 0,\n\t\tright: 20,\n\t\tbottom: 0,\n\t\ttop: 0,\n\t},\n\t...rest\n} ) => {\n\tconst chartOptions = useMemo( () => {\n\t\tconst isMultiSeries = data.length > 1;\n\n\t\tconst defaultYScale = {\n\t\t\t// For multi series, set default padding larger to look better.\n\t\t\tpaddingInner: isMultiSeries ? 0.3 : 0.1,\n\t\t\tpadding: isMultiSeries ? 0.3 : 0.1,\n\t\t};\n\t\tconst defaultXScale = {\n\t\t\t// Always begin at zero since the x axis is hidden.\n\t\t\tzero: true,\n\t\t};\n\t\tconst yScale = {\n\t\t\t...defaultYScale,\n\t\t\t...( options.yScale ?? {} ),\n\t\t};\n\t\tconst xScale = {\n\t\t\t...defaultXScale,\n\t\t\t...( options.xScale ?? {} ),\n\t\t};\n\n\t\treturn {\n\t\t\tyScale,\n\t\t\txScale,\n\t\t\tlabelPosition: options.labelPosition ?? ( isMultiSeries ? 0 : 10 ),\n\t\t\tvalueFormatter: options.valueFormatter ?? ( value => formatNumberCompact( value ) ),\n\t\t\tlabelFormatter: options.labelFormatter ?? ( value => String( value ) ),\n\t\t\tvaluePosition: options.valuePosition ?? width,\n\t\t\tyOffset: options.yOffset ?? getDefaultYOffset( data, yScale, height, isMultiSeries ),\n\t\t};\n\t}, [ options, width, data, height ] );\n\n\treturn (\n\t\t<BarChart\n\t\t\torientation=\"horizontal\"\n\t\t\tgridVisibility={ 'none' }\n\t\t\tdata={ data }\n\t\t\twidth={ width }\n\t\t\theight={ height }\n\t\t\tmargin={ margin }\n\t\t\toptions={ {\n\t\t\t\taxis: {\n\t\t\t\t\ty: {\n\t\t\t\t\t\tchildren: ( renderProps: AxisRendererProps< AnyD3Scale > ) => (\n\t\t\t\t\t\t\t<AxisRenderer\n\t\t\t\t\t\t\t\t{ ...renderProps }\n\t\t\t\t\t\t\t\tdata={ data }\n\t\t\t\t\t\t\t\tyOffset={ chartOptions.yOffset }\n\t\t\t\t\t\t\t\tlabelPosition={ chartOptions.labelPosition }\n\t\t\t\t\t\t\t\tvaluePosition={ chartOptions.valuePosition }\n\t\t\t\t\t\t\t\tlabelFormatter={ chartOptions.labelFormatter }\n\t\t\t\t\t\t\t\tvalueFormatter={ chartOptions.valueFormatter }\n\t\t\t\t\t\t\t\tLabelComponent={ options.labelComponent }\n\t\t\t\t\t\t\t\tValueComponent={ options.valueComponent }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\tx: {\n\t\t\t\t\t\tchildren: () => null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\txScale: chartOptions.xScale,\n\t\t\t\tyScale: chartOptions.yScale,\n\t\t\t} }\n\t\t\t{ ...rest }\n\t\t/>\n\t);\n};\n\nconst BarListChart: FC< BarListChartProps > = props => {\n\tconst existingContext = useContext( GlobalChartsContext );\n\n\t// If we're already in a GlobalChartsProvider context, render the core component directly\n\tif ( existingContext ) {\n\t\treturn <BarListChartInternal { ...props } />;\n\t}\n\n\t// Otherwise, wrap with our own GlobalChartsProvider\n\treturn (\n\t\t<GlobalChartsProvider>\n\t\t\t<BarListChartInternal { ...props } />\n\t\t</GlobalChartsProvider>\n\t);\n};\n\nBarListChart.displayName = 'BarListChart';\n\nconst BarListChartResponsive = withResponsive< BarListChartProps >( BarListChart );\n\nexport { BarListChartResponsive as default, BarListChart as BarListChartUnresponsive };\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-HA7WACBI.cjs","../src/components/bar-list-chart/bar-list-chart.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-HA7WACBI.cjs","sourcesContent":[null,"import { formatNumberCompact } from '@automattic/number-formatters';\nimport { Group } from '@visx/group';\nimport { createScale, scaleBand } from '@visx/scale';\nimport { Text, type TextProps } from '@visx/text';\nimport { useContext, useMemo } from 'react';\nimport { GlobalChartsContext, GlobalChartsProvider } from '../../providers';\nimport { BarChart } from '../bar-chart';\nimport { withResponsive } from '../private/with-responsive';\nimport type { SeriesData } from '../..';\nimport type { ScaleOptions } from '../../types';\nimport type { BarChartProps } from '../bar-chart/bar-chart';\nimport type { AxisRendererProps, AxisScale } from '@visx/axis';\nimport type { AnyD3Scale } from '@visx/scale';\nimport type { ComponentType, FC } from 'react';\n\nexport interface BarListChartProps\n\textends Exclude< BarChartProps, 'orientation' | 'size' | 'gridVisibility' > {\n\toptions?: {\n\t\t/**\n\t\t * Scale for the y axis. Exclude the type property.\n\t\t */\n\t\tyScale: Omit< ScaleOptions, 'type' >;\n\t\t/**\n\t\t * Scale for the x axis. Exclude the type property.\n\t\t */\n\t\txScale: Omit< ScaleOptions, 'type' >;\n\t\t/**\n\t\t * Formatter for the label.\n\t\t */\n\t\tlabelFormatter?: ( value: string ) => string;\n\t\t/**\n\t\t * Formatter for the value.\n\t\t */\n\t\tvalueFormatter?: ( value: number ) => string;\n\t\t/**\n\t\t * y offset of the label and value. Default is based on the number of series, automatically computed.\n\t\t */\n\t\tyOffset?: number;\n\t\t/**\n\t\t * x position of the label.\n\t\t */\n\t\tlabelPosition?: number;\n\t\t/**\n\t\t * x position of the value.\n\t\t */\n\t\tvaluePosition?: number;\n\t\t/**\n\t\t * Custom render function for the label.\n\t\t */\n\t\tlabelComponent?: ComponentType< RenderLabelProps >;\n\t\t/**\n\t\t * Custom render function for the value.\n\t\t */\n\t\tvalueComponent?: ComponentType< RenderValueProps >;\n\t};\n}\n\nexport interface RenderLabelProps {\n\ttextProps: TextProps;\n\tx: number;\n\ty: number;\n\tlabel: string;\n\tformatter: ( value: string ) => string;\n}\n\nexport interface RenderValueProps {\n\ttextProps: TextProps;\n\tx: number;\n\ty: number;\n\tvalue: number;\n\t/**\n\t * Original data\n\t */\n\tdata: SeriesData[];\n\t/**\n\t * Index of the data point\n\t */\n\tindex: number;\n\tformatter: ( value: number ) => string;\n}\n\n/**\n * Get the bandwidth of a scale\n * @param scale - The scale to get the bandwidth of\n * @return The bandwidth of the scale\n */\nconst getScaleBandwidth = < Scale extends AxisScale >( scale?: Scale ) => {\n\t// Broaden type before using 'xxx' in s as typeguard.\n\tconst s = scale as AxisScale;\n\treturn s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0;\n};\n\nconst DefaultLabelComponent = ( { textProps, x, y, label, formatter } ) => {\n\treturn (\n\t\t<Text { ...textProps } textAnchor=\"start\" x={ x } y={ y }>\n\t\t\t{ formatter( label ) }\n\t\t</Text>\n\t);\n};\n\nconst DefaultValueComponent = ( { textProps, x, y, value, formatter }: RenderValueProps ) => {\n\treturn (\n\t\t<Text { ...textProps } textAnchor=\"end\" x={ x } y={ y } fontWeight={ 500 }>\n\t\t\t{ formatter( value ) }\n\t\t</Text>\n\t);\n};\n\nconst AxisRenderer = ( {\n\tticks,\n\ttickLabelProps,\n\tyOffset,\n\tlabelPosition,\n\tvaluePosition,\n\tdata,\n\tlabelFormatter,\n\tvalueFormatter,\n\tLabelComponent = DefaultLabelComponent,\n\tValueComponent = DefaultValueComponent,\n}: AxisRendererProps< AnyD3Scale > & {\n\tyOffset: number;\n\tlabelPosition: number;\n\tvaluePosition: number;\n\tdata: SeriesData[];\n\tlabelFormatter?: ( value: string ) => string;\n\tvalueFormatter?: ( value: number ) => string;\n\tLabelComponent?: ComponentType< RenderLabelProps >;\n\tValueComponent?: ComponentType< RenderValueProps >;\n} ) => {\n\tif ( ticks.length === 0 ) {\n\t\treturn null;\n\t}\n\n\t// compute the max tick label size to compute label offset\n\tconst allTickLabelProps = ticks.map( ( { value, index } ) =>\n\t\ttypeof tickLabelProps === 'function' ? tickLabelProps( value, index, ticks ) : {}\n\t);\n\n\treturn ticks.map( ( { from, formattedValue }, index ) => {\n\t\tconst textProps = allTickLabelProps[ index ] ?? {};\n\t\t// No need to pass textAnchor and dx. It will be handled by the component.\n\t\tdelete textProps.textAnchor;\n\t\tdelete textProps.dx;\n\n\t\tconst sum = data.reduce(\n\t\t\t( acc, { data: seriesData } ) => acc + ( seriesData[ index ]?.value ?? 0 ),\n\t\t\t0\n\t\t);\n\t\tconst y = from.y + yOffset;\n\n\t\treturn (\n\t\t\t<Group key={ index }>\n\t\t\t\t<LabelComponent\n\t\t\t\t\ttextProps={ textProps }\n\t\t\t\t\tx={ labelPosition }\n\t\t\t\t\ty={ y }\n\t\t\t\t\tlabel={ formattedValue }\n\t\t\t\t\tformatter={ labelFormatter }\n\t\t\t\t/>\n\t\t\t\t<ValueComponent\n\t\t\t\t\ttextProps={ textProps }\n\t\t\t\t\tx={ valuePosition }\n\t\t\t\t\ty={ y }\n\t\t\t\t\tvalue={ sum }\n\t\t\t\t\tformatter={ valueFormatter }\n\t\t\t\t\tdata={ data }\n\t\t\t\t\tindex={ index }\n\t\t\t\t/>\n\t\t\t</Group>\n\t\t);\n\t} );\n};\n\n/**\n * Calculate the default y offset for the bar list chart.\n * @param data - The data to calculate the default y offset for.\n * @param yScaleConfig - The y scale configuration.\n * @param height - The height of the chart.\n * @param isMultiSeries - Whether the chart is a multi series chart.\n * @return The default y offset.\n */\nconst getDefaultYOffset = (\n\tdata: SeriesData[],\n\tyScaleConfig: Omit< ScaleOptions, 'type' >,\n\theight: number,\n\tisMultiSeries: boolean\n) => {\n\tif ( ! isMultiSeries ) {\n\t\treturn 0;\n\t}\n\n\tconst dataKeys = data.map( ( { label } ) => label );\n\n\tconst yScale = createScale< string >( {\n\t\ttype: 'band' as const,\n\t\trange: [ 0, height ],\n\t\tdomain: dataKeys,\n\t\t...yScaleConfig,\n\t} );\n\n\tconst groupScale = scaleBand< string >( {\n\t\tdomain: dataKeys,\n\t\trange: [ 0, getScaleBandwidth( yScale ) ],\n\t\tpadding: yScaleConfig.paddingInner,\n\t} );\n\n\tconst GAP_BETWEEN_BARS = 6;\n\tconst barThickness = getScaleBandwidth( groupScale );\n\n\t// Use negative value to move the label up.\n\treturn -( barThickness + GAP_BETWEEN_BARS );\n};\n\nconst BarListChartInternal: FC< BarListChartProps > = ( {\n\tdata,\n\twidth,\n\theight,\n\toptions = {},\n\tmargin = {\n\t\tleft: 0,\n\t\tright: 20,\n\t\tbottom: 0,\n\t\ttop: 0,\n\t},\n\t...rest\n} ) => {\n\tconst chartOptions = useMemo( () => {\n\t\tconst isMultiSeries = data.length > 1;\n\n\t\tconst defaultYScale = {\n\t\t\t// For multi series, set default padding larger to look better.\n\t\t\tpaddingInner: isMultiSeries ? 0.3 : 0.1,\n\t\t\tpadding: isMultiSeries ? 0.3 : 0.1,\n\t\t};\n\t\tconst defaultXScale = {\n\t\t\t// Always begin at zero since the x axis is hidden.\n\t\t\tzero: true,\n\t\t};\n\t\tconst yScale = {\n\t\t\t...defaultYScale,\n\t\t\t...( options.yScale ?? {} ),\n\t\t};\n\t\tconst xScale = {\n\t\t\t...defaultXScale,\n\t\t\t...( options.xScale ?? {} ),\n\t\t};\n\n\t\treturn {\n\t\t\tyScale,\n\t\t\txScale,\n\t\t\tlabelPosition: options.labelPosition ?? ( isMultiSeries ? 0 : 10 ),\n\t\t\tvalueFormatter: options.valueFormatter ?? ( value => formatNumberCompact( value ) ),\n\t\t\tlabelFormatter: options.labelFormatter ?? ( value => String( value ) ),\n\t\t\tvaluePosition: options.valuePosition ?? width,\n\t\t\tyOffset: options.yOffset ?? getDefaultYOffset( data, yScale, height, isMultiSeries ),\n\t\t};\n\t}, [ options, width, data, height ] );\n\n\treturn (\n\t\t<BarChart\n\t\t\torientation=\"horizontal\"\n\t\t\tgridVisibility={ 'none' }\n\t\t\tdata={ data }\n\t\t\twidth={ width }\n\t\t\theight={ height }\n\t\t\tmargin={ margin }\n\t\t\toptions={ {\n\t\t\t\taxis: {\n\t\t\t\t\ty: {\n\t\t\t\t\t\tchildren: ( renderProps: AxisRendererProps< AnyD3Scale > ) => (\n\t\t\t\t\t\t\t<AxisRenderer\n\t\t\t\t\t\t\t\t{ ...renderProps }\n\t\t\t\t\t\t\t\tdata={ data }\n\t\t\t\t\t\t\t\tyOffset={ chartOptions.yOffset }\n\t\t\t\t\t\t\t\tlabelPosition={ chartOptions.labelPosition }\n\t\t\t\t\t\t\t\tvaluePosition={ chartOptions.valuePosition }\n\t\t\t\t\t\t\t\tlabelFormatter={ chartOptions.labelFormatter }\n\t\t\t\t\t\t\t\tvalueFormatter={ chartOptions.valueFormatter }\n\t\t\t\t\t\t\t\tLabelComponent={ options.labelComponent }\n\t\t\t\t\t\t\t\tValueComponent={ options.valueComponent }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\tx: {\n\t\t\t\t\t\tchildren: () => null,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\txScale: chartOptions.xScale,\n\t\t\t\tyScale: chartOptions.yScale,\n\t\t\t} }\n\t\t\t{ ...rest }\n\t\t/>\n\t);\n};\n\nconst BarListChart: FC< BarListChartProps > = props => {\n\tconst existingContext = useContext( GlobalChartsContext );\n\n\t// If we're already in a GlobalChartsProvider context, render the core component directly\n\tif ( existingContext ) {\n\t\treturn <BarListChartInternal { ...props } />;\n\t}\n\n\t// Otherwise, wrap with our own GlobalChartsProvider\n\treturn (\n\t\t<GlobalChartsProvider>\n\t\t\t<BarListChartInternal { ...props } />\n\t\t</GlobalChartsProvider>\n\t);\n};\n\nBarListChart.displayName = 'BarListChart';\n\nconst BarListChartResponsive = withResponsive< BarListChartProps >( BarListChart );\n\nexport { BarListChartResponsive as default, BarListChart as BarListChartUnresponsive };\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-KE4EDAQI.cjs","../src/components/conversion-funnel-chart/conversion-funnel-chart.tsx","../src/components/conversion-funnel-chart/conversion-funnel-chart.module.scss","../src/components/conversion-funnel-chart/private/use-funnel-selection.ts"],"names":["useCallback"],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-KE4EDAQI.cjs","sourcesContent":[null,"import { localPoint } from '@visx/event';\nimport { useTooltip, useTooltipInPortal } from '@visx/tooltip';\nimport clsx from 'clsx';\nimport { type FC, useRef, useMemo, useEffect, useCallback, useContext } from 'react';\nimport { usePrefersReducedMotion } from '../../hooks';\nimport {\n\tGlobalChartsProvider,\n\tGlobalChartsContext,\n\tuseChartId,\n\tuseChartRegistration,\n\tuseGlobalChartsTheme,\n\tuseGlobalChartsContext,\n} from '../../providers';\nimport { hexToRgba, formatPercentage } from '../../utils';\nimport styles from './conversion-funnel-chart.module.scss';\nimport { useFunnelSelection } from './private';\nimport type { FunnelStep, ConversionFunnelChartProps } from './types';\n\n/**\n * Internal ConversionFunnelChart component with chart registration\n *\n * @param props - Component props\n * @param props.chartId - Optional unique identifier for the chart\n * @param props.mainRate - Main conversion rate to highlight\n * @param props.changeIndicator - Change indicator (e.g., +2%, -1.5%)\n * @param props.steps - Array of funnel steps\n * @param props.loading - Whether the chart is in loading state\n * @param props.animation - Whether to show chart animation on initial render or not\n * @param props.className - Additional CSS class name\n * @param props.style - Custom styling\n * @param props.renderStepLabel - Custom render function for step labels\n * @param props.renderStepRate - Custom render function for step rates\n * @param props.renderMainMetric - Custom render function for the entire main metric section\n * @param props.renderTooltip - Custom render function for tooltip content\n * @return JSX element representing the conversion funnel chart\n */\nconst ConversionFunnelChartInternal: FC< ConversionFunnelChartProps > = ( {\n\tmainRate,\n\tchangeIndicator,\n\tsteps,\n\tloading = false,\n\tanimation,\n\tclassName,\n\tchartId: providedChartId,\n\tstyle,\n\trenderStepLabel,\n\trenderStepRate,\n\trenderMainMetric,\n\trenderTooltip,\n} ) => {\n\tconst chartId = useChartId( providedChartId );\n\tconst { conversionFunnelChart: conversionFunnelChartSettings } = useGlobalChartsTheme();\n\tconst { getElementStyles } = useGlobalChartsContext();\n\tconst chartRef = useRef< HTMLDivElement >( null );\n\tconst selectedBarRef = useRef< HTMLDivElement | null >( null );\n\n\t// Use @visx/tooltip hooks for tooltip positioning\n\tconst { tooltipData, tooltipLeft, tooltipTop, tooltipOpen, showTooltip, hideTooltip } =\n\t\tuseTooltip();\n\n\t// Use custom hook for selection management\n\tconst { handleBarClick, handleBarKeyDown, clearSelection, getStepState } =\n\t\tuseFunnelSelection( hideTooltip );\n\tconst { containerRef: portalContainerRef, TooltipInPortal } = useTooltipInPortal( {\n\t\t// use TooltipWithBounds for boundary detection\n\t\tdetectBounds: true,\n\t\t// when tooltip containers are scrolled, this will correctly update the Tooltip position\n\t\tscroll: true,\n\t} );\n\n\t// Wrapper to clear selectedBarRef after clearing selection\n\tconst clearSelectionAndRef = useCallback( () => {\n\t\tclearSelection();\n\t\tselectedBarRef.current = null;\n\t\thideTooltip();\n\t}, [ clearSelection, hideTooltip ] );\n\n\t// Helper function to show tooltip at specific coordinates\n\tconst showTooltipAt = useCallback(\n\t\t( step: FunnelStep, x: number, y: number ) => {\n\t\t\tshowTooltip( {\n\t\t\t\ttooltipData: step,\n\t\t\t\ttooltipLeft: x,\n\t\t\t\ttooltipTop: y - 10,\n\t\t\t} );\n\t\t},\n\t\t[ showTooltip ]\n\t);\n\n\t// Helper function to get tooltip coordinates for mouse events\n\tconst getMouseTooltipCoords = useCallback( ( event: React.MouseEvent ) => {\n\t\tconst containerElement = chartRef.current;\n\t\tif ( containerElement ) {\n\t\t\tconst coords = localPoint( containerElement, event.nativeEvent );\n\t\t\tif ( coords ) {\n\t\t\t\treturn { x: coords.x, y: coords.y };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}, [] );\n\n\t// Helper function to get tooltip coordinates for keyboard events\n\tconst getKeyboardTooltipCoords = useCallback( ( event: React.KeyboardEvent ) => {\n\t\tconst rect = event.currentTarget.getBoundingClientRect();\n\t\tconst containerElement = chartRef.current;\n\t\tif ( containerElement ) {\n\t\t\tconst containerRect = containerElement.getBoundingClientRect();\n\t\t\tconst x = rect.left + rect.width / 2 - containerRect.left;\n\t\t\tconst y = rect.top - containerRect.top;\n\t\t\treturn { x, y };\n\t\t}\n\t\treturn null;\n\t}, [] );\n\n\t// Helper function to handle step interaction (both click and keyboard)\n\tconst handleStepInteraction = useCallback(\n\t\t(\n\t\t\tstep: FunnelStep,\n\t\t\tevent: React.MouseEvent | React.KeyboardEvent,\n\t\t\tinteractionType: 'click' | 'keyboard'\n\t\t) => {\n\t\t\t// Store reference to the interacted element\n\t\t\tselectedBarRef.current = event.currentTarget as HTMLDivElement;\n\n\t\t\t// Check if deselecting the same step\n\t\t\tconst { isClicked } = getStepState( step.id );\n\t\t\tif ( isClicked ) {\n\t\t\t\t// Deselecting - clear selection (tooltip will be hidden by hook)\n\t\t\t\tif ( interactionType === 'click' ) {\n\t\t\t\t\thandleBarClick( step.id );\n\t\t\t\t} else {\n\t\t\t\t\thandleBarKeyDown( step.id, event as React.KeyboardEvent );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Selecting - handle selection and show tooltip\n\t\t\tif ( interactionType === 'click' ) {\n\t\t\t\thandleBarClick( step.id );\n\t\t\t\tconst coords = getMouseTooltipCoords( event as React.MouseEvent );\n\t\t\t\tif ( coords ) {\n\t\t\t\t\tshowTooltipAt( step, coords.x, coords.y );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\thandleBarKeyDown( step.id, event as React.KeyboardEvent );\n\t\t\t\tconst coords = getKeyboardTooltipCoords( event as React.KeyboardEvent );\n\t\t\t\tif ( coords ) {\n\t\t\t\t\tshowTooltipAt( step, coords.x, coords.y );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tgetStepState,\n\t\t\thandleBarClick,\n\t\t\thandleBarKeyDown,\n\t\t\tshowTooltipAt,\n\t\t\tgetMouseTooltipCoords,\n\t\t\tgetKeyboardTooltipCoords,\n\t\t]\n\t);\n\n\t// Create handler factories to avoid arrow functions in JSX\n\tconst stepHandlers = useMemo( () => {\n\t\tconst handlers = new Map<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tonClick: ( event: React.MouseEvent ) => void;\n\t\t\t\tonKeyDown: ( event: React.KeyboardEvent ) => void;\n\t\t\t}\n\t\t>();\n\n\t\tsteps.forEach( step => {\n\t\t\tconst onClick = ( event: React.MouseEvent ) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\thandleStepInteraction( step, event, 'click' );\n\t\t\t};\n\n\t\t\tconst onKeyDown = ( event: React.KeyboardEvent ) => {\n\t\t\t\tif ( event.key === 'Enter' || event.key === ' ' ) {\n\t\t\t\t\thandleStepInteraction( step, event, 'keyboard' );\n\t\t\t\t} else {\n\t\t\t\t\t// For other keys (like Escape), just handle the selection\n\t\t\t\t\tselectedBarRef.current = event.currentTarget as HTMLDivElement;\n\t\t\t\t\thandleBarKeyDown( step.id, event );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\thandlers.set( step.id, { onClick, onKeyDown } );\n\t\t} );\n\n\t\treturn handlers;\n\t}, [ steps, handleStepInteraction, handleBarKeyDown ] );\n\n\t// Handle document-level click to clear selection when clicking outside selected bar\n\tuseEffect( () => {\n\t\tconst handleDocumentClick = ( event: MouseEvent ) => {\n\t\t\t// Only clear selection if there's an active selection and click is outside the selected bar\n\t\t\tif ( selectedBarRef.current && ! selectedBarRef.current.contains( event.target as Node ) ) {\n\t\t\t\tclearSelectionAndRef();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener( 'mousedown', handleDocumentClick );\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener( 'mousedown', handleDocumentClick );\n\t\t};\n\t}, [ clearSelectionAndRef ] );\n\n\t// Get component settings from theme with fallbacks\n\tconst { primaryColor, backgroundColor, positiveChangeColor, negativeChangeColor } =\n\t\tconversionFunnelChartSettings;\n\n\t// Resolve bar color using getElementStyles with primaryColor as override\n\tconst { color: barColor } = getElementStyles\n\t\t? getElementStyles( {\n\t\t\t\tindex: 0,\n\t\t\t\toverrideColor: primaryColor,\n\t\t } )\n\t\t: { color: primaryColor || '#000000' };\n\n\t// Determine change indicator color\n\tconst isPositiveChange = changeIndicator?.startsWith( '+' );\n\tconst changeColor = isPositiveChange ? positiveChangeColor : negativeChangeColor;\n\n\t// Create light background version of primary color if not set\n\tconst barBackgroundColor = backgroundColor || hexToRgba( barColor, 0.08 );\n\n\t// Default main metric rendering function\n\tconst renderDefaultMainMetric = () => (\n\t\t<>\n\t\t\t<span className={ styles[ 'main-rate' ] }>{ formatPercentage( mainRate ) }</span>\n\t\t\t{ changeIndicator && (\n\t\t\t\t<span className={ styles[ 'change-indicator' ] } style={ { color: changeColor } }>\n\t\t\t\t\t{ changeIndicator }\n\t\t\t\t</span>\n\t\t\t) }\n\t\t</>\n\t);\n\n\t// Default tooltip rendering function\n\tconst renderDefaultTooltip = ( step: FunnelStep ) => (\n\t\t<>\n\t\t\t<div className={ styles[ 'tooltip-title' ] }>{ step.label }</div>\n\t\t\t<div className={ styles[ 'tooltip-content' ] }>\n\t\t\t\t{ formatPercentage( step.rate ) }\n\t\t\t\t{ ` • ${ step.count ?? 'no' } items` }\n\t\t\t</div>\n\t\t</>\n\t);\n\n\t// Validate data\n\tconst isDataValid = Boolean( steps && steps.length > 0 );\n\n\t// Memoize metadata to prevent unnecessary re-registration\n\tconst chartMetadata = useMemo(\n\t\t() => ( {\n\t\t\tmainRate,\n\t\t\tchangeIndicator,\n\t\t\tstepsCount: steps?.length || 0,\n\t\t} ),\n\t\t[ mainRate, changeIndicator, steps?.length ]\n\t);\n\n\tuseChartRegistration( {\n\t\tchartId,\n\t\tlegendItems: [],\n\t\tchartType: 'conversion-funnel',\n\t\tisDataValid,\n\t\tmetadata: chartMetadata,\n\t} );\n\n\tconst prefersReducedMotion = usePrefersReducedMotion();\n\n\t// Handle empty or undefined data\n\tif ( ! isDataValid ) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={ clsx( styles.conversionFunnelChart, loading && styles.loading, className ) }\n\t\t\t\tstyle={ style }\n\t\t\t>\n\t\t\t\t<div className={ styles[ 'empty-state' ] }>\n\t\t\t\t\t{ loading ? 'Loading...' : 'No data available' }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Calculate bar heights relative to the maximum (first step)\n\tconst maxRate = Math.max( ...steps.map( step => step.rate ) );\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={ node => {\n\t\t\t\t\t// Set containerRef for @visx coordinate system\n\t\t\t\t\tportalContainerRef( node );\n\t\t\t\t\tchartRef.current = node;\n\t\t\t\t} }\n\t\t\t\tclassName={ clsx( styles.conversionFunnelChart, loading && styles.loading, className ) }\n\t\t\t\tstyle={ style }\n\t\t\t>\n\t\t\t\t{ /* Main Metric */ }\n\t\t\t\t{ renderMainMetric ? (\n\t\t\t\t\trenderMainMetric( {\n\t\t\t\t\t\tmainRate,\n\t\t\t\t\t\tchangeIndicator,\n\t\t\t\t\t\tclassName: styles[ 'main-metric' ],\n\t\t\t\t\t\tchangeColor,\n\t\t\t\t\t} )\n\t\t\t\t) : (\n\t\t\t\t\t<div className={ styles[ 'main-metric' ] }>{ renderDefaultMainMetric() }</div>\n\t\t\t\t) }\n\n\t\t\t\t{ /* Funnel Steps */ }\n\t\t\t\t<div className={ styles[ 'funnel-container' ] }>\n\t\t\t\t\t{ steps.map( ( step, index ) => {\n\t\t\t\t\t\tconst barHeight = ( step.rate / maxRate ) * 100;\n\t\t\t\t\t\tconst { isBlurred } = getStepState( step.id );\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={ step.id }\n\t\t\t\t\t\t\t\tclassName={ clsx( styles[ 'funnel-step' ], isBlurred && styles.blurred ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ /* Step Label and Rate */ }\n\t\t\t\t\t\t\t\t<div className={ styles[ 'step-header' ] }>\n\t\t\t\t\t\t\t\t\t{ renderStepLabel ? (\n\t\t\t\t\t\t\t\t\t\trenderStepLabel( {\n\t\t\t\t\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\t\tclassName: styles[ 'step-label' ],\n\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span className={ styles[ 'step-label' ] }>{ step.label }</span>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t{ renderStepRate ? (\n\t\t\t\t\t\t\t\t\t\trenderStepRate( {\n\t\t\t\t\t\t\t\t\t\t\tstep,\n\t\t\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\t\tclassName: styles[ 'step-rate' ],\n\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span className={ styles[ 'step-rate' ] }>\n\t\t\t\t\t\t\t\t\t\t\t{ formatPercentage( step.rate ) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{ /* Funnel Bar */ }\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={ clsx( styles[ 'bar-container' ], isBlurred && styles.disabled ) }\n\t\t\t\t\t\t\t\t\tonClick={ stepHandlers.get( step.id )?.onClick }\n\t\t\t\t\t\t\t\t\tonKeyDown={ stepHandlers.get( step.id )?.onKeyDown }\n\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\ttabIndex={ isBlurred ? -1 : 0 }\n\t\t\t\t\t\t\t\t\taria-label={ step.label }\n\t\t\t\t\t\t\t\t\tstyle={ { backgroundColor: barBackgroundColor } }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={ clsx( styles[ 'funnel-bar' ], {\n\t\t\t\t\t\t\t\t\t\t\t[ styles[ 'funnel-bar--animated' ] ]:\n\t\t\t\t\t\t\t\t\t\t\t\tanimation && ! loading && ! prefersReducedMotion,\n\t\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\t\t\t\theight: `${ barHeight }%`,\n\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: barColor,\n\t\t\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{ /* Tooltip Portal */ }\n\t\t\t{ tooltipOpen &&\n\t\t\t\ttooltipData &&\n\t\t\t\t( () => {\n\t\t\t\t\tconst tooltipContent = renderTooltip\n\t\t\t\t\t\t? renderTooltip( {\n\t\t\t\t\t\t\t\tstep: tooltipData as FunnelStep,\n\t\t\t\t\t\t\t\tindex: steps.findIndex( s => s.id === ( tooltipData as FunnelStep ).id ),\n\t\t\t\t\t\t\t\ttop: tooltipTop,\n\t\t\t\t\t\t\t\tleft: tooltipLeft,\n\t\t\t\t\t\t\t\tclassName: styles[ 'tooltip-wrapper' ],\n\t\t\t\t\t\t } )\n\t\t\t\t\t\t: renderDefaultTooltip( tooltipData as FunnelStep );\n\n\t\t\t\t\t// Don't render tooltip if renderTooltip returns falsy\n\t\t\t\t\tif ( ! tooltipContent ) return null;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TooltipInPortal\n\t\t\t\t\t\t\t// set this to random so it correctly updates with parent bounds\n\t\t\t\t\t\t\tkey={ Math.random() }\n\t\t\t\t\t\t\ttop={ tooltipTop }\n\t\t\t\t\t\t\tleft={ tooltipLeft }\n\t\t\t\t\t\t\tclassName={ styles[ 'tooltip-wrapper' ] }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ tooltipContent }\n\t\t\t\t\t\t</TooltipInPortal>\n\t\t\t\t\t);\n\t\t\t\t} )() }\n\t\t</>\n\t);\n};\n\n/**\n * ConversionFunnelChart component with provider wrapper\n *\n * @param props - Component props\n * @return JSX element representing the conversion funnel chart\n */\nconst ConversionFunnelChartWithProvider: FC< ConversionFunnelChartProps > = props => {\n\tconst existingContext = useContext( GlobalChartsContext );\n\n\t// If we're already in a GlobalChartsProvider context, don't create a new one\n\tif ( existingContext ) {\n\t\treturn <ConversionFunnelChartInternal { ...props } />;\n\t}\n\n\t// Otherwise, create our own GlobalChartsProvider\n\treturn (\n\t\t<GlobalChartsProvider>\n\t\t\t<ConversionFunnelChartInternal { ...props } />\n\t\t</GlobalChartsProvider>\n\t);\n};\n\nConversionFunnelChartWithProvider.displayName = 'ConversionFunnelChart';\n\nexport { ConversionFunnelChartWithProvider as default };\n","import 'css-chunk:src/components/conversion-funnel-chart/conversion-funnel-chart.module.scss';export default {\n \"conversionFunnelChart\": \"a8ccharts--9Qsb0\",\n \"loading\": \"a8ccharts-Kw-iZo\",\n \"main-metric\": \"a8ccharts-8mIwVL\",\n \"main-rate\": \"a8ccharts-D93Ubo\",\n \"change-indicator\": \"a8ccharts-QWypVS\",\n \"funnel-container\": \"a8ccharts-RR7xaC\",\n \"funnel-step\": \"a8ccharts-VIVztE\",\n \"blurred\": \"a8ccharts-Ax4cuC\",\n \"step-header\": \"a8ccharts-bUrZ0x\",\n \"step-label\": \"a8ccharts-SCy8FA\",\n \"step-rate\": \"a8ccharts-A0irBo\",\n \"bar-container\": \"a8ccharts-5Dl5-j\",\n \"disabled\": \"a8ccharts-Reovk6\",\n \"funnel-bar\": \"a8ccharts-tG5m3L\",\n \"selected\": \"a8ccharts-W40FYh\",\n \"funnel-bar--animated\": \"a8ccharts-YVRBpF\",\n \"stretch\": \"a8ccharts-4otxiv\",\n \"tooltip-wrapper\": \"a8ccharts-NohPt6\",\n \"tooltip-title\": \"a8ccharts-hjZr33\",\n \"tooltip-content\": \"a8ccharts-ocwAPj\",\n \"empty-state\": \"a8ccharts-9c0psv\"\n};","import { useCallback, useState } from 'react';\n\n/**\n * Custom hook to manage funnel bar selection state and interactions\n * @param hideTooltip - Function to hide tooltip when selection is cleared\n * @return Object containing selection state and event handlers\n */\nexport const useFunnelSelection = ( hideTooltip?: () => void ) => {\n\tconst [ clickedStep, setClickedStep ] = useState< string | null >( null );\n\n\t// Handle bar click\n\tconst handleBarClick = useCallback(\n\t\t( stepId: string ) => {\n\t\t\tif ( clickedStep === stepId ) {\n\t\t\t\t// If clicking the same step, deselect it\n\t\t\t\tsetClickedStep( null );\n\t\t\t\thideTooltip?.();\n\t\t\t} else {\n\t\t\t\t// Otherwise, select this step\n\t\t\t\tsetClickedStep( stepId );\n\t\t\t}\n\t\t},\n\t\t[ clickedStep, hideTooltip ]\n\t);\n\n\t// Handle bar keydown\n\tconst handleBarKeyDown = useCallback(\n\t\t( stepId: string, event: React.KeyboardEvent ) => {\n\t\t\tif ( event.key === 'Enter' || event.key === ' ' ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif ( clickedStep === stepId ) {\n\t\t\t\t\tsetClickedStep( null );\n\t\t\t\t\thideTooltip?.();\n\t\t\t\t} else {\n\t\t\t\t\tsetClickedStep( stepId );\n\t\t\t\t}\n\t\t\t} else if ( event.key === 'Escape' ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tsetClickedStep( null );\n\t\t\t\thideTooltip?.();\n\t\t\t}\n\t\t},\n\t\t[ clickedStep, hideTooltip ]\n\t);\n\n\t// Clear selection (for chart-level click)\n\tconst clearSelection = useCallback( () => {\n\t\tsetClickedStep( null );\n\t\thideTooltip?.();\n\t}, [ hideTooltip ] );\n\n\t// Get step state helpers\n\tconst getStepState = useCallback(\n\t\t( stepId: string ) => ( {\n\t\t\tisClicked: clickedStep === stepId,\n\t\t\tisBlurred: clickedStep !== null && clickedStep !== stepId,\n\t\t} ),\n\t\t[ clickedStep ]\n\t);\n\n\treturn {\n\t\tclickedStep,\n\t\thandleBarClick,\n\t\thandleBarKeyDown,\n\t\tclearSelection,\n\t\tgetStepState,\n\t};\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/chart-context/global-charts-provider.tsx","../src/providers/chart-context/private/get-chart-color.ts","../src/providers/chart-context/themes.ts","../src/providers/chart-context/hooks/use-global-charts-context.ts","../src/providers/chart-context/hooks/use-chart-id.ts","../src/providers/chart-context/hooks/use-chart-registration.ts","../src/hooks/use-deep-memo.ts","../src/hooks/use-chart-mouse-handler.ts","../src/hooks/use-xychart-theme.ts","../src/hooks/use-chart-data-transform.ts","../src/hooks/use-chart-margin.tsx","../src/hooks/use-element-height.ts","../src/hooks/use-text-truncation.ts","../src/hooks/use-zero-value-display.ts","../src/hooks/use-interactive-legend-data.ts","../src/hooks/use-prefers-reduced-motion.ts","../src/providers/chart-context/hooks/use-global-charts-theme.ts"],"sourcesContent":["import {\n\tcreateContext,\n\tuseCallback,\n\tuseMemo,\n\tuseState,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n} from 'react';\nimport {\n\tgetItemShapeStyles,\n\tgetSeriesLineStyles,\n\tmergeThemes,\n\thexToHsl,\n\tresolveCssVariable,\n} from '../../utils';\nimport { getChartColor, type ColorCache } from './private/get-chart-color';\nimport { defaultTheme } from './themes';\nimport type { GlobalChartsContextValue, ChartRegistration } from './types';\nimport type { ChartTheme, CompleteChartTheme } from '../../types';\nimport type { FC, ReactNode } from 'react';\n\nexport const GlobalChartsContext = createContext< GlobalChartsContextValue | null >( null );\n\nexport interface GlobalChartsProviderProps {\n\tchildren: ReactNode;\n\ttheme?: Partial< ChartTheme >;\n}\n\nexport const GlobalChartsProvider: FC< GlobalChartsProviderProps > = ( { children, theme } ) => {\n\tconst [ charts, setCharts ] = useState< Map< string, ChartRegistration > >( () => new Map() );\n\t// Track hidden series per chart: chartId -> Set<seriesLabel>\n\tconst [ hiddenSeries, setHiddenSeries ] = useState< Map< string, Set< string > > >(\n\t\t() => new Map()\n\t);\n\n\t// Ref to the wrapper element for resolving scoped CSS variables\n\tconst wrapperRef = useRef< HTMLDivElement >( null );\n\n\tconst providerTheme: CompleteChartTheme = useMemo( () => {\n\t\treturn theme ? mergeThemes( defaultTheme, theme ) : defaultTheme;\n\t}, [ theme ] );\n\n\t// Cache expensive color computations that only change when theme colors change\n\t// Using useState + useLayoutEffect instead of useMemo to ensure CSS variables\n\t// in <style> tags are applied to the DOM before we try to resolve them\n\tconst [ colorCache, setColorCache ] = useState< ColorCache >( () => ( {\n\t\tcolors: [],\n\t\thues: [],\n\t\texistingHslColors: [],\n\t\tminHue: 360,\n\t\tmaxHue: 0,\n\t} ) );\n\n\t// Compute color cache after DOM is updated (so CSS variables are available)\n\t// Resolves CSS variables from the wrapper element's scope to handle scoped variables\n\t// Note: Only re-runs when providerTheme changes, not when wrapper element changes.\n\t// This is intentional, as wrapperRef is expected to be stable for the lifetime of the provider.\n\tuseLayoutEffect( () => {\n\t\tconst { colors } = providerTheme;\n\t\tconst resolvedColors: string[] = [];\n\t\tconst hues: number[] = [];\n\t\tconst existingHslColors: Array< [ number, number, number ] > = [];\n\t\tlet minHue = 360;\n\t\tlet maxHue = 0;\n\n\t\t// Process all colors once and cache the results\n\t\tif ( Array.isArray( colors ) ) {\n\t\t\tfor ( const color of colors ) {\n\t\t\t\tif ( color && typeof color === 'string' ) {\n\t\t\t\t\tlet colorValue = color;\n\n\t\t\t\t\t// Handle CSS custom properties names - resolve them to actual values\n\t\t\t\t\t// Use wrapper element to resolve scoped CSS variables\n\t\t\t\t\tif ( color.startsWith( '--' ) ) {\n\t\t\t\t\t\tconst resolved = resolveCssVariable( color, wrapperRef.current );\n\n\t\t\t\t\t\tif ( resolved === null || resolved === '' ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcolorValue = resolved;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process hex colors\n\t\t\t\t\tif ( colorValue.startsWith( '#' ) ) {\n\t\t\t\t\t\tresolvedColors.push( colorValue );\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst hslColor = hexToHsl( colorValue );\n\t\t\t\t\t\t\thues.push( hslColor[ 0 ] );\n\t\t\t\t\t\t\texistingHslColors.push( hslColor );\n\t\t\t\t\t\t\tminHue = Math.min( minHue, hslColor[ 0 ] );\n\t\t\t\t\t\t\tmaxHue = Math.max( maxHue, hslColor[ 0 ] );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore invalid hex colors that don't parse to HSL\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetColorCache( {\n\t\t\tcolors: resolvedColors,\n\t\t\thues,\n\t\t\texistingHslColors,\n\t\t\tminHue,\n\t\t\tmaxHue,\n\t\t} );\n\t}, [ providerTheme ] );\n\n\tconst [ groupToColorMap, setGroupToColorMap ] = useState< Map< string, string > >(\n\t\t() => new Map()\n\t);\n\n\t// Reset group color mappings when theme colors change\n\tuseEffect( () => {\n\t\t// Create a completely new Map instance to trigger dependencies, e.g. useChartLegendItems\n\t\tsetGroupToColorMap( new Map() );\n\t}, [ providerTheme.colors ] );\n\n\tconst registerChart = useCallback( ( id: string, data: ChartRegistration ) => {\n\t\tsetCharts( prev => new Map( prev ).set( id, data ) );\n\t}, [] );\n\n\tconst unregisterChart = useCallback( ( id: string ) => {\n\t\tsetCharts( prev => {\n\t\t\tconst newMap = new Map( prev );\n\t\t\tnewMap.delete( id );\n\t\t\treturn newMap;\n\t\t} );\n\t}, [] );\n\n\tconst getChartData = useCallback(\n\t\t( id: string ) => {\n\t\t\treturn charts.get( id );\n\t\t},\n\t\t[ charts ]\n\t);\n\n\tconst resolveColor = useCallback(\n\t\t( {\n\t\t\tgroup,\n\t\t\tindex,\n\t\t\toverrideColor,\n\t\t}: {\n\t\t\tgroup?: string;\n\t\t\tindex: number;\n\t\t\toverrideColor?: string;\n\t\t} ): string => {\n\t\t\t// Highest precedence: eg. explicit series stroke or chart color prop\n\t\t\tif ( overrideColor ) {\n\t\t\t\treturn overrideColor;\n\t\t\t}\n\n\t\t\t// If group provided, maintain a stable assignment\n\t\t\tif ( group ) {\n\t\t\t\tconst existing = groupToColorMap.get( group );\n\n\t\t\t\tif ( existing ) {\n\t\t\t\t\treturn existing;\n\t\t\t\t}\n\n\t\t\t\tconst assignedCount = groupToColorMap.size;\n\t\t\t\tconst color =\n\t\t\t\t\tcolorCache.colors.length > 0 ? getChartColor( assignedCount, colorCache ) : '#000000';\n\t\t\t\tgroupToColorMap.set( group, color );\n\n\t\t\t\treturn color;\n\t\t\t}\n\n\t\t\treturn colorCache.colors.length > 0 ? getChartColor( index, colorCache ) : '#000000';\n\t\t},\n\t\t[ colorCache, groupToColorMap ]\n\t);\n\n\tconst getElementStyles = useCallback< GlobalChartsContextValue[ 'getElementStyles' ] >(\n\t\t( { data, index, overrideColor, legendShape } ) => {\n\t\t\tconst isSeriesData = data && typeof data === 'object' && 'data' in data && 'options' in data;\n\t\t\tconst isPointPercentageData = data && typeof data === 'object' && 'percentage' in data;\n\n\t\t\treturn {\n\t\t\t\tcolor: resolveColor( {\n\t\t\t\t\tgroup: data?.group,\n\t\t\t\t\tindex,\n\t\t\t\t\toverrideColor:\n\t\t\t\t\t\toverrideColor ||\n\t\t\t\t\t\t( isSeriesData && data?.options?.stroke ) ||\n\t\t\t\t\t\t( isPointPercentageData && data?.color ),\n\t\t\t\t} ),\n\t\t\t\tlineStyles: isSeriesData ? getSeriesLineStyles( data, index, providerTheme ) : {},\n\t\t\t\tglyph: providerTheme.glyphs?.[ index ],\n\t\t\t\tshapeStyles: isSeriesData\n\t\t\t\t\t? getItemShapeStyles( data, index, providerTheme, legendShape )\n\t\t\t\t\t: {},\n\t\t\t};\n\t\t},\n\t\t[ providerTheme, resolveColor ]\n\t);\n\n\t// Series visibility management methods\n\tconst toggleSeriesVisibility = useCallback( ( chartId: string, seriesLabel: string ) => {\n\t\tsetHiddenSeries( prev => {\n\t\t\tconst newMap = new Map( prev );\n\t\t\tconst chartHidden = newMap.get( chartId ) || new Set();\n\t\t\tconst newSet = new Set( chartHidden );\n\n\t\t\tif ( newSet.has( seriesLabel ) ) {\n\t\t\t\tnewSet.delete( seriesLabel );\n\t\t\t} else {\n\t\t\t\tnewSet.add( seriesLabel );\n\t\t\t}\n\n\t\t\tif ( newSet.size === 0 ) {\n\t\t\t\tnewMap.delete( chartId );\n\t\t\t} else {\n\t\t\t\tnewMap.set( chartId, newSet );\n\t\t\t}\n\n\t\t\treturn newMap;\n\t\t} );\n\t}, [] );\n\n\tconst isSeriesVisible = useCallback(\n\t\t( chartId: string, seriesLabel: string ) => {\n\t\t\tconst chartHidden = hiddenSeries.get( chartId );\n\t\t\treturn ! chartHidden || ! chartHidden.has( seriesLabel );\n\t\t},\n\t\t[ hiddenSeries ]\n\t);\n\n\tconst getHiddenSeries = useCallback(\n\t\t( chartId: string ): Set< string > => {\n\t\t\tconst set = hiddenSeries.get( chartId );\n\t\t\treturn set ? new Set( set ) : new Set< string >();\n\t\t},\n\t\t[ hiddenSeries ]\n\t);\n\n\tconst value: GlobalChartsContextValue = useMemo(\n\t\t() => ( {\n\t\t\tcharts,\n\t\t\tregisterChart,\n\t\t\tunregisterChart,\n\t\t\tgetChartData,\n\t\t\ttheme: providerTheme,\n\t\t\tgetElementStyles,\n\t\t\ttoggleSeriesVisibility,\n\t\t\tisSeriesVisible,\n\t\t\tgetHiddenSeries,\n\t\t} ),\n\t\t[\n\t\t\tcharts,\n\t\t\tregisterChart,\n\t\t\tunregisterChart,\n\t\t\tgetChartData,\n\t\t\tproviderTheme,\n\t\t\tgetElementStyles,\n\t\t\ttoggleSeriesVisibility,\n\t\t\tisSeriesVisible,\n\t\t\tgetHiddenSeries,\n\t\t]\n\t);\n\n\treturn (\n\t\t<GlobalChartsContext.Provider value={ value }>\n\t\t\t<div ref={ wrapperRef } style={ { display: 'contents' } }>\n\t\t\t\t{ children }\n\t\t\t</div>\n\t\t</GlobalChartsContext.Provider>\n\t);\n};\n","import { getColorDistance } from '../../../utils';\n\nexport interface ColorCache {\n\tcolors: string[];\n\thues: number[];\n\texistingHslColors: Array< [ number, number, number ] >;\n\tminHue: number;\n\tmaxHue: number;\n}\n\n/**\n * Golden ratio for mathematically pleasing color distribution\n * Used to generate evenly spaced hues that are visually distinct\n */\nconst GOLDEN_RATIO = 0.618033988749;\n\n/**\n * Minimum perceptual distance between colors to ensure visual distinction\n * Based on weighted HSL distance calculation optimized for chart readability\n */\nconst MIN_COLOR_DISTANCE = 25;\n\n/**\n * Maximum attempts to find a sufficiently different color\n * Prevents infinite loops while allowing reasonable search space\n */\nconst MAX_COLOR_GENERATION_ATTEMPTS = 50;\n\n/**\n * Color variation attempt offset\n * Small increment to explore slightly different color variations per attempt\n */\nconst VARIATION_ATTEMPT_OFFSET = 0.1;\n\n// Saturation configuration for generated colors\n\n/**\n * Base saturation percentage for generated colors\n * 45% provides muted, professional colors without being washed out\n */\nconst BASE_SATURATION = 45;\n\n/**\n * Number of saturation variation steps\n * Creates 3 different saturation levels for variety\n */\nconst SATURATION_VARIATION_STEPS = 3;\n\n/**\n * Saturation increment per variation step\n * 10% increments provide subtle variation while keeping colors muted\n * Results in saturation levels: 45%, 55%, 65%\n */\nconst SATURATION_INCREMENT = 10;\n\n// Lightness configuration for WCAG AA accessibility compliance\n\n/**\n * Base lightness percentage for generated colors\n * 35% ensures sufficient contrast against white backgrounds for WCAG AA compliance\n * WCAG AA requires 4.5:1 contrast ratio for normal text\n */\nconst BASE_LIGHTNESS = 35;\n\n/**\n * Number of lightness variation steps\n * Creates 4 different lightness levels for variety\n */\nconst LIGHTNESS_VARIATION_STEPS = 4;\n\n/**\n * Lightness increment per variation step\n * 8% increments provide subtle lightness variation while maintaining accessibility\n * Results in lightness levels: 35%, 43%, 51%, 59%\n * All levels maintain WCAG AA compliance against white backgrounds\n */\nconst LIGHTNESS_INCREMENT = 8;\n\n// Hue range expansion and constraints\n\n/**\n * Minimum hue range in degrees to ensure sufficient color variety\n * 60 degrees provides reasonable color spread even for narrow palettes\n */\nconst MIN_HUE_RANGE_DEGREES = 60;\n\n/**\n * Hue range expansion factor\n * 1.3x expansion provides slightly more variety than the original palette\n */\nconst HUE_RANGE_EXPANSION_FACTOR = 1.3;\n\n/**\n * Threshold for detecting hue wrap-around (color wheel boundary crossing)\n * 180 degrees indicates the colors span more than half the color wheel\n */\nconst HUE_WRAP_THRESHOLD_DEGREES = 180;\n\n/**\n * Full color wheel rotation in degrees\n */\nconst FULL_HUE_ROTATION_DEGREES = 360;\n\n/**\n * Factor for single color hue range\n */\nconst SINGLE_COLOR_HUE_RANGE_FACTOR = 0.33;\n\n/**\n * Get a color from the colors array or generate a new color using the golden ratio\n *\n * @param index - the index of the color to get\n * @param colorCache - pre-computed color data for performance\n * @return a color from the colors array or a new color using the golden ratio\n */\nexport const getChartColor = ( index: number, colorCache: ColorCache ) => {\n\tconst {\n\t\tcolors,\n\t\thues,\n\t\texistingHslColors,\n\t\tminHue: cachedMinHue,\n\t\tmaxHue: cachedMaxHue,\n\t} = colorCache;\n\n\tif ( index < colors.length ) {\n\t\treturn colors[ index ];\n\t}\n\n\tlet minHue = cachedMinHue;\n\tlet maxHue = cachedMaxHue;\n\n\t// Generate additional colors using golden ratio, avoiding similar colors\n\tfor ( let attempt = 0; attempt < MAX_COLOR_GENERATION_ATTEMPTS; attempt++ ) {\n\t\t// Calculate hue using golden ratio distribution with variation per attempt\n\t\t// Formula: ((base_index + attempt_variation) * golden_ratio * 360°) mod 360°\n\t\t// This ensures mathematically pleasing spacing while allowing slight shifts per attempt\n\t\tlet hue =\n\t\t\t( ( index - colors.length + attempt * VARIATION_ATTEMPT_OFFSET ) *\n\t\t\t\tGOLDEN_RATIO *\n\t\t\t\tFULL_HUE_ROTATION_DEGREES ) %\n\t\t\tFULL_HUE_ROTATION_DEGREES;\n\n\t\t// If we have existing colors, constrain new colors to their hue range\n\t\tif ( hues.length > 0 ) {\n\t\t\t// Handle hue wrap-around (e.g., if colors span across 0 degrees)\n\t\t\tlet hueRange = maxHue - minHue;\n\n\t\t\t// If there's only one color, use a set hue range for limited variety\n\t\t\tif ( hues.length === 1 ) {\n\t\t\t\thueRange = FULL_HUE_ROTATION_DEGREES * SINGLE_COLOR_HUE_RANGE_FACTOR;\n\t\t\t} else if ( hueRange > HUE_WRAP_THRESHOLD_DEGREES ) {\n\t\t\t\t// If the range is very large, it might be wrapping around the color wheel\n\t\t\t\t// Check if a smaller range exists when considering wrap-around\n\t\t\t\tconst altMinHue = Math.min( ...hues.filter( h => h > HUE_WRAP_THRESHOLD_DEGREES ) );\n\t\t\t\tconst altMaxHue =\n\t\t\t\t\tMath.max( ...hues.filter( h => h < HUE_WRAP_THRESHOLD_DEGREES ) ) +\n\t\t\t\t\tFULL_HUE_ROTATION_DEGREES;\n\t\t\t\tconst altRange = altMaxHue - altMinHue;\n\n\t\t\t\tif ( altRange < hueRange ) {\n\t\t\t\t\tminHue = altMinHue;\n\t\t\t\t\tmaxHue = altMaxHue;\n\t\t\t\t\thueRange = altRange;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand the range slightly to provide some variation\n\t\t\tconst expandedRange = Math.max(\n\t\t\t\thueRange * HUE_RANGE_EXPANSION_FACTOR,\n\t\t\t\tMIN_HUE_RANGE_DEGREES\n\t\t\t);\n\t\t\tconst rangeCenter = ( minHue + maxHue ) / 2;\n\t\t\tconst expandedMin = rangeCenter - expandedRange / 2;\n\n\t\t\t// Map the generated hue to the expanded range\n\t\t\thue = expandedMin + ( hue / FULL_HUE_ROTATION_DEGREES ) * expandedRange;\n\n\t\t\t// Normalize to 0-360 range\n\t\t\thue =\n\t\t\t\t( ( hue % FULL_HUE_ROTATION_DEGREES ) + FULL_HUE_ROTATION_DEGREES ) %\n\t\t\t\tFULL_HUE_ROTATION_DEGREES;\n\t\t}\n\n\t\tconst saturation =\n\t\t\tBASE_SATURATION + ( ( index + attempt ) % SATURATION_VARIATION_STEPS ) * SATURATION_INCREMENT;\n\t\tconst lightness =\n\t\t\tBASE_LIGHTNESS + ( ( index + attempt ) % LIGHTNESS_VARIATION_STEPS ) * LIGHTNESS_INCREMENT;\n\n\t\tconst candidateHsl: [ number, number, number ] = [ hue, saturation, lightness ];\n\n\t\t// Check if this color is sufficiently different from existing colors\n\t\tlet isSufficientlyDifferent = true;\n\t\tfor ( const existingHsl of existingHslColors ) {\n\t\t\tif ( getColorDistance( candidateHsl, existingHsl ) < MIN_COLOR_DISTANCE ) {\n\t\t\t\tisSufficientlyDifferent = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( isSufficientlyDifferent ) {\n\t\t\treturn `hsl(${ Math.round( hue ) }, ${ saturation }%, ${ lightness }%)`;\n\t\t}\n\t}\n\n\t// Fallback if we couldn't find a sufficiently different color\n\t// Formula: ((base_index) * golden_ratio * 360°) mod 360°\n\t// This ensures mathematically pleasing spacing while maintaining consistency\n\tconst fallbackHue =\n\t\t( ( index - colors.length ) * GOLDEN_RATIO * FULL_HUE_ROTATION_DEGREES ) %\n\t\tFULL_HUE_ROTATION_DEGREES;\n\tconst fallbackSaturation =\n\t\tBASE_SATURATION + ( index % SATURATION_VARIATION_STEPS ) * SATURATION_INCREMENT;\n\tconst fallbackLightness =\n\t\tBASE_LIGHTNESS + ( index % LIGHTNESS_VARIATION_STEPS ) * LIGHTNESS_INCREMENT;\n\treturn `hsl(${ Math.round( fallbackHue ) }, ${ fallbackSaturation }%, ${ fallbackLightness }%)`;\n};\n","import type { ChartTheme, CompleteChartTheme } from '../../types';\n\n/**\n * Default theme configuration\n */\nconst defaultTheme: CompleteChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [ '#98C8DF', '#006DAB', '#A6DC80', '#1F9828', '#FF8C8F' ],\n\tgridStyles: {\n\t\tstroke: '#DCDCDE',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tcolor: 'var(--jp-gray-80, #2c3338)',\n\t},\n\tlegendContainerStyles: {},\n\tseriesLineStyles: [],\n\tlegendShapeStyles: [],\n\tglyphs: [],\n\tsvgLabelSmall: { fill: 'var(--jp-gray-80, #2c3338)' },\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'var(--jp-gray-80, #2c3338)',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'var(--jp-gray-80, #2c3338)',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'var(--jp-gray-80, #2c3338)',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tdeltaColors: [ '#FF8C8F', '#757575', '#1F9828' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#1F9828',\n\t\tnegativeChangeColor: '#FF8C8F',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\n/**\n * Jetpack theme configuration\n */\nconst jetpackTheme: ChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [ '#98C8DF', '#006DAB', '#A6DC80', '#1F9828', '#FF8C8F' ],\n\tgridStyles: {\n\t\tstroke: '#DCDCDE',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tcolor: 'var(--jp-gray-80, #2c3338)',\n\t},\n\tsvgLabelSmall: { fill: 'var(--jp-gray-80, #2c3338)' },\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'var(--jp-gray-80, #2c3338)',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'var(--jp-gray-80, #2c3338)',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'var(--jp-gray-80, #2c3338)',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tprimaryColor: '#006DAB',\n\t\tsecondaryColor: '#98C8DF',\n\t\tdeltaColors: [ '#FF8C8F', '#757575', '#1F9828' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#1F9828',\n\t\tnegativeChangeColor: '#FF8C8F',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\n/**\n * Woo theme configuration\n */\nconst wooTheme: ChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [\n\t\t'#3858E9', // WooCommerce brand blue\n\t\t'#66BDFF', // Light blue\n\t\t'#873EFF', // Purple\n\t\t'#7B90FF', // Periwinkle blue\n\t\t'#EB6594', // Pink/rose\n\t],\n\tgridStyles: {\n\t\tstroke: '#787C82',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\tsvgLabelSmall: { fill: '#757575' },\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tfontSize: '12px',\n\t\tfontWeight: 400,\n\t\tcolor: '#757575',\n\t},\n\tlegendContainerStyles: {\n\t\tgap: '8px',\n\t},\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'black',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'black',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'black',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tdeltaColors: [ '#D63638', '#757575', '#008A20' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#008A20',\n\t\tnegativeChangeColor: '#D63638',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeWidth: 1.5,\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport { defaultTheme, jetpackTheme, wooTheme };\n","import { useContext } from 'react';\nimport { GlobalChartsContext } from '../global-charts-provider';\nimport type { GlobalChartsContextValue } from '../types';\n\nexport const useGlobalChartsContext = (): GlobalChartsContextValue => {\n\tconst context = useContext( GlobalChartsContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useGlobalChartsContext must be used within a GlobalChartsProvider' );\n\t}\n\treturn context;\n};\n","import { useId } from 'react';\n\nexport const useChartId = ( providedId?: string ): string => {\n\tconst generatedId = useId();\n\treturn providedId || generatedId;\n};\n","import { useEffect, useMemo } from 'react';\nimport { useDeepMemo } from '../../../hooks';\nimport { useGlobalChartsContext } from './use-global-charts-context';\nimport type { BaseLegendItem } from '../../../components/legend';\n\nexport const useChartRegistration = ( {\n\tchartId,\n\tlegendItems,\n\tchartType,\n\tisDataValid,\n\tmetadata,\n}: {\n\tchartId: string;\n\tlegendItems: BaseLegendItem[];\n\tchartType: string;\n\tisDataValid: boolean;\n\tmetadata?: Record< string, unknown >;\n} ): void => {\n\tconst { registerChart, unregisterChart } = useGlobalChartsContext();\n\n\t// Memoize legendItems with deep comparison to prevent infinite loops\n\tconst stableLegendItems = useDeepMemo( legendItems );\n\n\t// Memoize metadata to prevent unnecessary re-renders\n\tconst memoizedMetadata = useMemo( () => metadata, [ metadata ] );\n\n\tuseEffect( () => {\n\t\t// Only register if data is valid\n\t\tif ( isDataValid ) {\n\t\t\tregisterChart( chartId, {\n\t\t\t\tlegendItems: stableLegendItems,\n\t\t\t\tchartType,\n\t\t\t\tmetadata: memoizedMetadata,\n\t\t\t} );\n\t\t}\n\n\t\treturn () => {\n\t\t\tunregisterChart( chartId );\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\tchartId,\n\t\tstableLegendItems,\n\t\tchartType,\n\t\tmemoizedMetadata,\n\t\tisDataValid,\n\t\t// Removed registerChart and unregisterChart from dependencies\n\t\t// They are stable functions created with useCallback and empty deps\n\t] );\n};\n","import isEqual from 'fast-deep-equal';\nimport { useRef } from 'react';\n\n/**\n * Custom hook to memoize a value using deep equality comparison.\n * Prevents unnecessary re-renders when objects have the same content but different references.\n *\n * @param value - The value to memoize with deep equality comparison\n * @return The memoized value that only changes when deeply different\n */\nexport const useDeepMemo = < T >( value: T ): T => {\n\tconst ref = useRef< T >( value );\n\n\tif ( ! isEqual( ref.current, value ) ) {\n\t\tref.current = value;\n\t}\n\n\treturn ref.current;\n};\n","import { localPoint } from '@visx/event';\nimport { useTooltip } from '@visx/tooltip';\nimport { useCallback, type MouseEvent } from 'react';\nimport type { DataPoint } from '../types';\n\ntype UseChartMouseHandlerProps = {\n\t/**\n\t * Whether tooltips are enabled\n\t */\n\twithTooltips: boolean;\n\t/**\n\t * Horizontal offset for tooltip positioning in pixels (default: 0)\n\t */\n\toffsetX?: number;\n\t/**\n\t * Vertical offset for tooltip positioning in pixels (default: -10)\n\t */\n\toffsetY?: number;\n};\n\ntype UseChartMouseHandlerReturn = {\n\t/**\n\t * Handler for mouse move events\n\t */\n\tonMouseMove: ( event: MouseEvent< SVGElement >, data: DataPoint ) => void;\n\t/**\n\t * Handler for mouse leave events\n\t */\n\tonMouseLeave: () => void;\n\t/**\n\t * Whether the tooltip is currently open\n\t */\n\ttooltipOpen: boolean;\n\t/**\n\t * The current tooltip data\n\t */\n\ttooltipData: DataPoint | null;\n\t/**\n\t * The current tooltip left position\n\t */\n\ttooltipLeft: number | undefined;\n\t/**\n\t * The current tooltip top position\n\t */\n\ttooltipTop: number | undefined;\n};\n\n/**\n * Hook to handle mouse interactions for chart components\n *\n * @param {UseChartMouseHandlerProps} props - Hook configuration\n * @return {UseChartMouseHandlerReturn} Object containing handlers and tooltip state\n */\nexport const useChartMouseHandler = ( {\n\twithTooltips,\n\toffsetX = 0,\n\toffsetY = -10,\n}: UseChartMouseHandlerProps ): UseChartMouseHandlerReturn => {\n\tconst { tooltipOpen, tooltipLeft, tooltipTop, tooltipData, hideTooltip, showTooltip } =\n\t\tuseTooltip< DataPoint >();\n\n\tconst onMouseMove = useCallback(\n\t\t( event: MouseEvent< SVGElement >, data: DataPoint ) => {\n\t\t\tif ( ! withTooltips ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst coords = localPoint( event );\n\t\t\tif ( ! coords ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tshowTooltip( {\n\t\t\t\ttooltipData: data,\n\t\t\t\ttooltipLeft: coords.x + offsetX,\n\t\t\t\ttooltipTop: coords.y + offsetY,\n\t\t\t} );\n\t\t},\n\t\t[ withTooltips, showTooltip, offsetX, offsetY ]\n\t);\n\n\tconst onMouseLeave = useCallback( () => {\n\t\tif ( ! withTooltips ) {\n\t\t\treturn;\n\t\t}\n\t\thideTooltip();\n\t}, [ withTooltips, hideTooltip ] );\n\n\treturn {\n\t\tonMouseMove,\n\t\tonMouseLeave,\n\t\ttooltipOpen,\n\t\ttooltipData: tooltipData || null,\n\t\ttooltipLeft,\n\t\ttooltipTop,\n\t};\n};\n","import { buildChartTheme } from '@visx/xychart';\nimport { useMemo } from 'react';\nimport { useGlobalChartsTheme } from '../providers';\nimport type { SeriesData } from '../types';\n\nexport const useXYChartTheme = ( data: SeriesData[] ) => {\n\tconst theme = useGlobalChartsTheme();\n\n\treturn useMemo( () => {\n\t\tconst seriesColors = ( data ?? [] )\n\t\t\t.map( series => series.options?.stroke )\n\t\t\t.filter( ( color ): color is string => Boolean( color ) );\n\n\t\treturn buildChartTheme( {\n\t\t\t...theme,\n\t\t\tcolors: [ ...seriesColors, ...( theme.colors ?? [] ) ],\n\t\t} );\n\t}, [ theme, data ] );\n};\n","import { useMemo } from 'react';\nimport { parseAsLocalDate } from '../utils';\nimport type { SeriesData } from '../types';\n\n/**\n * Hook that transforms and sorts chart data, handling date parsing and sorting\n *\n * This hook extracts the common data transformation logic used in both line-chart\n * and bar-chart components. It:\n * 1. Parses date strings into Date objects using parseAsLocalDate\n * 2. Sorts data points by date when date properties are present\n * 3. Returns the original data unchanged when no date properties are found\n *\n * @param {SeriesData[]} data - The raw chart data to transform\n * @return {SeriesData[]} The transformed and sorted data\n */\nexport const useChartDataTransform = ( data: SeriesData[] ) => {\n\treturn useMemo( () => {\n\t\t// Check if the first data point has date or dateString properties\n\t\tconst firstPoint = data?.[ 0 ]?.data?.[ 0 ];\n\t\tconst hasDateProperties = firstPoint && ( 'date' in firstPoint || 'dateString' in firstPoint );\n\n\t\t// If no date properties found, return data unchanged\n\t\tif ( ! hasDateProperties ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Transform and sort data with date properties\n\t\treturn data.map( series => ( {\n\t\t\t...series,\n\t\t\tdata: series.data\n\t\t\t\t.map( point => {\n\t\t\t\t\tlet date: Date | undefined;\n\n\t\t\t\t\tif ( 'date' in point && point.date ) {\n\t\t\t\t\t\tdate = point.date;\n\t\t\t\t\t} else if ( 'dateString' in point && point.dateString ) {\n\t\t\t\t\t\tdate = parseAsLocalDate( point.dateString );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...point,\n\t\t\t\t\t\tdate,\n\t\t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.sort( ( a, b ) => {\n\t\t\t\t\tif ( ! a.date || ! b.date ) return 0;\n\t\t\t\t\treturn a.date.getTime() - b.date.getTime();\n\t\t\t\t} ),\n\t\t} ) );\n\t}, [ data ] );\n};\n","import { createScale, getTicks } from '@visx/scale';\nimport { useMemo } from 'react';\nimport { getLongestTickWidth } from '../utils';\nimport type { BaseChartProps, DataPointDate, SeriesData } from '../types';\nimport type { XYChartTheme } from '@visx/xychart';\n\nexport const useChartMargin = (\n\theight: number,\n\toptions: BaseChartProps[ 'options' ],\n\tdata: SeriesData[],\n\ttheme: XYChartTheme,\n\thorizontal: boolean = false\n) => {\n\tconst yTicks = useMemo( () => {\n\t\tconst allDataPoints = data.flatMap( series => series.data as DataPointDate[] );\n\n\t\tif ( horizontal ) {\n\t\t\t// When horizontal, y ticks renders fixed tick labels.\n\t\t\treturn allDataPoints.map(\n\t\t\t\td => d.label || options.axis?.y?.tickFormat( d.date.getTime(), 0, [] )\n\t\t\t);\n\t\t}\n\n\t\tconst minY = Math.min( ...allDataPoints.map( d => d.value ) );\n\t\tconst maxY = Math.max( ...allDataPoints.map( d => d.value ) );\n\t\tconst yScale = createScale( {\n\t\t\t...options.yScale,\n\t\t\tdomain: [ minY, maxY ],\n\t\t\trange: [ height, 0 ],\n\t\t} );\n\n\t\treturn getTicks( yScale, options.axis?.y?.numTicks );\n\t}, [ options, data, height, horizontal ] );\n\n\treturn useMemo( () => {\n\t\t// Default margin is for bottom axis labels.\n\t\tconst defaultMargin = { top: 10, right: 20, bottom: 20, left: 20 };\n\t\tconst defaultTickWidth = 40;\n\n\t\t// Auto-calculate margin for y axis labels based on orientation and tick width.\n\t\tconst yAxisOrientation = options.axis?.y?.orientation;\n\t\tconst yAxisStyles =\n\t\t\tyAxisOrientation === 'right' ? theme.axisStyles.y.right : theme.axisStyles.y.left;\n\t\tconst yTickWidth = getLongestTickWidth(\n\t\t\tyTicks,\n\t\t\toptions.axis?.y?.tickFormat,\n\t\t\tyAxisStyles.axisLabel\n\t\t);\n\t\tconst yMarginValue = ( yTickWidth ?? defaultTickWidth ) + ( yAxisStyles?.tickLength ?? 0 );\n\n\t\tif ( yAxisOrientation === 'right' ) {\n\t\t\tdefaultMargin.right = yMarginValue;\n\t\t} else {\n\t\t\tdefaultMargin.left = yMarginValue;\n\t\t}\n\n\t\tif ( options.axis?.x?.orientation === 'top' ) {\n\t\t\tdefaultMargin.top = 20;\n\t\t\tdefaultMargin.bottom = 10;\n\t\t}\n\n\t\treturn defaultMargin;\n\t}, [ options, theme, yTicks ] );\n};\n","import { useState, useCallback, useRef } from 'react';\n\n/**\n * Hook to measure the height of a DOM element.\n * Returns a ref to attach to the element and the current height in pixels.\n *\n * @param {object} props - Optional props.\n * @param {number} props.initialHeight - The initial height to use.\n *\n * @return {[Function, number]} A tuple containing a ref to attach to the element and the current height in pixels\n */\nexport function useElementHeight< T extends HTMLElement = HTMLDivElement >( {\n\tinitialHeight = 0,\n}: {\n\tinitialHeight?: number;\n} = {} ): [ ( node: T | null ) => void, number ] {\n\tconst [ height, setHeight ] = useState( initialHeight );\n\tconst observerRef = useRef< ResizeObserver | null >( null );\n\n\tconst refCallback = useCallback( ( node: T | null ) => {\n\t\tif ( observerRef.current ) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\t\tif ( node ) {\n\t\t\tconst handleResize = () => {\n\t\t\t\tsetHeight( node.getBoundingClientRect().height || 0 );\n\t\t\t};\n\t\t\thandleResize();\n\t\t\tconst resizeObserver = new window.ResizeObserver( handleResize );\n\t\t\tresizeObserver.observe( node );\n\t\t\tobserverRef.current = resizeObserver;\n\t\t}\n\t}, [] );\n\n\treturn [ refCallback, height ];\n}\n","import { useCallback, useRef, useState } from 'react';\n\n/**\n * Hook to detect if text content is truncated within its container.\n * Uses ResizeObserver to dynamically track changes in element size.\n *\n * @param enabled - Whether truncation detection should be active. Defaults to true.\n * @return A tuple containing:\n * - [0] refCallback: Function to attach to the text element as a ref\n * - [1] isTruncated: Boolean indicating if the text is currently truncated\n *\n * @example\n * ```tsx\n * const [textRef, isTruncated] = useTextTruncation(true);\n *\n * return (\n * <span ref={textRef} title={isTruncated ? fullText : undefined}>\n * {text}\n * </span>\n * );\n * ```\n */\nexport function useTextTruncation(\n\tenabled: boolean = true\n): [ ( node: HTMLElement | null ) => void, boolean ] {\n\tconst [ isTruncated, setIsTruncated ] = useState( false );\n\tconst observerRef = useRef< ResizeObserver | null >( null );\n\n\tconst refCallback = useCallback(\n\t\t( node: HTMLElement | null ) => {\n\t\t\t// Cleanup existing observer\n\t\t\tif ( observerRef.current ) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t\tobserverRef.current = null;\n\t\t\t}\n\n\t\t\tif ( node && enabled ) {\n\t\t\t\tconst checkTruncation = () => {\n\t\t\t\t\t// Check if content width exceeds container width (indicates truncation)\n\t\t\t\t\tconst truncated = node.scrollWidth > node.clientWidth;\n\t\t\t\t\tsetIsTruncated( truncated );\n\t\t\t\t};\n\n\t\t\t\t// Initial check\n\t\t\t\tcheckTruncation();\n\n\t\t\t\t// Watch for size changes\n\t\t\t\tconst resizeObserver = new ResizeObserver( checkTruncation );\n\t\t\t\tresizeObserver.observe( node );\n\t\t\t\tobserverRef.current = resizeObserver;\n\t\t\t} else {\n\t\t\t\tsetIsTruncated( false );\n\t\t\t}\n\t\t},\n\t\t[ enabled ]\n\t);\n\n\treturn [ refCallback, isTruncated ];\n}\n","import { useMemo } from 'react';\nimport type { SeriesData, DataPointDate } from '../types';\n\nexport type EnhancedDataPoint = DataPointDate & {\n\tvisualValue?: number;\n};\n\nexport interface EnhancedSeriesData extends Omit< SeriesData, 'data' > {\n\tdata: EnhancedDataPoint[];\n}\n\nexport interface UseZeroValueDisplayOptions {\n\tenabled: boolean;\n\tminValueRatio?: number;\n\tmaxValueRatio?: number;\n}\n\nexport const useZeroValueDisplay = (\n\tdata: SeriesData[],\n\toptions: UseZeroValueDisplayOptions = { enabled: false }\n): SeriesData[] | EnhancedSeriesData[] => {\n\tconst { enabled, minValueRatio = 0.6, maxValueRatio = 0.008 } = options;\n\n\treturn useMemo( () => {\n\t\tif ( ! enabled ) return data;\n\n\t\t// Collect all non-zero, non-null values (both positive and negative)\n\t\tconst nonZeroValues: number[] = [];\n\n\t\tfor ( const series of data ) {\n\t\t\tfor ( const point of series.data ) {\n\t\t\t\tif ( point.value !== null && point.value !== 0 ) {\n\t\t\t\t\tnonZeroValues.push( point.value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( nonZeroValues.length === 0 ) return data;\n\n\t\t// Convert to absolute values to find the range\n\t\tconst absoluteValues = nonZeroValues.map( Math.abs );\n\n\t\t// Calculate min and max based on absolute values\n\t\tconst minAbsoluteValue = Math.min( ...absoluteValues );\n\t\tconst maxAbsoluteValue = Math.max( ...absoluteValues );\n\n\t\t// Calculate minimum visible value using absolute range\n\t\tconst minVisibleValue = Math.min(\n\t\t\tminAbsoluteValue * minValueRatio,\n\t\t\tmaxAbsoluteValue * maxValueRatio\n\t\t);\n\n\t\treturn data.map( series => ( {\n\t\t\t...series,\n\t\t\tdata: series.data.map( ( point ): EnhancedDataPoint => {\n\t\t\t\tif ( point.value === 0 ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...point,\n\t\t\t\t\t\tvisualValue: minVisibleValue,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn point;\n\t\t\t} ),\n\t\t} ) );\n\t}, [ data, enabled, minValueRatio, maxValueRatio ] );\n};\n","import { useMemo } from 'react';\n\n/**\n * Data point interface for charts with interactive legends.\n * Requires label for series identification, value for calculations, and percentage for display.\n */\ninterface DataPointWithPercentage {\n\tlabel: string;\n\tvalue: number;\n\tpercentage: number;\n}\n\n/**\n * Parameters for the useInteractiveLegendData hook.\n */\ninterface UseInteractiveLegendDataParams< T extends DataPointWithPercentage > {\n\t/** The chart data to filter based on legend visibility */\n\tdata: T[];\n\t/** Unique chart identifier, required for interactive legends */\n\tchartId: string | undefined;\n\t/** Whether interactive legend filtering is enabled */\n\tlegendInteractive: boolean;\n\t/** Function to check if a series is visible in the legend */\n\tisSeriesVisible: ( chartId: string, label: string ) => boolean;\n}\n\n/**\n * Return value from the useInteractiveLegendData hook.\n */\ninterface UseInteractiveLegendDataResult< T extends DataPointWithPercentage > {\n\t/** Filtered data array containing only visible segments with recalculated percentages */\n\tvisibleData: T[];\n\t/** Boolean indicating if all segments are hidden */\n\tallSegmentsHidden: boolean;\n\t/**\n\t * Legend data with recalculated percentages for visible items.\n\t * Uses original data for hidden items, but shows recalculated percentages for visible ones.\n\t * This ensures the legend displays accurate percentages while maintaining all entries.\n\t */\n\tlegendData: T[];\n}\n\n/**\n * Custom hook to filter and recalculate chart data for interactive legends.\n *\n * When interactive legends are enabled, this hook:\n * 1. Filters data to show only visible series based on legend selection\n * 2. Recalculates percentages so visible segments total 100%\n * 3. Tracks whether all segments are hidden to show empty state\n *\n * This is particularly useful for pie charts, donut charts, and semi-circle charts\n * where segment visibility and percentages need to be dynamically adjusted.\n *\n * @example\n * ```tsx\n * const { visibleData, allSegmentsHidden, legendData } = useInteractiveLegendData({\n * data: chartData,\n * chartId: 'my-pie-chart',\n * legendInteractive: true,\n * isSeriesVisible: (id, label) => context.isSeriesVisible(id, label),\n * });\n *\n * // Use legendData for creating legend items (shows recalculated percentages)\n * const legendItems = useChartLegendItems(legendData, legendOptions);\n *\n * if (allSegmentsHidden) {\n * return <EmptyState />;\n * }\n *\n * // Use visibleData for rendering the chart (only visible segments)\n * return <PieChart data={visibleData} />;\n * ```\n *\n * @param params - Configuration object for the hook\n * @param params.data - The chart data to filter\n * @param params.chartId - Unique identifier for the chart (required for interactive mode)\n * @param params.legendInteractive - Whether to enable interactive filtering\n * @param params.isSeriesVisible - Function to check series visibility\n * @return Object containing visibleData, allSegmentsHidden flag, and legendData with recalculated percentages\n */\nexport const useInteractiveLegendData = < T extends DataPointWithPercentage >( {\n\tdata,\n\tchartId,\n\tlegendInteractive,\n\tisSeriesVisible,\n}: UseInteractiveLegendDataParams< T > ): UseInteractiveLegendDataResult< T > => {\n\t// Filter and recalculate data for interactive legends\n\tconst visibleData = useMemo( () => {\n\t\t// If interactive mode is disabled or no chartId, return all data unchanged\n\t\tif ( ! chartId || ! legendInteractive ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Filter to only visible segments based on legend state\n\t\tconst filtered = data.filter( segment => isSeriesVisible( chartId, segment.label ) );\n\n\t\t// If no segments are visible, return empty array\n\t\tif ( filtered.length === 0 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Recalculate percentages so visible segments total 100%\n\t\tconst totalValue = filtered.reduce( ( sum, segment ) => sum + segment.value, 0 );\n\n\t\treturn filtered.map( segment => ( {\n\t\t\t...segment,\n\t\t\tpercentage: totalValue > 0 ? ( segment.value / totalValue ) * 100 : 0,\n\t\t} ) );\n\t}, [ data, chartId, isSeriesVisible, legendInteractive ] );\n\n\t// Check if all segments are hidden (only relevant in interactive mode)\n\tconst allSegmentsHidden = useMemo( () => {\n\t\treturn legendInteractive && visibleData.length === 0;\n\t}, [ legendInteractive, visibleData ] );\n\n\t// Prepare legend data with recalculated percentages for visible items\n\t// This maintains all legend entries but shows updated percentages for visible segments\n\tconst legendData = useMemo( () => {\n\t\tif ( ! legendInteractive || ! chartId ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Map original data to show recalculated percentages for visible items\n\t\treturn data.map( segment => {\n\t\t\tconst isVisible = isSeriesVisible( chartId, segment.label );\n\t\t\tif ( ! isVisible ) {\n\t\t\t\t// Return original data for hidden items\n\t\t\t\treturn segment;\n\t\t\t}\n\n\t\t\t// For visible items, find the recalculated percentage from visibleData\n\t\t\tconst recalculated = visibleData.find( d => d.label === segment.label );\n\t\t\treturn recalculated || segment;\n\t\t} );\n\t}, [ data, visibleData, legendInteractive, chartId, isSeriesVisible ] );\n\n\treturn { visibleData, allSegmentsHidden, legendData };\n};\n","import { useState, useEffect } from 'react';\n\n// 'no-preference' returns false in unsupported browsers,\n// causing a safe fallback to reduced motion instead of animating.\nconst QUERY = '(prefers-reduced-motion: no-preference)';\n\nconst getInitialState = () => ! window.matchMedia( QUERY ).matches;\n\n/**\n * Custom hook to determine if the user prefers reduced motion.\n * @return {boolean} A boolean indicating the user's preference for reduced motion.\n */\nexport function usePrefersReducedMotion() {\n\tconst [ prefersReducedMotion, setPrefersReducedMotion ] = useState( getInitialState );\n\n\tuseEffect( () => {\n\t\tconst mediaQueryList = window.matchMedia( QUERY );\n\n\t\tconst listener = event => {\n\t\t\tsetPrefersReducedMotion( ! event.matches );\n\t\t};\n\n\t\tmediaQueryList.addEventListener( 'change', listener );\n\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener( 'change', listener );\n\t\t};\n\t}, [] );\n\n\treturn prefersReducedMotion;\n}\n","import { useContext } from 'react';\nimport { GlobalChartsContext } from '../global-charts-provider';\nimport { defaultTheme } from '../themes';\nimport type { CompleteChartTheme } from '../../../types';\n\n/**\n * Hook to get the global chart theme from GlobalChartsProvider\n *\n * @return The global chart theme\n */\nexport const useGlobalChartsTheme = (): CompleteChartTheme => {\n\t// Get context but don't throw if it doesn't exist (for testing or standalone usage)\n\tconst context = useContext( GlobalChartsContext );\n\tconst globalTheme = context?.theme;\n\n\treturn globalTheme ?? defaultTheme;\n};\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useCallback","useMemo","useMemo","useMemo","useMemo","useMemo","useMemo","useState","useCallback","useRef","useCallback","useRef","useState","useMemo","useMemo","useState","useEffect","useMemo","useEffect","useContext","useContext"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-N4ZDNOPY.cjs","../src/providers/chart-context/global-charts-provider.tsx","../src/providers/chart-context/private/get-chart-color.ts","../src/providers/chart-context/themes.ts","../src/providers/chart-context/hooks/use-global-charts-context.ts","../src/providers/chart-context/hooks/use-chart-id.ts","../src/providers/chart-context/hooks/use-chart-registration.ts","../src/hooks/use-deep-memo.ts","../src/hooks/use-chart-mouse-handler.ts","../src/hooks/use-xychart-theme.ts","../src/hooks/use-chart-data-transform.ts","../src/hooks/use-chart-margin.tsx","../src/hooks/use-element-height.ts","../src/hooks/use-text-truncation.ts","../src/hooks/use-zero-value-display.ts","../src/hooks/use-interactive-legend-data.ts","../src/hooks/use-prefers-reduced-motion.ts","../src/providers/chart-context/hooks/use-global-charts-theme.ts"],"names":["useRef","useCallback","useMemo","useState","useEffect","useContext"],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-N4ZDNOPY.cjs","sourcesContent":[null,"import {\n\tcreateContext,\n\tuseCallback,\n\tuseMemo,\n\tuseState,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n} from 'react';\nimport {\n\tgetItemShapeStyles,\n\tgetSeriesLineStyles,\n\tmergeThemes,\n\thexToHsl,\n\tresolveCssVariable,\n} from '../../utils';\nimport { getChartColor, type ColorCache } from './private/get-chart-color';\nimport { defaultTheme } from './themes';\nimport type { GlobalChartsContextValue, ChartRegistration } from './types';\nimport type { ChartTheme, CompleteChartTheme } from '../../types';\nimport type { FC, ReactNode } from 'react';\n\nexport const GlobalChartsContext = createContext< GlobalChartsContextValue | null >( null );\n\nexport interface GlobalChartsProviderProps {\n\tchildren: ReactNode;\n\ttheme?: Partial< ChartTheme >;\n}\n\nexport const GlobalChartsProvider: FC< GlobalChartsProviderProps > = ( { children, theme } ) => {\n\tconst [ charts, setCharts ] = useState< Map< string, ChartRegistration > >( () => new Map() );\n\t// Track hidden series per chart: chartId -> Set<seriesLabel>\n\tconst [ hiddenSeries, setHiddenSeries ] = useState< Map< string, Set< string > > >(\n\t\t() => new Map()\n\t);\n\n\t// Ref to the wrapper element for resolving scoped CSS variables\n\tconst wrapperRef = useRef< HTMLDivElement >( null );\n\n\tconst providerTheme: CompleteChartTheme = useMemo( () => {\n\t\treturn theme ? mergeThemes( defaultTheme, theme ) : defaultTheme;\n\t}, [ theme ] );\n\n\t// Cache expensive color computations that only change when theme colors change\n\t// Using useState + useLayoutEffect instead of useMemo to ensure CSS variables\n\t// in <style> tags are applied to the DOM before we try to resolve them\n\tconst [ colorCache, setColorCache ] = useState< ColorCache >( () => ( {\n\t\tcolors: [],\n\t\thues: [],\n\t\texistingHslColors: [],\n\t\tminHue: 360,\n\t\tmaxHue: 0,\n\t} ) );\n\n\t// Compute color cache after DOM is updated (so CSS variables are available)\n\t// Resolves CSS variables from the wrapper element's scope to handle scoped variables\n\t// Note: Only re-runs when providerTheme changes, not when wrapper element changes.\n\t// This is intentional, as wrapperRef is expected to be stable for the lifetime of the provider.\n\tuseLayoutEffect( () => {\n\t\tconst { colors } = providerTheme;\n\t\tconst resolvedColors: string[] = [];\n\t\tconst hues: number[] = [];\n\t\tconst existingHslColors: Array< [ number, number, number ] > = [];\n\t\tlet minHue = 360;\n\t\tlet maxHue = 0;\n\n\t\t// Process all colors once and cache the results\n\t\tif ( Array.isArray( colors ) ) {\n\t\t\tfor ( const color of colors ) {\n\t\t\t\tif ( color && typeof color === 'string' ) {\n\t\t\t\t\tlet colorValue = color;\n\n\t\t\t\t\t// Handle CSS custom properties names - resolve them to actual values\n\t\t\t\t\t// Use wrapper element to resolve scoped CSS variables\n\t\t\t\t\tif ( color.startsWith( '--' ) ) {\n\t\t\t\t\t\tconst resolved = resolveCssVariable( color, wrapperRef.current );\n\n\t\t\t\t\t\tif ( resolved === null || resolved === '' ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcolorValue = resolved;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Process hex colors\n\t\t\t\t\tif ( colorValue.startsWith( '#' ) ) {\n\t\t\t\t\t\tresolvedColors.push( colorValue );\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst hslColor = hexToHsl( colorValue );\n\t\t\t\t\t\t\thues.push( hslColor[ 0 ] );\n\t\t\t\t\t\t\texistingHslColors.push( hslColor );\n\t\t\t\t\t\t\tminHue = Math.min( minHue, hslColor[ 0 ] );\n\t\t\t\t\t\t\tmaxHue = Math.max( maxHue, hslColor[ 0 ] );\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Ignore invalid hex colors that don't parse to HSL\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetColorCache( {\n\t\t\tcolors: resolvedColors,\n\t\t\thues,\n\t\t\texistingHslColors,\n\t\t\tminHue,\n\t\t\tmaxHue,\n\t\t} );\n\t}, [ providerTheme ] );\n\n\tconst [ groupToColorMap, setGroupToColorMap ] = useState< Map< string, string > >(\n\t\t() => new Map()\n\t);\n\n\t// Reset group color mappings when theme colors change\n\tuseEffect( () => {\n\t\t// Create a completely new Map instance to trigger dependencies, e.g. useChartLegendItems\n\t\tsetGroupToColorMap( new Map() );\n\t}, [ providerTheme.colors ] );\n\n\tconst registerChart = useCallback( ( id: string, data: ChartRegistration ) => {\n\t\tsetCharts( prev => new Map( prev ).set( id, data ) );\n\t}, [] );\n\n\tconst unregisterChart = useCallback( ( id: string ) => {\n\t\tsetCharts( prev => {\n\t\t\tconst newMap = new Map( prev );\n\t\t\tnewMap.delete( id );\n\t\t\treturn newMap;\n\t\t} );\n\t}, [] );\n\n\tconst getChartData = useCallback(\n\t\t( id: string ) => {\n\t\t\treturn charts.get( id );\n\t\t},\n\t\t[ charts ]\n\t);\n\n\tconst resolveColor = useCallback(\n\t\t( {\n\t\t\tgroup,\n\t\t\tindex,\n\t\t\toverrideColor,\n\t\t}: {\n\t\t\tgroup?: string;\n\t\t\tindex: number;\n\t\t\toverrideColor?: string;\n\t\t} ): string => {\n\t\t\t// Highest precedence: eg. explicit series stroke or chart color prop\n\t\t\tif ( overrideColor ) {\n\t\t\t\treturn overrideColor;\n\t\t\t}\n\n\t\t\t// If group provided, maintain a stable assignment\n\t\t\tif ( group ) {\n\t\t\t\tconst existing = groupToColorMap.get( group );\n\n\t\t\t\tif ( existing ) {\n\t\t\t\t\treturn existing;\n\t\t\t\t}\n\n\t\t\t\tconst assignedCount = groupToColorMap.size;\n\t\t\t\tconst color =\n\t\t\t\t\tcolorCache.colors.length > 0 ? getChartColor( assignedCount, colorCache ) : '#000000';\n\t\t\t\tgroupToColorMap.set( group, color );\n\n\t\t\t\treturn color;\n\t\t\t}\n\n\t\t\treturn colorCache.colors.length > 0 ? getChartColor( index, colorCache ) : '#000000';\n\t\t},\n\t\t[ colorCache, groupToColorMap ]\n\t);\n\n\tconst getElementStyles = useCallback< GlobalChartsContextValue[ 'getElementStyles' ] >(\n\t\t( { data, index, overrideColor, legendShape } ) => {\n\t\t\tconst isSeriesData = data && typeof data === 'object' && 'data' in data && 'options' in data;\n\t\t\tconst isPointPercentageData = data && typeof data === 'object' && 'percentage' in data;\n\n\t\t\treturn {\n\t\t\t\tcolor: resolveColor( {\n\t\t\t\t\tgroup: data?.group,\n\t\t\t\t\tindex,\n\t\t\t\t\toverrideColor:\n\t\t\t\t\t\toverrideColor ||\n\t\t\t\t\t\t( isSeriesData && data?.options?.stroke ) ||\n\t\t\t\t\t\t( isPointPercentageData && data?.color ),\n\t\t\t\t} ),\n\t\t\t\tlineStyles: isSeriesData ? getSeriesLineStyles( data, index, providerTheme ) : {},\n\t\t\t\tglyph: providerTheme.glyphs?.[ index ],\n\t\t\t\tshapeStyles: isSeriesData\n\t\t\t\t\t? getItemShapeStyles( data, index, providerTheme, legendShape )\n\t\t\t\t\t: {},\n\t\t\t};\n\t\t},\n\t\t[ providerTheme, resolveColor ]\n\t);\n\n\t// Series visibility management methods\n\tconst toggleSeriesVisibility = useCallback( ( chartId: string, seriesLabel: string ) => {\n\t\tsetHiddenSeries( prev => {\n\t\t\tconst newMap = new Map( prev );\n\t\t\tconst chartHidden = newMap.get( chartId ) || new Set();\n\t\t\tconst newSet = new Set( chartHidden );\n\n\t\t\tif ( newSet.has( seriesLabel ) ) {\n\t\t\t\tnewSet.delete( seriesLabel );\n\t\t\t} else {\n\t\t\t\tnewSet.add( seriesLabel );\n\t\t\t}\n\n\t\t\tif ( newSet.size === 0 ) {\n\t\t\t\tnewMap.delete( chartId );\n\t\t\t} else {\n\t\t\t\tnewMap.set( chartId, newSet );\n\t\t\t}\n\n\t\t\treturn newMap;\n\t\t} );\n\t}, [] );\n\n\tconst isSeriesVisible = useCallback(\n\t\t( chartId: string, seriesLabel: string ) => {\n\t\t\tconst chartHidden = hiddenSeries.get( chartId );\n\t\t\treturn ! chartHidden || ! chartHidden.has( seriesLabel );\n\t\t},\n\t\t[ hiddenSeries ]\n\t);\n\n\tconst getHiddenSeries = useCallback(\n\t\t( chartId: string ): Set< string > => {\n\t\t\tconst set = hiddenSeries.get( chartId );\n\t\t\treturn set ? new Set( set ) : new Set< string >();\n\t\t},\n\t\t[ hiddenSeries ]\n\t);\n\n\tconst value: GlobalChartsContextValue = useMemo(\n\t\t() => ( {\n\t\t\tcharts,\n\t\t\tregisterChart,\n\t\t\tunregisterChart,\n\t\t\tgetChartData,\n\t\t\ttheme: providerTheme,\n\t\t\tgetElementStyles,\n\t\t\ttoggleSeriesVisibility,\n\t\t\tisSeriesVisible,\n\t\t\tgetHiddenSeries,\n\t\t} ),\n\t\t[\n\t\t\tcharts,\n\t\t\tregisterChart,\n\t\t\tunregisterChart,\n\t\t\tgetChartData,\n\t\t\tproviderTheme,\n\t\t\tgetElementStyles,\n\t\t\ttoggleSeriesVisibility,\n\t\t\tisSeriesVisible,\n\t\t\tgetHiddenSeries,\n\t\t]\n\t);\n\n\treturn (\n\t\t<GlobalChartsContext.Provider value={ value }>\n\t\t\t<div ref={ wrapperRef } style={ { display: 'contents' } }>\n\t\t\t\t{ children }\n\t\t\t</div>\n\t\t</GlobalChartsContext.Provider>\n\t);\n};\n","import { getColorDistance } from '../../../utils';\n\nexport interface ColorCache {\n\tcolors: string[];\n\thues: number[];\n\texistingHslColors: Array< [ number, number, number ] >;\n\tminHue: number;\n\tmaxHue: number;\n}\n\n/**\n * Golden ratio for mathematically pleasing color distribution\n * Used to generate evenly spaced hues that are visually distinct\n */\nconst GOLDEN_RATIO = 0.618033988749;\n\n/**\n * Minimum perceptual distance between colors to ensure visual distinction\n * Based on weighted HSL distance calculation optimized for chart readability\n */\nconst MIN_COLOR_DISTANCE = 25;\n\n/**\n * Maximum attempts to find a sufficiently different color\n * Prevents infinite loops while allowing reasonable search space\n */\nconst MAX_COLOR_GENERATION_ATTEMPTS = 50;\n\n/**\n * Color variation attempt offset\n * Small increment to explore slightly different color variations per attempt\n */\nconst VARIATION_ATTEMPT_OFFSET = 0.1;\n\n// Saturation configuration for generated colors\n\n/**\n * Base saturation percentage for generated colors\n * 45% provides muted, professional colors without being washed out\n */\nconst BASE_SATURATION = 45;\n\n/**\n * Number of saturation variation steps\n * Creates 3 different saturation levels for variety\n */\nconst SATURATION_VARIATION_STEPS = 3;\n\n/**\n * Saturation increment per variation step\n * 10% increments provide subtle variation while keeping colors muted\n * Results in saturation levels: 45%, 55%, 65%\n */\nconst SATURATION_INCREMENT = 10;\n\n// Lightness configuration for WCAG AA accessibility compliance\n\n/**\n * Base lightness percentage for generated colors\n * 35% ensures sufficient contrast against white backgrounds for WCAG AA compliance\n * WCAG AA requires 4.5:1 contrast ratio for normal text\n */\nconst BASE_LIGHTNESS = 35;\n\n/**\n * Number of lightness variation steps\n * Creates 4 different lightness levels for variety\n */\nconst LIGHTNESS_VARIATION_STEPS = 4;\n\n/**\n * Lightness increment per variation step\n * 8% increments provide subtle lightness variation while maintaining accessibility\n * Results in lightness levels: 35%, 43%, 51%, 59%\n * All levels maintain WCAG AA compliance against white backgrounds\n */\nconst LIGHTNESS_INCREMENT = 8;\n\n// Hue range expansion and constraints\n\n/**\n * Minimum hue range in degrees to ensure sufficient color variety\n * 60 degrees provides reasonable color spread even for narrow palettes\n */\nconst MIN_HUE_RANGE_DEGREES = 60;\n\n/**\n * Hue range expansion factor\n * 1.3x expansion provides slightly more variety than the original palette\n */\nconst HUE_RANGE_EXPANSION_FACTOR = 1.3;\n\n/**\n * Threshold for detecting hue wrap-around (color wheel boundary crossing)\n * 180 degrees indicates the colors span more than half the color wheel\n */\nconst HUE_WRAP_THRESHOLD_DEGREES = 180;\n\n/**\n * Full color wheel rotation in degrees\n */\nconst FULL_HUE_ROTATION_DEGREES = 360;\n\n/**\n * Factor for single color hue range\n */\nconst SINGLE_COLOR_HUE_RANGE_FACTOR = 0.33;\n\n/**\n * Get a color from the colors array or generate a new color using the golden ratio\n *\n * @param index - the index of the color to get\n * @param colorCache - pre-computed color data for performance\n * @return a color from the colors array or a new color using the golden ratio\n */\nexport const getChartColor = ( index: number, colorCache: ColorCache ) => {\n\tconst {\n\t\tcolors,\n\t\thues,\n\t\texistingHslColors,\n\t\tminHue: cachedMinHue,\n\t\tmaxHue: cachedMaxHue,\n\t} = colorCache;\n\n\tif ( index < colors.length ) {\n\t\treturn colors[ index ];\n\t}\n\n\tlet minHue = cachedMinHue;\n\tlet maxHue = cachedMaxHue;\n\n\t// Generate additional colors using golden ratio, avoiding similar colors\n\tfor ( let attempt = 0; attempt < MAX_COLOR_GENERATION_ATTEMPTS; attempt++ ) {\n\t\t// Calculate hue using golden ratio distribution with variation per attempt\n\t\t// Formula: ((base_index + attempt_variation) * golden_ratio * 360°) mod 360°\n\t\t// This ensures mathematically pleasing spacing while allowing slight shifts per attempt\n\t\tlet hue =\n\t\t\t( ( index - colors.length + attempt * VARIATION_ATTEMPT_OFFSET ) *\n\t\t\t\tGOLDEN_RATIO *\n\t\t\t\tFULL_HUE_ROTATION_DEGREES ) %\n\t\t\tFULL_HUE_ROTATION_DEGREES;\n\n\t\t// If we have existing colors, constrain new colors to their hue range\n\t\tif ( hues.length > 0 ) {\n\t\t\t// Handle hue wrap-around (e.g., if colors span across 0 degrees)\n\t\t\tlet hueRange = maxHue - minHue;\n\n\t\t\t// If there's only one color, use a set hue range for limited variety\n\t\t\tif ( hues.length === 1 ) {\n\t\t\t\thueRange = FULL_HUE_ROTATION_DEGREES * SINGLE_COLOR_HUE_RANGE_FACTOR;\n\t\t\t} else if ( hueRange > HUE_WRAP_THRESHOLD_DEGREES ) {\n\t\t\t\t// If the range is very large, it might be wrapping around the color wheel\n\t\t\t\t// Check if a smaller range exists when considering wrap-around\n\t\t\t\tconst altMinHue = Math.min( ...hues.filter( h => h > HUE_WRAP_THRESHOLD_DEGREES ) );\n\t\t\t\tconst altMaxHue =\n\t\t\t\t\tMath.max( ...hues.filter( h => h < HUE_WRAP_THRESHOLD_DEGREES ) ) +\n\t\t\t\t\tFULL_HUE_ROTATION_DEGREES;\n\t\t\t\tconst altRange = altMaxHue - altMinHue;\n\n\t\t\t\tif ( altRange < hueRange ) {\n\t\t\t\t\tminHue = altMinHue;\n\t\t\t\t\tmaxHue = altMaxHue;\n\t\t\t\t\thueRange = altRange;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand the range slightly to provide some variation\n\t\t\tconst expandedRange = Math.max(\n\t\t\t\thueRange * HUE_RANGE_EXPANSION_FACTOR,\n\t\t\t\tMIN_HUE_RANGE_DEGREES\n\t\t\t);\n\t\t\tconst rangeCenter = ( minHue + maxHue ) / 2;\n\t\t\tconst expandedMin = rangeCenter - expandedRange / 2;\n\n\t\t\t// Map the generated hue to the expanded range\n\t\t\thue = expandedMin + ( hue / FULL_HUE_ROTATION_DEGREES ) * expandedRange;\n\n\t\t\t// Normalize to 0-360 range\n\t\t\thue =\n\t\t\t\t( ( hue % FULL_HUE_ROTATION_DEGREES ) + FULL_HUE_ROTATION_DEGREES ) %\n\t\t\t\tFULL_HUE_ROTATION_DEGREES;\n\t\t}\n\n\t\tconst saturation =\n\t\t\tBASE_SATURATION + ( ( index + attempt ) % SATURATION_VARIATION_STEPS ) * SATURATION_INCREMENT;\n\t\tconst lightness =\n\t\t\tBASE_LIGHTNESS + ( ( index + attempt ) % LIGHTNESS_VARIATION_STEPS ) * LIGHTNESS_INCREMENT;\n\n\t\tconst candidateHsl: [ number, number, number ] = [ hue, saturation, lightness ];\n\n\t\t// Check if this color is sufficiently different from existing colors\n\t\tlet isSufficientlyDifferent = true;\n\t\tfor ( const existingHsl of existingHslColors ) {\n\t\t\tif ( getColorDistance( candidateHsl, existingHsl ) < MIN_COLOR_DISTANCE ) {\n\t\t\t\tisSufficientlyDifferent = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( isSufficientlyDifferent ) {\n\t\t\treturn `hsl(${ Math.round( hue ) }, ${ saturation }%, ${ lightness }%)`;\n\t\t}\n\t}\n\n\t// Fallback if we couldn't find a sufficiently different color\n\t// Formula: ((base_index) * golden_ratio * 360°) mod 360°\n\t// This ensures mathematically pleasing spacing while maintaining consistency\n\tconst fallbackHue =\n\t\t( ( index - colors.length ) * GOLDEN_RATIO * FULL_HUE_ROTATION_DEGREES ) %\n\t\tFULL_HUE_ROTATION_DEGREES;\n\tconst fallbackSaturation =\n\t\tBASE_SATURATION + ( index % SATURATION_VARIATION_STEPS ) * SATURATION_INCREMENT;\n\tconst fallbackLightness =\n\t\tBASE_LIGHTNESS + ( index % LIGHTNESS_VARIATION_STEPS ) * LIGHTNESS_INCREMENT;\n\treturn `hsl(${ Math.round( fallbackHue ) }, ${ fallbackSaturation }%, ${ fallbackLightness }%)`;\n};\n","import type { ChartTheme, CompleteChartTheme } from '../../types';\n\n/**\n * Default theme configuration\n */\nconst defaultTheme: CompleteChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [ '#98C8DF', '#006DAB', '#A6DC80', '#1F9828', '#FF8C8F' ],\n\tgridStyles: {\n\t\tstroke: '#DCDCDE',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tcolor: 'var(--jp-gray-80, #2c3338)',\n\t},\n\tlegendContainerStyles: {},\n\tseriesLineStyles: [],\n\tlegendShapeStyles: [],\n\tglyphs: [],\n\tsvgLabelSmall: { fill: 'var(--jp-gray-80, #2c3338)' },\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'var(--jp-gray-80, #2c3338)',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'var(--jp-gray-80, #2c3338)',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'var(--jp-gray-80, #2c3338)',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tdeltaColors: [ '#FF8C8F', '#757575', '#1F9828' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#1F9828',\n\t\tnegativeChangeColor: '#FF8C8F',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\n/**\n * Jetpack theme configuration\n */\nconst jetpackTheme: ChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [ '#98C8DF', '#006DAB', '#A6DC80', '#1F9828', '#FF8C8F' ],\n\tgridStyles: {\n\t\tstroke: '#DCDCDE',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tcolor: 'var(--jp-gray-80, #2c3338)',\n\t},\n\tsvgLabelSmall: { fill: 'var(--jp-gray-80, #2c3338)' },\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'var(--jp-gray-80, #2c3338)',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'var(--jp-gray-80, #2c3338)',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'var(--jp-gray-80, #2c3338)',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tprimaryColor: '#006DAB',\n\t\tsecondaryColor: '#98C8DF',\n\t\tdeltaColors: [ '#FF8C8F', '#757575', '#1F9828' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#1F9828',\n\t\tnegativeChangeColor: '#FF8C8F',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\n/**\n * Woo theme configuration\n */\nconst wooTheme: ChartTheme = {\n\tbackgroundColor: '#FFFFFF', // chart background color\n\tlabelBackgroundColor: 'transparent', // label background color (transparent by default)\n\tlabelTextColor: '#FFFFFF', // label text color (white to match original behavior)\n\tcolors: [\n\t\t'#3858E9', // WooCommerce brand blue\n\t\t'#66BDFF', // Light blue\n\t\t'#873EFF', // Purple\n\t\t'#7B90FF', // Periwinkle blue\n\t\t'#EB6594', // Pink/rose\n\t],\n\tgridStyles: {\n\t\tstroke: '#787C82',\n\t\tstrokeWidth: 1,\n\t},\n\ttickLength: 4,\n\tgridColor: '',\n\tgridColorDark: '',\n\tsvgLabelSmall: { fill: '#757575' },\n\txTickLineStyles: { stroke: 'black' },\n\txAxisLineStyles: { stroke: '#DCDCDE', strokeWidth: 1 },\n\tlegendLabelStyles: {\n\t\tfontSize: '12px',\n\t\tfontWeight: 400,\n\t\tcolor: '#757575',\n\t},\n\tlegendContainerStyles: {\n\t\tgap: '8px',\n\t},\n\tannotationStyles: {\n\t\tlabel: {\n\t\t\tanchorLineStroke: 'black',\n\t\t\tbackgroundFill: '#fff',\n\t\t},\n\t\tconnector: {\n\t\t\tstroke: 'black',\n\t\t},\n\t\tcircleSubject: {\n\t\t\tstroke: 'transparent',\n\t\t\tfill: 'black',\n\t\t\tradius: 5,\n\t\t},\n\t},\n\tleaderboardChart: {\n\t\trowGap: 12,\n\t\tcolumnGap: 4,\n\t\tlabelSpacing: 1.5,\n\t\tdeltaColors: [ '#D63638', '#757575', '#008A20' ], // [negative, neutral, positive]\n\t},\n\tconversionFunnelChart: {\n\t\tbackgroundColor: '#F3F4F6',\n\t\tpositiveChangeColor: '#008A20',\n\t\tnegativeChangeColor: '#D63638',\n\t},\n\tlineChart: {\n\t\tlineStyles: {\n\t\t\tcomparison: {\n\t\t\t\tstrokeDasharray: '4 4',\n\t\t\t\tstrokeWidth: 1.5,\n\t\t\t\tstrokeLinecap: 'square',\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport { defaultTheme, jetpackTheme, wooTheme };\n","import { useContext } from 'react';\nimport { GlobalChartsContext } from '../global-charts-provider';\nimport type { GlobalChartsContextValue } from '../types';\n\nexport const useGlobalChartsContext = (): GlobalChartsContextValue => {\n\tconst context = useContext( GlobalChartsContext );\n\tif ( ! context ) {\n\t\tthrow new Error( 'useGlobalChartsContext must be used within a GlobalChartsProvider' );\n\t}\n\treturn context;\n};\n","import { useId } from 'react';\n\nexport const useChartId = ( providedId?: string ): string => {\n\tconst generatedId = useId();\n\treturn providedId || generatedId;\n};\n","import { useEffect, useMemo } from 'react';\nimport { useDeepMemo } from '../../../hooks';\nimport { useGlobalChartsContext } from './use-global-charts-context';\nimport type { BaseLegendItem } from '../../../components/legend';\n\nexport const useChartRegistration = ( {\n\tchartId,\n\tlegendItems,\n\tchartType,\n\tisDataValid,\n\tmetadata,\n}: {\n\tchartId: string;\n\tlegendItems: BaseLegendItem[];\n\tchartType: string;\n\tisDataValid: boolean;\n\tmetadata?: Record< string, unknown >;\n} ): void => {\n\tconst { registerChart, unregisterChart } = useGlobalChartsContext();\n\n\t// Memoize legendItems with deep comparison to prevent infinite loops\n\tconst stableLegendItems = useDeepMemo( legendItems );\n\n\t// Memoize metadata to prevent unnecessary re-renders\n\tconst memoizedMetadata = useMemo( () => metadata, [ metadata ] );\n\n\tuseEffect( () => {\n\t\t// Only register if data is valid\n\t\tif ( isDataValid ) {\n\t\t\tregisterChart( chartId, {\n\t\t\t\tlegendItems: stableLegendItems,\n\t\t\t\tchartType,\n\t\t\t\tmetadata: memoizedMetadata,\n\t\t\t} );\n\t\t}\n\n\t\treturn () => {\n\t\t\tunregisterChart( chartId );\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [\n\t\tchartId,\n\t\tstableLegendItems,\n\t\tchartType,\n\t\tmemoizedMetadata,\n\t\tisDataValid,\n\t\t// Removed registerChart and unregisterChart from dependencies\n\t\t// They are stable functions created with useCallback and empty deps\n\t] );\n};\n","import isEqual from 'fast-deep-equal';\nimport { useRef } from 'react';\n\n/**\n * Custom hook to memoize a value using deep equality comparison.\n * Prevents unnecessary re-renders when objects have the same content but different references.\n *\n * @param value - The value to memoize with deep equality comparison\n * @return The memoized value that only changes when deeply different\n */\nexport const useDeepMemo = < T >( value: T ): T => {\n\tconst ref = useRef< T >( value );\n\n\tif ( ! isEqual( ref.current, value ) ) {\n\t\tref.current = value;\n\t}\n\n\treturn ref.current;\n};\n","import { localPoint } from '@visx/event';\nimport { useTooltip } from '@visx/tooltip';\nimport { useCallback, type MouseEvent } from 'react';\nimport type { DataPoint } from '../types';\n\ntype UseChartMouseHandlerProps = {\n\t/**\n\t * Whether tooltips are enabled\n\t */\n\twithTooltips: boolean;\n\t/**\n\t * Horizontal offset for tooltip positioning in pixels (default: 0)\n\t */\n\toffsetX?: number;\n\t/**\n\t * Vertical offset for tooltip positioning in pixels (default: -10)\n\t */\n\toffsetY?: number;\n};\n\ntype UseChartMouseHandlerReturn = {\n\t/**\n\t * Handler for mouse move events\n\t */\n\tonMouseMove: ( event: MouseEvent< SVGElement >, data: DataPoint ) => void;\n\t/**\n\t * Handler for mouse leave events\n\t */\n\tonMouseLeave: () => void;\n\t/**\n\t * Whether the tooltip is currently open\n\t */\n\ttooltipOpen: boolean;\n\t/**\n\t * The current tooltip data\n\t */\n\ttooltipData: DataPoint | null;\n\t/**\n\t * The current tooltip left position\n\t */\n\ttooltipLeft: number | undefined;\n\t/**\n\t * The current tooltip top position\n\t */\n\ttooltipTop: number | undefined;\n};\n\n/**\n * Hook to handle mouse interactions for chart components\n *\n * @param {UseChartMouseHandlerProps} props - Hook configuration\n * @return {UseChartMouseHandlerReturn} Object containing handlers and tooltip state\n */\nexport const useChartMouseHandler = ( {\n\twithTooltips,\n\toffsetX = 0,\n\toffsetY = -10,\n}: UseChartMouseHandlerProps ): UseChartMouseHandlerReturn => {\n\tconst { tooltipOpen, tooltipLeft, tooltipTop, tooltipData, hideTooltip, showTooltip } =\n\t\tuseTooltip< DataPoint >();\n\n\tconst onMouseMove = useCallback(\n\t\t( event: MouseEvent< SVGElement >, data: DataPoint ) => {\n\t\t\tif ( ! withTooltips ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst coords = localPoint( event );\n\t\t\tif ( ! coords ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tshowTooltip( {\n\t\t\t\ttooltipData: data,\n\t\t\t\ttooltipLeft: coords.x + offsetX,\n\t\t\t\ttooltipTop: coords.y + offsetY,\n\t\t\t} );\n\t\t},\n\t\t[ withTooltips, showTooltip, offsetX, offsetY ]\n\t);\n\n\tconst onMouseLeave = useCallback( () => {\n\t\tif ( ! withTooltips ) {\n\t\t\treturn;\n\t\t}\n\t\thideTooltip();\n\t}, [ withTooltips, hideTooltip ] );\n\n\treturn {\n\t\tonMouseMove,\n\t\tonMouseLeave,\n\t\ttooltipOpen,\n\t\ttooltipData: tooltipData || null,\n\t\ttooltipLeft,\n\t\ttooltipTop,\n\t};\n};\n","import { buildChartTheme } from '@visx/xychart';\nimport { useMemo } from 'react';\nimport { useGlobalChartsTheme } from '../providers';\nimport type { SeriesData } from '../types';\n\nexport const useXYChartTheme = ( data: SeriesData[] ) => {\n\tconst theme = useGlobalChartsTheme();\n\n\treturn useMemo( () => {\n\t\tconst seriesColors = ( data ?? [] )\n\t\t\t.map( series => series.options?.stroke )\n\t\t\t.filter( ( color ): color is string => Boolean( color ) );\n\n\t\treturn buildChartTheme( {\n\t\t\t...theme,\n\t\t\tcolors: [ ...seriesColors, ...( theme.colors ?? [] ) ],\n\t\t} );\n\t}, [ theme, data ] );\n};\n","import { useMemo } from 'react';\nimport { parseAsLocalDate } from '../utils';\nimport type { SeriesData } from '../types';\n\n/**\n * Hook that transforms and sorts chart data, handling date parsing and sorting\n *\n * This hook extracts the common data transformation logic used in both line-chart\n * and bar-chart components. It:\n * 1. Parses date strings into Date objects using parseAsLocalDate\n * 2. Sorts data points by date when date properties are present\n * 3. Returns the original data unchanged when no date properties are found\n *\n * @param {SeriesData[]} data - The raw chart data to transform\n * @return {SeriesData[]} The transformed and sorted data\n */\nexport const useChartDataTransform = ( data: SeriesData[] ) => {\n\treturn useMemo( () => {\n\t\t// Check if the first data point has date or dateString properties\n\t\tconst firstPoint = data?.[ 0 ]?.data?.[ 0 ];\n\t\tconst hasDateProperties = firstPoint && ( 'date' in firstPoint || 'dateString' in firstPoint );\n\n\t\t// If no date properties found, return data unchanged\n\t\tif ( ! hasDateProperties ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Transform and sort data with date properties\n\t\treturn data.map( series => ( {\n\t\t\t...series,\n\t\t\tdata: series.data\n\t\t\t\t.map( point => {\n\t\t\t\t\tlet date: Date | undefined;\n\n\t\t\t\t\tif ( 'date' in point && point.date ) {\n\t\t\t\t\t\tdate = point.date;\n\t\t\t\t\t} else if ( 'dateString' in point && point.dateString ) {\n\t\t\t\t\t\tdate = parseAsLocalDate( point.dateString );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...point,\n\t\t\t\t\t\tdate,\n\t\t\t\t\t};\n\t\t\t\t} )\n\t\t\t\t.sort( ( a, b ) => {\n\t\t\t\t\tif ( ! a.date || ! b.date ) return 0;\n\t\t\t\t\treturn a.date.getTime() - b.date.getTime();\n\t\t\t\t} ),\n\t\t} ) );\n\t}, [ data ] );\n};\n","import { createScale, getTicks } from '@visx/scale';\nimport { useMemo } from 'react';\nimport { getLongestTickWidth } from '../utils';\nimport type { BaseChartProps, DataPointDate, SeriesData } from '../types';\nimport type { XYChartTheme } from '@visx/xychart';\n\nexport const useChartMargin = (\n\theight: number,\n\toptions: BaseChartProps[ 'options' ],\n\tdata: SeriesData[],\n\ttheme: XYChartTheme,\n\thorizontal: boolean = false\n) => {\n\tconst yTicks = useMemo( () => {\n\t\tconst allDataPoints = data.flatMap( series => series.data as DataPointDate[] );\n\n\t\tif ( horizontal ) {\n\t\t\t// When horizontal, y ticks renders fixed tick labels.\n\t\t\treturn allDataPoints.map(\n\t\t\t\td => d.label || options.axis?.y?.tickFormat( d.date.getTime(), 0, [] )\n\t\t\t);\n\t\t}\n\n\t\tconst minY = Math.min( ...allDataPoints.map( d => d.value ) );\n\t\tconst maxY = Math.max( ...allDataPoints.map( d => d.value ) );\n\t\tconst yScale = createScale( {\n\t\t\t...options.yScale,\n\t\t\tdomain: [ minY, maxY ],\n\t\t\trange: [ height, 0 ],\n\t\t} );\n\n\t\treturn getTicks( yScale, options.axis?.y?.numTicks );\n\t}, [ options, data, height, horizontal ] );\n\n\treturn useMemo( () => {\n\t\t// Default margin is for bottom axis labels.\n\t\tconst defaultMargin = { top: 10, right: 20, bottom: 20, left: 20 };\n\t\tconst defaultTickWidth = 40;\n\n\t\t// Auto-calculate margin for y axis labels based on orientation and tick width.\n\t\tconst yAxisOrientation = options.axis?.y?.orientation;\n\t\tconst yAxisStyles =\n\t\t\tyAxisOrientation === 'right' ? theme.axisStyles.y.right : theme.axisStyles.y.left;\n\t\tconst yTickWidth = getLongestTickWidth(\n\t\t\tyTicks,\n\t\t\toptions.axis?.y?.tickFormat,\n\t\t\tyAxisStyles.axisLabel\n\t\t);\n\t\tconst yMarginValue = ( yTickWidth ?? defaultTickWidth ) + ( yAxisStyles?.tickLength ?? 0 );\n\n\t\tif ( yAxisOrientation === 'right' ) {\n\t\t\tdefaultMargin.right = yMarginValue;\n\t\t} else {\n\t\t\tdefaultMargin.left = yMarginValue;\n\t\t}\n\n\t\tif ( options.axis?.x?.orientation === 'top' ) {\n\t\t\tdefaultMargin.top = 20;\n\t\t\tdefaultMargin.bottom = 10;\n\t\t}\n\n\t\treturn defaultMargin;\n\t}, [ options, theme, yTicks ] );\n};\n","import { useState, useCallback, useRef } from 'react';\n\n/**\n * Hook to measure the height of a DOM element.\n * Returns a ref to attach to the element and the current height in pixels.\n *\n * @param {object} props - Optional props.\n * @param {number} props.initialHeight - The initial height to use.\n *\n * @return {[Function, number]} A tuple containing a ref to attach to the element and the current height in pixels\n */\nexport function useElementHeight< T extends HTMLElement = HTMLDivElement >( {\n\tinitialHeight = 0,\n}: {\n\tinitialHeight?: number;\n} = {} ): [ ( node: T | null ) => void, number ] {\n\tconst [ height, setHeight ] = useState( initialHeight );\n\tconst observerRef = useRef< ResizeObserver | null >( null );\n\n\tconst refCallback = useCallback( ( node: T | null ) => {\n\t\tif ( observerRef.current ) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\t\tif ( node ) {\n\t\t\tconst handleResize = () => {\n\t\t\t\tsetHeight( node.getBoundingClientRect().height || 0 );\n\t\t\t};\n\t\t\thandleResize();\n\t\t\tconst resizeObserver = new window.ResizeObserver( handleResize );\n\t\t\tresizeObserver.observe( node );\n\t\t\tobserverRef.current = resizeObserver;\n\t\t}\n\t}, [] );\n\n\treturn [ refCallback, height ];\n}\n","import { useCallback, useRef, useState } from 'react';\n\n/**\n * Hook to detect if text content is truncated within its container.\n * Uses ResizeObserver to dynamically track changes in element size.\n *\n * @param enabled - Whether truncation detection should be active. Defaults to true.\n * @return A tuple containing:\n * - [0] refCallback: Function to attach to the text element as a ref\n * - [1] isTruncated: Boolean indicating if the text is currently truncated\n *\n * @example\n * ```tsx\n * const [textRef, isTruncated] = useTextTruncation(true);\n *\n * return (\n * <span ref={textRef} title={isTruncated ? fullText : undefined}>\n * {text}\n * </span>\n * );\n * ```\n */\nexport function useTextTruncation(\n\tenabled: boolean = true\n): [ ( node: HTMLElement | null ) => void, boolean ] {\n\tconst [ isTruncated, setIsTruncated ] = useState( false );\n\tconst observerRef = useRef< ResizeObserver | null >( null );\n\n\tconst refCallback = useCallback(\n\t\t( node: HTMLElement | null ) => {\n\t\t\t// Cleanup existing observer\n\t\t\tif ( observerRef.current ) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t\tobserverRef.current = null;\n\t\t\t}\n\n\t\t\tif ( node && enabled ) {\n\t\t\t\tconst checkTruncation = () => {\n\t\t\t\t\t// Check if content width exceeds container width (indicates truncation)\n\t\t\t\t\tconst truncated = node.scrollWidth > node.clientWidth;\n\t\t\t\t\tsetIsTruncated( truncated );\n\t\t\t\t};\n\n\t\t\t\t// Initial check\n\t\t\t\tcheckTruncation();\n\n\t\t\t\t// Watch for size changes\n\t\t\t\tconst resizeObserver = new ResizeObserver( checkTruncation );\n\t\t\t\tresizeObserver.observe( node );\n\t\t\t\tobserverRef.current = resizeObserver;\n\t\t\t} else {\n\t\t\t\tsetIsTruncated( false );\n\t\t\t}\n\t\t},\n\t\t[ enabled ]\n\t);\n\n\treturn [ refCallback, isTruncated ];\n}\n","import { useMemo } from 'react';\nimport type { SeriesData, DataPointDate } from '../types';\n\nexport type EnhancedDataPoint = DataPointDate & {\n\tvisualValue?: number;\n};\n\nexport interface EnhancedSeriesData extends Omit< SeriesData, 'data' > {\n\tdata: EnhancedDataPoint[];\n}\n\nexport interface UseZeroValueDisplayOptions {\n\tenabled: boolean;\n\tminValueRatio?: number;\n\tmaxValueRatio?: number;\n}\n\nexport const useZeroValueDisplay = (\n\tdata: SeriesData[],\n\toptions: UseZeroValueDisplayOptions = { enabled: false }\n): SeriesData[] | EnhancedSeriesData[] => {\n\tconst { enabled, minValueRatio = 0.6, maxValueRatio = 0.008 } = options;\n\n\treturn useMemo( () => {\n\t\tif ( ! enabled ) return data;\n\n\t\t// Collect all non-zero, non-null values (both positive and negative)\n\t\tconst nonZeroValues: number[] = [];\n\n\t\tfor ( const series of data ) {\n\t\t\tfor ( const point of series.data ) {\n\t\t\t\tif ( point.value !== null && point.value !== 0 ) {\n\t\t\t\t\tnonZeroValues.push( point.value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( nonZeroValues.length === 0 ) return data;\n\n\t\t// Convert to absolute values to find the range\n\t\tconst absoluteValues = nonZeroValues.map( Math.abs );\n\n\t\t// Calculate min and max based on absolute values\n\t\tconst minAbsoluteValue = Math.min( ...absoluteValues );\n\t\tconst maxAbsoluteValue = Math.max( ...absoluteValues );\n\n\t\t// Calculate minimum visible value using absolute range\n\t\tconst minVisibleValue = Math.min(\n\t\t\tminAbsoluteValue * minValueRatio,\n\t\t\tmaxAbsoluteValue * maxValueRatio\n\t\t);\n\n\t\treturn data.map( series => ( {\n\t\t\t...series,\n\t\t\tdata: series.data.map( ( point ): EnhancedDataPoint => {\n\t\t\t\tif ( point.value === 0 ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...point,\n\t\t\t\t\t\tvisualValue: minVisibleValue,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn point;\n\t\t\t} ),\n\t\t} ) );\n\t}, [ data, enabled, minValueRatio, maxValueRatio ] );\n};\n","import { useMemo } from 'react';\n\n/**\n * Data point interface for charts with interactive legends.\n * Requires label for series identification, value for calculations, and percentage for display.\n */\ninterface DataPointWithPercentage {\n\tlabel: string;\n\tvalue: number;\n\tpercentage: number;\n}\n\n/**\n * Parameters for the useInteractiveLegendData hook.\n */\ninterface UseInteractiveLegendDataParams< T extends DataPointWithPercentage > {\n\t/** The chart data to filter based on legend visibility */\n\tdata: T[];\n\t/** Unique chart identifier, required for interactive legends */\n\tchartId: string | undefined;\n\t/** Whether interactive legend filtering is enabled */\n\tlegendInteractive: boolean;\n\t/** Function to check if a series is visible in the legend */\n\tisSeriesVisible: ( chartId: string, label: string ) => boolean;\n}\n\n/**\n * Return value from the useInteractiveLegendData hook.\n */\ninterface UseInteractiveLegendDataResult< T extends DataPointWithPercentage > {\n\t/** Filtered data array containing only visible segments with recalculated percentages */\n\tvisibleData: T[];\n\t/** Boolean indicating if all segments are hidden */\n\tallSegmentsHidden: boolean;\n\t/**\n\t * Legend data with recalculated percentages for visible items.\n\t * Uses original data for hidden items, but shows recalculated percentages for visible ones.\n\t * This ensures the legend displays accurate percentages while maintaining all entries.\n\t */\n\tlegendData: T[];\n}\n\n/**\n * Custom hook to filter and recalculate chart data for interactive legends.\n *\n * When interactive legends are enabled, this hook:\n * 1. Filters data to show only visible series based on legend selection\n * 2. Recalculates percentages so visible segments total 100%\n * 3. Tracks whether all segments are hidden to show empty state\n *\n * This is particularly useful for pie charts, donut charts, and semi-circle charts\n * where segment visibility and percentages need to be dynamically adjusted.\n *\n * @example\n * ```tsx\n * const { visibleData, allSegmentsHidden, legendData } = useInteractiveLegendData({\n * data: chartData,\n * chartId: 'my-pie-chart',\n * legendInteractive: true,\n * isSeriesVisible: (id, label) => context.isSeriesVisible(id, label),\n * });\n *\n * // Use legendData for creating legend items (shows recalculated percentages)\n * const legendItems = useChartLegendItems(legendData, legendOptions);\n *\n * if (allSegmentsHidden) {\n * return <EmptyState />;\n * }\n *\n * // Use visibleData for rendering the chart (only visible segments)\n * return <PieChart data={visibleData} />;\n * ```\n *\n * @param params - Configuration object for the hook\n * @param params.data - The chart data to filter\n * @param params.chartId - Unique identifier for the chart (required for interactive mode)\n * @param params.legendInteractive - Whether to enable interactive filtering\n * @param params.isSeriesVisible - Function to check series visibility\n * @return Object containing visibleData, allSegmentsHidden flag, and legendData with recalculated percentages\n */\nexport const useInteractiveLegendData = < T extends DataPointWithPercentage >( {\n\tdata,\n\tchartId,\n\tlegendInteractive,\n\tisSeriesVisible,\n}: UseInteractiveLegendDataParams< T > ): UseInteractiveLegendDataResult< T > => {\n\t// Filter and recalculate data for interactive legends\n\tconst visibleData = useMemo( () => {\n\t\t// If interactive mode is disabled or no chartId, return all data unchanged\n\t\tif ( ! chartId || ! legendInteractive ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Filter to only visible segments based on legend state\n\t\tconst filtered = data.filter( segment => isSeriesVisible( chartId, segment.label ) );\n\n\t\t// If no segments are visible, return empty array\n\t\tif ( filtered.length === 0 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Recalculate percentages so visible segments total 100%\n\t\tconst totalValue = filtered.reduce( ( sum, segment ) => sum + segment.value, 0 );\n\n\t\treturn filtered.map( segment => ( {\n\t\t\t...segment,\n\t\t\tpercentage: totalValue > 0 ? ( segment.value / totalValue ) * 100 : 0,\n\t\t} ) );\n\t}, [ data, chartId, isSeriesVisible, legendInteractive ] );\n\n\t// Check if all segments are hidden (only relevant in interactive mode)\n\tconst allSegmentsHidden = useMemo( () => {\n\t\treturn legendInteractive && visibleData.length === 0;\n\t}, [ legendInteractive, visibleData ] );\n\n\t// Prepare legend data with recalculated percentages for visible items\n\t// This maintains all legend entries but shows updated percentages for visible segments\n\tconst legendData = useMemo( () => {\n\t\tif ( ! legendInteractive || ! chartId ) {\n\t\t\treturn data;\n\t\t}\n\n\t\t// Map original data to show recalculated percentages for visible items\n\t\treturn data.map( segment => {\n\t\t\tconst isVisible = isSeriesVisible( chartId, segment.label );\n\t\t\tif ( ! isVisible ) {\n\t\t\t\t// Return original data for hidden items\n\t\t\t\treturn segment;\n\t\t\t}\n\n\t\t\t// For visible items, find the recalculated percentage from visibleData\n\t\t\tconst recalculated = visibleData.find( d => d.label === segment.label );\n\t\t\treturn recalculated || segment;\n\t\t} );\n\t}, [ data, visibleData, legendInteractive, chartId, isSeriesVisible ] );\n\n\treturn { visibleData, allSegmentsHidden, legendData };\n};\n","import { useState, useEffect } from 'react';\n\n// 'no-preference' returns false in unsupported browsers,\n// causing a safe fallback to reduced motion instead of animating.\nconst QUERY = '(prefers-reduced-motion: no-preference)';\n\nconst getInitialState = () => ! window.matchMedia( QUERY ).matches;\n\n/**\n * Custom hook to determine if the user prefers reduced motion.\n * @return {boolean} A boolean indicating the user's preference for reduced motion.\n */\nexport function usePrefersReducedMotion() {\n\tconst [ prefersReducedMotion, setPrefersReducedMotion ] = useState( getInitialState );\n\n\tuseEffect( () => {\n\t\tconst mediaQueryList = window.matchMedia( QUERY );\n\n\t\tconst listener = event => {\n\t\t\tsetPrefersReducedMotion( ! event.matches );\n\t\t};\n\n\t\tmediaQueryList.addEventListener( 'change', listener );\n\n\t\treturn () => {\n\t\t\tmediaQueryList.removeEventListener( 'change', listener );\n\t\t};\n\t}, [] );\n\n\treturn prefersReducedMotion;\n}\n","import { useContext } from 'react';\nimport { GlobalChartsContext } from '../global-charts-provider';\nimport { defaultTheme } from '../themes';\nimport type { CompleteChartTheme } from '../../../types';\n\n/**\n * Hook to get the global chart theme from GlobalChartsProvider\n *\n * @return The global chart theme\n */\nexport const useGlobalChartsTheme = (): CompleteChartTheme => {\n\t// Get context but don't throw if it doesn't exist (for testing or standalone usage)\n\tconst context = useContext( GlobalChartsContext );\n\tconst globalTheme = context?.theme;\n\n\treturn globalTheme ?? defaultTheme;\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-PEUZZ3WY.cjs","../src/components/pie-chart/pie-chart.tsx","../src/components/pie-chart/pie-chart.module.scss"],"names":[],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/charts/dist/chunk-PEUZZ3WY.cjs","sourcesContent":[null,"import { localPoint } from '@visx/event';\nimport { Group } from '@visx/group';\nimport { Pie } from '@visx/shape';\nimport { useTooltip, useTooltipInPortal } from '@visx/tooltip';\nimport { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport { useCallback, useContext, useMemo } from 'react';\nimport { useElementHeight, useInteractiveLegendData, usePrefersReducedMotion } from '../../hooks';\nimport {\n\tGlobalChartsProvider,\n\tuseChartId,\n\tuseChartRegistration,\n\tuseGlobalChartsContext,\n\tuseGlobalChartsTheme,\n\tGlobalChartsContext,\n} from '../../providers';\nimport { attachSubComponents } from '../../utils';\nimport { getStringWidth } from '../../visx/text';\nimport { Legend, useChartLegendItems } from '../legend';\nimport { ChartSVG, ChartHTML, useChartChildren } from '../private/chart-composition';\nimport { RadialWipeAnimation } from '../private/radial-wipe-animation/';\nimport { SingleChartContext } from '../private/single-chart-context';\nimport { withResponsive, ResponsiveConfig } from '../private/with-responsive';\nimport { BaseTooltip } from '../tooltip';\nimport styles from './pie-chart.module.scss';\nimport type { BaseChartProps, DataPointPercentage, Optional } from '../../types';\nimport type { LegendValueDisplay } from '../legend';\nimport type { ChartComponentWithComposition } from '../private/chart-composition';\nimport type { SVGProps, MouseEvent, ReactNode, FC } from 'react';\n\nexport interface PieChartProps extends BaseChartProps< DataPointPercentage[] > {\n\t/**\n\t * Inner radius in pixels. If > 0, creates a donut chart. Defaults to 0.\n\t */\n\tinnerRadius?: number;\n\n\t/**\n\t * Add padding to the chart\n\t */\n\tpadding?: number;\n\n\t/**\n\t * Thickness of the pie chart.\n\t * A value between 0 and 1, where 0 means no thickness\n\t * and 1 means the maximum thickness.\n\t */\n\tthickness?: number;\n\n\t/**\n\t * Scale of the gap between groups in the pie chart\n\t * A value between 0 and 1, where 0 means no gap.\n\t */\n\tgapScale?: number;\n\n\t/**\n\t * Scale of the corner radius for the pie chart segments.\n\t * A value between 0 and 1, where 0 means no corner radius.\n\t */\n\tcornerScale?: number;\n\n\t/**\n\t * Whether to show labels on pie segments. Defaults to true.\n\t */\n\tshowLabels?: boolean;\n\n\t/**\n\t * What type of value to display in the legend when showValues is true.\n\t * - 'percentage': Shows percentage values (e.g., \"23%\") [default]\n\t * - 'value': Shows raw numeric values (e.g., \"30000\")\n\t * - 'valueDisplay': Shows formatted values (e.g., \"30K\")\n\t * - 'none': Shows no values, only labels\n\t */\n\tlegendValueDisplay?: LegendValueDisplay;\n\n\t/**\n\t * Enable interactive legend items that can toggle segment visibility.\n\t * Requires chartId and GlobalChartsProvider.\n\t * When segments are hidden, percentages are recalculated so visible segments total 100%.\n\t */\n\tlegendInteractive?: boolean;\n\n\t/**\n\t * Use the children prop to render additional elements on the chart.\n\t */\n\tchildren?: ReactNode;\n\n\t/**\n\t * Horizontal offset for tooltip positioning in pixels (default: 0)\n\t */\n\ttooltipOffsetX?: number;\n\n\t/**\n\t * Vertical offset for tooltip positioning in pixels (default: -15)\n\t */\n\ttooltipOffsetY?: number;\n}\n\n// Base props type with optional responsive properties\ntype PieChartBaseProps = Optional< PieChartProps, 'size' >;\n\n// Composition API types\ntype PieChartComponent = ChartComponentWithComposition< PieChartBaseProps >;\ntype PieChartResponsiveComponent = ChartComponentWithComposition<\n\tPieChartBaseProps & ResponsiveConfig\n>;\n\n/**\n * Validates the pie chart data\n * @param data - The data to validate\n * @return Object containing validation result and error message\n */\nconst validateData = ( data: DataPointPercentage[] ) => {\n\tif ( ! data.length ) {\n\t\treturn { isValid: false, message: 'No data available' };\n\t}\n\n\t// Check for negative values\n\tconst hasNegativeValues = data.some( item => item.percentage < 0 || item.value < 0 );\n\tif ( hasNegativeValues ) {\n\t\treturn { isValid: false, message: 'Invalid data: Negative values are not allowed' };\n\t}\n\n\t// Validate total percentage\n\tconst totalPercentage = data.reduce( ( sum, item ) => sum + item.percentage, 0 );\n\tif ( Math.abs( totalPercentage - 100 ) > 0.01 ) {\n\t\t// Using small epsilon for floating point comparison\n\t\treturn { isValid: false, message: 'Invalid percentage total: Must equal 100' };\n\t}\n\n\treturn { isValid: true, message: '' };\n};\n\n/**\n * Renders a pie or donut chart using the provided data.\n *\n * @param {PieChartProps} props - Component props\n * @return {JSX.Element} The rendered chart component\n */\nconst PieChartInternal = ( {\n\tdata,\n\tchartId: providedChartId,\n\twithTooltips = false,\n\tclassName,\n\tshowLegend = false,\n\tlegendOrientation = 'horizontal',\n\tlegendPosition = 'bottom',\n\tlegendAlignment = 'center',\n\tlegendMaxWidth,\n\tlegendTextOverflow = 'wrap',\n\tlegendItemClassName,\n\tlegendShape = 'circle',\n\tsize,\n\tanimation,\n\tthickness = 1,\n\tpadding = 0,\n\tgapScale = 0,\n\tcornerScale = 0,\n\tshowLabels = true,\n\tlegendValueDisplay = 'percentage',\n\tlegendInteractive = false,\n\tchildren = null,\n\ttooltipOffsetX = 0,\n\ttooltipOffsetY = -15,\n}: PieChartProps ) => {\n\tconst providerTheme = useGlobalChartsTheme();\n\tconst chartId = useChartId( providedChartId );\n\tconst [ legendRef, legendHeight ] = useElementHeight< HTMLDivElement >();\n\tconst { tooltipOpen, tooltipLeft, tooltipTop, tooltipData, hideTooltip, showTooltip } =\n\t\tuseTooltip< DataPointPercentage >();\n\n\t// Set up portal tooltip for better z-index handling\n\tconst { containerRef, TooltipInPortal } = useTooltipInPortal( {\n\t\tdetectBounds: true,\n\t\tscroll: true,\n\t\tdebounce: 0,\n\t} );\n\n\tconst onMouseLeave = useCallback( () => {\n\t\tif ( ! withTooltips ) {\n\t\t\treturn;\n\t\t}\n\t\thideTooltip();\n\t}, [ withTooltips, hideTooltip ] );\n\n\tconst { getElementStyles, isSeriesVisible } = useGlobalChartsContext();\n\n\t// Filter and recalculate data for interactive legends\n\tconst { visibleData, allSegmentsHidden, legendData } = useInteractiveLegendData( {\n\t\tdata,\n\t\tchartId,\n\t\tlegendInteractive,\n\t\tisSeriesVisible,\n\t} );\n\n\t// Memoize legend options to prevent unnecessary re-calculations\n\tconst legendOptions = useMemo(\n\t\t() => ( { showValues: true, legendValueDisplay } ),\n\t\t[ legendValueDisplay ]\n\t);\n\n\t// Create legend items using legendData (has recalculated percentages for visible items)\n\tconst legendItems = useChartLegendItems( legendData, legendOptions );\n\n\tconst { isValid, message } = validateData( data );\n\n\t// Process children to extract compound components\n\tconst { svgChildren, htmlChildren, otherChildren } = useChartChildren( children, 'PieChart' );\n\n\t// Memoize metadata to prevent unnecessary re-registration\n\tconst chartMetadata = useMemo(\n\t\t() => ( {\n\t\t\tthickness,\n\t\t\tgapScale,\n\t\t\tcornerScale,\n\t\t} ),\n\t\t[ thickness, gapScale, cornerScale ]\n\t);\n\n\t// Register chart with context only if data is valid\n\tuseChartRegistration( {\n\t\tchartId,\n\t\tlegendItems,\n\t\tchartType: 'pie',\n\t\tisDataValid: isValid,\n\t\tmetadata: chartMetadata,\n\t} );\n\n\tconst prefersReducedMotion = usePrefersReducedMotion();\n\n\tif ( ! isValid ) {\n\t\treturn (\n\t\t\t<div className={ clsx( 'pie-chart', styles[ 'pie-chart' ], className ) }>\n\t\t\t\t<div className={ styles[ 'error-message' ] }>{ message }</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst width = size;\n\tconst height = size;\n\tconst adjustedHeight = showLegend && legendPosition === 'top' ? height - legendHeight : height;\n\n\t// Calculate radius based on width/height\n\tconst radius = Math.min( width, adjustedHeight ) / 2;\n\n\t// Center the chart in the available space\n\tconst centerX = width / 2;\n\tconst centerY = adjustedHeight / 2;\n\n\t// Calculate the angle between each (use original data length for consistent spacing)\n\tconst padAngle = gapScale * ( ( 2 * Math.PI ) / data.length );\n\n\tconst outerRadius = radius - padding;\n\tconst innerRadius = thickness === 0 ? 0 : outerRadius * ( 1 - thickness );\n\n\tconst maxCornerRadius = ( outerRadius - innerRadius ) / 2;\n\tconst cornerRadius = cornerScale ? Math.min( cornerScale * outerRadius, maxCornerRadius ) : 0;\n\n\t// Map the data to include index for color assignment\n\t// When interactive, we need to find the original index to maintain consistent colors\n\tconst dataWithIndex = visibleData.map( d => {\n\t\tconst originalIndex = data.findIndex( item => item.label === d.label );\n\t\treturn {\n\t\t\t...d,\n\t\t\tindex: originalIndex >= 0 ? originalIndex : 0,\n\t\t};\n\t} );\n\n\tconst accessors = {\n\t\tvalue: ( d: DataPointPercentage ) => d.value,\n\t\tfill: ( d: DataPointPercentage & { index: number } ) => {\n\t\t\treturn getElementStyles( { data: d, index: d.index } ).color;\n\t\t},\n\t};\n\n\treturn (\n\t\t<SingleChartContext.Provider\n\t\t\tvalue={ {\n\t\t\t\tchartId,\n\t\t\t\tchartWidth: width,\n\t\t\t\tchartHeight: adjustedHeight,\n\t\t\t} }\n\t\t>\n\t\t\t<div\n\t\t\t\tref={ containerRef }\n\t\t\t\tclassName={ clsx(\n\t\t\t\t\t'pie-chart',\n\t\t\t\t\tstyles[ 'pie-chart' ],\n\t\t\t\t\t{ [ styles[ 'pie-chart--legend-top' ] ]: showLegend && legendPosition === 'top' },\n\t\t\t\t\tclassName\n\t\t\t\t) }\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\tviewBox={ `0 0 ${ width } ${ adjustedHeight }` }\n\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\twidth={ width }\n\t\t\t\t\theight={ adjustedHeight }\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<RadialWipeAnimation\n\t\t\t\t\t\t\tid={ `radial-wipe-${ chartId }` }\n\t\t\t\t\t\t\tradius={ outerRadius }\n\t\t\t\t\t\t\tinnerRadius={ innerRadius }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</defs>\n\n\t\t\t\t\t<Group\n\t\t\t\t\t\ttop={ centerY }\n\t\t\t\t\t\tleft={ centerX }\n\t\t\t\t\t\tmask={ animation && ! prefersReducedMotion ? `url(#radial-wipe-${ chartId })` : null }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ allSegmentsHidden ? (\n\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\t\tdy=\".33em\"\n\t\t\t\t\t\t\t\tfill={ providerTheme.gridColor || '#ccc' }\n\t\t\t\t\t\t\t\tfontSize=\"14\"\n\t\t\t\t\t\t\t\tfontFamily=\"-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'All segments are hidden. Click legend items to show data.',\n\t\t\t\t\t\t\t\t\t'jetpack-charts'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Pie< DataPointPercentage & { index: number } >\n\t\t\t\t\t\t\t\tdata={ dataWithIndex }\n\t\t\t\t\t\t\t\tpieValue={ accessors.value }\n\t\t\t\t\t\t\t\touterRadius={ outerRadius }\n\t\t\t\t\t\t\t\tinnerRadius={ innerRadius }\n\t\t\t\t\t\t\t\tpadAngle={ padAngle }\n\t\t\t\t\t\t\t\tcornerRadius={ cornerRadius }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ pie => {\n\t\t\t\t\t\t\t\t\treturn pie.arcs.map( ( arc, index ) => {\n\t\t\t\t\t\t\t\t\t\tconst [ centroidX, centroidY ] = pie.path.centroid( arc );\n\t\t\t\t\t\t\t\t\t\tconst hasSpaceForLabel = arc.endAngle - arc.startAngle >= 0.25;\n\t\t\t\t\t\t\t\t\t\tconst handleMouseMove = ( event: MouseEvent< SVGElement > ) => {\n\t\t\t\t\t\t\t\t\t\t\tif ( ! withTooltips ) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Get coordinates relative to the current target element\n\t\t\t\t\t\t\t\t\t\t\tconst coords = localPoint( event );\n\t\t\t\t\t\t\t\t\t\t\tif ( coords ) {\n\t\t\t\t\t\t\t\t\t\t\t\t// Account for legend offset when legend is on top\n\t\t\t\t\t\t\t\t\t\t\t\tconst legendOffset =\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowLegend && legendPosition === 'top' ? legendHeight : 0;\n\t\t\t\t\t\t\t\t\t\t\t\tshowTooltip( {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipData: arc.data,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipLeft: coords.x + tooltipOffsetX,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttooltipTop: coords.y + legendOffset + tooltipOffsetY,\n\t\t\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\tconst pathProps: SVGProps< SVGPathElement > & { 'data-testid'?: string } = {\n\t\t\t\t\t\t\t\t\t\t\td: pie.path( arc ) || '',\n\t\t\t\t\t\t\t\t\t\t\tfill: accessors.fill( arc.data ),\n\t\t\t\t\t\t\t\t\t\t\t'data-testid': 'pie-segment',\n\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\tconst groupProps: SVGProps< SVGGElement > = {};\n\t\t\t\t\t\t\t\t\t\tif ( withTooltips ) {\n\t\t\t\t\t\t\t\t\t\t\tgroupProps.onMouseMove = handleMouseMove;\n\t\t\t\t\t\t\t\t\t\t\tgroupProps.onMouseLeave = onMouseLeave;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Estimate text width more accurately for background sizing\n\t\t\t\t\t\t\t\t\t\tconst fontSize = 12;\n\t\t\t\t\t\t\t\t\t\tconst estimatedTextWidth = getStringWidth( arc.data.label, { fontSize } );\n\t\t\t\t\t\t\t\t\t\tconst labelPadding = 6;\n\t\t\t\t\t\t\t\t\t\tconst backgroundWidth = estimatedTextWidth + labelPadding * 2;\n\t\t\t\t\t\t\t\t\t\tconst backgroundHeight = fontSize + labelPadding * 2;\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<g key={ `arc-${ index }` } { ...groupProps }>\n\t\t\t\t\t\t\t\t\t\t\t\t<path { ...pathProps } />\n\t\t\t\t\t\t\t\t\t\t\t\t{ showLabels && hasSpaceForLabel && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ providerTheme.labelBackgroundColor && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tx={ centroidX - backgroundWidth / 2 }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ty={ centroidY - backgroundHeight / 2 }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth={ backgroundWidth }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight={ backgroundHeight }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfill={ providerTheme.labelBackgroundColor }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trx={ 4 }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\try={ 4 }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tx={ centroidX }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ty={ centroidY }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdy=\".33em\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfill={ providerTheme.labelTextColor || '#333' }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize={ fontSize }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpointerEvents=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ arc.data.label }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t</Pie>\n\t\t\t\t\t\t) }\n\n\t\t\t\t\t\t{ /* Render SVG children (like Group, Text) inside the SVG */ }\n\t\t\t\t\t\t{ ! allSegmentsHidden && svgChildren }\n\t\t\t\t\t</Group>\n\t\t\t\t</svg>\n\n\t\t\t\t{ showLegend && (\n\t\t\t\t\t<Legend\n\t\t\t\t\t\torientation={ legendOrientation }\n\t\t\t\t\t\tposition={ legendPosition }\n\t\t\t\t\t\talignment={ legendAlignment }\n\t\t\t\t\t\tmaxWidth={ legendMaxWidth }\n\t\t\t\t\t\ttextOverflow={ legendTextOverflow }\n\t\t\t\t\t\tlegendItemClassName={ legendItemClassName }\n\t\t\t\t\t\tclassName={ styles[ 'pie-chart-legend' ] }\n\t\t\t\t\t\tshape={ legendShape }\n\t\t\t\t\t\tref={ legendRef }\n\t\t\t\t\t\tchartId={ chartId }\n\t\t\t\t\t\tinteractive={ legendInteractive }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\n\t\t\t\t{ withTooltips && tooltipOpen && tooltipData && (\n\t\t\t\t\t<TooltipInPortal top={ tooltipTop || 0 } left={ tooltipLeft || 0 }>\n\t\t\t\t\t\t<div role=\"tooltip\">\n\t\t\t\t\t\t\t<BaseTooltip data={ tooltipData } top={ 0 } left={ 0 } renderContainer={ false } />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</TooltipInPortal>\n\t\t\t\t) }\n\n\t\t\t\t{ /* Render HTML component children from PieChart.HTML */ }\n\t\t\t\t{ htmlChildren }\n\n\t\t\t\t{ /* Render other React children for backward compatibility */ }\n\t\t\t\t{ otherChildren }\n\t\t\t</div>\n\t\t</SingleChartContext.Provider>\n\t);\n};\n\nconst PieChartWithProvider: FC< PieChartProps > = props => {\n\tconst existingContext = useContext( GlobalChartsContext );\n\n\t// If we're already in a GlobalChartsProvider context, don't create a new one\n\tif ( existingContext ) {\n\t\treturn <PieChartInternal { ...props } />;\n\t}\n\n\t// Otherwise, create our own GlobalChartsProvider\n\treturn (\n\t\t<GlobalChartsProvider>\n\t\t\t<PieChartInternal { ...props } />\n\t\t</GlobalChartsProvider>\n\t);\n};\n\nPieChartWithProvider.displayName = 'PieChart';\n\n// Create PieChart with composition API\nconst PieChart = attachSubComponents( PieChartWithProvider, {\n\tLegend: Legend,\n\tSVG: ChartSVG,\n\tHTML: ChartHTML,\n} ) as PieChartComponent;\n\n// Create responsive PieChart with composition API\nconst PieChartResponsive = attachSubComponents(\n\twithResponsive< PieChartProps >( PieChartWithProvider ),\n\t{\n\t\tLegend: Legend,\n\t\tSVG: ChartSVG,\n\t\tHTML: ChartHTML,\n\t}\n) as PieChartResponsiveComponent;\n\nexport { PieChartResponsive as default, PieChart as PieChartUnresponsive };\n","import 'css-chunk:src/components/pie-chart/pie-chart.module.scss';export default {\n \"pie-chart\": \"a8ccharts-R12VhH\",\n \"pie-chart--legend-top\": \"a8ccharts-eG7-zj\"\n};"]}
|