@sproutsocial/seeds-react-data-viz 0.26.0 → 0.27.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.
Files changed (53) hide show
  1. package/dist/{axis-BWvZqdQr.d.ts → axis-DQXvjzBs.d.ts} +1 -1
  2. package/dist/{axis-3XKa6pW7.d.mts → axis-DVx6Mn1k.d.mts} +1 -1
  3. package/dist/bar/index.d.mts +2 -2
  4. package/dist/bar/index.d.ts +2 -2
  5. package/dist/bar/index.js +12 -12
  6. package/dist/bubble/index.d.mts +1 -1
  7. package/dist/bubble/index.d.ts +1 -1
  8. package/dist/bubble/index.js +9 -9
  9. package/dist/chart-styles.css +41 -0
  10. package/dist/{chartBase-BM97OBBE.d.ts → chartBase-BYipK7MZ.d.ts} +5 -1
  11. package/dist/{chartBase-D6WI2icR.d.mts → chartBase-Cd405GIA.d.mts} +5 -1
  12. package/dist/charts.css +41 -0
  13. package/dist/{chunk-LWDHU4QK.js → chunk-34OKRQET.js} +8 -49
  14. package/dist/chunk-34OKRQET.js.map +1 -0
  15. package/dist/{chunk-POMPBGZR.js → chunk-5TWNMPQU.js} +118 -46
  16. package/dist/chunk-5TWNMPQU.js.map +1 -0
  17. package/dist/{chunk-XUAHFLZQ.js → chunk-CV45MD47.js} +3 -3
  18. package/dist/{chunk-XUAHFLZQ.js.map → chunk-CV45MD47.js.map} +1 -1
  19. package/dist/{chunk-RHGKZW6Y.js → chunk-WMKO3RGT.js} +3 -3
  20. package/dist/{chunk-RHGKZW6Y.js.map → chunk-WMKO3RGT.js.map} +1 -1
  21. package/dist/donut/index.d.mts +1 -1
  22. package/dist/donut/index.d.ts +1 -1
  23. package/dist/donut/index.js +6 -6
  24. package/dist/esm/bar/index.js +4 -4
  25. package/dist/esm/bubble/index.js +2 -2
  26. package/dist/esm/{chunk-VCTZWYEM.js → chunk-332X77M5.js} +11 -52
  27. package/dist/esm/chunk-332X77M5.js.map +1 -0
  28. package/dist/esm/{chunk-QBFXLKBO.js → chunk-AL3OTBTT.js} +2 -2
  29. package/dist/esm/{chunk-4IWPHCZ4.js → chunk-CYCKJ5ML.js} +105 -33
  30. package/dist/esm/chunk-CYCKJ5ML.js.map +1 -0
  31. package/dist/esm/{chunk-SM2B52UR.js → chunk-MVNO5UV6.js} +2 -2
  32. package/dist/esm/donut/index.js +2 -2
  33. package/dist/esm/index.js +1 -1
  34. package/dist/esm/line-area/index.js +4 -4
  35. package/dist/esm/sparkline/index.js +3 -3
  36. package/dist/esm/wordcloud/index.js +2 -2
  37. package/dist/index.d.mts +6 -0
  38. package/dist/index.d.ts +6 -0
  39. package/dist/index.js +53 -53
  40. package/dist/line-area/index.d.mts +2 -2
  41. package/dist/line-area/index.d.ts +2 -2
  42. package/dist/line-area/index.js +12 -12
  43. package/dist/sparkline/index.d.mts +3 -3
  44. package/dist/sparkline/index.d.ts +3 -3
  45. package/dist/sparkline/index.js +7 -7
  46. package/dist/wordcloud/index.js +8 -8
  47. package/package.json +1 -1
  48. package/dist/chunk-LWDHU4QK.js.map +0 -1
  49. package/dist/chunk-POMPBGZR.js.map +0 -1
  50. package/dist/esm/chunk-4IWPHCZ4.js.map +0 -1
  51. package/dist/esm/chunk-VCTZWYEM.js.map +0 -1
  52. /package/dist/esm/{chunk-QBFXLKBO.js.map → chunk-AL3OTBTT.js.map} +0 -0
  53. /package/dist/esm/{chunk-SM2B52UR.js.map → chunk-MVNO5UV6.js.map} +0 -0
@@ -99,72 +99,28 @@ var ChartLegend = memo2(function ChartLegend2({
99
99
 
100
100
  // src/components/ChartTooltip/ChartTooltip.tsx
101
101
  import { memo as memo3 } from "react";
102
- import styled2 from "styled-components";
103
- import { Box as Box4 } from "@sproutsocial/seeds-react-box";
104
102
  import { jsx as jsx5 } from "react/jsx-runtime";
105
- var StyledBox2 = styled2(Box4)`
106
- .Icon,
107
- .logo {
108
- stroke: none;
109
- }
110
- `;
111
103
  var ChartTooltip = memo3(function ChartTooltip2({
112
104
  children
113
105
  }) {
114
- return /* @__PURE__ */ jsx5(
115
- StyledBox2,
116
- {
117
- bg: "container.background.base",
118
- boxShadow: "medium",
119
- border: 500,
120
- borderColor: "container.border.base",
121
- borderRadius: 500,
122
- p: 400,
123
- minWidth: 285,
124
- children: /* @__PURE__ */ jsx5(Box4, { display: "flex", flexDirection: "column", gap: 350, children })
125
- }
126
- );
106
+ return /* @__PURE__ */ jsx5("div", { className: "seeds-chart-tooltip", children });
127
107
  });
128
108
 
129
109
  // src/components/ChartTooltip/components/ChartTooltipFooter.tsx
130
110
  import { memo as memo4 } from "react";
131
- import { Box as Box5 } from "@sproutsocial/seeds-react-box";
132
111
  import { jsx as jsx6 } from "react/jsx-runtime";
133
112
  var ChartTooltipFooter = memo4(
134
113
  function ChartTooltipFooter2({ children }) {
135
- return /* @__PURE__ */ jsx6(
136
- Box5,
137
- {
138
- borderTop: 500,
139
- borderColor: "container.border.base",
140
- mx: -400,
141
- mb: -200,
142
- px: 400,
143
- pt: 350,
144
- children
145
- }
146
- );
114
+ return /* @__PURE__ */ jsx6("div", { className: "seeds-chart-tooltip-footer", children });
147
115
  }
148
116
  );
149
117
 
150
118
  // src/components/ChartTooltip/components/ChartTooltipHeader.tsx
151
119
  import { memo as memo5 } from "react";
152
- import { Box as Box6 } from "@sproutsocial/seeds-react-box";
153
120
  import { jsx as jsx7 } from "react/jsx-runtime";
154
121
  var ChartTooltipHeader = memo5(
155
122
  function ChartTooltipHeader2({ children }) {
156
- return /* @__PURE__ */ jsx7(
157
- Box6,
158
- {
159
- borderBottom: 500,
160
- borderColor: "container.border.base",
161
- mx: -400,
162
- mt: -200,
163
- px: 400,
164
- pb: 350,
165
- children
166
- }
167
- );
123
+ return /* @__PURE__ */ jsx7("div", { className: "seeds-chart-tooltip-header", children });
168
124
  }
169
125
  );
170
126
 
@@ -213,11 +169,11 @@ var ChartTooltipPortal = memo6(
213
169
 
214
170
  // src/components/ChartTable/ChartTable.tsx
215
171
  import { memo as memo7 } from "react";
216
- import styled3 from "styled-components";
172
+ import styled2 from "styled-components";
217
173
  import { Text as Text2 } from "@sproutsocial/seeds-react-text";
218
174
  import { Table as SeedsTable } from "@sproutsocial/seeds-react-table";
219
175
  import { jsx as jsx8 } from "react/jsx-runtime";
220
- var StyledSeedsTable = styled3(SeedsTable)`
176
+ var StyledSeedsTable = styled2(SeedsTable)`
221
177
  tbody tr:last-child {
222
178
  border-bottom: none;
223
179
  }
@@ -236,7 +192,7 @@ var StyledSeedsTable = styled3(SeedsTable)`
236
192
  padding-right: 0;
237
193
  }
238
194
  `;
239
- var StyledSeedsTableRow = styled3(SeedsTable.TableRow)`
195
+ var StyledSeedsTableRow = styled2(SeedsTable.TableRow)`
240
196
  ${({ $isAppendedRow, theme: theme5 }) => $isAppendedRow ? `border-top: 2px solid ${theme5.colors.container.border.base}` : ""}
241
197
  `;
242
198
  var ChartTable = memo7(function ChartTable2({
@@ -254,7 +210,7 @@ var ChartTable = memo7(function ChartTable2({
254
210
  {
255
211
  $isAppendedRow: isAppendedRow,
256
212
  children: cells.map(
257
- ({ content, align = "left", colSpan = 1 }, cellIndex) => {
213
+ ({ content, align = "left", colSpan = 1, pl, pr, style }, cellIndex) => {
258
214
  const uniqueIdentifier = `chart-tooltip-table-cell-${cellIndex}`;
259
215
  return /* @__PURE__ */ jsx8(
260
216
  SeedsTable.Cell,
@@ -264,6 +220,9 @@ var ChartTable = memo7(function ChartTable2({
264
220
  align,
265
221
  colSpan,
266
222
  py: 200,
223
+ pl,
224
+ pr,
225
+ style,
267
226
  children: /* @__PURE__ */ jsx8(Text2.SmallBodyCopy, { as: "div", children: content })
268
227
  },
269
228
  uniqueIdentifier
@@ -687,4 +646,4 @@ export {
687
646
  areaChartStyles,
688
647
  donutChartStyles
689
648
  };
690
- //# sourceMappingURL=chunk-VCTZWYEM.js.map
649
+ //# sourceMappingURL=chunk-332X77M5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/ColorBox/ColorBox.tsx","../../../seeds-react-theme-provider/src/index.tsx","../../src/components/ChartLegend/components/ChartLegendLabel.tsx","../../src/components/ChartLegend/ChartLegend.tsx","../../src/components/ChartTooltip/ChartTooltip.tsx","../../src/components/ChartTooltip/components/ChartTooltipFooter.tsx","../../src/components/ChartTooltip/components/ChartTooltipHeader.tsx","../../src/components/ChartTooltip/components/ChartTooltipPortal.tsx","../../src/components/ChartTable/ChartTable.tsx","../../src/components/ChartTooltip/components/ChartTooltipTable.tsx","../../src/components/ChartTooltip/components/ChartTooltipTitle.tsx","../../src/helpers/transformTimeSeriesTooltipData.ts","../../src/constants/chartOptions.ts","../../src/styles/chartStyles.ts"],"sourcesContent":["import { css, type CSSProp } from \"styled-components\";\nimport { Box, type TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\nimport ThemeProvider from \"@sproutsocial/seeds-react-theme-provider\";\nimport { type TypeSproutTheme } from \"@sproutsocial/seeds-react-theme\";\n\nexport type TypeColorBoxProps = TypeBoxProps;\n\n/**\n * ColorBox extends Box to apply basic styles.\n */\nexport const ColorBox = ({\n display = \"inline-block\",\n height = \"16px\",\n width = \"16px\",\n minWidth = width,\n borderRadius = \"400\",\n ...props\n}: TypeColorBoxProps) => {\n return (\n <Box\n {...props}\n display={display}\n height={height}\n width={width}\n minWidth={minWidth}\n borderRadius={borderRadius}\n css={\n css`\n cursor: ${(\n props: typeof ThemeProvider & {\n onClick: ((e: React.MouseEvent<HTMLElement>) => void) | void;\n }\n ) => (props?.onClick ? \"pointer\" : \"default\")};\n ` as CSSProp<TypeSproutTheme>\n }\n />\n );\n};\n","import * as React from \"react\";\nimport { ThemeProvider as BaseThemeProvider } from \"styled-components\";\nimport { theme } from \"@sproutsocial/seeds-react-theme\";\nimport type {\n TypeSproutTheme,\n TypeTheme,\n} from \"@sproutsocial/seeds-react-theme\";\n\n// We can append additional themes types here\ntype TypeAllThemes = TypeTheme | TypeSproutTheme;\n\ntype TypeProps = {\n readonly theme?: TypeAllThemes;\n readonly children?: React.ReactNode;\n};\n\nconst ThemeProvider = (props: TypeProps) => (\n <BaseThemeProvider {...props} theme={props.theme || theme}>\n {props.children}\n </BaseThemeProvider>\n);\n\nexport default ThemeProvider;\n","import styled from \"styled-components\";\nimport { memo } from \"react\";\nimport { Box, type TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\nimport { Text } from \"@sproutsocial/seeds-react-text\";\n\nimport type { TypeLegendLabel } from \"../ChartLegend\";\n\nimport { ColorBox } from \"../../ColorBox\";\n\nconst StyledBox = styled(Box)<TypeBoxProps>`\n list-style: none;\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.space[300]};\n`;\n\nexport type TypeChartLegendLabelProps = Readonly<{\n children: TypeLegendLabel[\"content\"];\n color: TypeLegendLabel[\"color\"];\n // optional\n containerBoxProps?: TypeBoxProps;\n}>;\n\nexport const ChartLegendLabel = memo<TypeChartLegendLabelProps>(\n function ChartLegendLabel({\n children,\n color = \"#CCC\",\n containerBoxProps = {},\n }: TypeChartLegendLabelProps) {\n return (\n <StyledBox {...containerBoxProps}>\n <ColorBox bg={color} />\n <Text as=\"div\" fontSize={200} color=\"text.subtext\">\n {children}\n </Text>\n </StyledBox>\n );\n }\n);\n","import { memo } from \"react\";\nimport { Box, type TypeBoxProps } from \"@sproutsocial/seeds-react-box\";\nimport { theme } from \"@sproutsocial/seeds-react-theme\";\n\nimport { ChartLegendLabel } from \"./components/ChartLegendLabel\";\n\nexport type TypeLegendLabel = Readonly<{\n content: React.ReactNode;\n color?: string;\n}>;\n\nexport type TypeChartLegendProps = Readonly<{\n legendLabels: ReadonlyArray<TypeLegendLabel>;\n // optional\n containerBoxProps?: TypeBoxProps;\n stacked?: boolean;\n}>;\n\nexport const ChartLegend = memo<TypeChartLegendProps>(function ChartLegend({\n legendLabels,\n containerBoxProps = {},\n stacked = false,\n}: TypeChartLegendProps) {\n return (\n <Box\n as=\"ul\"\n aria-hidden=\"true\"\n display=\"flex\"\n justifyContent=\"center\"\n flexDirection={stacked ? \"column\" : \"row\"}\n flexWrap=\"wrap\"\n columnGap={450}\n rowGap={200}\n m={0}\n p={0}\n {...containerBoxProps}\n >\n {legendLabels.map(({ color, content }, index) => (\n <ChartLegendLabel\n key={`chart-legend-label-${index}`}\n color={color || theme.colors.DATAVIZ_COLORS_LIST[index]}\n containerBoxProps={{ as: \"li\" }}\n >\n {content}\n </ChartLegendLabel>\n ))}\n </Box>\n );\n});\n","import { memo } from \"react\";\n\n// Chart Tooltip\ntype TypeChartTooltipProps = Readonly<{\n children: React.ReactNode;\n}>;\n\n// Consumes the .seeds-chart-tooltip class from chart-styles.css (the shared\n// foundation every v2 chart already imports): the padded/bordered/shadowed\n// container plus the flex-column gap between rows.\nexport const ChartTooltip = memo<TypeChartTooltipProps>(function ChartTooltip({\n children,\n}: TypeChartTooltipProps) {\n return <div className=\"seeds-chart-tooltip\">{children}</div>;\n});\n","import { memo } from \"react\";\n\ntype TypeChartTooltipFooterProps = {\n children: React.ReactNode;\n};\n\nexport const ChartTooltipFooter = memo<TypeChartTooltipFooterProps>(\n function ChartTooltipFooter({ children }: TypeChartTooltipFooterProps) {\n return <div className=\"seeds-chart-tooltip-footer\">{children}</div>;\n }\n);\n","import { memo } from \"react\";\n\ntype TypeChartTooltipHeaderProps = {\n children: React.ReactNode;\n};\n\nexport const ChartTooltipHeader = memo<TypeChartTooltipHeaderProps>(\n function ChartTooltipHeader({ children }: TypeChartTooltipHeaderProps) {\n return <div className=\"seeds-chart-tooltip-header\">{children}</div>;\n }\n);\n","import { memo, useState, useRef, useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n Tooltip,\n Chart,\n TooltipFormatterContextObject,\n TooltipFormatterCallbackFunction,\n} from \"highcharts\";\n\ninterface ExtendedHighchartsTooltip extends Tooltip {\n label: {\n box: { attr({ height, width }: { height: number; width: number }): void };\n text: { element: HTMLElement };\n };\n}\n\nexport const generateChartTooltipPortalId = (chartId: number) =>\n `highcharts-custom-tooltip-${chartId}`;\n\ntype ChartTooltipPortalProps = Readonly<{\n chart: Chart;\n renderContent: (_context: TooltipFormatterContextObject) => ReactNode;\n}>;\n\nexport const ChartTooltipPortal = memo<ChartTooltipPortalProps>(\n function ChartTooltipPortal({\n chart,\n renderContent,\n }: ChartTooltipPortalProps) {\n const isInitialized = useRef<boolean>(false);\n const [node, setNode] = useState<HTMLElement | null>(null);\n const [context, setContext] =\n useState<TooltipFormatterContextObject | null>(null);\n\n useEffect(() => {\n const formatter: TooltipFormatterCallbackFunction = function () {\n // Ensures that tooltip DOM container is rendered before React portal is created.\n if (!isInitialized.current) {\n isInitialized.current = true;\n chart.tooltip.refresh.apply(chart.tooltip, [this.point]);\n chart.tooltip.hide(0);\n }\n\n setContext(this);\n\n return `<div id=\"${generateChartTooltipPortalId(\n chart.index\n )}\" role='tooltip'></div>`;\n };\n\n chart.update({ tooltip: { formatter } });\n }, [chart]);\n\n useEffect(() => {\n // In some cases tooltip is not available on the chart yet\n if (context?.series?.chart?.tooltip) {\n const tooltip = context.series.chart\n .tooltip as ExtendedHighchartsTooltip;\n const textElement = tooltip.label.text.element;\n\n tooltip.label.box.attr({\n height: textElement.offsetHeight,\n width: textElement.offsetWidth,\n });\n\n setNode(\n document.getElementById(generateChartTooltipPortalId(chart.index))\n );\n }\n }, [context, chart.index]);\n\n return node && context ? createPortal(renderContent(context), node) : null;\n }\n);\n","import { memo } from \"react\";\nimport styled from \"styled-components\";\nimport { Text } from \"@sproutsocial/seeds-react-text\";\nimport { Table as SeedsTable } from \"@sproutsocial/seeds-react-table\";\n\nconst StyledSeedsTable = styled<typeof SeedsTable>(SeedsTable)`\n tbody tr:last-child {\n border-bottom: none;\n }\n tr:last-child td,\n tr:last-child th {\n padding-bottom: 0;\n }\n tr:first-child td,\n tr:first-child th {\n padding-top: 0;\n }\n tr th {\n padding-left: 0;\n }\n tr td:last-child {\n padding-right: 0;\n }\n`;\n\nconst StyledSeedsTableRow = styled(SeedsTable.TableRow)<{\n $isAppendedRow?: boolean;\n}>`\n ${({ $isAppendedRow, theme }) =>\n $isAppendedRow\n ? `border-top: 2px solid ${theme.colors.container.border.base}`\n : \"\"}\n`;\n\nexport type TypeChartTableProps = Readonly<{\n rows: ReadonlyArray<{\n cells: ReadonlyArray<{\n content: React.ReactNode;\n align?: React.ComponentProps<typeof SeedsTable.Cell>[\"align\"];\n colSpan?: React.ComponentProps<typeof SeedsTable.Cell>[\"colSpan\"];\n pl?: React.ComponentProps<typeof SeedsTable.Cell>[\"pl\"];\n pr?: React.ComponentProps<typeof SeedsTable.Cell>[\"pr\"];\n style?: React.ComponentProps<typeof SeedsTable.Cell>[\"style\"];\n }>;\n isAppendedRow?: boolean;\n }>;\n}>;\n\nexport const ChartTable = memo<TypeChartTableProps>(function ChartTable({\n rows,\n}: TypeChartTableProps) {\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return (\n <StyledSeedsTable>\n <SeedsTable.TableBody>\n {rows.map(({ cells, isAppendedRow }, rowIndex) => {\n if (!cells || cells.length === 0) {\n return null;\n }\n\n return (\n <StyledSeedsTableRow\n key={`chart-tooltip-table-row-${rowIndex}`}\n $isAppendedRow={isAppendedRow}\n >\n {cells.map(\n (\n { content, align = \"left\", colSpan = 1, pl, pr, style },\n cellIndex\n ) => {\n const uniqueIdentifier = `chart-tooltip-table-cell-${cellIndex}`;\n return (\n <SeedsTable.Cell\n key={uniqueIdentifier}\n id={uniqueIdentifier}\n scope={cellIndex === 0 ? \"row\" : undefined}\n align={align}\n colSpan={colSpan}\n py={200}\n pl={pl}\n pr={pr}\n style={style}\n >\n <Text.SmallBodyCopy as=\"div\">\n {content}\n </Text.SmallBodyCopy>\n </SeedsTable.Cell>\n );\n }\n )}\n </StyledSeedsTableRow>\n );\n })}\n </SeedsTable.TableBody>\n </StyledSeedsTable>\n );\n});\n","import { memo } from \"react\";\n\nimport { ChartTable, type TypeChartTableProps } from \"../../ChartTable\";\n\nexport type TypeChartTooltipTableProps = {\n rows: TypeChartTableProps[\"rows\"];\n};\n\nexport const ChartTooltipTable = memo<TypeChartTooltipTableProps>(\n function ChartTooltipTable({ rows }: TypeChartTooltipTableProps) {\n return <ChartTable rows={rows} />;\n }\n);\n","import { memo } from \"react\";\nimport { Text } from \"@sproutsocial/seeds-react-text\";\n\ntype TypeChartTooltipTitleProps = {\n children: React.ReactNode;\n};\n\nexport const ChartTooltipTitle = memo<TypeChartTooltipTitleProps>(\n function ChartTooltipTitle({ children }: TypeChartTooltipTitleProps) {\n return <Text.SmallSubHeadline as=\"p\">{children}</Text.SmallSubHeadline>;\n }\n);\n","import type { TooltipFormatterContextObject } from \"highcharts\";\nimport { theme } from \"@sproutsocial/seeds-react-theme\";\n\nimport type { TypeAreaChartProps } from \"../components/AreaChart\";\nimport type { TypeLineChartProps } from \"../components/LineChart\";\nimport type { TypeChartTooltipProps } from \"../types\";\n\ntype TypeTransformTimeSeriesTooltipDataProps = Readonly<{\n context: TooltipFormatterContextObject;\n data: TypeAreaChartProps[\"data\"] | TypeLineChartProps[\"data\"];\n}>;\ntype TypeTransformTimeSeriesTooltipDataReturn = TypeChartTooltipProps[\"data\"];\n\nexport const transformTimeSeriesTooltipData = ({\n context,\n data,\n}: TypeTransformTimeSeriesTooltipDataProps): TypeTransformTimeSeriesTooltipDataReturn => {\n // @ts-expect-error - Highcharts tooltip context series typing does not expose chart.series here\n return (context.series.chart.series || []).map((series, index) => {\n const pointIndex = context.point.index;\n const y = series?.points?.[pointIndex]?.y;\n\n return {\n color:\n data[index]?.styles?.color || theme.colors.DATAVIZ_COLORS_LIST[index],\n ...(data[index]?.icon ? { icon: data[index]?.icon } : {}),\n name: series.name,\n value: typeof y === \"number\" ? y : null,\n };\n });\n};\n","import type { Options } from \"highcharts\";\nimport _ from \"lodash\";\n\n// options that should apply to all charts\n// this is being exported because it's needed for the listening bubble chart component.\n// when that components gets moved into the data-viz package, we can remove the export here\nexport const baseChartOptions: Options = {\n chart: {\n animation: false,\n styledMode: true,\n },\n credits: {\n enabled: false,\n },\n exporting: {\n enabled: false,\n fallbackToExportServer: false,\n },\n legend: {\n enabled: false,\n },\n title: {\n text: undefined,\n },\n tooltip: {\n hideDelay: 0,\n outside: true,\n padding: 0,\n shape: \"rect\",\n shared: true,\n useHTML: true,\n },\n};\n\n// options that should apply to time series charts\nexport const TIME_SERIES_CHART_HEIGHT = 275;\nexport const timeSeriesChartOptions: Options = _.merge({}, baseChartOptions, {\n annotations: [\n {\n draggable: \"\",\n labelOptions: {\n useHTML: true,\n padding: 0, // removes \"left\" property padding created by highcharts so that label is centered\n },\n },\n ],\n chart: {\n // events.click is set at the component level because of the optional onClick prop\n height: TIME_SERIES_CHART_HEIGHT,\n spacing: [5, 1, 0, 2],\n },\n plotOptions: {\n series: {\n animation: false,\n clip: false,\n marker: {\n enabled: false,\n states: {\n hover: {\n enabled: false,\n },\n },\n },\n },\n },\n xAxis: {\n crosshair: {\n zIndex: 3,\n },\n minPadding: 0, // must be handled dynamically instead of css\n maxPadding: 0, // must be handled dynamically instead of css\n type: \"datetime\",\n labels: {\n useHTML: true,\n // formatter is set at the component level because of the required text locale prop\n },\n },\n yAxis: {\n labels: {\n useHTML: true,\n // formatter is set at the component level because of the optional yAxisLabelFormatter prop\n },\n softMax: 0,\n softMin: 0,\n title: {\n text: undefined,\n },\n plotLines: [\n /* Adds a custom plotLine at y=0 to represent the chart baseline.\n This approach allows full control over the line's appearance (e.g., color, z-index),\n unlike relying on the default xAxis line, which always renders at the bottom of the chart\n even when y=0 appears elsewhere (e.g., with negative values).\n */\n {\n className: \"y-axis-zero-line\",\n value: 0,\n zIndex: 3, // ensures the line appears over the default y=0 line, which we can't seleect as specifically\n },\n ],\n },\n});\n\n// options that should apply to LineChart\nexport const lineChartOptions: Options = _.merge({}, timeSeriesChartOptions, {\n // plotOptions.spline.events.click is set at the component level because of the optional onClick prop\n});\n\n// options that should apply to AreaChart\nexport const areaChartOptions: Options = _.merge({}, timeSeriesChartOptions, {\n plotOptions: {\n areaspline: {\n // events.click is set at the component level because of the optional onClick prop\n stacking: \"normal\",\n },\n },\n});\n\nexport const columnChartOptions: Options = _.merge({}, timeSeriesChartOptions, {\n plotOptions: {\n column: {\n stacking: \"normal\",\n pointPadding: 0.25,\n groupPadding: 0.25,\n borderRadius: 4,\n },\n },\n xAxis: {\n crosshair: false,\n },\n yAxis: {\n plotLines: [\n {\n // For stacked column charts with visible borders (e.g., white for contrast),\n // we raise the zIndex of the y=0 plotLine to ensure it remains visible\n // and isn't visually covered by overlapping column borders.\n zIndex: 5,\n },\n ],\n },\n});\n\n/**\n * The default series limit for VerticalBarChart.\n * This limit is recommended to maintain chart readability and accessibility.\n * @see {VerticalBarChart}\n */\nexport const VERTICAL_BAR_CHART_DEFAULT_SERIES_LIMIT = 10;\n\n// options that should apply to DonutChart\nexport const DONUT_CHART_HALO_SIZE = 10; // 10 is the default from highcharts\nexport const DONUT_CHART_HEIGHT = 250 + DONUT_CHART_HALO_SIZE * 2;\nexport const DONUT_CHART_WIDTH = DONUT_CHART_HEIGHT;\nexport const donutChartOptions: Options = _.merge({}, baseChartOptions, {\n chart: {\n height: DONUT_CHART_HEIGHT,\n spacing: [0, 0, 0, 0],\n },\n plotOptions: {\n pie: {\n animation: false,\n borderRadius: 0, // must be handled here instead of css because of path rendering\n dataLabels: {\n enabled: false,\n },\n innerSize: \"50%\",\n },\n },\n});\n\n// options that should apply to BubbleChart (v2 packedbubble)\nexport const BUBBLE_CHART_HEIGHT = 600;\n// Preserved verbatim from v1 (consumed by web-app-core's `Overlays.tsx` as a\n// Box width) — re-exported from `/bubble` for the future consumer-migration\n// ticket. Not wired into the v2 chart's own options: packedbubble is\n// fluid-width like every other v2 family, matching the container's own\n// responsive sizing rather than v1's fixed `chart.width`.\nexport const defaultBubbleChartWidth = 600;\nexport const BUBBLE_CHART_DEFAULT_PADDING = 16;\nexport const BUBBLE_CHART_DEFAULT_MAX_SIZE = \"100%\";\n\n// options that should apply to WordCloud\n/** Also sets the cloud's aspect ratio — a wider/shorter box biases the silhouette wide, a narrower/taller one biases it tall. */\nexport const WORD_CLOUD_CHART_HEIGHT = 400;\n","import { css, createGlobalStyle } from \"styled-components\";\nimport { theme } from \"@sproutsocial/seeds-react-theme\";\nimport {\n type TypeChartStyleColor,\n type TypeChartStyleHasOnClick,\n type TypeChartStylePattern,\n} from \"../types\";\nimport \"highcharts/css/highcharts.css\";\n\nexport const GlobalChartStyleOverrides = createGlobalStyle`\n // USAGE NOTE:\n // Put general styles in baseChartStyles instead when possible to avoid excessive global styling.\n // This global component is only for styles that can't override highcharts defaults when scoped.\n\n .highcharts-tooltip-container {\n z-index: 7 !important;\n }\n .highcharts-tooltip-box {\n fill: transparent !important;\n }\n`;\n\n// options that should apply to all charts\nexport const baseChartStyles = css<\n Readonly<{ $colors: ReadonlyArray<TypeChartStyleColor> }>\n>`\n --highcharts-background-color: ${({ theme }) =>\n theme.colors.container.background.base};\n\n // set color variables and map to each series\n ${({ $colors }) =>\n $colors\n .map((color, index) => {\n const chartColor = color || theme.colors.DATAVIZ_COLORS_LIST[index];\n return `\n\t\t\t\t// map colors to custom assigned colors or fallback to default data viz color rotation\n\t\t\t\t--highcharts-color-${index}: ${chartColor};\n\n\t\t\t\t// highcharts already accounts for 10 series, but if we have more, we need to add them\n\t\t\t\t.highcharts-color-${index} {\n\t\t\t\t\tcolor: var(--highcharts-color-${index});\n\t\t\t\t\tstroke: var(--highcharts-color-${index});\n\t\t\t\t\tfill: var(--highcharts-color-${index});\n\t\t\t\t}`;\n })\n .join(\"\\n\")}\n\n // set overall chart background color\n .highcharts-background {\n fill: ${({ theme }) => theme.colors.container.background.base};\n }\n\n g.highcharts-annotation-label {\n display: none;\n }\n\n div.highcharts-annotation-label {\n top: 0 !important;\n transform: translateX(-50%); // centers the label on the targeted axis point\n pointer-events: none; // prevents tooltip hover from being interrupted by this element since it renders after on the dom\n }\n`;\n\n// options that should apply to time series charts\nexport const timeSeriesChartStyles = css<\n Readonly<{\n $colors: ReadonlyArray<TypeChartStyleColor>;\n $hasOnClick: TypeChartStyleHasOnClick;\n }>\n>`\n ${baseChartStyles}\n\n // vertical crosshair styles\n\t.highcharts-crosshair {\n stroke: ${({ theme }) => theme.colors.container.border.decorative.neutral};\n stroke-width: 1;\n }\n\n // axis and gridline styles\n .highcharts-grid-line {\n stroke: ${({ theme }) => theme.colors.container.border.base};\n }\n\n .highcharts-axis-line {\n stroke: ${({ theme }) => theme.colors.container.border.base};\n }\n\n .highcharts-tick {\n stroke: none;\n }\n .highcharts-xaxis-labels,\n .highcharts-yaxis-labels {\n // v1 HTML labels (useHTML: true). v2 SVG label styles live in\n // charts/shared/styles.ts (axisLabelV2Styles) — don't add v2 rules here.\n > span {\n font-family: ${({ theme }) => theme.fontFamily};\n ${({ theme }) => theme.typography[100]};\n font-weight: ${({ theme }) => theme.fontWeights.normal};\n color: ${({ theme }) => theme.colors.text.subtext};\n }\n }\n .highcharts-xaxis-labels {\n // v1 HTML stacked labels (useHTML: true). v2 SVG stacked-label styles live\n // in charts/shared/styles.ts (axisLabelV2Styles).\n > span {\n display: flex;\n flex-direction: column;\n align-items: center;\n > span:nth-of-type(2) {\n font-weight: ${({ theme }) => theme.fontWeights.semibold};\n }\n }\n }\n\n // we don't want to drop the opacity when another item is hovered\n .highcharts-series-inactive {\n opacity: 1;\n }\n\n // apply cursor pointer when click functionality is turned on\n ${({ $hasOnClick }) =>\n $hasOnClick &&\n `\n \t\t\t.highcharts-series,\n \t\t\t.highcharts-point {\n \t\t\t\tcursor: pointer;\n \t\t\t}\n \t\t\t.highcharts-plot-background,\n \t\t\t.highcharts-crosshair,\n \t\t\t.highcharts-grid-line {\n \t\t\t\tfill: transparent;\n \t\t\t\tcursor: pointer;\n \t\t}`}\n\n path.highcharts-plot-line.y-axis-zero-line {\n stroke: ${({ theme }) => theme.colors.container.border.decorative.neutral};\n }\n`;\n\n// options that should apply to line charts\nexport const lineChartStyles = css<\n Readonly<{\n $colors: ReadonlyArray<TypeChartStyleColor>;\n $patterns: ReadonlyArray<TypeChartStylePattern>;\n $hasOnClick: TypeChartStyleHasOnClick;\n }>\n>`\n ${timeSeriesChartStyles}\n\n // set the line stroke\n\t.highcharts-graph {\n stroke-width: 3;\n }\n\n // dashed line styles\n ${({ $patterns }) =>\n $patterns.map((pattern, index) => {\n return pattern === \"dashed\"\n ? `\n \t\t\t\t\t// highcharts already accounts for 10 series, but if we have more, we need to add them\n \t\t\t\t\t.highcharts-series-${index} {\n \t\t\t\t\t\tstroke-dasharray: 2, 8;\n \t\t\t\t\t}`\n : \"\";\n })}\n`;\n\n// options that should apply to area charts\nexport const areaChartStyles = css`\n ${timeSeriesChartStyles}\n\n // don't need to show a stroke for the line part of each area\n\t.highcharts-graph {\n stroke-width: 0;\n }\n\n // fill areas to full opacity\n .highcharts-area {\n fill-opacity: 1;\n }\n`;\n\n// options that should apply to donut charts\nexport const donutChartStyles = css<\n Readonly<{\n $colors: ReadonlyArray<TypeChartStyleColor>;\n $hasOnClick: TypeChartStyleHasOnClick;\n }>\n>`\n ${baseChartStyles}\n\n // remove 250ms fade in/out when hovering over different donut chart slices\n\t.highcharts-point {\n transition: opacity 0s;\n }\n\n // remove stroke on donut slices\n .highcharts-pie-series .highcharts-point {\n stroke: none;\n }\n\n // don't reduce opacity when hovering\n .highcharts-point-hover {\n fill-opacity: none;\n }\n\n // apply cursor pointer when click functionality is turned on\n ${({ $hasOnClick }) =>\n $hasOnClick &&\n `\n \t\t\t.highcharts-series,\n \t\t\t.highcharts-point {\n \t\t\t\tcursor: pointer;\n \t\t\t}\n \t\t\t.highcharts-plot-background,\n \t\t\t.highcharts-crosshair,\n \t\t\t.highcharts-grid-line {\n \t\t\t\tfill: transparent;\n \t\t\t\tcursor: pointer;\n \t\t}`}\n`;\n"],"mappings":";AAAA,SAAS,WAAyB;AAClC,SAAS,WAA8B;;;ACDvC,OAAuB;AACvB,SAAS,iBAAiB,yBAAyB;AACnD,SAAS,aAAa;AAepB,SAAA,WAAA;;;ADdF,OAAqC;AAgBjC,gBAAAA,YAAA;AATG,IAAM,WAAW,CAAC;AAAA,EACvB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,GAAG;AACL,MAAyB;AACvB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KACE;AAAA,oBACY,CACRC,WAGIA,QAAO,UAAU,YAAY,SAAU;AAAA;AAAA;AAAA,EAGnD;AAEJ;;;AErCA,OAAO,YAAY;AACnB,SAAS,YAAY;AACrB,SAAS,OAAAC,YAA8B;AACvC,SAAS,YAAY;AA2Bf,SACE,OAAAC,MADF;AArBN,IAAM,YAAY,OAAOC,IAAG;AAAA;AAAA;AAAA;AAAA,SAInB,CAAC,EAAE,OAAAC,OAAM,MAAMA,OAAM,MAAM,GAAG,CAAC;AAAA;AAUjC,IAAM,mBAAmB;AAAA,EAC9B,SAASC,kBAAiB;AAAA,IACxB;AAAA,IACA,QAAQ;AAAA,IACR,oBAAoB,CAAC;AAAA,EACvB,GAA8B;AAC5B,WACE,qBAAC,aAAW,GAAG,mBACb;AAAA,sBAAAH,KAAC,YAAS,IAAI,OAAO;AAAA,MACrB,gBAAAA,KAAC,QAAK,IAAG,OAAM,UAAU,KAAK,OAAM,gBACjC,UACH;AAAA,OACF;AAAA,EAEJ;AACF;;;ACtCA,SAAS,QAAAI,aAAY;AACrB,SAAS,OAAAC,YAA8B;AACvC,SAAS,SAAAC,cAAa;AAoCd,gBAAAC,YAAA;AApBD,IAAM,cAAcC,MAA2B,SAASC,aAAY;AAAA,EACzE;AAAA,EACA,oBAAoB,CAAC;AAAA,EACrB,UAAU;AACZ,GAAyB;AACvB,SACE,gBAAAF;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,gBAAe;AAAA,MACf,eAAe,UAAU,WAAW;AAAA,MACpC,UAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,MACF,GAAG;AAAA,MAEH,uBAAa,IAAI,CAAC,EAAE,OAAO,QAAQ,GAAG,UACrC,gBAAAH;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,SAASI,OAAM,OAAO,oBAAoB,KAAK;AAAA,UACtD,mBAAmB,EAAE,IAAI,KAAK;AAAA,UAE7B;AAAA;AAAA,QAJI,sBAAsB,KAAK;AAAA,MAKlC,CACD;AAAA;AAAA,EACH;AAEJ,CAAC;;;AChDD,SAAS,QAAAC,aAAY;AAaZ,gBAAAC,YAAA;AAHF,IAAM,eAAeD,MAA4B,SAASE,cAAa;AAAA,EAC5E;AACF,GAA0B;AACxB,SAAO,gBAAAD,KAAC,SAAI,WAAU,uBAAuB,UAAS;AACxD,CAAC;;;ACdD,SAAS,QAAAE,aAAY;AAQV,gBAAAC,YAAA;AAFJ,IAAM,qBAAqBD;AAAA,EAChC,SAASE,oBAAmB,EAAE,SAAS,GAAgC;AACrE,WAAO,gBAAAD,KAAC,SAAI,WAAU,8BAA8B,UAAS;AAAA,EAC/D;AACF;;;ACVA,SAAS,QAAAE,aAAY;AAQV,gBAAAC,YAAA;AAFJ,IAAM,qBAAqBD;AAAA,EAChC,SAASE,oBAAmB,EAAE,SAAS,GAAgC;AACrE,WAAO,gBAAAD,KAAC,SAAI,WAAU,8BAA8B,UAAS;AAAA,EAC/D;AACF;;;ACVA,SAAS,QAAAE,OAAM,UAAU,QAAQ,iBAAiC;AAClE,SAAS,oBAAoB;AAetB,IAAM,+BAA+B,CAAC,YAC3C,6BAA6B,OAAO;AAO/B,IAAM,qBAAqBA;AAAA,EAChC,SAASC,oBAAmB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,GAA4B;AAC1B,UAAM,gBAAgB,OAAgB,KAAK;AAC3C,UAAM,CAAC,MAAM,OAAO,IAAI,SAA6B,IAAI;AACzD,UAAM,CAAC,SAAS,UAAU,IACxB,SAA+C,IAAI;AAErD,cAAU,MAAM;AACd,YAAM,YAA8C,WAAY;AAE9D,YAAI,CAAC,cAAc,SAAS;AAC1B,wBAAc,UAAU;AACxB,gBAAM,QAAQ,QAAQ,MAAM,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC;AACvD,gBAAM,QAAQ,KAAK,CAAC;AAAA,QACtB;AAEA,mBAAW,IAAI;AAEf,eAAO,YAAY;AAAA,UACjB,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA,YAAM,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AAAA,IACzC,GAAG,CAAC,KAAK,CAAC;AAEV,cAAU,MAAM;AAEd,UAAI,SAAS,QAAQ,OAAO,SAAS;AACnC,cAAM,UAAU,QAAQ,OAAO,MAC5B;AACH,cAAM,cAAc,QAAQ,MAAM,KAAK;AAEvC,gBAAQ,MAAM,IAAI,KAAK;AAAA,UACrB,QAAQ,YAAY;AAAA,UACpB,OAAO,YAAY;AAAA,QACrB,CAAC;AAED;AAAA,UACE,SAAS,eAAe,6BAA6B,MAAM,KAAK,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,GAAG,CAAC,SAAS,MAAM,KAAK,CAAC;AAEzB,WAAO,QAAQ,UAAU,aAAa,cAAc,OAAO,GAAG,IAAI,IAAI;AAAA,EACxE;AACF;;;ACzEA,SAAS,QAAAC,aAAY;AACrB,OAAOC,aAAY;AACnB,SAAS,QAAAC,aAAY;AACrB,SAAS,SAAS,kBAAkB;AAmFd,gBAAAC,YAAA;AAjFtB,IAAM,mBAAmBF,QAA0B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB7D,IAAM,sBAAsBA,QAAO,WAAW,QAAQ;AAAA,IAGlD,CAAC,EAAE,gBAAgB,OAAAG,OAAM,MACzB,iBACI,yBAAyBA,OAAM,OAAO,UAAU,OAAO,IAAI,KAC3D,EAAE;AAAA;AAiBH,IAAM,aAAaJ,MAA0B,SAASK,YAAW;AAAA,EACtE;AACF,GAAwB;AACtB,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAF,KAAC,oBACC,0BAAAA,KAAC,WAAW,WAAX,EACE,eAAK,IAAI,CAAC,EAAE,OAAO,cAAc,GAAG,aAAa;AAChD,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,gBAAgB;AAAA,QAEf,gBAAM;AAAA,UACL,CACE,EAAE,SAAS,QAAQ,QAAQ,UAAU,GAAG,IAAI,IAAI,MAAM,GACtD,cACG;AACH,kBAAM,mBAAmB,4BAA4B,SAAS;AAC9D,mBACE,gBAAAA;AAAA,cAAC,WAAW;AAAA,cAAX;AAAA,gBAEC,IAAI;AAAA,gBACJ,OAAO,cAAc,IAAI,QAAQ;AAAA,gBACjC;AAAA,gBACA;AAAA,gBACA,IAAI;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA;AAAA,gBAEA,0BAAAA,KAACD,MAAK,eAAL,EAAmB,IAAG,OACpB,mBACH;AAAA;AAAA,cAZK;AAAA,YAaP;AAAA,UAEJ;AAAA,QACF;AAAA;AAAA,MA3BK,2BAA2B,QAAQ;AAAA,IA4B1C;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ,CAAC;;;ACnGD,SAAS,QAAAI,aAAY;AAUV,gBAAAC,YAAA;AAFJ,IAAM,oBAAoBC;AAAA,EAC/B,SAASC,mBAAkB,EAAE,KAAK,GAA+B;AAC/D,WAAO,gBAAAF,KAAC,cAAW,MAAY;AAAA,EACjC;AACF;;;ACZA,SAAS,QAAAG,aAAY;AACrB,SAAS,QAAAC,aAAY;AAQV,gBAAAC,aAAA;AAFJ,IAAM,oBAAoBF;AAAA,EAC/B,SAASG,mBAAkB,EAAE,SAAS,GAA+B;AACnE,WAAO,gBAAAD,MAACD,MAAK,kBAAL,EAAsB,IAAG,KAAK,UAAS;AAAA,EACjD;AACF;;;ACVA,SAAS,SAAAG,cAAa;AAYf,IAAM,iCAAiC,CAAC;AAAA,EAC7C;AAAA,EACA;AACF,MAAyF;AAEvF,UAAQ,QAAQ,OAAO,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,UAAU;AAChE,UAAM,aAAa,QAAQ,MAAM;AACjC,UAAM,IAAI,QAAQ,SAAS,UAAU,GAAG;AAExC,WAAO;AAAA,MACL,OACE,KAAK,KAAK,GAAG,QAAQ,SAASA,OAAM,OAAO,oBAAoB,KAAK;AAAA,MACtE,GAAI,KAAK,KAAK,GAAG,OAAO,EAAE,MAAM,KAAK,KAAK,GAAG,KAAK,IAAI,CAAC;AAAA,MACvD,MAAM,OAAO;AAAA,MACb,OAAO,OAAO,MAAM,WAAW,IAAI;AAAA,IACrC;AAAA,EACF,CAAC;AACH;;;AC7BA,OAAO,OAAO;AAKP,IAAM,mBAA4B;AAAA,EACvC,OAAO;AAAA,IACL,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,wBAAwB;AAAA,EAC1B;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAGO,IAAM,2BAA2B;AACjC,IAAM,yBAAkC,EAAE,MAAM,CAAC,GAAG,kBAAkB;AAAA,EAC3E,aAAa;AAAA,IACX;AAAA,MACE,WAAW;AAAA,MACX,cAAc;AAAA,QACZ,SAAS;AAAA,QACT,SAAS;AAAA;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA,IAEL,QAAQ;AAAA,IACR,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,OAAO;AAAA,YACL,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA,YAAY;AAAA;AAAA,IACZ,YAAY;AAAA;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,SAAS;AAAA;AAAA,IAEX;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,SAAS;AAAA;AAAA,IAEX;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMT;AAAA,QACE,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGM,IAAM,mBAA4B,EAAE,MAAM,CAAC,GAAG,wBAAwB;AAAA;AAE7E,CAAC;AAGM,IAAM,mBAA4B,EAAE,MAAM,CAAC,GAAG,wBAAwB;AAAA,EAC3E,aAAa;AAAA,IACX,YAAY;AAAA;AAAA,MAEV,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qBAA8B,EAAE,MAAM,CAAC,GAAG,wBAAwB;AAAA,EAC7E,aAAa;AAAA,IACX,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,EACb;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAOM,IAAM,0CAA0C;AAGhD,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB,MAAM,wBAAwB;AACzD,IAAM,oBAAoB;AAC1B,IAAM,oBAA6B,EAAE,MAAM,CAAC,GAAG,kBAAkB;AAAA,EACtE,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,IACX,KAAK;AAAA,MACH,WAAW;AAAA,MACX,cAAc;AAAA;AAAA,MACd,YAAY;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAGM,IAAM,sBAAsB;AAM5B,IAAM,0BAA0B;AAChC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AAItC,IAAM,0BAA0B;;;ACtLvC,SAAS,OAAAC,MAAK,yBAAyB;AACvC,SAAS,SAAAC,cAAa;AAMtB,OAAO;AAEA,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAclC,IAAM,kBAAkBC;AAAA,mCAGI,CAAC,EAAE,OAAAC,OAAM,MACxCA,OAAM,OAAO,UAAU,WAAW,IAAI;AAAA;AAAA;AAAA,IAGtC,CAAC,EAAE,QAAQ,MACX,QACG,IAAI,CAAC,OAAO,UAAU;AACrB,QAAM,aAAa,SAASA,OAAM,OAAO,oBAAoB,KAAK;AAClE,SAAO;AAAA;AAAA,yBAEU,KAAK,KAAK,UAAU;AAAA;AAAA;AAAA,wBAGrB,KAAK;AAAA,qCACQ,KAAK;AAAA,sCACJ,KAAK;AAAA,oCACP,KAAK;AAAA;AAEnC,CAAC,EACA,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,YAIL,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,OAAO,UAAU,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe1D,IAAM,wBAAwBD;AAAA,IAMjC,eAAe;AAAA;AAAA;AAAA;AAAA,cAIL,CAAC,EAAE,OAAAC,OAAM,MAAMA,OAAM,OAAO,UAAU,OAAO,WAAW,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAM/D,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,OAAO,UAAU,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,cAIjD,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,OAAO,UAAU,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAW1C,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,UAAU;AAAA,QAC5C,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,WAAW,GAAG,CAAC;AAAA,qBACvB,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,YAAY,MAAM;AAAA,eAC7C,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,OAAO,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAWhC,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,YAAY,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAW5D,CAAC,EAAE,YAAY,MACf,eACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUC;AAAA;AAAA;AAAA,cAGS,CAAC,EAAE,OAAAA,OAAM,MAAMA,OAAM,OAAO,UAAU,OAAO,WAAW,OAAO;AAAA;AAAA;AAKtE,IAAM,kBAAkBD;AAAA,IAO3B,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQrB,CAAC,EAAE,UAAU,MACb,UAAU,IAAI,CAAC,SAAS,UAAU;AAChC,SAAO,YAAY,WACf;AAAA;AAAA,2BAEiB,KAAK;AAAA;AAAA,WAGtB;AACN,CAAC,CAAC;AAAA;AAIC,IAAM,kBAAkBA;AAAA,IAC3B,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAclB,IAAM,mBAAmBA;AAAA,IAM5B,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBf,CAAC,EAAE,YAAY,MACf,eACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUC;AAAA;","names":["jsx","props","Box","jsx","Box","theme","ChartLegendLabel","memo","Box","theme","jsx","memo","ChartLegend","Box","theme","memo","jsx","ChartTooltip","memo","jsx","ChartTooltipFooter","memo","jsx","ChartTooltipHeader","memo","ChartTooltipPortal","memo","styled","Text","jsx","theme","ChartTable","memo","jsx","memo","ChartTooltipTable","memo","Text","jsx","ChartTooltipTitle","theme","css","theme","css","theme"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  datetimeFormatter
3
- } from "./chunk-4IWPHCZ4.js";
3
+ } from "./chunk-CYCKJ5ML.js";
4
4
 
5
5
  // src/charts/shared/axisOptions.ts
6
6
  function makeDatetimeAxisLabelFormatter(timezone, timeFormat) {
@@ -53,4 +53,4 @@ export {
53
53
  buildDimensionalAxis,
54
54
  resolveTooltipOptions
55
55
  };
56
- //# sourceMappingURL=chunk-QBFXLKBO.js.map
56
+ //# sourceMappingURL=chunk-AL3OTBTT.js.map
@@ -10,7 +10,7 @@ import {
10
10
  GlobalChartStyleOverrides,
11
11
  WORD_CLOUD_CHART_HEIGHT,
12
12
  transformTimeSeriesTooltipData
13
- } from "./chunk-VCTZWYEM.js";
13
+ } from "./chunk-332X77M5.js";
14
14
 
15
15
  // src/charts/shared/baseChartOptions.ts
16
16
  function buildBaseChartOptions({
@@ -157,7 +157,7 @@ function allocateWordsAcrossGroups(data, maxWordCount) {
157
157
  }
158
158
  return result.sort((a, b) => b.weight - a.weight);
159
159
  }
160
- function transformWordCloudDataToPoints(data, groups, opacityRange, maxWordCount = WORD_CLOUD_MAXIMUM_WORD_COUNT) {
160
+ function transformWordCloudDataToPoints(data, groups, opacityRange, maxWordCount = WORD_CLOUD_MAXIMUM_WORD_COUNT, minFontSize = WORD_CLOUD_MIN_FONT_SIZE, maxFontSize = WORD_CLOUD_MAXIMUM_MAX_FONT_SIZE) {
161
161
  const hasGroups = Boolean(groups && groups.length > 0);
162
162
  const capped = hasGroups ? allocateWordsAcrossGroups(data, maxWordCount) : [...data].sort((a, b) => b.weight - a.weight).slice(0, maxWordCount);
163
163
  const compressedWeights = capped.map((point) => compressWeight(point.weight));
@@ -165,13 +165,15 @@ function transformWordCloudDataToPoints(data, groups, opacityRange, maxWordCount
165
165
  const max = Math.max(...compressedWeights);
166
166
  return capped.map((point, i) => {
167
167
  const colorIndex = resolveGroupColorIndex(point.groupId, groups);
168
- const weight = compressedWeights[i];
168
+ const compressed = compressedWeights[i];
169
+ const t = normalizeWeight(compressed, min, max);
170
+ const weight = minFontSize + t * (maxFontSize - minFontSize);
169
171
  return {
170
172
  name: point.name,
171
173
  weight,
172
174
  colorIndex,
173
175
  opacity: resolvePointOpacity({
174
- weight,
176
+ weight: compressed,
175
177
  min,
176
178
  max,
177
179
  hasGroups,
@@ -199,11 +201,15 @@ function transformWordCloudClickData(event) {
199
201
  }
200
202
  function buildWordCloudOptions(props, containerWidth, hasActiveNames = false) {
201
203
  const opacityRange = props.opacityRange ?? DEFAULT_OPACITY_RANGE;
204
+ const minFontSize = props.minFontSize ?? WORD_CLOUD_MIN_FONT_SIZE;
205
+ const maxFontSize = props.maxFontSize ?? deriveMaxFontSize(containerWidth ?? 0);
202
206
  const points = transformWordCloudDataToPoints(
203
207
  props.data,
204
208
  props.groups,
205
209
  opacityRange,
206
- deriveMaxWordCount(containerWidth ?? 0)
210
+ deriveMaxWordCount(containerWidth ?? 0),
211
+ minFontSize,
212
+ maxFontSize
207
213
  );
208
214
  const base = buildBaseChartOptions({
209
215
  type: "wordcloud",
@@ -245,20 +251,26 @@ function buildWordCloudOptions(props, containerWidth, hasActiveNames = false) {
245
251
  // emphasis — otherwise Highcharts' own hover pass fights the
246
252
  // consumer's `data-active-word-indices` dimming (wordcloud.css).
247
253
  inactiveOtherPoints: !hasActiveNames,
248
- minFontSize: props.minFontSize ?? WORD_CLOUD_MIN_FONT_SIZE,
249
- // An explicit prop wins; otherwise derived from the measured
250
- // container width (`WordCloud.tsx`'s `useMeasure` call). Must stay a
251
- // number — see `WORD_CLOUD_MAXIMUM_MAX_FONT_SIZE`'s doc comment for
252
- // why `undefined` breaks sizing.
253
- maxFontSize: props.maxFontSize ?? deriveMaxFontSize(containerWidth ?? 0),
254
+ // Resolved above and shared with the transform's font-size mapping.
255
+ // Must stay a number see `WORD_CLOUD_MAXIMUM_MAX_FONT_SIZE`'s doc
256
+ // comment for why `undefined` breaks sizing.
257
+ minFontSize,
258
+ maxFontSize,
254
259
  // Pinned horizontal — Highcharts' default tilts words vertical
255
260
  // (`{from: 0, to: 90}`).
256
261
  rotation: { from: 0, to: 0, orientations: 1 },
257
- // `seedsAspectArchimedean` (a pure function above, registered onto
258
- // Highcharts in chartBase.tsx) — Highcharts' own `archimedean` traces
259
- // a true circle with no aspect term, so it can't grow into a wide
260
- // container.
261
- spiral: "seedsAspectArchimedean",
262
+ // Highcharts' built-in rectangular spiral. It factors the field's
263
+ // aspect ratio in natively (it's built on squareSpiral over the field
264
+ // dimensions), so it fills a wide container and packs denser than the
265
+ // circular `archimedean`. Chosen over the custom `seedsAspectArchimedean`
266
+ // after a visual comparison once the font-size hierarchy fix made word
267
+ // sizes vary enough for the circular spiral's gaps to show. The custom
268
+ // spiral stays registered in chartBase.tsx for now; drop it if
269
+ // rectangular holds up in-app.
270
+ spiral: "rectangular",
271
+ // Highcharts' wordcloud module defaults `style.fontWeight` to `"900"`
272
+ // (heavy bold) — overridden to normal weight.
273
+ style: { fontWeight: "normal" },
262
274
  // `seedsWordPadding` (a pure function above, registered onto
263
275
  // Highcharts in chartBase.tsx) approximates word spacing, which
264
276
  // Highcharts' wordcloud module has no native option for; it reads
@@ -686,18 +698,42 @@ function DefaultChartTooltip({
686
698
  hideTitle,
687
699
  hideTotal = false
688
700
  }) {
701
+ const usePercentColumn = data.filter((d) => d.percent != null && !isNaN(d.percent)).length > 1;
689
702
  const rows = data.map((d) => {
690
703
  const formattedValue = d.value == null ? invalidNumberLabel ?? "\u2014" : valueFormatter({ ...valueFormat, value: d.value, abbreviate: false });
691
704
  const nameCell = {
692
705
  content: /* @__PURE__ */ jsx3(ChartLegendLabel, { color: d.color, children: /* @__PURE__ */ jsx3(ChartLabelWithIcon, { icon: d.icon, children: /* @__PURE__ */ jsx3(Text, { "aria-label": `${d.name}: `, children: d.name }) }) })
693
706
  };
707
+ const percent = d.percent;
708
+ if (usePercentColumn) {
709
+ return {
710
+ cells: [
711
+ nameCell,
712
+ {
713
+ content: percent != null && !isNaN(percent) ? /* @__PURE__ */ jsxs3(Text, { children: [
714
+ Math.round(percent),
715
+ "%"
716
+ ] }) : null,
717
+ align: "right",
718
+ pr: 350,
719
+ style: { width: "1%", whiteSpace: "nowrap" }
720
+ },
721
+ {
722
+ content: /* @__PURE__ */ jsx3(Text, { children: formattedValue }),
723
+ align: "right",
724
+ pl: 0,
725
+ style: { width: "1%", whiteSpace: "nowrap" }
726
+ }
727
+ ]
728
+ };
729
+ }
694
730
  return {
695
731
  cells: [
696
732
  nameCell,
697
733
  {
698
- content: d.percent != null && !isNaN(d.percent) ? /* @__PURE__ */ jsxs3(Box2, { display: "inline-flex", alignItems: "center", gap: 350, children: [
734
+ content: percent != null && !isNaN(percent) ? /* @__PURE__ */ jsxs3(Box2, { display: "inline-flex", alignItems: "center", gap: 350, children: [
699
735
  /* @__PURE__ */ jsxs3(Text, { children: [
700
- Math.round(d.percent),
736
+ Math.round(percent),
701
737
  "%"
702
738
  ] }),
703
739
  /* @__PURE__ */ jsx3(Text, { fontWeight: "semibold", children: formattedValue })
@@ -714,6 +750,10 @@ function DefaultChartTooltip({
714
750
  isAppendedRow: true,
715
751
  cells: [
716
752
  {
753
+ // In column mode the Total has no percent, so span the label
754
+ // across the name + percent columns; the value then lands in
755
+ // the value column (col 3) without an empty <td>.
756
+ colSpan: usePercentColumn ? 2 : 1,
717
757
  content: /* @__PURE__ */ jsx3(Text, { fontWeight: "semibold", "aria-label": "Total: ", children: "Total" })
718
758
  },
719
759
  {
@@ -723,7 +763,20 @@ function DefaultChartTooltip({
723
763
  value: total,
724
764
  abbreviate: false
725
765
  }) }),
726
- align: "right"
766
+ align: "right",
767
+ // Only collapse to content width in percent-column mode, matching
768
+ // the per-series value cells above (which are gated the same way).
769
+ // In non-percent multi-series mode the Total stays a plain
770
+ // right-aligned cell so regular stacking is untouched (ticket
771
+ // scope) and the Total matches the series value cells stacked
772
+ // above it.
773
+ ...usePercentColumn ? {
774
+ pl: 0,
775
+ style: {
776
+ width: "1%",
777
+ whiteSpace: "nowrap"
778
+ }
779
+ } : {}
727
780
  }
728
781
  ]
729
782
  }
@@ -771,6 +824,15 @@ var SeriesLegend = memo3(function SeriesLegend2({
771
824
  return /* @__PURE__ */ jsx4(ChartLegend, { legendLabels: labels });
772
825
  });
773
826
 
827
+ // src/charts/shared/stacking.ts
828
+ function isChartPercentStacked(options) {
829
+ const plotOptions = options.plotOptions;
830
+ if (!plotOptions) return false;
831
+ return Object.values(plotOptions).some(
832
+ (slot) => slot != null && typeof slot === "object" && slot.stacking === "percent"
833
+ );
834
+ }
835
+
774
836
  // src/charts/shared/chartExport.ts
775
837
  function defaultFilename(type, now) {
776
838
  const iso = now.toISOString();
@@ -1108,19 +1170,29 @@ function ChartRenderer({
1108
1170
  ] : (
1109
1171
  // Drop v1's `readonly` wrapper (v2 is mutable); icon is forwarded
1110
1172
  // from `series[]` by index below since the helper doesn't carry it.
1111
- transformTimeSeriesTooltipData({
1112
- context,
1113
- data: series.map((s, i) => ({
1114
- name: s.name,
1115
- points: [],
1116
- styles: { color: s.color ?? colors[i] ?? "" }
1117
- }))
1118
- }).map((row, i) => ({
1119
- color: row.color,
1120
- name: row.name,
1121
- value: row.value,
1122
- icon: series[i]?.icon
1123
- }))
1173
+ (() => {
1174
+ const showPercent = isChartPercentStacked(options) && series.length > 1;
1175
+ const pctCtx = context;
1176
+ const pointIndex = pctCtx.point.index;
1177
+ const chartSeries = pctCtx.series.chart.series;
1178
+ return transformTimeSeriesTooltipData({
1179
+ context,
1180
+ data: series.map((s, i) => ({
1181
+ name: s.name,
1182
+ points: [],
1183
+ styles: { color: s.color ?? colors[i] ?? "" }
1184
+ }))
1185
+ }).map((row, i) => {
1186
+ const percentage = chartSeries[i]?.points?.[pointIndex]?.percentage;
1187
+ return {
1188
+ color: row.color,
1189
+ name: row.name,
1190
+ value: row.value,
1191
+ icon: series[i]?.icon,
1192
+ ...showPercent && typeof percentage === "number" && !isNaN(percentage) ? { percent: percentage } : {}
1193
+ };
1194
+ });
1195
+ })()
1124
1196
  );
1125
1197
  const position = isPie || isPackedBubble ? ctx.key ?? ctx.point.name : context.x;
1126
1198
  const tickPositions = ctx.points?.[0]?.series?.xAxis?.tickPositions;
@@ -1171,4 +1243,4 @@ export {
1171
1243
  useSeedsChartSetup,
1172
1244
  ChartRenderer
1173
1245
  };
1174
- //# sourceMappingURL=chunk-4IWPHCZ4.js.map
1246
+ //# sourceMappingURL=chunk-CYCKJ5ML.js.map