@neo4j-ndl/react-charts 1.4.4 → 2.0.0-alpha.0.b2b2481

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 (32) hide show
  1. package/lib/cjs/charts/Chart.js +5 -5
  2. package/lib/cjs/charts/Chart.js.map +1 -1
  3. package/lib/cjs/charts/Legend.js +2 -2
  4. package/lib/cjs/charts/Legend.js.map +1 -1
  5. package/lib/cjs/charts/LegendItem.js +5 -5
  6. package/lib/cjs/charts/LegendItem.js.map +1 -1
  7. package/lib/cjs/charts/tests/PieChartWithRerender.js +1 -1
  8. package/lib/cjs/charts/tests/PieChartWithRerender.js.map +1 -1
  9. package/lib/cjs/charts/tests/chart-test-utils.js +5 -5
  10. package/lib/cjs/charts/tests/chart-test-utils.js.map +1 -1
  11. package/lib/cjs/charts/utils/chart-types.js.map +1 -1
  12. package/lib/esm/charts/Chart.js +5 -5
  13. package/lib/esm/charts/Chart.js.map +1 -1
  14. package/lib/esm/charts/Legend.js +2 -2
  15. package/lib/esm/charts/Legend.js.map +1 -1
  16. package/lib/esm/charts/LegendItem.js +5 -5
  17. package/lib/esm/charts/LegendItem.js.map +1 -1
  18. package/lib/esm/charts/tests/PieChartWithRerender.js +1 -1
  19. package/lib/esm/charts/tests/PieChartWithRerender.js.map +1 -1
  20. package/lib/esm/charts/tests/chart-test-utils.js +5 -5
  21. package/lib/esm/charts/tests/chart-test-utils.js.map +1 -1
  22. package/lib/esm/charts/utils/chart-types.js.map +1 -1
  23. package/lib/types/charts/Chart.d.ts.map +1 -1
  24. package/lib/types/charts/LegendItem.d.ts +1 -1
  25. package/lib/types/charts/LegendItem.d.ts.map +1 -1
  26. package/lib/types/charts/tests/chart-test-utils.d.ts +5 -5
  27. package/lib/types/charts/utils/chart-types.d.ts +13 -9
  28. package/lib/types/charts/utils/chart-types.d.ts.map +1 -1
  29. package/package.json +8 -5
  30. package/skills/ndl-react-charts/SKILL.md +3 -3
  31. package/skills/ndl-react-charts/components/charts.md +25 -31
  32. package/skills/ndl-react-charts/references/styling.md +28 -21
@@ -1 +1 @@
1
- {"version":3,"file":"Legend.js","sourceRoot":"","sources":["../../../src/charts/Legend.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAOiC,EAAE,EAAE;QAPrC,EACrB,SAAS,EACT,MAAM,EACN,aAAa,GAAG,IAAI,EACpB,aAAa,EACb,cAAc,OAEwC,EADnD,SAAS,cANS,2EAOtB,CADa;IAEZ,MAAM,EAAE,sBAAsB,EAAE,GAAG,kBAAkB,CAAC;QACpD,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC;QAClD,cAAc,EAAE,sBAAsB;QACtC,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,sBAAsB,EAAE,GAAG,mBAAmB,CACpD,sBAAsB,CACvB,CAAC;IAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,CACvE,OAAO,CACR,CAAC,MAAM,CAAC;IACT,MAAM,kBAAkB,GAAG,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC;IAClE,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAE7C,OAAO,CACL,KAAC,YAAY,kBACX,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EACxB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,IAC1B,SAAS,cAEZ,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE;;YAAC,OAAA,CACpC,KAAC,UAAU,IAET,IAAI,EAAE,aAAa,CAAC,IAAI,EACxB,KAAK,EAAE,aAAa,CAAC,KAAK,EAC1B,UAAU,EAAE,kBAAkB,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAClE,sBAAsB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,EAClE,sBAAsB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,EACnE,iBAAiB,EAAE,GAAG,EAAE;;oBACtB,MAAM,aAAa,GACjB,sBAAsB,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC;wBAChD,oBAAoB,KAAK,CAAC,CAAC;oBAE7B,sBAAsB,CACpB,aAAa,CAAC,IAAI,EAClB,kBAAkB,EAClB,aAAa,CACd,CAAC;gBACJ,CAAC,EACD,QAAQ,EACN,CAAC,kBAAkB;oBACnB,sBAAsB,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC,EAElD,UAAU,EACR,aAAa,CAAC,IAAI,KAAK,SAAS;oBAC9B,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,YAGhD,MAAA,aAAa,CAAC,IAAI,mCAAI,UAAU,KAAK,EAAE,IA3BnC,MAAA,aAAa,CAAC,IAAI,mCAAI,KAAK,CA4BrB,CACd,CAAA;SAAA,CAAC,IACW,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n useLegendHoverHighlight,\n useLegendSelection,\n} from './hooks/use-legend-interactions';\nimport { useLegendVisibility } from './hooks/use-legend-visibility';\nimport { LegendItem } from './LegendItem';\nimport { LegendLayout } from './LegendLayout';\nimport { type CommonProps, type LegendProps } from './utils/chart-types';\n\ntype LegendComponentProps = LegendProps & {\n isLayoutReady?: boolean;\n onLayoutReady?: () => void;\n};\n\n/**\n * Renders the interactive chart legend and keeps legend state synchronized with\n * ECharts.\n *\n * The component owns the React-side selected-series state, mirrors it into the\n * shared ref consumed when rebuilding chart options, and wires item hover/click\n * interactions back to the ECharts instance.\n */\nexport const Legend = ({\n className,\n series,\n isLayoutReady = true,\n onLayoutReady,\n htmlAttributes,\n ...restProps\n}: Omit<CommonProps<'div', LegendComponentProps>, 'ref'>) => {\n const { renderedSelectedSeries } = useLegendSelection({\n series,\n });\n\n const { toggleHighlight } = useLegendHoverHighlight({\n selectedSeries: renderedSelectedSeries,\n series,\n });\n\n const { toggleLegendVisibility } = useLegendVisibility(\n renderedSelectedSeries,\n );\n\n const selectedSeriesLength = Object.values(renderedSelectedSeries).filter(\n Boolean,\n ).length;\n const isAllSeriesVisible = selectedSeriesLength === series.length;\n const hasMoreThanOneItem = series.length > 1;\n\n return (\n <LegendLayout\n className={className}\n isLayoutReady={isLayoutReady}\n itemCount={series.length}\n onLayoutReady={onLayoutReady}\n htmlAttributes={htmlAttributes}\n {...restProps}\n >\n {series.map((currentSeries, index) => (\n <LegendItem\n key={currentSeries.name ?? index}\n name={currentSeries.name}\n color={currentSeries.color}\n hasButtons={hasMoreThanOneItem && currentSeries.name !== undefined}\n onLegendItemMouseEnter={() => toggleHighlight(currentSeries, true)}\n onLegendItemMouseLeave={() => toggleHighlight(currentSeries, false)}\n onLegendItemClick={() => {\n const isOnlyVisible =\n renderedSelectedSeries[currentSeries.name ?? ''] &&\n selectedSeriesLength === 1;\n\n toggleLegendVisibility(\n currentSeries.name,\n isAllSeriesVisible,\n isOnlyVisible,\n );\n }}\n selected={\n !isAllSeriesVisible &&\n renderedSelectedSeries[currentSeries.name ?? '']\n }\n deSelected={\n currentSeries.name === undefined\n ? false\n : !renderedSelectedSeries[currentSeries.name]\n }\n >\n {currentSeries.name ?? `Series ${index}`}\n </LegendItem>\n ))}\n </LegendLayout>\n );\n};\n"]}
1
+ {"version":3,"file":"Legend.js","sourceRoot":"","sources":["../../../src/charts/Legend.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAOiC,EAAE,EAAE;QAPrC,EACrB,SAAS,EACT,MAAM,EACN,aAAa,GAAG,IAAI,EACpB,aAAa,EACb,cAAc,OAEwC,EADnD,SAAS,cANS,2EAOtB,CADa;IAEZ,MAAM,EAAE,sBAAsB,EAAE,GAAG,kBAAkB,CAAC;QACpD,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC;QAClD,cAAc,EAAE,sBAAsB;QACtC,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,EAAE,sBAAsB,EAAE,GAAG,mBAAmB,CACpD,sBAAsB,CACvB,CAAC;IAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,CACvE,OAAO,CACR,CAAC,MAAM,CAAC;IACT,MAAM,kBAAkB,GAAG,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC;IAClE,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAE7C,OAAO,CACL,KAAC,YAAY,kBACX,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EACxB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,IAC1B,SAAS,cAEZ,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE;;YAAC,OAAA,CACpC,KAAC,UAAU,IAET,IAAI,EAAE,aAAa,CAAC,IAAI,EACxB,KAAK,EAAE,aAAa,CAAC,KAAK,EAC1B,UAAU,EAAE,kBAAkB,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAClE,sBAAsB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,EAClE,sBAAsB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,EACnE,iBAAiB,EAAE,GAAG,EAAE;;oBACtB,MAAM,aAAa,GACjB,sBAAsB,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC;wBAChD,oBAAoB,KAAK,CAAC,CAAC;oBAE7B,sBAAsB,CACpB,aAAa,CAAC,IAAI,EAClB,kBAAkB,EAClB,aAAa,CACd,CAAC;gBACJ,CAAC,EACD,UAAU,EACR,CAAC,kBAAkB;oBACnB,sBAAsB,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC,EAElD,YAAY,EACV,aAAa,CAAC,IAAI,KAAK,SAAS;oBAC9B,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,YAGhD,MAAA,aAAa,CAAC,IAAI,mCAAI,UAAU,KAAK,EAAE,IA3BnC,MAAA,aAAa,CAAC,IAAI,mCAAI,KAAK,CA4BrB,CACd,CAAA;SAAA,CAAC,IACW,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n useLegendHoverHighlight,\n useLegendSelection,\n} from './hooks/use-legend-interactions';\nimport { useLegendVisibility } from './hooks/use-legend-visibility';\nimport { LegendItem } from './LegendItem';\nimport { LegendLayout } from './LegendLayout';\nimport { type CommonProps, type LegendProps } from './utils/chart-types';\n\ntype LegendComponentProps = LegendProps & {\n isLayoutReady?: boolean;\n onLayoutReady?: () => void;\n};\n\n/**\n * Renders the interactive chart legend and keeps legend state synchronized with\n * ECharts.\n *\n * The component owns the React-side selected-series state, mirrors it into the\n * shared ref consumed when rebuilding chart options, and wires item hover/click\n * interactions back to the ECharts instance.\n */\nexport const Legend = ({\n className,\n series,\n isLayoutReady = true,\n onLayoutReady,\n htmlAttributes,\n ...restProps\n}: Omit<CommonProps<'div', LegendComponentProps>, 'ref'>) => {\n const { renderedSelectedSeries } = useLegendSelection({\n series,\n });\n\n const { toggleHighlight } = useLegendHoverHighlight({\n selectedSeries: renderedSelectedSeries,\n series,\n });\n\n const { toggleLegendVisibility } = useLegendVisibility(\n renderedSelectedSeries,\n );\n\n const selectedSeriesLength = Object.values(renderedSelectedSeries).filter(\n Boolean,\n ).length;\n const isAllSeriesVisible = selectedSeriesLength === series.length;\n const hasMoreThanOneItem = series.length > 1;\n\n return (\n <LegendLayout\n className={className}\n isLayoutReady={isLayoutReady}\n itemCount={series.length}\n onLayoutReady={onLayoutReady}\n htmlAttributes={htmlAttributes}\n {...restProps}\n >\n {series.map((currentSeries, index) => (\n <LegendItem\n key={currentSeries.name ?? index}\n name={currentSeries.name}\n color={currentSeries.color}\n hasButtons={hasMoreThanOneItem && currentSeries.name !== undefined}\n onLegendItemMouseEnter={() => toggleHighlight(currentSeries, true)}\n onLegendItemMouseLeave={() => toggleHighlight(currentSeries, false)}\n onLegendItemClick={() => {\n const isOnlyVisible =\n renderedSelectedSeries[currentSeries.name ?? ''] &&\n selectedSeriesLength === 1;\n\n toggleLegendVisibility(\n currentSeries.name,\n isAllSeriesVisible,\n isOnlyVisible,\n );\n }}\n isSelected={\n !isAllSeriesVisible &&\n renderedSelectedSeries[currentSeries.name ?? '']\n }\n isDeselected={\n currentSeries.name === undefined\n ? false\n : !renderedSelectedSeries[currentSeries.name]\n }\n >\n {currentSeries.name ?? `Series ${index}`}\n </LegendItem>\n ))}\n </LegendLayout>\n );\n};\n"]}
@@ -43,11 +43,11 @@ import { isThresholdLine } from './utils/threshold';
43
43
  */
44
44
  export const LegendItem = (_a) => {
45
45
  var _b;
46
- var { children, as, className, name, selected, deSelected, onLegendItemClick, color, hasButtons = true, ref, onLegendItemMouseEnter, onLegendItemMouseLeave } = _a, restProps = __rest(_a, ["children", "as", "className", "name", "selected", "deSelected", "onLegendItemClick", "color", "hasButtons", "ref", "onLegendItemMouseEnter", "onLegendItemMouseLeave"]);
46
+ var { children, as, className, name, isSelected, isDeselected, onLegendItemClick, color, hasButtons = true, ref, onLegendItemMouseEnter, onLegendItemMouseLeave } = _a, restProps = __rest(_a, ["children", "as", "className", "name", "isSelected", "isDeselected", "onLegendItemClick", "color", "hasButtons", "ref", "onLegendItemMouseEnter", "onLegendItemMouseLeave"]);
47
47
  const Component = as !== null && as !== void 0 ? as : (hasButtons ? 'button' : 'div');
48
48
  const classes = classNames('ndl-chart-legend-item', {
49
- 'ndl-chart-legend-item-deselected': deSelected,
50
- 'ndl-chart-legend-item-selected': selected,
49
+ 'ndl-chart-legend-item-deselected': isDeselected,
50
+ 'ndl-chart-legend-item-selected': isSelected,
51
51
  }, className);
52
52
  // We don't want to display threshold lines in the legend
53
53
  if ((_b = isThresholdLine(name)) !== null && _b !== void 0 ? _b : false) {
@@ -55,7 +55,7 @@ export const LegendItem = (_a) => {
55
55
  }
56
56
  return (_jsxs(Component, Object.assign({ className: classes, ref: ref, "data-labelname": name, title: name, onClick: hasButtons ? onLegendItemClick : undefined, onMouseEnter: onLegendItemMouseEnter, onMouseLeave: onLegendItemMouseLeave }, restProps, { children: [_jsx("span", { className: "ndl-chart-legend-item-square", style: {
57
57
  '--ndl-chart-legend-item-color': color,
58
- backgroundColor: deSelected === true ? 'transparent' : color,
59
- }, children: selected === true && (_jsx(CheckIconOutline, { className: "ndl-chart-legend-item-square-checkmark" })) }), _jsx(Typography, { variant: "body-medium", className: "ndl-chart-legend-item-text", children: children })] })));
58
+ backgroundColor: isDeselected === true ? 'transparent' : color,
59
+ }, children: isSelected === true && (_jsx(CheckIconOutline, { className: "ndl-chart-legend-item-square-checkmark" })) }), _jsx(Typography, { variant: "body-medium", className: "ndl-chart-legend-item-text", children: children })] })));
60
60
  };
61
61
  //# sourceMappingURL=LegendItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LegendItem.js","sourceRoot":"","sources":["../../../src/charts/LegendItem.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAcT,EAAE,EAAE;;QAdK,EACzB,QAAQ,EACR,EAAE,EACF,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,KAAK,EACL,UAAU,GAAG,IAAI,EACjB,GAAG,EACH,sBAAsB,EACtB,sBAAsB,OAEN,EADb,SAAS,cAba,wKAc1B,CADa;IAEZ,MAAM,SAAS,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,UAAU,CACxB,uBAAuB,EACvB;QACE,kCAAkC,EAAE,UAAU;QAC9C,gCAAgC,EAAE,QAAQ;KAC3C,EACD,SAAS,CACV,CAAC;IAEF,yDAAyD;IACzD,IAAI,MAAA,eAAe,CAAC,IAAI,CAAC,mCAAI,KAAK,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAC,SAAS,kBACR,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,GAAG,oBACQ,IAAI,EACpB,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EACnD,YAAY,EAAE,sBAAsB,EACpC,YAAY,EAAE,sBAAsB,IAChC,SAAS,eAEb,eACE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EACH;oBACE,+BAA+B,EAAE,KAAK;oBACtC,eAAe,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK;iBACtC,YAGzB,QAAQ,KAAK,IAAI,IAAI,CACpB,KAAC,gBAAgB,IAAC,SAAS,EAAC,wCAAwC,GAAG,CACxE,GACI,EACP,KAAC,UAAU,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,4BAA4B,YACrE,QAAQ,GACE,KACH,CACb,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { Typography } from '@neo4j-ndl/react';\nimport { CheckIconOutline } from '@neo4j-ndl/react/icons';\nimport classNames from 'classnames';\nimport type React from 'react';\n\nimport { type LegendItemProps } from './utils/chart-types';\nimport { isThresholdLine } from './utils/threshold';\n\n/**\n * Renders a single legend entry with its series color, selection indicator, and\n * optional button semantics.\n *\n * Threshold-line series are intentionally skipped because they are chart\n * annotations rather than user-toggleable data series.\n */\nexport const LegendItem = ({\n children,\n as,\n className,\n name,\n selected,\n deSelected,\n onLegendItemClick,\n color,\n hasButtons = true,\n ref,\n onLegendItemMouseEnter,\n onLegendItemMouseLeave,\n ...restProps\n}: LegendItemProps) => {\n const Component = as ?? (hasButtons ? 'button' : 'div');\n\n const classes = classNames(\n 'ndl-chart-legend-item',\n {\n 'ndl-chart-legend-item-deselected': deSelected,\n 'ndl-chart-legend-item-selected': selected,\n },\n className,\n );\n\n // We don't want to display threshold lines in the legend\n if (isThresholdLine(name) ?? false) {\n return null;\n }\n\n return (\n <Component\n className={classes}\n ref={ref}\n data-labelname={name}\n title={name}\n onClick={hasButtons ? onLegendItemClick : undefined}\n onMouseEnter={onLegendItemMouseEnter}\n onMouseLeave={onLegendItemMouseLeave}\n {...restProps}\n >\n <span\n className=\"ndl-chart-legend-item-square\"\n style={\n {\n '--ndl-chart-legend-item-color': color,\n backgroundColor: deSelected === true ? 'transparent' : color,\n } as React.CSSProperties\n }\n >\n {selected === true && (\n <CheckIconOutline className=\"ndl-chart-legend-item-square-checkmark\" />\n )}\n </span>\n <Typography variant=\"body-medium\" className=\"ndl-chart-legend-item-text\">\n {children}\n </Typography>\n </Component>\n );\n};\n"]}
1
+ {"version":3,"file":"LegendItem.js","sourceRoot":"","sources":["../../../src/charts/LegendItem.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAcT,EAAE,EAAE;;QAdK,EACzB,QAAQ,EACR,EAAE,EACF,SAAS,EACT,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,UAAU,GAAG,IAAI,EACjB,GAAG,EACH,sBAAsB,EACtB,sBAAsB,OAEN,EADb,SAAS,cAba,4KAc1B,CADa;IAEZ,MAAM,SAAS,GAAG,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,UAAU,CACxB,uBAAuB,EACvB;QACE,kCAAkC,EAAE,YAAY;QAChD,gCAAgC,EAAE,UAAU;KAC7C,EACD,SAAS,CACV,CAAC;IAEF,yDAAyD;IACzD,IAAI,MAAA,eAAe,CAAC,IAAI,CAAC,mCAAI,KAAK,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,MAAC,SAAS,kBACR,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE,GAAG,oBACQ,IAAI,EACpB,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EACnD,YAAY,EAAE,sBAAsB,EACpC,YAAY,EAAE,sBAAsB,IAChC,SAAS,eAEb,eACE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EACH;oBACE,+BAA+B,EAAE,KAAK;oBACtC,eAAe,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK;iBACxC,YAGzB,UAAU,KAAK,IAAI,IAAI,CACtB,KAAC,gBAAgB,IAAC,SAAS,EAAC,wCAAwC,GAAG,CACxE,GACI,EACP,KAAC,UAAU,IAAC,OAAO,EAAC,aAAa,EAAC,SAAS,EAAC,4BAA4B,YACrE,QAAQ,GACE,KACH,CACb,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { Typography } from '@neo4j-ndl/react';\nimport { CheckIconOutline } from '@neo4j-ndl/react/icons';\nimport classNames from 'classnames';\nimport type React from 'react';\n\nimport { type LegendItemProps } from './utils/chart-types';\nimport { isThresholdLine } from './utils/threshold';\n\n/**\n * Renders a single legend entry with its series color, selection indicator, and\n * optional button semantics.\n *\n * Threshold-line series are intentionally skipped because they are chart\n * annotations rather than user-toggleable data series.\n */\nexport const LegendItem = ({\n children,\n as,\n className,\n name,\n isSelected,\n isDeselected,\n onLegendItemClick,\n color,\n hasButtons = true,\n ref,\n onLegendItemMouseEnter,\n onLegendItemMouseLeave,\n ...restProps\n}: LegendItemProps) => {\n const Component = as ?? (hasButtons ? 'button' : 'div');\n\n const classes = classNames(\n 'ndl-chart-legend-item',\n {\n 'ndl-chart-legend-item-deselected': isDeselected,\n 'ndl-chart-legend-item-selected': isSelected,\n },\n className,\n );\n\n // We don't want to display threshold lines in the legend\n if (isThresholdLine(name) ?? false) {\n return null;\n }\n\n return (\n <Component\n className={classes}\n ref={ref}\n data-labelname={name}\n title={name}\n onClick={hasButtons ? onLegendItemClick : undefined}\n onMouseEnter={onLegendItemMouseEnter}\n onMouseLeave={onLegendItemMouseLeave}\n {...restProps}\n >\n <span\n className=\"ndl-chart-legend-item-square\"\n style={\n {\n '--ndl-chart-legend-item-color': color,\n backgroundColor: isDeselected === true ? 'transparent' : color,\n } as React.CSSProperties\n }\n >\n {isSelected === true && (\n <CheckIconOutline className=\"ndl-chart-legend-item-square-checkmark\" />\n )}\n </span>\n <Typography variant=\"body-medium\" className=\"ndl-chart-legend-item-text\">\n {children}\n </Typography>\n </Component>\n );\n};\n"]}
@@ -31,7 +31,7 @@ export function PieChartWithRerenderComponent({ dataset1, dataset2, datasetNewCa
31
31
  : renderCount % 2 === 0
32
32
  ? dataset1
33
33
  : dataset2;
34
- return (_jsxs("div", { children: [_jsxs("div", { style: { display: 'flex', gap: '8px', marginBottom: '12px' }, children: [_jsx("button", { type: "button", "data-testid": "rerender-button", onClick: () => setRenderCount((count) => count + 1), children: "Re-render" }), _jsx("button", { type: "button", "data-testid": "switch-categories-button", onClick: () => setShouldUseNewCategories((value) => !value), children: "Switch categories" }), _jsx("span", { "data-testid": "render-count", children: chartRenderCount.current })] }), _jsx("div", { style: { height: '350px', width: '100%' }, children: _jsx(Chart, { legend: { show: true }, series: [
34
+ return (_jsxs("div", { children: [_jsxs("div", { style: { display: 'flex', gap: '8px', marginBottom: '12px' }, children: [_jsx("button", { type: "button", "data-testid": "rerender-button", onClick: () => setRenderCount((count) => count + 1), children: "Re-render" }), _jsx("button", { type: "button", "data-testid": "switch-categories-button", onClick: () => setShouldUseNewCategories((value) => !value), children: "Switch categories" }), _jsx("span", { "data-testid": "render-count", children: chartRenderCount.current })] }), _jsx("div", { style: { height: '350px', width: '100%' }, children: _jsx(Chart, { legend: { isVisible: true }, series: [
35
35
  {
36
36
  center: ['50%', '50%'],
37
37
  encode: { itemName: 'product', value: '2015' },
@@ -1 +1 @@
1
- {"version":3,"file":"PieChartWithRerender.js","sourceRoot":"","sources":["../../../../src/charts/tests/PieChartWithRerender.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQzC,MAAM,UAAU,6BAA6B,CAAC,EAC5C,QAAQ,EACR,QAAQ,EACR,oBAAoB,GACM;IAC1B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,gBAAgB,CAAC,OAAO,IAAI,CAAC,CAAC;IAE9B,MAAM,cAAc,GAAG,sBAAsB;QAC3C,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC;IAEf,OAAO,CACL,0BACE,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAC/D,iBACE,IAAI,EAAC,QAAQ,iBACD,iBAAiB,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,0BAG5C,EACT,iBACE,IAAI,EAAC,QAAQ,iBACD,0BAA0B,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,kCAGpD,EACT,8BAAkB,cAAc,YAAE,gBAAgB,CAAC,OAAO,GAAQ,IAC9D,EACN,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAC5C,KAAC,KAAK,IACJ,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EACtB,MAAM,EAAE;wBACN;4BACE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;4BACtB,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;4BAC9C,MAAM,EAAE,KAAK;4BACb,IAAI,EAAE,KAAK;yBACZ;qBACF,EACD,OAAO,EAAE,cAAc,GACvB,GACE,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport type { EChartsOption } from 'echarts';\nimport { useRef, useState } from 'react';\n\ntype PieChartWithRerenderProps = {\n dataset1: EChartsOption['dataset'];\n dataset2: EChartsOption['dataset'];\n datasetNewCategories: EChartsOption['dataset'];\n};\n\nexport function PieChartWithRerenderComponent({\n dataset1,\n dataset2,\n datasetNewCategories,\n}: PieChartWithRerenderProps) {\n const [renderCount, setRenderCount] = useState(0);\n const [shouldUseNewCategories, setShouldUseNewCategories] = useState(false);\n const chartRenderCount = useRef(0);\n chartRenderCount.current += 1;\n\n const currentDataset = shouldUseNewCategories\n ? datasetNewCategories\n : renderCount % 2 === 0\n ? dataset1\n : dataset2;\n\n return (\n <div>\n <div style={{ display: 'flex', gap: '8px', marginBottom: '12px' }}>\n <button\n type=\"button\"\n data-testid=\"rerender-button\"\n onClick={() => setRenderCount((count) => count + 1)}\n >\n Re-render\n </button>\n <button\n type=\"button\"\n data-testid=\"switch-categories-button\"\n onClick={() => setShouldUseNewCategories((value) => !value)}\n >\n Switch categories\n </button>\n <span data-testid=\"render-count\">{chartRenderCount.current}</span>\n </div>\n <div style={{ height: '350px', width: '100%' }}>\n <Chart\n legend={{ show: true }}\n series={[\n {\n center: ['50%', '50%'],\n encode: { itemName: 'product', value: '2015' },\n radius: '90%',\n type: 'pie',\n },\n ]}\n dataset={currentDataset}\n />\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"PieChartWithRerender.js","sourceRoot":"","sources":["../../../../src/charts/tests/PieChartWithRerender.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQzC,MAAM,UAAU,6BAA6B,CAAC,EAC5C,QAAQ,EACR,QAAQ,EACR,oBAAoB,GACM;IAC1B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,gBAAgB,CAAC,OAAO,IAAI,CAAC,CAAC;IAE9B,MAAM,cAAc,GAAG,sBAAsB;QAC3C,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,QAAQ,CAAC;IAEf,OAAO,CACL,0BACE,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAC/D,iBACE,IAAI,EAAC,QAAQ,iBACD,iBAAiB,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,0BAG5C,EACT,iBACE,IAAI,EAAC,QAAQ,iBACD,0BAA0B,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,kCAGpD,EACT,8BAAkB,cAAc,YAAE,gBAAgB,CAAC,OAAO,GAAQ,IAC9D,EACN,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAC5C,KAAC,KAAK,IACJ,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAC3B,MAAM,EAAE;wBACN;4BACE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;4BACtB,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;4BAC9C,MAAM,EAAE,KAAK;4BACb,IAAI,EAAE,KAAK;yBACZ;qBACF,EACD,OAAO,EAAE,cAAc,GACvB,GACE,IACF,CACP,CAAC;AACJ,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport type { EChartsOption } from 'echarts';\nimport { useRef, useState } from 'react';\n\ntype PieChartWithRerenderProps = {\n dataset1: EChartsOption['dataset'];\n dataset2: EChartsOption['dataset'];\n datasetNewCategories: EChartsOption['dataset'];\n};\n\nexport function PieChartWithRerenderComponent({\n dataset1,\n dataset2,\n datasetNewCategories,\n}: PieChartWithRerenderProps) {\n const [renderCount, setRenderCount] = useState(0);\n const [shouldUseNewCategories, setShouldUseNewCategories] = useState(false);\n const chartRenderCount = useRef(0);\n chartRenderCount.current += 1;\n\n const currentDataset = shouldUseNewCategories\n ? datasetNewCategories\n : renderCount % 2 === 0\n ? dataset1\n : dataset2;\n\n return (\n <div>\n <div style={{ display: 'flex', gap: '8px', marginBottom: '12px' }}>\n <button\n type=\"button\"\n data-testid=\"rerender-button\"\n onClick={() => setRenderCount((count) => count + 1)}\n >\n Re-render\n </button>\n <button\n type=\"button\"\n data-testid=\"switch-categories-button\"\n onClick={() => setShouldUseNewCategories((value) => !value)}\n >\n Switch categories\n </button>\n <span data-testid=\"render-count\">{chartRenderCount.current}</span>\n </div>\n <div style={{ height: '350px', width: '100%' }}>\n <Chart\n legend={{ isVisible: true }}\n series={[\n {\n center: ['50%', '50%'],\n encode: { itemName: 'product', value: '2015' },\n radius: '90%',\n type: 'pie',\n },\n ]}\n dataset={currentDataset}\n />\n </div>\n </div>\n );\n}\n"]}
@@ -69,7 +69,7 @@ export const pieChartProps = (seriesName, value, rgbSeriesColor) => ({
69
69
  },
70
70
  ],
71
71
  legend: {
72
- show: true,
72
+ isVisible: true,
73
73
  },
74
74
  series: [
75
75
  {
@@ -92,7 +92,7 @@ export const barChartProps = (seriesName, value, rgbSeriesColor) => ({
92
92
  source: [['Finland', value]],
93
93
  },
94
94
  legend: {
95
- show: true,
95
+ isVisible: true,
96
96
  },
97
97
  series: [
98
98
  {
@@ -123,7 +123,7 @@ y, rgbSeriesColor, tooltipTitle = 'point-a') => ({
123
123
  source: [['row-id', x, y, tooltipTitle]],
124
124
  },
125
125
  legend: {
126
- show: true,
126
+ isVisible: true,
127
127
  },
128
128
  series: [
129
129
  {
@@ -165,7 +165,7 @@ export const overlappingScatterChartProps = {
165
165
  ],
166
166
  },
167
167
  legend: {
168
- show: true,
168
+ isVisible: true,
169
169
  },
170
170
  series: [
171
171
  {
@@ -203,7 +203,7 @@ export const multiSeriesChartProps = {
203
203
  ],
204
204
  },
205
205
  legend: {
206
- show: true,
206
+ isVisible: true,
207
207
  },
208
208
  option: {},
209
209
  series: [
@@ -1 +1 @@
1
- {"version":3,"file":"chart-test-utils.js","sourceRoot":"","sources":["../../../../src/charts/tests/chart-test-utils.tsx"],"names":[],"mappings":"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","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { tokens } from '@neo4j-ndl/base';\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport { expect } from '@playwright/experimental-ct-react';\nimport { type Page } from '@playwright/test';\nimport { type ComponentProps } from 'react';\n\nimport { ChartWrapperWithTooltipFormatter } from './ChartWrapperWithTooltipFormatter';\n\n/**\n * Convert hex color to rgb format\n *\n * @param hex - Color in hex code format\n * @returns color in rgb format rgb(_, _, _)\n */\nconst convertHexToRGB = (hex: string) => {\n const normalizedHex = hex.replace(/^#/, '');\n\n const red = parseInt(normalizedHex.substring(0, 2), 16);\n const green = parseInt(normalizedHex.substring(2, 4), 16);\n const blue = parseInt(normalizedHex.substring(4, 6), 16);\n\n return `rgb(${red}, ${green}, ${blue})`;\n};\n\nexport const chartColorsAfterHighlighting: Record<number, string> = {\n 1: 'rgb(93,207,216)',\n 2: 'rgb(84,80,223)',\n 3: 'rgb(242,152,62)',\n 4: 'rgb(221,75,155)',\n 5: 'rgb(156,154,255)',\n 6: 'rgb(132,244,136)',\n 7: 'rgb(69,140,249)',\n 8: 'rgb(113,69,188)',\n 9: 'rgb(240,210,70)',\n 10: 'rgb(210,126,49)',\n 11: 'rgb(78,151,121)',\n 12: 'rgb(190,255,117)',\n};\n\nexport const pieChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: [\n {\n source: [\n ['product', '2012'],\n [seriesName, value],\n ],\n },\n ],\n legend: {\n show: true,\n },\n series: [\n {\n center: ['50%', '50%'],\n encode: {\n itemName: 'product',\n value: '2012',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n radius: '90%',\n type: 'pie' as const,\n },\n ],\n});\n\nexport const barChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: {\n dimensions: ['Country', 'Sales'],\n source: [['Finland', value]],\n },\n legend: {\n show: true,\n },\n series: [\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'Country', y: 'Sales' },\n itemStyle: {\n color: rgbSeriesColor,\n },\n name: seriesName,\n type: 'bar' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n});\n\nexport const scatterChartProps = (\n seriesName: string,\n // oxlint-disable-next-line id-length\n x: number,\n // oxlint-disable-next-line id-length\n y: number,\n rgbSeriesColor: string,\n tooltipTitle = 'point-a',\n) => ({\n dataset: {\n dimensions: ['id', 'x', 'y', 'label'],\n source: [['row-id', x, y, tooltipTitle]],\n },\n legend: {\n show: true,\n },\n series: [\n {\n color: rgbSeriesColor,\n encode: {\n tooltip: 'label',\n // oxlint-disable-next-line id-length\n x: 'x',\n // oxlint-disable-next-line id-length\n y: 'y',\n },\n name: seriesName,\n type: 'scatter' as const,\n },\n ],\n xAxis: {\n name: 'Duration',\n type: 'value' as const,\n },\n yAxis: {\n name: 'Latency',\n type: 'value' as const,\n },\n});\n\n/**\n * Two points sit a fraction of a unit apart and a third shares the coordinates\n * of the first exactly, so their symbols overlap at any reasonable chart size,\n * while the remaining points stay far away.\n */\nexport const overlappingScatterChartProps = {\n dataset: {\n source: [\n ['id', 'x', 'y', 'label'],\n ['id-near-one', 50, 50, 'near-one'],\n ['id-near-two', 50.2, 50.1, 'near-two'],\n ['id-same-spot', 50, 50, 'same-spot'],\n ['id-far-away', 95, 95, 'far-away'],\n ['id-origin', 5, 5, 'origin'],\n ],\n },\n legend: {\n show: true,\n },\n series: [\n {\n color: 'rgb(93,207,216)',\n encode: {\n tooltip: 'label',\n // oxlint-disable-next-line id-length\n x: 'x',\n // oxlint-disable-next-line id-length\n y: 'y',\n },\n name: 'Measurements',\n type: 'scatter' as const,\n },\n ],\n xAxis: {\n name: 'Duration',\n type: 'value' as const,\n },\n yAxis: {\n name: 'Latency',\n type: 'value' as const,\n },\n};\n\nexport const overlappingScatterChart = ({\n width = '100%',\n height = '400px',\n}: {\n width?: string;\n height?: string;\n} = {}) => (\n <div style={{ height, width }}>\n <Chart {...overlappingScatterChartProps} />\n </div>\n);\n\nexport const multiSeriesChartProps = {\n dataset: {\n dimensions: ['day', 'first', 'second', 'third', 'fourth', 'fifth', 'sixth'],\n source: [\n ['Monday', 20, 40, 60, 80, 100, 120],\n ['Tuesday', 30, 50, 70, 90, 110, 130],\n ['Wednesday', 25, 45, 65, 85, 105, 125],\n ['Thursday', 35, 55, 75, 95, 115, 135],\n ['Friday', 40, 60, 80, 100, 120, 140],\n ],\n },\n legend: {\n show: true,\n },\n option: {},\n series: [\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'first' },\n name: 'First Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'second' },\n name: 'Second Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'third' },\n name: 'Third Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'fourth' },\n name: 'Fourth Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'fifth' },\n name: 'Fifth Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'sixth' },\n name: 'Sixth Series',\n type: 'line' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n};\n\nexport const multiSeriesChart = ({\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n}) => (\n <div style={{ height, width }} className=\"ndl-chart\">\n <Chart {...multiSeriesChartProps} {...chartProps} />\n </div>\n);\n\nexport const pieChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...pieChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const scatterChartWithTooltipFormatter = ({\n seriesName,\n // oxlint-disable-next-line id-length\n x,\n // oxlint-disable-next-line id-length\n y,\n rgbSeriesColor,\n tooltipTitle = 'point-a',\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n tooltipTitle?: string;\n // oxlint-disable-next-line id-length\n x: number;\n // oxlint-disable-next-line id-length\n y: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...scatterChartProps(seriesName, x, y, rgbSeriesColor, tooltipTitle)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChart = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <Chart\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const expectChartElementVisible = async (page: Page) => {\n await expect(page.locator('svg').first()).toBeVisible();\n await expect(page.locator('.ndl-chart-legend')).toBeVisible();\n};\n\nexport const startLegendMeasuringObserver = async (\n page: Page,\n options: { chartLayoutSelector?: string } = {},\n) => {\n await page.evaluate(({ chartLayoutSelector }) => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n const legendElement = document.querySelector('.ndl-chart-legend');\n const chartLayout = chartLayoutSelector\n ? document.querySelector(chartLayoutSelector)\n : undefined;\n\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement = undefined;\n windowWithLegendObserver.__legendMeasuringClassWasAdded = false;\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n if (!legendElement) {\n return;\n }\n\n const observer = new MutationObserver(() => {\n if (!legendElement.classList.contains('ndl-chart-legend-calculating')) {\n return;\n }\n\n windowWithLegendObserver.__legendMeasuringClassWasAdded = true;\n\n if (\n chartLayout &&\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement ===\n undefined\n ) {\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement =\n chartLayout.getBoundingClientRect().height;\n }\n });\n\n observer.observe(legendElement, {\n attributeFilter: ['class'],\n attributes: true,\n });\n windowWithLegendObserver.__legendMeasuringObserver = observer;\n }, options);\n};\n\nexport const getLegendMeasuringObserverResult = async (page: Page) =>\n page.evaluate(() => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n return {\n chartHeightDuringMeasurement:\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement,\n didAddMeasuringClass:\n windowWithLegendObserver.__legendMeasuringClassWasAdded ?? false,\n };\n });\n\nconst SELECTORS = {\n CHECKMARK:\n '.ndl-chart-legend > .ndl-chart-legend-item .ndl-chart-legend-item-square-checkmark',\n DESELECTED: '.ndl-chart-legend > .ndl-chart-legend-item-deselected',\n seriesCheckmark: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"] .ndl-chart-legend-item-square-checkmark`,\n seriesDeselected: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"].ndl-chart-legend-item-deselected`,\n} as const;\n\nconst getGraphPaletteColorFromSeriesIndex = (index: string): string => {\n const hexColor = tokens.categorical[index as keyof typeof tokens.categorical];\n if (!hexColor) {\n throw new Error(`Categorical palette index ${index} not found`);\n }\n\n return hexColor;\n};\n\n/**\n * Checks so a single series is not blurred.\n */\nexport const expectSingleSeriesNotToBeBlurred = async (\n page: Page,\n seriesName: string,\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n const seriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === seriesName) +\n 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[seriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n seriesIndex.toString(),\n );\n\n // More flexible color matching - try both with and without spaces\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n // Wait for the element to be attached to the DOM before checking its attributes\n await expect(pathLocator).toBeAttached({ timeout: 10000 });\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n};\n\n/**\n * Checks so that the seriesNamesToBeHighlighted are visible in the chart and that other series are blurred.\n */\nexport const expectLegendSeriesToBeHighlightedInChart = async (\n page: Page,\n seriesNamesToBeHighlighted: string[],\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n for (const name of seriesNamesToBeHighlighted) {\n const highlightedSeriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === name) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[highlightedSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n highlightedSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n }\n\n const seriesToBeBlurred = allChartSeries.filter(\n (series) => !seriesNamesToBeHighlighted.includes(series.name),\n );\n\n for (const series of seriesToBeBlurred) {\n const blurredSeriesIndex =\n allChartSeries.findIndex(\n (seriesItem) => seriesItem.name === series.name,\n ) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[blurredSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n blurredSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).toHaveAttribute('stroke-opacity');\n }\n};\n\n/**\n * Identifies if the series are visible / not visible in the chart by checking\n * component-owned legend state. ECharts rewrites generated SVG paths during\n * legend updates, which makes exact path color selectors flaky in Firefox.\n */\nexport const expectLegendSeriesToBeVisibleInChart = async (\n page: Page,\n seriesNamesToBeVisible: string[],\n) => {\n await expect(page.locator('svg path').first()).toBeAttached();\n\n for (const name of seriesNamesToBeVisible) {\n const visibleLegendItem = page.locator(\n `.ndl-chart-legend > [data-labelname=\"${name}\"]`,\n );\n\n if ((await visibleLegendItem.count()) > 0) {\n await expect(visibleLegendItem).not.toHaveClass(\n /ndl-chart-legend-item-deselected/,\n );\n }\n }\n\n const hiddenSeries = multiSeriesChartProps.series.filter(\n (series) => !seriesNamesToBeVisible.includes(series.name),\n );\n\n for (const hiddenSeriesItem of hiddenSeries) {\n const hiddenLegendItem = page.locator(\n SELECTORS.seriesDeselected(hiddenSeriesItem.name),\n );\n\n if ((await hiddenLegendItem.count()) > 0) {\n await expect(hiddenLegendItem).toBeVisible();\n }\n }\n};\n\n// Check so legends are selected -> has checkmark and no strike-through classes\nexport const expectLegendsSelected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesCheckmark(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesDeselected(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so legends are deselected -> has strike-through and no checkmark classes\nexport const expectLegendsDeselected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesDeselected(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesCheckmark(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so all legends are neutral -> no checkmark and no strike-through classes\nexport const expectAllLegendsNeutral = async (page: Page) => {\n await expect(page.locator(SELECTORS.CHECKMARK)).not.toBeVisible();\n await expect(page.locator(SELECTORS.DESELECTED)).not.toBeVisible();\n};\n\n/**\n * Clicks the series legend item and hover the chart to make sure no blur effect exists on other series in the chart.\n * This is needed to make sure the series has the correct color when looking for them in the chart in later steps.\n */\nexport const clickSeries = async (page: Page, seriesName: string) => {\n await page\n .locator(`.ndl-chart-legend > [data-labelname=\"${seriesName}\"]`)\n .click();\n await page.hover('.ndl-chart');\n};\n\nexport const expectFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n await expect(\n page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`)),\n ).toBeVisible();\n await page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`))\n .hover();\n const tooltip = page.getByText(`${seriesName}formatted ${value}`);\n await expect(tooltip).toBeVisible();\n};\n\n/**\n * Scatter points are rings, so the series color is the stroke. The fill is the\n * theme surface color until hover paints it.\n */\nexport const scatterPointLocator = (page: Page, rgbSeriesColor: string) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n return page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`));\n};\n\nexport const expectScatterTooltipToBeVisible = async (\n page: Page,\n tooltipTitle: string,\n // oxlint-disable-next-line id-length\n x: number,\n // oxlint-disable-next-line id-length\n y: number,\n rgbSeriesColor: string,\n) => {\n const chartElement = scatterPointLocator(page, rgbSeriesColor);\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n // Scatter uses an item tooltip: encode.tooltip titles it, then the axis-named\n // x and y rows follow.\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(tooltipTitle);\n await expect(tooltip).not.toContainText('row-id');\n await expect(tooltip).toContainText(`Duration`);\n await expect(tooltip).toContainText(`formatted ${x}`);\n await expect(tooltip).toContainText(`Latency`);\n await expect(tooltip).toContainText(`formatted ${y}`);\n\n // The point color belongs to the title row only, so the rows below it do not\n // repeat the swatch.\n await expect(\n tooltip.locator('.ndl-charts-chart-tooltip-title-indent-square'),\n ).toHaveCount(1);\n await expect(\n tooltip.locator('.ndl-charts-chart-tooltip-content-indent-square'),\n ).toHaveCount(0);\n};\n\nexport const expectDefaultFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n const chartElement = page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[fill=\"${rgbWithSpaces}\"]`));\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(seriesName);\n await expect(tooltip).toContainText(\n new Intl.NumberFormat('en-US').format(value),\n );\n};\n\nexport const waitForAnimationEnd = (page: Page, selector: string) => {\n return page\n .locator(selector)\n .evaluate((element) =>\n Promise.all(\n element.getAnimations().map((animation) => animation.finished),\n ),\n );\n};\n"]}
1
+ {"version":3,"file":"chart-test-utils.js","sourceRoot":"","sources":["../../../../src/charts/tests/chart-test-utils.tsx"],"names":[],"mappings":";;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAI3D,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE;IACtC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,OAAO,OAAO,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAA2B;IAClE,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,kBAAkB;IACrB,CAAC,EAAE,kBAAkB;IACrB,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,iBAAiB;IACpB,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,kBAAkB;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAkB,EAClB,KAAa,EACb,cAAsB,EACtB,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE;QACP;YACE,MAAM,EAAE;gBACN,CAAC,SAAS,EAAE,MAAM,CAAC;gBACnB,CAAC,UAAU,EAAE,KAAK,CAAC;aACpB;SACF;KACF;IACD,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE;QACN;YACE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,MAAM;aACd;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,cAAc;aACtB;YACD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,KAAc;SACrB;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,UAAkB,EAClB,KAAa,EACb,cAAsB,EACtB,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE;QACP,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;KAC7B;IACD,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE;QACN;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE;YACpC,SAAS,EAAE;gBACT,KAAK,EAAE,cAAc;aACtB;YACD,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,KAAc;SACrB;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,UAAmB;KAC1B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAgB;KACvB;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAAkB;AAClB,qCAAqC;AACrC,CAAS;AACT,qCAAqC;AACrC,CAAS,EACT,cAAsB,EACtB,YAAY,GAAG,SAAS,EACxB,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE;QACP,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;KACzC;IACD,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE;QACN;YACE,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;gBAChB,qCAAqC;gBACrC,CAAC,EAAE,GAAG;gBACN,qCAAqC;gBACrC,CAAC,EAAE,GAAG;aACP;YACD,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,SAAkB;SACzB;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAgB;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAgB;KACvB;CACF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,OAAO,EAAE;QACP,MAAM,EAAE;YACN,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;YACzB,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC;YACnC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;YACvC,CAAC,cAAc,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC;YACrC,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC;YACnC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;SAC9B;KACF;IACD,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE;QACN;YACE,KAAK,EAAE,iBAAiB;YACxB,MAAM,EAAE;gBACN,OAAO,EAAE,OAAO;gBAChB,qCAAqC;gBACrC,CAAC,EAAE,GAAG;gBACN,qCAAqC;gBACrC,CAAC,EAAE,GAAG;aACP;YACD,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAkB;SACzB;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAgB;KACvB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAgB;KACvB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EACtC,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,MAId,EAAE,EAAE,EAAE,CAAC,CACT,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAC3B,KAAC,KAAK,oBAAK,4BAA4B,EAAI,GACvC,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE;QACP,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;QAC3E,MAAM,EAAE;YACN,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;YACpC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;YACrC,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;YACvC,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;YACtC,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACtC;KACF;IACD,MAAM,EAAE;QACN,SAAS,EAAE,IAAI;KAChB;IACD,MAAM,EAAE,EAAE;IACV,MAAM,EAAE;QACN;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE;YAChC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAe;SACtB;QACD;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE;YACjC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,MAAe;SACtB;QACD;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE;YAChC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAe;SACtB;QACD;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE;YACjC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,MAAe;SACtB;QACD;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE;YAChC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAe;SACtB;QACD;YACE,qGAAqG;YACrG,qCAAqC;YACrC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE;YAChC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAe;SACtB;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,UAAmB;KAC1B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAgB;KACvB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,UAAU,EACV,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,GAKjB,EAAE,EAAE,CAAC,CACJ,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAC,WAAW,YAClD,KAAC,KAAK,oBAAK,qBAAqB,EAAM,UAAU,EAAI,GAChD,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,UAAU,EACV,KAAK,EACL,cAAc,EACd,UAAU,EACV,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,GAQjB,EAAE,EAAE,CAAC,CACJ,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAC3B,KAAC,gCAAgC,oBAC3B,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,EAChD,UAAU,EACd,GACE,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,UAAU,EACV,KAAK,EACL,cAAc,EACd,UAAU,EACV,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,GAQjB,EAAE,EAAE,CAAC,CACJ,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAC3B,KAAC,gCAAgC,oBAC3B,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,EAChD,UAAU,EACd,GACE,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,EAC/C,UAAU;AACV,qCAAqC;AACrC,CAAC;AACD,qCAAqC;AACrC,CAAC,EACD,cAAc,EACd,YAAY,GAAG,SAAS,EACxB,UAAU,EACV,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,GAYjB,EAAE,EAAE,CAAC,CACJ,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAC3B,KAAC,gCAAgC,oBAC3B,iBAAiB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EACjE,UAAU,EACd,GACE,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EACvB,UAAU,EACV,KAAK,EACL,cAAc,EACd,UAAU,EACV,KAAK,GAAG,MAAM,EACd,MAAM,GAAG,OAAO,GAQjB,EAAE,EAAE,CAAC,CACJ,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAC3B,KAAC,KAAK,oBACA,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,EAChD,UAAU,EACd,GACE,CACP,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAO,IAAU,EAAE,EAAE;IAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAG1C,EAAE,2DAFF,IAAU,EACV,UAA4C,EAAE;IAE9C,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE;;QAC9C,MAAM,wBAAwB,GAAG,MAKhC,CAAC;QACF,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,mBAAmB;YACrC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAC;QAEd,wBAAwB,CAAC,oCAAoC,GAAG,SAAS,CAAC;QAC1E,wBAAwB,CAAC,8BAA8B,GAAG,KAAK,CAAC;QAChE,MAAA,wBAAwB,CAAC,yBAAyB,0CAAE,UAAU,EAAE,CAAC;QAEjE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,wBAAwB,CAAC,8BAA8B,GAAG,IAAI,CAAC;YAE/D,IACE,WAAW;gBACX,wBAAwB,CAAC,oCAAoC;oBAC3D,SAAS,EACX,CAAC;gBACD,wBAAwB,CAAC,oCAAoC;oBAC3D,WAAW,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE;YAC9B,eAAe,EAAE,CAAC,OAAO,CAAC;YAC1B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,wBAAwB,CAAC,yBAAyB,GAAG,QAAQ,CAAC;IAChE,CAAC,EAAE,OAAO,CAAC,CAAC;AACd,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAO,IAAU,EAAE,EAAE;IACnE,OAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;;QACjB,MAAM,wBAAwB,GAAG,MAKhC,CAAC;QAEF,MAAA,wBAAwB,CAAC,yBAAyB,0CAAE,UAAU,EAAE,CAAC;QAEjE,OAAO;YACL,4BAA4B,EAC1B,wBAAwB,CAAC,oCAAoC;YAC/D,oBAAoB,EAClB,MAAA,wBAAwB,CAAC,8BAA8B,mCAAI,KAAK;SACnE,CAAC;IACJ,CAAC,CAAC,CAAA;EAAA,CAAC;AAEL,MAAM,SAAS,GAAG;IAChB,SAAS,EACP,oFAAoF;IACtF,UAAU,EAAE,uDAAuD;IACnE,eAAe,EAAE,CAAC,IAAY,EAAE,EAAE,CAChC,wCAAwC,IAAI,4CAA4C;IAC1F,gBAAgB,EAAE,CAAC,IAAY,EAAE,EAAE,CACjC,wCAAwC,IAAI,qCAAqC;CAC3E,CAAC;AAEX,MAAM,mCAAmC,GAAG,CAAC,KAAa,EAAU,EAAE;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,KAAwC,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,IAAU,EACV,UAAkB,EAClB,EAAE;IACF,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAEpD,MAAM,WAAW,GACf,cAAc,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC;QACxE,CAAC,CAAC;IAEJ,MAAM,cAAc,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,mCAAmC,CACxD,WAAW,CAAC,QAAQ,EAAE,CACvB,CAAC;IAEF,kEAAkE;IAClE,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,IAAI;SACrB,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC;SAC3C,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC;SACnD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC,CAAC;SACpD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;SACrE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAE1D,gFAAgF;IAChF,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;AAClE,CAAC,CAAA,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,IAAU,EACV,0BAAoC,EACpC,EAAE;IACF,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAC9C,MAAM,sBAAsB,GAC1B,cAAc,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QAEzE,MAAM,cAAc,GAAG,4BAA4B,CAAC,sBAAsB,CAAC,CAAC;QAC5E,MAAM,cAAc,GAAG,mCAAmC,CACxD,sBAAsB,CAAC,QAAQ,EAAE,CAClC,CAAC;QAEF,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,IAAI;aACrB,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC;aAC3C,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC;aACnD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC,CAAC;aACpD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aACrE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,gBAAgB,IAAI,CAAC,CAAC,CAAC;QAE1D,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAC7C,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC9D,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,MAAM,kBAAkB,GACtB,cAAc,CAAC,SAAS,CACtB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAChD,GAAG,CAAC,CAAC;QAER,MAAM,cAAc,GAAG,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,mCAAmC,CACxD,kBAAkB,CAAC,QAAQ,EAAE,CAC9B,CAAC;QAEF,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,IAAI;aACrB,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC;aAC3C,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC;aACnD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC,CAAC;aACpD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;aACrE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,gBAAgB,IAAI,CAAC,CAAC,CAAC;QAE1D,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAA,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAClD,IAAU,EACV,sBAAgC,EAChC,EAAE;IACF,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;IAE9D,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;QAC1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CACpC,wCAAwC,IAAI,IAAI,CACjD,CAAC;QAEF,IAAI,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,WAAW,CAC7C,kCAAkC,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CACtD,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAC1D,CAAC;IAEF,KAAK,MAAM,gBAAgB,IAAI,YAAY,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CACnC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAClD,CAAC;QAEF,IAAI,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAU,EACV,WAAqB,EACrB,EAAE;IACF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1E,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAC/C,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAU,EACV,WAAqB,EACrB,EAAE;IACF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3E,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAC9C,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAO,IAAU,EAAE,EAAE;IAC1D,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAClE,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;AACrE,CAAC,CAAA,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,IAAU,EAAE,UAAkB,EAAE,EAAE;IAClE,MAAM,IAAI;SACP,OAAO,CAAC,wCAAwC,UAAU,IAAI,CAAC;SAC/D,KAAK,EAAE,CAAC;IACX,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACjC,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,IAAU,EACV,UAAkB,EAClB,KAAa,EACb,cAAsB,EACtB,EAAE;IACF,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEzD,MAAM,MAAM,CACV,IAAI;SACD,OAAO,CAAC,cAAc,cAAc,IAAI,CAAC;SACzC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC,CACvD,CAAC,WAAW,EAAE,CAAC;IAChB,MAAM,IAAI;SACP,OAAO,CAAC,cAAc,cAAc,IAAI,CAAC;SACzC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC;SACnD,KAAK,EAAE,CAAC;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,UAAU,aAAa,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC,CAAA,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAU,EAAE,cAAsB,EAAE,EAAE;IACxE,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEzD,OAAO,IAAI;SACR,OAAO,CAAC,gBAAgB,cAAc,IAAI,CAAC;SAC3C,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,aAAa,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,IAAU,EACV,YAAoB;AACpB,qCAAqC;AACrC,CAAS;AACT,qCAAqC;AACrC,CAAS,EACT,cAAsB,EACtB,EAAE;IACF,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAE/D,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAE3B,8EAA8E;IAC9E,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACtD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEtD,6EAA6E;IAC7E,qBAAqB;IACrB,MAAM,MAAM,CACV,OAAO,CAAC,OAAO,CAAC,+CAA+C,CAAC,CACjE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACjB,MAAM,MAAM,CACV,OAAO,CAAC,OAAO,CAAC,iDAAiD,CAAC,CACnE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,IAAU,EACV,UAAkB,EAClB,KAAa,EACb,cAAsB,EACtB,EAAE;IACF,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAI;SACtB,OAAO,CAAC,cAAc,cAAc,IAAI,CAAC;SACzC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,aAAa,IAAI,CAAC,CAAC,CAAC;IAErD,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1D,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CACjC,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAC7C,CAAC;AACJ,CAAC,CAAA,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAU,EAAE,QAAgB,EAAE,EAAE;IAClE,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CACpB,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAC/D,CACF,CAAC;AACN,CAAC,CAAC","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { tokens } from '@neo4j-ndl/base';\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport { expect } from '@playwright/experimental-ct-react';\nimport { type Page } from '@playwright/test';\nimport { type ComponentProps } from 'react';\n\nimport { ChartWrapperWithTooltipFormatter } from './ChartWrapperWithTooltipFormatter';\n\n/**\n * Convert hex color to rgb format\n *\n * @param hex - Color in hex code format\n * @returns color in rgb format rgb(_, _, _)\n */\nconst convertHexToRGB = (hex: string) => {\n const normalizedHex = hex.replace(/^#/, '');\n\n const red = parseInt(normalizedHex.substring(0, 2), 16);\n const green = parseInt(normalizedHex.substring(2, 4), 16);\n const blue = parseInt(normalizedHex.substring(4, 6), 16);\n\n return `rgb(${red}, ${green}, ${blue})`;\n};\n\nexport const chartColorsAfterHighlighting: Record<number, string> = {\n 1: 'rgb(93,207,216)',\n 2: 'rgb(84,80,223)',\n 3: 'rgb(242,152,62)',\n 4: 'rgb(221,75,155)',\n 5: 'rgb(156,154,255)',\n 6: 'rgb(132,244,136)',\n 7: 'rgb(69,140,249)',\n 8: 'rgb(113,69,188)',\n 9: 'rgb(240,210,70)',\n 10: 'rgb(210,126,49)',\n 11: 'rgb(78,151,121)',\n 12: 'rgb(190,255,117)',\n};\n\nexport const pieChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: [\n {\n source: [\n ['product', '2012'],\n [seriesName, value],\n ],\n },\n ],\n legend: {\n isVisible: true,\n },\n series: [\n {\n center: ['50%', '50%'],\n encode: {\n itemName: 'product',\n value: '2012',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n radius: '90%',\n type: 'pie' as const,\n },\n ],\n});\n\nexport const barChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: {\n dimensions: ['Country', 'Sales'],\n source: [['Finland', value]],\n },\n legend: {\n isVisible: true,\n },\n series: [\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'Country', y: 'Sales' },\n itemStyle: {\n color: rgbSeriesColor,\n },\n name: seriesName,\n type: 'bar' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n});\n\nexport const scatterChartProps = (\n seriesName: string,\n // oxlint-disable-next-line id-length\n x: number,\n // oxlint-disable-next-line id-length\n y: number,\n rgbSeriesColor: string,\n tooltipTitle = 'point-a',\n) => ({\n dataset: {\n dimensions: ['id', 'x', 'y', 'label'],\n source: [['row-id', x, y, tooltipTitle]],\n },\n legend: {\n isVisible: true,\n },\n series: [\n {\n color: rgbSeriesColor,\n encode: {\n tooltip: 'label',\n // oxlint-disable-next-line id-length\n x: 'x',\n // oxlint-disable-next-line id-length\n y: 'y',\n },\n name: seriesName,\n type: 'scatter' as const,\n },\n ],\n xAxis: {\n name: 'Duration',\n type: 'value' as const,\n },\n yAxis: {\n name: 'Latency',\n type: 'value' as const,\n },\n});\n\n/**\n * Two points sit a fraction of a unit apart and a third shares the coordinates\n * of the first exactly, so their symbols overlap at any reasonable chart size,\n * while the remaining points stay far away.\n */\nexport const overlappingScatterChartProps = {\n dataset: {\n source: [\n ['id', 'x', 'y', 'label'],\n ['id-near-one', 50, 50, 'near-one'],\n ['id-near-two', 50.2, 50.1, 'near-two'],\n ['id-same-spot', 50, 50, 'same-spot'],\n ['id-far-away', 95, 95, 'far-away'],\n ['id-origin', 5, 5, 'origin'],\n ],\n },\n legend: {\n isVisible: true,\n },\n series: [\n {\n color: 'rgb(93,207,216)',\n encode: {\n tooltip: 'label',\n // oxlint-disable-next-line id-length\n x: 'x',\n // oxlint-disable-next-line id-length\n y: 'y',\n },\n name: 'Measurements',\n type: 'scatter' as const,\n },\n ],\n xAxis: {\n name: 'Duration',\n type: 'value' as const,\n },\n yAxis: {\n name: 'Latency',\n type: 'value' as const,\n },\n};\n\nexport const overlappingScatterChart = ({\n width = '100%',\n height = '400px',\n}: {\n width?: string;\n height?: string;\n} = {}) => (\n <div style={{ height, width }}>\n <Chart {...overlappingScatterChartProps} />\n </div>\n);\n\nexport const multiSeriesChartProps = {\n dataset: {\n dimensions: ['day', 'first', 'second', 'third', 'fourth', 'fifth', 'sixth'],\n source: [\n ['Monday', 20, 40, 60, 80, 100, 120],\n ['Tuesday', 30, 50, 70, 90, 110, 130],\n ['Wednesday', 25, 45, 65, 85, 105, 125],\n ['Thursday', 35, 55, 75, 95, 115, 135],\n ['Friday', 40, 60, 80, 100, 120, 140],\n ],\n },\n legend: {\n isVisible: true,\n },\n option: {},\n series: [\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'first' },\n name: 'First Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'second' },\n name: 'Second Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'third' },\n name: 'Third Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'fourth' },\n name: 'Fourth Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'fifth' },\n name: 'Fifth Series',\n type: 'line' as const,\n },\n {\n // E-Charts uses encode.x and encode.y - https://echarts.apache.org/en/option.html#series-line.encode\n // oxlint-disable-next-line id-length\n encode: { x: 'day', y: 'sixth' },\n name: 'Sixth Series',\n type: 'line' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n};\n\nexport const multiSeriesChart = ({\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n}) => (\n <div style={{ height, width }} className=\"ndl-chart\">\n <Chart {...multiSeriesChartProps} {...chartProps} />\n </div>\n);\n\nexport const pieChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...pieChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const scatterChartWithTooltipFormatter = ({\n seriesName,\n // oxlint-disable-next-line id-length\n x,\n // oxlint-disable-next-line id-length\n y,\n rgbSeriesColor,\n tooltipTitle = 'point-a',\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n tooltipTitle?: string;\n // oxlint-disable-next-line id-length\n x: number;\n // oxlint-disable-next-line id-length\n y: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...scatterChartProps(seriesName, x, y, rgbSeriesColor, tooltipTitle)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChart = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <Chart\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const expectChartElementVisible = async (page: Page) => {\n await expect(page.locator('svg').first()).toBeVisible();\n await expect(page.locator('.ndl-chart-legend')).toBeVisible();\n};\n\nexport const startLegendMeasuringObserver = async (\n page: Page,\n options: { chartLayoutSelector?: string } = {},\n) => {\n await page.evaluate(({ chartLayoutSelector }) => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n const legendElement = document.querySelector('.ndl-chart-legend');\n const chartLayout = chartLayoutSelector\n ? document.querySelector(chartLayoutSelector)\n : undefined;\n\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement = undefined;\n windowWithLegendObserver.__legendMeasuringClassWasAdded = false;\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n if (!legendElement) {\n return;\n }\n\n const observer = new MutationObserver(() => {\n if (!legendElement.classList.contains('ndl-chart-legend-calculating')) {\n return;\n }\n\n windowWithLegendObserver.__legendMeasuringClassWasAdded = true;\n\n if (\n chartLayout &&\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement ===\n undefined\n ) {\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement =\n chartLayout.getBoundingClientRect().height;\n }\n });\n\n observer.observe(legendElement, {\n attributeFilter: ['class'],\n attributes: true,\n });\n windowWithLegendObserver.__legendMeasuringObserver = observer;\n }, options);\n};\n\nexport const getLegendMeasuringObserverResult = async (page: Page) =>\n page.evaluate(() => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n return {\n chartHeightDuringMeasurement:\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement,\n didAddMeasuringClass:\n windowWithLegendObserver.__legendMeasuringClassWasAdded ?? false,\n };\n });\n\nconst SELECTORS = {\n CHECKMARK:\n '.ndl-chart-legend > .ndl-chart-legend-item .ndl-chart-legend-item-square-checkmark',\n DESELECTED: '.ndl-chart-legend > .ndl-chart-legend-item-deselected',\n seriesCheckmark: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"] .ndl-chart-legend-item-square-checkmark`,\n seriesDeselected: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"].ndl-chart-legend-item-deselected`,\n} as const;\n\nconst getGraphPaletteColorFromSeriesIndex = (index: string): string => {\n const hexColor = tokens.categorical[index as keyof typeof tokens.categorical];\n if (!hexColor) {\n throw new Error(`Categorical palette index ${index} not found`);\n }\n\n return hexColor;\n};\n\n/**\n * Checks so a single series is not blurred.\n */\nexport const expectSingleSeriesNotToBeBlurred = async (\n page: Page,\n seriesName: string,\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n const seriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === seriesName) +\n 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[seriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n seriesIndex.toString(),\n );\n\n // More flexible color matching - try both with and without spaces\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n // Wait for the element to be attached to the DOM before checking its attributes\n await expect(pathLocator).toBeAttached({ timeout: 10000 });\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n};\n\n/**\n * Checks so that the seriesNamesToBeHighlighted are visible in the chart and that other series are blurred.\n */\nexport const expectLegendSeriesToBeHighlightedInChart = async (\n page: Page,\n seriesNamesToBeHighlighted: string[],\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n for (const name of seriesNamesToBeHighlighted) {\n const highlightedSeriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === name) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[highlightedSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n highlightedSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n }\n\n const seriesToBeBlurred = allChartSeries.filter(\n (series) => !seriesNamesToBeHighlighted.includes(series.name),\n );\n\n for (const series of seriesToBeBlurred) {\n const blurredSeriesIndex =\n allChartSeries.findIndex(\n (seriesItem) => seriesItem.name === series.name,\n ) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[blurredSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n blurredSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).toHaveAttribute('stroke-opacity');\n }\n};\n\n/**\n * Identifies if the series are visible / not visible in the chart by checking\n * component-owned legend state. ECharts rewrites generated SVG paths during\n * legend updates, which makes exact path color selectors flaky in Firefox.\n */\nexport const expectLegendSeriesToBeVisibleInChart = async (\n page: Page,\n seriesNamesToBeVisible: string[],\n) => {\n await expect(page.locator('svg path').first()).toBeAttached();\n\n for (const name of seriesNamesToBeVisible) {\n const visibleLegendItem = page.locator(\n `.ndl-chart-legend > [data-labelname=\"${name}\"]`,\n );\n\n if ((await visibleLegendItem.count()) > 0) {\n await expect(visibleLegendItem).not.toHaveClass(\n /ndl-chart-legend-item-deselected/,\n );\n }\n }\n\n const hiddenSeries = multiSeriesChartProps.series.filter(\n (series) => !seriesNamesToBeVisible.includes(series.name),\n );\n\n for (const hiddenSeriesItem of hiddenSeries) {\n const hiddenLegendItem = page.locator(\n SELECTORS.seriesDeselected(hiddenSeriesItem.name),\n );\n\n if ((await hiddenLegendItem.count()) > 0) {\n await expect(hiddenLegendItem).toBeVisible();\n }\n }\n};\n\n// Check so legends are selected -> has checkmark and no strike-through classes\nexport const expectLegendsSelected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesCheckmark(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesDeselected(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so legends are deselected -> has strike-through and no checkmark classes\nexport const expectLegendsDeselected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesDeselected(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesCheckmark(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so all legends are neutral -> no checkmark and no strike-through classes\nexport const expectAllLegendsNeutral = async (page: Page) => {\n await expect(page.locator(SELECTORS.CHECKMARK)).not.toBeVisible();\n await expect(page.locator(SELECTORS.DESELECTED)).not.toBeVisible();\n};\n\n/**\n * Clicks the series legend item and hover the chart to make sure no blur effect exists on other series in the chart.\n * This is needed to make sure the series has the correct color when looking for them in the chart in later steps.\n */\nexport const clickSeries = async (page: Page, seriesName: string) => {\n await page\n .locator(`.ndl-chart-legend > [data-labelname=\"${seriesName}\"]`)\n .click();\n await page.hover('.ndl-chart');\n};\n\nexport const expectFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n await expect(\n page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`)),\n ).toBeVisible();\n await page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`))\n .hover();\n const tooltip = page.getByText(`${seriesName}formatted ${value}`);\n await expect(tooltip).toBeVisible();\n};\n\n/**\n * Scatter points are rings, so the series color is the stroke. The fill is the\n * theme surface color until hover paints it.\n */\nexport const scatterPointLocator = (page: Page, rgbSeriesColor: string) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n return page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`));\n};\n\nexport const expectScatterTooltipToBeVisible = async (\n page: Page,\n tooltipTitle: string,\n // oxlint-disable-next-line id-length\n x: number,\n // oxlint-disable-next-line id-length\n y: number,\n rgbSeriesColor: string,\n) => {\n const chartElement = scatterPointLocator(page, rgbSeriesColor);\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n // Scatter uses an item tooltip: encode.tooltip titles it, then the axis-named\n // x and y rows follow.\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(tooltipTitle);\n await expect(tooltip).not.toContainText('row-id');\n await expect(tooltip).toContainText(`Duration`);\n await expect(tooltip).toContainText(`formatted ${x}`);\n await expect(tooltip).toContainText(`Latency`);\n await expect(tooltip).toContainText(`formatted ${y}`);\n\n // The point color belongs to the title row only, so the rows below it do not\n // repeat the swatch.\n await expect(\n tooltip.locator('.ndl-charts-chart-tooltip-title-indent-square'),\n ).toHaveCount(1);\n await expect(\n tooltip.locator('.ndl-charts-chart-tooltip-content-indent-square'),\n ).toHaveCount(0);\n};\n\nexport const expectDefaultFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n const chartElement = page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[fill=\"${rgbWithSpaces}\"]`));\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(seriesName);\n await expect(tooltip).toContainText(\n new Intl.NumberFormat('en-US').format(value),\n );\n};\n\nexport const waitForAnimationEnd = (page: Page, selector: string) => {\n return page\n .locator(selector)\n .evaluate((element) =>\n Promise.all(\n element.getAnimations().map((animation) => animation.finished),\n ),\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chart-types.js","sourceRoot":"","sources":["../../../../src/charts/utils/chart-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n type EChartsOption,\n type LineSeriesOption,\n type RegisteredSeriesOption,\n type SetOptionOpts,\n} from 'echarts';\n\nexport type HexColor = `#${string}`;\n\nexport type Condition =\n | 'greater'\n | 'greaterOrEqual'\n | 'less'\n | 'lessOrEqual'\n | 'equal'\n | 'notEqual';\n\nexport type Values<T> = T[keyof T];\nexport type SeriesOption = Values<RegisteredSeriesOption>;\n\nexport type EchartsSeries = SeriesOption | SeriesOption[];\n\ntype CustomCondition = (\n lineValue: unknown,\n thresholdLineValue: unknown,\n) => boolean;\n\nexport interface ThresholdLineSeriesOption<\n T extends NotificationType,\n> extends Omit<LineSeriesOption, 'type'> {\n type: 'thresholdLine';\n yAxis: number;\n xAxis: [number, number];\n notificationType: T;\n color?: string;\n condition?: Condition;\n customConditionText?: string;\n customCondition?: CustomCondition;\n}\n\n// Only one threshold line of each type is allowed.\nexport type NeedleSeries =\n | [\n ThresholdLineSeriesOption<'warning'>,\n ThresholdLineSeriesOption<'danger'>,\n ...SeriesOption[],\n ]\n | [ThresholdLineSeriesOption<'danger'>, ...SeriesOption[]]\n | [ThresholdLineSeriesOption<'warning'>, ...SeriesOption[]]\n | SeriesOption[];\n\nexport interface ChartProps {\n /** The dataset configuration for the chart. Can be a single dataset or an array of datasets. */\n dataset: EChartsOption['dataset'];\n /** The series configuration for the chart. Defines what data to display and how to display it. */\n series: NeedleSeries;\n /** X-axis configuration for the chart. */\n xAxis?: EChartsOption['xAxis'];\n /** Y-axis configuration for the chart. */\n yAxis?: EChartsOption['yAxis'];\n /** Legend configuration for the chart. */\n legend?: {\n // TODO v5: fix boolean naming convention\n // eslint-disable-next-line @typescript-eslint/naming-convention\n show?: boolean;\n // TODO v5: remove this prop\n /** @deprecated No longer has any effect since wrapping is now automatic, will be removed in v 5 */\n wrappingType?: 'wrapping' | 'truncation' | 'overflow';\n };\n /** Additional ECharts options to merge with the chart configuration. */\n option?: Omit<\n EChartsOption,\n 'series' | 'dataset' | 'legend' | 'xAxis' | 'yAxis'\n >;\n /** Custom CSS styles to apply to the chart container. */\n style?: React.CSSProperties;\n /**\n * Settings for how ECharts should update the chart. Defaults to replacing the\n * components the chart owns (`series`, `dataset`, axes, and similar) while\n * merging the rest, which drops data that disappeared without discarding the\n * ECharts components behind zoom interactions. Passing `notMerge: true`\n * re-creates those components on every update and breaks drag-to-zoom.\n */\n settings?: SetOptionOpts;\n /** Whether the chart is in a loading state. */\n isLoading?: boolean;\n /** Callback functions for chart interactions. */\n callbacks?: {\n onZoom?: (params: { startValue: number; endValue: number }) => void;\n };\n /** Data zoom configuration for the chart. */\n dataZoom?: EChartsOption['dataZoom'];\n /** Whether the zoom in the chart is disabled */\n isChartZoomDisabled?: boolean;\n /** Custom color palette that overrides the default categorical colors. */\n palette?: HexColor[];\n}\n\nexport interface ChartEmptyProps {\n /** A text displayed to the user when the chart is empty. */\n message?: React.ReactNode;\n /** The type of chart. This is used to render the appropriate icon. */\n type?: 'line' | 'pie' | 'bar';\n /** Optional element (preferably a TextButton) that should provide the user with an action. */\n action?: React.ReactNode;\n}\n\n/**\n * Chart tooltip\n */\n\nexport interface ChartTooltipProps {\n children: React.ReactNode;\n className?: string;\n isOpen?: boolean;\n style?: React.CSSProperties;\n anchorPosition?: {\n // TODO v5: create componentProps type for this\n // oxlint-disable-next-line id-length\n x: number;\n // TODO v5: create componentProps type for this\n // oxlint-disable-next-line id-length\n y: number;\n };\n ref?: React.Ref<HTMLDivElement>;\n}\n\nexport type NotificationType = 'warning' | 'danger';\n\nexport type Notification = {\n leadingElement: React.ReactNode;\n trailingElement: React.ReactNode;\n notificationType: NotificationType;\n id: string;\n};\n\nexport type ChartTooltipContentProps = {\n leadingElement?: React.ReactNode;\n trailingElement?: React.ReactNode;\n indentSquareColor?: string;\n notifications?: Notification[];\n ref?: React.Ref<HTMLDivElement>;\n};\n\n/**\n * Legend\n */\nexport interface LegendItemProps {\n name: string;\n children: React.ReactNode;\n as?: 'button' | 'div';\n className?: string;\n color?: string;\n // TODO v5: fix boolean naming convention\n // eslint-disable-next-line @typescript-eslint/naming-convention\n selected?: boolean;\n // TODO v5: fix boolean naming convention\n // eslint-disable-next-line @typescript-eslint/naming-convention\n deSelected?: boolean;\n onLegendItemClick?: () => void;\n hasButtons?: boolean;\n onLegendItemMouseEnter?: () => void;\n onLegendItemMouseLeave?: () => void;\n ref?: React.Ref<HTMLButtonElement> & React.Ref<HTMLDivElement>;\n}\n\nexport type LegendProps = {\n series: {\n name: string;\n color: string;\n }[];\n ref?: React.Ref<HTMLDivElement>;\n};\n\nexport type HtmlAttributes<T extends React.ElementType> =\n React.ComponentPropsWithoutRef<T> & {\n [key: `data-${string}`]: string | undefined;\n };\n\ntype BaseProps<T extends React.ElementType> = {\n /**\n * Additional classnames will be applied to the root element.\n */\n className?: string;\n /**\n * Additional css styling. Will be applied to the root element.\n */\n style?: React.CSSProperties;\n\n /**\n * Html attributes to apply to the root element. This will override any default html attributes, use with caution.\n */\n htmlAttributes?: HtmlAttributes<T>;\n\n /**\n * A ref to apply to the root element.\n */\n ref?: React.ComponentPropsWithRef<T>['ref'];\n};\n\nexport type CommonProps<T extends React.ElementType, P> = P & BaseProps<T>;\n"]}
1
+ {"version":3,"file":"chart-types.js","sourceRoot":"","sources":["../../../../src/charts/utils/chart-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG","sourcesContent":["/*!\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport {\n type EChartsOption,\n type LineSeriesOption,\n type RegisteredSeriesOption,\n type SetOptionOpts,\n} from 'echarts';\n\nexport type HexColor = `#${string}`;\n\nexport type Condition =\n | 'greater'\n | 'greaterOrEqual'\n | 'less'\n | 'lessOrEqual'\n | 'equal'\n | 'notEqual';\n\nexport type Values<T> = T[keyof T];\nexport type SeriesOption = Values<RegisteredSeriesOption>;\n\nexport type EchartsSeries = SeriesOption | SeriesOption[];\n\ntype CustomCondition = (\n lineValue: unknown,\n thresholdLineValue: unknown,\n) => boolean;\n\nexport interface ThresholdLineSeriesOption<\n T extends NotificationType,\n> extends Omit<LineSeriesOption, 'type'> {\n type: 'thresholdLine';\n yAxis: number;\n xAxis: [number, number];\n notificationType: T;\n color?: string;\n condition?: Condition;\n customConditionText?: string;\n customCondition?: CustomCondition;\n}\n\n// Only one threshold line of each type is allowed.\nexport type NeedleSeries =\n | [\n ThresholdLineSeriesOption<'warning'>,\n ThresholdLineSeriesOption<'danger'>,\n ...SeriesOption[],\n ]\n | [ThresholdLineSeriesOption<'danger'>, ...SeriesOption[]]\n | [ThresholdLineSeriesOption<'warning'>, ...SeriesOption[]]\n | SeriesOption[];\n\nexport interface ChartProps {\n /** The dataset configuration for the chart. Can be a single dataset or an array of datasets. */\n dataset: EChartsOption['dataset'];\n /** The series configuration for the chart. Defines what data to display and how to display it. */\n series: NeedleSeries;\n /** X-axis configuration for the chart. */\n xAxis?: EChartsOption['xAxis'];\n /** Y-axis configuration for the chart. */\n yAxis?: EChartsOption['yAxis'];\n /** Legend configuration for the chart. */\n legend?: {\n /** Whether the legend is visible. */\n isVisible?: boolean;\n };\n /** Additional ECharts options to merge with the chart configuration. */\n option?: Omit<\n EChartsOption,\n 'series' | 'dataset' | 'legend' | 'xAxis' | 'yAxis'\n >;\n /** Custom CSS styles to apply to the chart container. */\n style?: React.CSSProperties;\n /**\n * Settings for how ECharts should update the chart. Defaults to replacing the\n * components the chart owns (`series`, `dataset`, axes, and similar) while\n * merging the rest, which drops data that disappeared without discarding the\n * ECharts components behind zoom interactions. Passing `notMerge: true`\n * re-creates those components on every update and breaks drag-to-zoom.\n */\n settings?: SetOptionOpts;\n /** Whether the chart is in a loading state. */\n isLoading?: boolean;\n /** Callback functions for chart interactions. */\n callbacks?: {\n onZoom?: (params: { startValue: number; endValue: number }) => void;\n };\n /** Data zoom configuration for the chart. */\n dataZoom?: EChartsOption['dataZoom'];\n /** Whether the zoom in the chart is disabled */\n isChartZoomDisabled?: boolean;\n /** Custom color palette that overrides the default categorical colors. */\n palette?: HexColor[];\n}\n\nexport interface ChartEmptyProps {\n /** A text displayed to the user when the chart is empty. */\n message?: React.ReactNode;\n /** The type of chart. This is used to render the appropriate icon. */\n type?: 'line' | 'pie' | 'bar';\n /** Optional element (preferably a TextButton) that should provide the user with an action. */\n action?: React.ReactNode;\n}\n\n/**\n * Chart tooltip\n */\n\n/**\n * Client coordinates used to anchor a floating element at a fixed point (e.g.\n * the cursor position), instead of at an anchor element.\n */\ntype AnchorPosition = {\n // oxlint-disable-next-line id-length\n x: number;\n // oxlint-disable-next-line id-length\n y: number;\n};\n\nexport interface ChartTooltipProps {\n children: React.ReactNode;\n className?: string;\n isOpen?: boolean;\n style?: React.CSSProperties;\n anchorPosition?: AnchorPosition;\n ref?: React.Ref<HTMLDivElement>;\n}\n\nexport type NotificationType = 'warning' | 'danger';\n\nexport type Notification = {\n leadingElement: React.ReactNode;\n trailingElement: React.ReactNode;\n notificationType: NotificationType;\n id: string;\n};\n\nexport type ChartTooltipContentProps = {\n leadingElement?: React.ReactNode;\n trailingElement?: React.ReactNode;\n indentSquareColor?: string;\n notifications?: Notification[];\n ref?: React.Ref<HTMLDivElement>;\n};\n\n/**\n * Legend\n */\nexport interface LegendItemProps {\n name: string;\n children: React.ReactNode;\n as?: 'button' | 'div';\n className?: string;\n color?: string;\n isSelected?: boolean;\n isDeselected?: boolean;\n onLegendItemClick?: () => void;\n hasButtons?: boolean;\n onLegendItemMouseEnter?: () => void;\n onLegendItemMouseLeave?: () => void;\n ref?: React.Ref<HTMLButtonElement> & React.Ref<HTMLDivElement>;\n}\n\nexport type LegendProps = {\n series: {\n name: string;\n color: string;\n }[];\n ref?: React.Ref<HTMLDivElement>;\n};\n\nexport type HtmlAttributes<T extends React.ElementType> =\n React.ComponentPropsWithoutRef<T> & {\n [key: `data-${string}`]: string | undefined;\n };\n\ntype BaseProps<T extends React.ElementType> = {\n /**\n * Additional classnames will be applied to the root element.\n */\n className?: string;\n /**\n * Additional css styling. Will be applied to the root element.\n */\n style?: React.CSSProperties;\n\n /**\n * Html attributes to apply to the root element. This will override any default html attributes, use with caution.\n */\n htmlAttributes?: HtmlAttributes<T>;\n\n /**\n * A ref to apply to the root element.\n */\n ref?: React.ComponentPropsWithRef<T>['ref'];\n};\n\nexport type CommonProps<T extends React.ElementType, P> = P & BaseProps<T>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/charts/Chart.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAUH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA8CtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,KAAK,GAAI,kCAAkC,UAAU,4CAyCjE,CAAC"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/charts/Chart.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAUH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA8CtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,KAAK,GAAI,kCAAkC,UAAU,4CA2CjE,CAAC"}
@@ -26,5 +26,5 @@ import { type LegendItemProps } from './utils/chart-types';
26
26
  * Threshold-line series are intentionally skipped because they are chart
27
27
  * annotations rather than user-toggleable data series.
28
28
  */
29
- export declare const LegendItem: ({ children, as, className, name, selected, deSelected, onLegendItemClick, color, hasButtons, ref, onLegendItemMouseEnter, onLegendItemMouseLeave, ...restProps }: LegendItemProps) => import("react/jsx-runtime").JSX.Element | null;
29
+ export declare const LegendItem: ({ children, as, className, name, isSelected, isDeselected, onLegendItemClick, color, hasButtons, ref, onLegendItemMouseEnter, onLegendItemMouseLeave, ...restProps }: LegendItemProps) => import("react/jsx-runtime").JSX.Element | null;
30
30
  //# sourceMappingURL=LegendItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LegendItem.d.ts","sourceRoot":"","sources":["../../../src/charts/LegendItem.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,kKAcxB,eAAe,mDA8CjB,CAAC"}
1
+ {"version":3,"file":"LegendItem.d.ts","sourceRoot":"","sources":["../../../src/charts/LegendItem.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,sKAcxB,eAAe,mDA8CjB,CAAC"}
@@ -27,7 +27,7 @@ export declare const pieChartProps: (seriesName: string, value: number, rgbSerie
27
27
  source: (string | number)[][];
28
28
  }[];
29
29
  legend: {
30
- show: boolean;
30
+ isVisible: boolean;
31
31
  };
32
32
  series: {
33
33
  center: string[];
@@ -48,7 +48,7 @@ export declare const barChartProps: (seriesName: string, value: number, rgbSerie
48
48
  source: (string | number)[][];
49
49
  };
50
50
  legend: {
51
- show: boolean;
51
+ isVisible: boolean;
52
52
  };
53
53
  series: {
54
54
  encode: {
@@ -74,7 +74,7 @@ export declare const scatterChartProps: (seriesName: string, x: number, y: numbe
74
74
  source: (string | number)[][];
75
75
  };
76
76
  legend: {
77
- show: boolean;
77
+ isVisible: boolean;
78
78
  };
79
79
  series: {
80
80
  color: string;
@@ -105,7 +105,7 @@ export declare const overlappingScatterChartProps: {
105
105
  source: (string | number)[][];
106
106
  };
107
107
  legend: {
108
- show: boolean;
108
+ isVisible: boolean;
109
109
  };
110
110
  series: {
111
111
  color: string;
@@ -136,7 +136,7 @@ export declare const multiSeriesChartProps: {
136
136
  source: (string | number)[][];
137
137
  };
138
138
  legend: {
139
- show: boolean;
139
+ isVisible: boolean;
140
140
  };
141
141
  option: {};
142
142
  series: {
@@ -51,9 +51,8 @@ export interface ChartProps {
51
51
  yAxis?: EChartsOption['yAxis'];
52
52
  /** Legend configuration for the chart. */
53
53
  legend?: {
54
- show?: boolean;
55
- /** @deprecated No longer has any effect since wrapping is now automatic, will be removed in v 5 */
56
- wrappingType?: 'wrapping' | 'truncation' | 'overflow';
54
+ /** Whether the legend is visible. */
55
+ isVisible?: boolean;
57
56
  };
58
57
  /** Additional ECharts options to merge with the chart configuration. */
59
58
  option?: Omit<EChartsOption, 'series' | 'dataset' | 'legend' | 'xAxis' | 'yAxis'>;
@@ -94,15 +93,20 @@ export interface ChartEmptyProps {
94
93
  /**
95
94
  * Chart tooltip
96
95
  */
96
+ /**
97
+ * Client coordinates used to anchor a floating element at a fixed point (e.g.
98
+ * the cursor position), instead of at an anchor element.
99
+ */
100
+ type AnchorPosition = {
101
+ x: number;
102
+ y: number;
103
+ };
97
104
  export interface ChartTooltipProps {
98
105
  children: React.ReactNode;
99
106
  className?: string;
100
107
  isOpen?: boolean;
101
108
  style?: React.CSSProperties;
102
- anchorPosition?: {
103
- x: number;
104
- y: number;
105
- };
109
+ anchorPosition?: AnchorPosition;
106
110
  ref?: React.Ref<HTMLDivElement>;
107
111
  }
108
112
  export type NotificationType = 'warning' | 'danger';
@@ -128,8 +132,8 @@ export interface LegendItemProps {
128
132
  as?: 'button' | 'div';
129
133
  className?: string;
130
134
  color?: string;
131
- selected?: boolean;
132
- deSelected?: boolean;
135
+ isSelected?: boolean;
136
+ isDeselected?: boolean;
133
137
  onLegendItemClick?: () => void;
134
138
  hasButtons?: boolean;
135
139
  onLegendItemMouseEnter?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"chart-types.d.ts","sourceRoot":"","sources":["../../../../src/charts/utils/chart-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-types.d.ts","sourceRoot":"","sources":["../../../../src/charts/utils/chart-types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neo4j-ndl/react-charts",
3
- "version": "1.4.4",
3
+ "version": "2.0.0-alpha.0.b2b2481",
4
4
  "sideEffects": false,
5
5
  "description": "React implementation of charts from Neo4j Design System",
6
6
  "keywords": [
@@ -57,16 +57,19 @@
57
57
  "peerDependencies": {
58
58
  "react": ">=19.0.0",
59
59
  "react-dom": ">=19.0.0",
60
- "@neo4j-ndl/base": "^4.23.8",
61
- "@neo4j-ndl/react": "^4.25.10"
60
+ "@neo4j-ndl/base": "^5.0.0-alpha.0.b2b2481",
61
+ "@neo4j-ndl/react": "^5.0.0-alpha.0.b2b2481"
62
62
  },
63
63
  "dependencies": {
64
64
  "classnames": "2.5.1",
65
- "echarts": "6.1.0"
65
+ "echarts": "6.1.0",
66
+ "@neo4j-ndl/base": "5.0.0-alpha.0.b2b2481",
67
+ "@neo4j-ndl/react": "5.0.0-alpha.0.b2b2481"
66
68
  },
67
69
  "scripts": {
68
70
  "test": "pnpm run test:playwright",
69
- "test:unit": "pnpm exec vitest --run --typecheck --exclude node_modules",
71
+ "test:unit": "pnpm exec vitest --run --exclude node_modules",
72
+ "typecheck": "pnpm exec tsc -p tsconfig.tests.json",
70
73
  "test:playwright": "pnpm exec playwright test -c playwright-component-testing.config.ts",
71
74
  "build": "pnpm run build:esm && pnpm run build:cjs && pnpm run build:types",
72
75
  "build:esm": "pnpm exec tsc -p tsconfig.esm.json",
@@ -2,7 +2,7 @@
2
2
  name: ndl-react-charts
3
3
  metadata:
4
4
  package: '@neo4j-ndl/react-charts'
5
- version: '1.4.4'
5
+ version: '2.0.0-alpha.0.b2b2481'
6
6
  description: >-
7
7
  Build data visualizations with the Neo4j Needle React Charts library
8
8
  (@neo4j-ndl/react-charts), an Apache ECharts-based charting layer. Use when
@@ -15,7 +15,7 @@ description: >-
15
15
 
16
16
  # Neo4j Needle React Charts (@neo4j-ndl/react-charts)
17
17
 
18
- > 📌 Shipped with `@neo4j-ndl/react-charts` v1.4.4. Once installed into your repo (e.g. via
18
+ > 📌 Shipped with `@neo4j-ndl/react-charts` v2.0.0-alpha.0.b2b2481. Once installed into your repo (e.g. via
19
19
  > `npx skills add`) this folder is detached from the package — the installed
20
20
  > package (TypeScript types in `node_modules/@neo4j-ndl/react-charts`) is the source of
21
21
  > truth.
@@ -59,7 +59,7 @@ Use Neo4j Needle React Charts instead of hand-rolling chart components.
59
59
  `@neo4j-ndl/react` with typed token props rather than utility classes. See
60
60
  [references/styling.md](references/styling.md) for the complete token catalog.
61
61
  - **Class names are unchecked strings.** The same rule from the `ndl-react`
62
- skill applies: verify any `n-*` utility class against
62
+ skill applies: verify any Tailwind utility class against
63
63
  `node_modules/@neo4j-ndl/base/lib/neo4j-ds-styles.css` before using it. Prefer
64
64
  `Flex`, `Box`, and `Typography` component props over utility classes.
65
65
  - Follow the accessibility guidance in each component's doc; don't strip built-in