@enact-ui/charts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/components/activity-gauges.demo.d.ts +15 -0
  2. package/dist/components/activity-gauges.demo.d.ts.map +1 -0
  3. package/dist/components/activity-gauges.demo.js +74 -0
  4. package/dist/components/activity-gauges.demo.js.map +1 -0
  5. package/dist/components/activity-gauges.story.d.ts +23 -0
  6. package/dist/components/activity-gauges.story.d.ts.map +1 -0
  7. package/dist/components/activity-gauges.story.js +17 -0
  8. package/dist/components/activity-gauges.story.js.map +1 -0
  9. package/dist/components/bar-charts.demo.d.ts +4 -0
  10. package/dist/components/bar-charts.demo.d.ts.map +1 -0
  11. package/dist/components/bar-charts.demo.js +263 -0
  12. package/dist/components/bar-charts.demo.js.map +1 -0
  13. package/dist/components/bar-charts.story.d.ts +19 -0
  14. package/dist/components/bar-charts.story.d.ts.map +1 -0
  15. package/dist/components/bar-charts.story.js +15 -0
  16. package/dist/components/bar-charts.story.js.map +1 -0
  17. package/dist/components/charts-base.d.ts +38 -0
  18. package/dist/components/charts-base.d.ts.map +1 -0
  19. package/dist/components/charts-base.js +68 -0
  20. package/dist/components/charts-base.js.map +1 -0
  21. package/dist/components/line-charts.demo.d.ts +5 -0
  22. package/dist/components/line-charts.demo.d.ts.map +1 -0
  23. package/dist/components/line-charts.demo.js +169 -0
  24. package/dist/components/line-charts.demo.js.map +1 -0
  25. package/dist/components/line-charts.story.d.ts +23 -0
  26. package/dist/components/line-charts.story.d.ts.map +1 -0
  27. package/dist/components/line-charts.story.js +17 -0
  28. package/dist/components/line-charts.story.js.map +1 -0
  29. package/dist/components/pie-charts.demo.d.ts +14 -0
  30. package/dist/components/pie-charts.demo.d.ts.map +1 -0
  31. package/dist/components/pie-charts.demo.js +75 -0
  32. package/dist/components/pie-charts.demo.js.map +1 -0
  33. package/dist/components/pie-charts.story.d.ts +27 -0
  34. package/dist/components/pie-charts.story.d.ts.map +1 -0
  35. package/dist/components/pie-charts.story.js +19 -0
  36. package/dist/components/pie-charts.story.js.map +1 -0
  37. package/dist/components/progress-circles.demo.d.ts +14 -0
  38. package/dist/components/progress-circles.demo.d.ts.map +1 -0
  39. package/dist/components/progress-circles.demo.js +63 -0
  40. package/dist/components/progress-circles.demo.js.map +1 -0
  41. package/dist/components/progress-circles.story.d.ts +39 -0
  42. package/dist/components/progress-circles.story.d.ts.map +1 -0
  43. package/dist/components/progress-circles.story.js +25 -0
  44. package/dist/components/progress-circles.story.js.map +1 -0
  45. package/dist/components/radar-charts.demo.d.ts +14 -0
  46. package/dist/components/radar-charts.demo.d.ts.map +1 -0
  47. package/dist/components/radar-charts.demo.js +94 -0
  48. package/dist/components/radar-charts.demo.js.map +1 -0
  49. package/dist/components/radar-charts.story.d.ts +11 -0
  50. package/dist/components/radar-charts.story.d.ts.map +1 -0
  51. package/dist/components/radar-charts.story.js +11 -0
  52. package/dist/components/radar-charts.story.js.map +1 -0
  53. package/dist/index.d.ts +10 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +97 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +67 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/package.json +61 -0
@@ -0,0 +1,39 @@
1
+ import type { FC } from "react";
2
+ declare const _default: {
3
+ title: string;
4
+ decorators: ((Story: FC) => import("react/jsx-runtime").JSX.Element)[];
5
+ };
6
+ export default _default;
7
+ export declare const ProgressCircleXs: {
8
+ (): import("react/jsx-runtime").JSX.Element;
9
+ storyName: string;
10
+ };
11
+ export declare const ProgressCircleSm: {
12
+ (): import("react/jsx-runtime").JSX.Element;
13
+ storyName: string;
14
+ };
15
+ export declare const ProgressCircleMd: {
16
+ (): import("react/jsx-runtime").JSX.Element;
17
+ storyName: string;
18
+ };
19
+ export declare const ProgressCircleLg: {
20
+ (): import("react/jsx-runtime").JSX.Element;
21
+ storyName: string;
22
+ };
23
+ export declare const ProgressCircleXsOnlyTitle: {
24
+ (): import("react/jsx-runtime").JSX.Element;
25
+ storyName: string;
26
+ };
27
+ export declare const ProgressCircleSmOnlyTitle: {
28
+ (): import("react/jsx-runtime").JSX.Element;
29
+ storyName: string;
30
+ };
31
+ export declare const ProgressCircleMdOnlyTitle: {
32
+ (): import("react/jsx-runtime").JSX.Element;
33
+ storyName: string;
34
+ };
35
+ export declare const ProgressCircleLgOnlyTitle: {
36
+ (): import("react/jsx-runtime").JSX.Element;
37
+ storyName: string;
38
+ };
39
+ //# sourceMappingURL=progress-circles.story.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-circles.story.d.ts","sourceRoot":"","sources":["../../src/components/progress-circles.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;;;yBAMhB,EAAE;;AAHlB,wBAWE;AAEF,eAAO,MAAM,gBAAgB;;;CAAgF,CAAC;AAE9G,eAAO,MAAM,gBAAgB;;;CAAsE,CAAC;AAEpG,eAAO,MAAM,gBAAgB;;;CAAgF,CAAC;AAE9G,eAAO,MAAM,gBAAgB;;;CAAgF,CAAC;AAG9G,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC;AAE/F,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC;AAE/F,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC;AAE/F,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as Charts from "./progress-circles.demo";
3
+ export default {
4
+ title: "Application/Charts",
5
+ decorators: [
6
+ (Story) => (_jsx("div", { className: "bg-base flex min-h-screen items-center justify-center py-8", children: _jsx("div", { className: "flex w-full items-center justify-center", children: _jsx(Story, {}) }) })),
7
+ ],
8
+ };
9
+ export const ProgressCircleXs = () => _jsx(Charts.ProgressCircle, { size: "xs", title: "40%", subtitle: "Active users" });
10
+ ProgressCircleXs.storyName = "Progress circle xs";
11
+ export const ProgressCircleSm = () => _jsx(Charts.ProgressCircle, { title: "40%", subtitle: "Active users" });
12
+ ProgressCircleSm.storyName = "Progress circle sm";
13
+ export const ProgressCircleMd = () => _jsx(Charts.ProgressCircle, { size: "md", title: "40%", subtitle: "Active users" });
14
+ ProgressCircleMd.storyName = "Progress circle md";
15
+ export const ProgressCircleLg = () => _jsx(Charts.ProgressCircle, { size: "lg", title: "40%", subtitle: "Active users" });
16
+ ProgressCircleLg.storyName = "Progress circle lg";
17
+ export const ProgressCircleXsOnlyTitle = () => _jsx(Charts.ProgressCircle, { size: "xs", title: "40%" });
18
+ ProgressCircleXsOnlyTitle.storyName = "Progress circle xs only title";
19
+ export const ProgressCircleSmOnlyTitle = () => _jsx(Charts.ProgressCircle, { size: "sm", title: "40%" });
20
+ ProgressCircleSmOnlyTitle.storyName = "Progress circle sm only title";
21
+ export const ProgressCircleMdOnlyTitle = () => _jsx(Charts.ProgressCircle, { size: "md", title: "40%" });
22
+ ProgressCircleMdOnlyTitle.storyName = "Progress circle md only title";
23
+ export const ProgressCircleLgOnlyTitle = () => _jsx(Charts.ProgressCircle, { size: "lg", title: "40%" });
24
+ ProgressCircleLgOnlyTitle.storyName = "Progress circle lg only title";
25
+ //# sourceMappingURL=progress-circles.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-circles.story.js","sourceRoot":"","sources":["../../src/components/progress-circles.story.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAElD,eAAe;IACX,KAAK,EAAE,oBAAoB;IAC3B,UAAU,EAAE;QACR,CAAC,KAAS,EAAE,EAAE,CAAC,CACX,cAAK,SAAS,EAAC,4DAA4D,YACvE,cAAK,SAAS,EAAC,yCAAyC,YACpD,KAAC,KAAK,KAAG,GACP,GACJ,CACT;KACJ;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,cAAc,GAAG,CAAC;AAC9G,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,cAAc,GAAG,CAAC;AACpG,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,cAAc,GAAG,CAAC;AAC9G,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,cAAc,GAAG,CAAC;AAC9G,gBAAgB,CAAC,SAAS,GAAG,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,GAAG,CAAC;AAC/F,yBAAyB,CAAC,SAAS,GAAG,+BAA+B,CAAC;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,GAAG,CAAC;AAC/F,yBAAyB,CAAC,SAAS,GAAG,+BAA+B,CAAC;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,GAAG,CAAC;AAC/F,yBAAyB,CAAC,SAAS,GAAG,+BAA+B,CAAC;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,cAAc,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,GAAG,CAAC;AAC/F,yBAAyB,CAAC,SAAS,GAAG,+BAA+B,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface CustomRadarChartTickProps {
2
+ payload: {
3
+ value: string;
4
+ };
5
+ x: number;
6
+ y: number;
7
+ textAnchor: string;
8
+ stroke: string;
9
+ radius: number;
10
+ }
11
+ export declare const CustomRadarChartTick: ({ payload, x, y, textAnchor, stroke, radius }: CustomRadarChartTickProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const RadarChart: () => import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=radar-charts.demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-charts.demo.d.ts","sourceRoot":"","sources":["../../src/components/radar-charts.demo.tsx"],"names":[],"mappings":"AAQA,UAAU,yBAAyB;IAC/B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,GAAI,+CAA+C,yBAAyB,4CAoC5G,CAAC;AAiDF,eAAO,MAAM,UAAU,+CAsGtB,CAAC"}
@@ -0,0 +1,94 @@
1
+ // Copyright (c) 2025 Amsterdam Data Labs
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { cx } from "@enact-ui/react";
5
+ import { Fragment, useEffect, useRef } from "react";
6
+ import { Legend, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart as RechartsRadarChart, ResponsiveContainer, Tooltip } from "recharts";
7
+ import { ChartLegendContent, ChartTooltipContent } from "./charts-base";
8
+ export const CustomRadarChartTick = ({ payload, x, y, textAnchor, stroke, radius }) => {
9
+ const textRef = useRef(null);
10
+ const rectRef = useRef(null);
11
+ useEffect(() => {
12
+ if (textRef.current && rectRef.current) {
13
+ const textBoundingBox = textRef.current.getBBox();
14
+ const EXTRA_WIDTH = 16;
15
+ const EXTRA_HEIGHT = 8;
16
+ rectRef.current.setAttribute("width", (textBoundingBox.width + EXTRA_WIDTH).toString());
17
+ rectRef.current.setAttribute("height", (textBoundingBox.height + EXTRA_HEIGHT).toString());
18
+ rectRef.current.setAttribute("x", (textBoundingBox.x - EXTRA_WIDTH / 2).toString());
19
+ rectRef.current.setAttribute("y", (textBoundingBox.y - EXTRA_HEIGHT / 2).toString());
20
+ }
21
+ }, []);
22
+ return (_jsxs(Fragment, { children: [_jsx("rect", { ref: rectRef, x: x, y: y, rx: 11, className: "fill-gray-light stroke-gray-light stroke-1" }), _jsx("text", { ref: textRef, x: x, y: y + 5, radius: radius, stroke: stroke, textAnchor: textAnchor, className: "recharts-text recharts-polar-angle-axis-tick-value", children: _jsx("tspan", { x: x, dy: "0em", className: "fill-gray-dark text-xs font-medium", children: payload.value }) })] }));
23
+ };
24
+ const radarData = [
25
+ // collapse-start
26
+ {
27
+ subject: "Mon",
28
+ A: 800,
29
+ B: 400,
30
+ C: 600,
31
+ },
32
+ {
33
+ subject: "Tue",
34
+ A: 600,
35
+ B: 1000,
36
+ C: 800,
37
+ },
38
+ {
39
+ subject: "Wed",
40
+ A: 600,
41
+ B: 200,
42
+ C: 400,
43
+ },
44
+ {
45
+ subject: "Thu",
46
+ A: 200,
47
+ B: 600,
48
+ C: 800,
49
+ },
50
+ {
51
+ subject: "Fri",
52
+ A: 400,
53
+ B: 200,
54
+ C: 600,
55
+ },
56
+ {
57
+ subject: "Sat",
58
+ A: 1000,
59
+ B: 800,
60
+ C: 600,
61
+ },
62
+ {
63
+ subject: "Sun",
64
+ A: 400,
65
+ B: 1000,
66
+ C: 800,
67
+ },
68
+ // collapse-end
69
+ ];
70
+ export const RadarChart = () => {
71
+ const colors = {
72
+ A: "text-brand-medium",
73
+ B: "text-pink-500",
74
+ C: "text-blue-light-500",
75
+ };
76
+ return (_jsx(ResponsiveContainer, { height: 500, width: "100%", children: _jsxs(RechartsRadarChart, { cx: "50%", cy: "50%", outerRadius: "80%", data: radarData, className: "text-muted size-full font-medium [&_.recharts-polar-grid]:text-gray-subtle [&_.recharts-text]:text-sm", margin: {
77
+ left: 0,
78
+ right: 0,
79
+ top: 0,
80
+ bottom: 0,
81
+ }, children: [_jsx(Legend, { verticalAlign: "bottom", align: "center", layout: "horizontal", content: ChartLegendContent }), _jsx(PolarGrid, { stroke: "currentColor", className: "text-gray-subtle" }), _jsx(PolarAngleAxis, { dataKey: "subject", stroke: "currentColor", tick: ({ x, y, textAnchor, index, payload, ...props }) => (_jsx("text", { x: x, y: index === 0 ? Number(y) - 14 : index === 3 || index === 4 ? Number(y) + 10 : Number(y), textAnchor: textAnchor, ...props, className: cx("recharts-text recharts-polar-angle-axis-tick-value", props.className), children: _jsx("tspan", { dy: "0em", className: "fill-gray-dark text-xs font-medium", children: payload.value }) })), tickLine: false, axisLine: false }), _jsx(PolarRadiusAxis, { textAnchor: "middle", tick: (props) => _jsx(CustomRadarChartTick, { ...props }), axisLine: false, angle: 90, domain: [0, 1000] }), _jsx(Tooltip, { content: _jsx(ChartTooltipContent, {}), cursor: {
82
+ className: "stroke-brand-medium stroke-2",
83
+ style: {
84
+ transform: "translateZ(0)",
85
+ },
86
+ } }), _jsx(Radar, { isAnimationActive: false, className: colors.A, dataKey: "A", name: "Series 1", stroke: "currentColor", strokeWidth: 2, strokeLinejoin: "round", fill: "currentColor", fillOpacity: 0.2, activeDot: {
87
+ className: "fill-bg-base stroke-brand-medium stroke-2",
88
+ } }), _jsx(Radar, { isAnimationActive: false, className: colors.B, dataKey: "B", name: "Series 2", stroke: "currentColor", strokeWidth: 2, strokeLinejoin: "round", fill: "currentColor", fillOpacity: 0.2, activeDot: {
89
+ className: "fill-bg-base stroke-brand-medium stroke-2",
90
+ } }), _jsx(Radar, { isAnimationActive: false, className: colors.C, dataKey: "C", name: "Series 3", stroke: "currentColor", strokeWidth: 2, strokeLinejoin: "round", fill: "currentColor", fillOpacity: 0.2, activeDot: {
91
+ className: "fill-bg-base stroke-brand-medium stroke-2",
92
+ } })] }) }));
93
+ };
94
+ //# sourceMappingURL=radar-charts.demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-charts.demo.js","sourceRoot":"","sources":["../../src/components/radar-charts.demo.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { FC } from "react";
2
+ declare const _default: {
3
+ title: string;
4
+ decorators: ((Story: FC) => import("react/jsx-runtime").JSX.Element)[];
5
+ };
6
+ export default _default;
7
+ export declare const RadarChart: {
8
+ (): import("react/jsx-runtime").JSX.Element;
9
+ storyName: string;
10
+ };
11
+ //# sourceMappingURL=radar-charts.story.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-charts.story.d.ts","sourceRoot":"","sources":["../../src/components/radar-charts.story.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;;;yBAMhB,EAAE;;AAHlB,wBAWE;AAEF,eAAO,MAAM,UAAU;;;CAA8B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as Charts from "./radar-charts.demo";
3
+ export default {
4
+ title: "Application/Charts",
5
+ decorators: [
6
+ (Story) => (_jsx("div", { className: "bg-base flex min-h-screen items-center justify-center py-8", children: _jsx("div", { className: "flex w-full items-center justify-center", children: _jsx(Story, {}) }) })),
7
+ ],
8
+ };
9
+ export const RadarChart = () => _jsx(Charts.RadarChart, {});
10
+ RadarChart.storyName = "Radar chart";
11
+ //# sourceMappingURL=radar-charts.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-charts.story.js","sourceRoot":"","sources":["../../src/components/radar-charts.story.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAE9C,eAAe;IACX,KAAK,EAAE,oBAAoB;IAC3B,UAAU,EAAE;QACR,CAAC,KAAS,EAAE,EAAE,CAAC,CACX,cAAK,SAAS,EAAC,4DAA4D,YACvE,cAAK,SAAS,EAAC,yCAAyC,YACpD,KAAC,KAAK,KAAG,GACP,GACJ,CACT;KACJ;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,KAAC,MAAM,CAAC,UAAU,KAAG,CAAC;AACtD,UAAU,CAAC,SAAS,GAAG,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @enact-ui/charts
3
+ *
4
+ * Chart components for ENACT UI built on Recharts.
5
+ * Adds ~200KB to bundle. Only install if you need charts.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ export { ChartActiveDot, ChartLegendContent, ChartTooltipContent, selectEvenlySpacedItems, } from "./components/charts-base";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAKH,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,GAC1B,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ChartActiveDot: () => ChartActiveDot,
24
+ ChartLegendContent: () => ChartLegendContent,
25
+ ChartTooltipContent: () => ChartTooltipContent,
26
+ selectEvenlySpacedItems: () => selectEvenlySpacedItems
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+
30
+ // src/components/charts-base.tsx
31
+ var import_react = require("@enact-ui/react");
32
+ var import_jsx_runtime = require("react/jsx-runtime");
33
+ var selectEvenlySpacedItems = (dataArray, count) => {
34
+ if (!dataArray || dataArray.length === 0) {
35
+ return [];
36
+ }
37
+ const selectedItems = [];
38
+ if (dataArray.length === 1) {
39
+ for (let i = 0; i < count; i++) {
40
+ selectedItems.push(dataArray[0]);
41
+ }
42
+ return selectedItems;
43
+ }
44
+ for (let i = 0; i < count; i++) {
45
+ const targetIndex = Math.round(i * (dataArray.length - 1) / (count - 1));
46
+ const boundedIndex = Math.max(0, Math.min(targetIndex, dataArray.length - 1));
47
+ selectedItems.push(dataArray[boundedIndex]);
48
+ }
49
+ return selectedItems;
50
+ };
51
+ var ChartLegendContent = ({ reversed, payload, align, layout, className }) => {
52
+ payload = reversed ? payload?.toReversed() : payload;
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ "ul",
55
+ {
56
+ className: (0, import_react.cx)(
57
+ "flex",
58
+ layout === "vertical" ? `flex-col gap-1 pl-4 ${align === "center" ? "items-center" : align === "right" ? "items-start" : "items-start"}` : `flex-row gap-3 ${align === "center" ? "justify-center" : align === "right" ? "justify-end" : "justify-start"}`,
59
+ className
60
+ ),
61
+ children: payload?.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { className: "text-muted flex items-center gap-2 text-sm", children: [
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_react.cx)("h-2 w-2 rounded-full bg-current", entry.payload?.className) }),
63
+ entry.value
64
+ ] }, entry.value ?? index))
65
+ }
66
+ );
67
+ };
68
+ var ChartTooltipContent = ({ active, payload, label, isRadialChart, isPieChart, formatter, labelFormatter }) => {
69
+ const canRender = active && payload && payload.length;
70
+ if (!canRender) {
71
+ return null;
72
+ }
73
+ const isSingleDataPoint = payload.length === 1;
74
+ let title = isSingleDataPoint ? isRadialChart ? payload[0].value : isPieChart ? payload[0].value : payload[0].value : label;
75
+ let secondaryTitle = isSingleDataPoint ? isRadialChart ? payload[0].payload.name : isPieChart ? payload[0].name : label : payload;
76
+ title = isSingleDataPoint && formatter ? formatter(title, payload?.[0].name || label, payload[0], 0, payload) : labelFormatter ? labelFormatter(title, payload) : title;
77
+ secondaryTitle = isSingleDataPoint && labelFormatter ? labelFormatter(secondaryTitle, payload) : secondaryTitle;
78
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-base-solid flex flex-col gap-0.5 rounded-lg px-3 py-2 shadow-lg", children: [
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold text-white", children: title }),
80
+ !secondaryTitle ? null : Array.isArray(secondaryTitle) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: secondaryTitle.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: (0, import_react.cx)("text-xs text-tooltip-supporting-text"), children: `${entry.name}: ${formatter ? formatter(entry.value, entry.name, entry, index, entry.payload) : entry.value}` }, entry.name ?? index)) }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-tooltip-supporting-text", children: secondaryTitle })
81
+ ] });
82
+ };
83
+ var ChartActiveDot = ({ cx: cx2 = 0, cy = 0 }) => {
84
+ const size = 12;
85
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { x: cx2 - size / 2, y: cy - size / 2, width: size, height: size, viewBox: "0 0 12 12", fill: "none", children: [
86
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("title", { children: "Active data point indicator" }),
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "2", y: "2", width: "8", height: "8", rx: "6", className: "stroke-brand-medium fill-bg-base", strokeWidth: "2" })
88
+ ] });
89
+ };
90
+ // Annotate the CommonJS export names for ESM import in node:
91
+ 0 && (module.exports = {
92
+ ChartActiveDot,
93
+ ChartLegendContent,
94
+ ChartTooltipContent,
95
+ selectEvenlySpacedItems
96
+ });
97
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/charts-base.tsx"],"sourcesContent":["// Copyright (c) 2025 Amsterdam Data Labs\n// @enact-ui/charts - Chart components built on Recharts\n\n/**\n * @enact-ui/charts\n *\n * Chart components for ENACT UI built on Recharts.\n * Adds ~200KB to bundle. Only install if you need charts.\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Chart Base Utilities\n// =============================================================================\nexport {\n ChartActiveDot,\n ChartLegendContent,\n ChartTooltipContent,\n selectEvenlySpacedItems,\n} from \"./components/charts-base\";\n\n// =============================================================================\n// Demo Components (for reference/examples)\n// =============================================================================\n// Note: Demo components are included for reference but typically\n// consumers will build their own chart implementations using the base utilities\n","// Copyright (c) 2025 Amsterdam Data Labs\n\"use client\";\n\nimport { cx } from \"@enact-ui/react\";\nimport type { TooltipProps } from \"recharts\";\nimport type { Props as LegendContentProps } from \"recharts/types/component/DefaultLegendContent\";\nimport type { NameType, ValueType } from \"recharts/types/component/DefaultTooltipContent\";\nimport type { Props as DotProps } from \"recharts/types/shape/Dot\";\n\n/**\n * Selects evenly spaced items from an array. Used for rendering\n * certain number of x-axis labels.\n * @param dataArray - The array of items to select from.\n * @param count - The number of items to select.\n * @returns The selected items.\n */\nexport const selectEvenlySpacedItems = <T extends readonly unknown[]>(dataArray: T, count: number): Array<T[number]> => {\n if (!dataArray || dataArray.length === 0) {\n return [];\n }\n\n const selectedItems: Array<T[number]> = [];\n\n if (dataArray.length === 1) {\n for (let i = 0; i < count; i++) {\n selectedItems.push(dataArray[0]);\n }\n return selectedItems;\n }\n\n for (let i = 0; i < count; i++) {\n const targetIndex = Math.round((i * (dataArray.length - 1)) / (count - 1));\n const boundedIndex = Math.max(0, Math.min(targetIndex, dataArray.length - 1));\n selectedItems.push(dataArray[boundedIndex]);\n }\n\n return selectedItems;\n};\n\n/**\n * Renders the legend content for a chart.\n * @param reversed - Whether to reverse the payload.\n * @param payload - The payload of the legend.\n * @param align - The alignment of the legend.\n * @param layout - The layout of the legend.\n * @param className - The class name of the legend.\n * @returns The legend content.\n */\nexport const ChartLegendContent = ({ reversed, payload, align, layout, className }: LegendContentProps & { reversed?: boolean; className?: string }) => {\n payload = reversed ? payload?.toReversed() : payload;\n\n return (\n <ul\n className={cx(\n \"flex\",\n layout === \"vertical\"\n ? `flex-col gap-1 pl-4 ${align === \"center\" ? \"items-center\" : align === \"right\" ? \"items-start\" : \"items-start\"}`\n : `flex-row gap-3 ${align === \"center\" ? \"justify-center\" : align === \"right\" ? \"justify-end\" : \"justify-start\"}`,\n className,\n )}\n >\n {payload?.map((entry, index) => (\n <li className=\"text-muted flex items-center gap-2 text-sm\" key={entry.value ?? index}>\n <span className={cx(\"h-2 w-2 rounded-full bg-current\", (entry.payload as { className?: string })?.className)} />\n {entry.value}\n </li>\n ))}\n </ul>\n );\n};\n\ninterface ChartTooltipContentProps extends TooltipProps<ValueType, NameType> {\n isRadialChart?: boolean;\n isPieChart?: boolean;\n label?: string;\n // We have to use `any` here because the `payload` prop is not typed correctly in the `recharts` library.\n // biome-ignore lint/suspicious/noExplicitAny: recharts library typing limitation\n payload?: any;\n}\n\nexport const ChartTooltipContent = ({ active, payload, label, isRadialChart, isPieChart, formatter, labelFormatter }: ChartTooltipContentProps) => {\n const canRender = active && payload && payload.length;\n\n if (!canRender) {\n return null;\n }\n\n const isSingleDataPoint = payload.length === 1;\n\n // If it's a single data point, we use the value as the title and\n // the name as the secondary title.\n let title = isSingleDataPoint ? (isRadialChart ? payload[0].value : isPieChart ? payload[0].value : payload[0].value) : label;\n let secondaryTitle = isSingleDataPoint ? (isRadialChart ? payload[0].payload.name : isPieChart ? payload[0].name : label) : payload;\n\n title =\n isSingleDataPoint && formatter\n ? formatter(title, payload?.[0].name || label, payload[0], 0, payload)\n : labelFormatter\n ? labelFormatter(title, payload)\n : title;\n secondaryTitle = isSingleDataPoint && labelFormatter ? labelFormatter(secondaryTitle, payload) : secondaryTitle;\n\n return (\n <div className=\"bg-base-solid flex flex-col gap-0.5 rounded-lg px-3 py-2 shadow-lg\">\n <p className=\"text-xs font-semibold text-white\">{title}</p>\n\n {!secondaryTitle ? null : Array.isArray(secondaryTitle) ? (\n <div>\n {secondaryTitle.map((entry, index) => (\n <p key={entry.name ?? index} className={cx(\"text-xs text-tooltip-supporting-text\")}>\n {`${entry.name}: ${formatter ? formatter(entry.value, entry.name, entry, index, entry.payload) : entry.value}`}\n </p>\n ))}\n </div>\n ) : (\n <p className=\"text-xs text-tooltip-supporting-text\">{secondaryTitle}</p>\n )}\n </div>\n );\n};\n\ninterface ChartActiveDotProps extends DotProps {\n // We have to use `any` here because the `payload` prop is not typed correctly in the `recharts` library.\n // biome-ignore lint/suspicious/noExplicitAny: recharts library typing limitation\n payload?: any;\n}\n\nexport const ChartActiveDot = ({ cx = 0, cy = 0 }: ChartActiveDotProps) => {\n const size = 12;\n\n return (\n <svg x={cx - size / 2} y={cy - size / 2} width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <title>Active data point indicator</title>\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"6\" className=\"stroke-brand-medium fill-bg-base\" strokeWidth=\"2\" />\n </svg>\n );\n};\n"],"mappings":"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","names":["cx"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,67 @@
1
+ // src/components/charts-base.tsx
2
+ import { cx } from "@enact-ui/react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ var selectEvenlySpacedItems = (dataArray, count) => {
5
+ if (!dataArray || dataArray.length === 0) {
6
+ return [];
7
+ }
8
+ const selectedItems = [];
9
+ if (dataArray.length === 1) {
10
+ for (let i = 0; i < count; i++) {
11
+ selectedItems.push(dataArray[0]);
12
+ }
13
+ return selectedItems;
14
+ }
15
+ for (let i = 0; i < count; i++) {
16
+ const targetIndex = Math.round(i * (dataArray.length - 1) / (count - 1));
17
+ const boundedIndex = Math.max(0, Math.min(targetIndex, dataArray.length - 1));
18
+ selectedItems.push(dataArray[boundedIndex]);
19
+ }
20
+ return selectedItems;
21
+ };
22
+ var ChartLegendContent = ({ reversed, payload, align, layout, className }) => {
23
+ payload = reversed ? payload?.toReversed() : payload;
24
+ return /* @__PURE__ */ jsx(
25
+ "ul",
26
+ {
27
+ className: cx(
28
+ "flex",
29
+ layout === "vertical" ? `flex-col gap-1 pl-4 ${align === "center" ? "items-center" : align === "right" ? "items-start" : "items-start"}` : `flex-row gap-3 ${align === "center" ? "justify-center" : align === "right" ? "justify-end" : "justify-start"}`,
30
+ className
31
+ ),
32
+ children: payload?.map((entry, index) => /* @__PURE__ */ jsxs("li", { className: "text-muted flex items-center gap-2 text-sm", children: [
33
+ /* @__PURE__ */ jsx("span", { className: cx("h-2 w-2 rounded-full bg-current", entry.payload?.className) }),
34
+ entry.value
35
+ ] }, entry.value ?? index))
36
+ }
37
+ );
38
+ };
39
+ var ChartTooltipContent = ({ active, payload, label, isRadialChart, isPieChart, formatter, labelFormatter }) => {
40
+ const canRender = active && payload && payload.length;
41
+ if (!canRender) {
42
+ return null;
43
+ }
44
+ const isSingleDataPoint = payload.length === 1;
45
+ let title = isSingleDataPoint ? isRadialChart ? payload[0].value : isPieChart ? payload[0].value : payload[0].value : label;
46
+ let secondaryTitle = isSingleDataPoint ? isRadialChart ? payload[0].payload.name : isPieChart ? payload[0].name : label : payload;
47
+ title = isSingleDataPoint && formatter ? formatter(title, payload?.[0].name || label, payload[0], 0, payload) : labelFormatter ? labelFormatter(title, payload) : title;
48
+ secondaryTitle = isSingleDataPoint && labelFormatter ? labelFormatter(secondaryTitle, payload) : secondaryTitle;
49
+ return /* @__PURE__ */ jsxs("div", { className: "bg-base-solid flex flex-col gap-0.5 rounded-lg px-3 py-2 shadow-lg", children: [
50
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-white", children: title }),
51
+ !secondaryTitle ? null : Array.isArray(secondaryTitle) ? /* @__PURE__ */ jsx("div", { children: secondaryTitle.map((entry, index) => /* @__PURE__ */ jsx("p", { className: cx("text-xs text-tooltip-supporting-text"), children: `${entry.name}: ${formatter ? formatter(entry.value, entry.name, entry, index, entry.payload) : entry.value}` }, entry.name ?? index)) }) : /* @__PURE__ */ jsx("p", { className: "text-xs text-tooltip-supporting-text", children: secondaryTitle })
52
+ ] });
53
+ };
54
+ var ChartActiveDot = ({ cx: cx2 = 0, cy = 0 }) => {
55
+ const size = 12;
56
+ return /* @__PURE__ */ jsxs("svg", { x: cx2 - size / 2, y: cy - size / 2, width: size, height: size, viewBox: "0 0 12 12", fill: "none", children: [
57
+ /* @__PURE__ */ jsx("title", { children: "Active data point indicator" }),
58
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "2", width: "8", height: "8", rx: "6", className: "stroke-brand-medium fill-bg-base", strokeWidth: "2" })
59
+ ] });
60
+ };
61
+ export {
62
+ ChartActiveDot,
63
+ ChartLegendContent,
64
+ ChartTooltipContent,
65
+ selectEvenlySpacedItems
66
+ };
67
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts-base.tsx"],"sourcesContent":["// Copyright (c) 2025 Amsterdam Data Labs\n\"use client\";\n\nimport { cx } from \"@enact-ui/react\";\nimport type { TooltipProps } from \"recharts\";\nimport type { Props as LegendContentProps } from \"recharts/types/component/DefaultLegendContent\";\nimport type { NameType, ValueType } from \"recharts/types/component/DefaultTooltipContent\";\nimport type { Props as DotProps } from \"recharts/types/shape/Dot\";\n\n/**\n * Selects evenly spaced items from an array. Used for rendering\n * certain number of x-axis labels.\n * @param dataArray - The array of items to select from.\n * @param count - The number of items to select.\n * @returns The selected items.\n */\nexport const selectEvenlySpacedItems = <T extends readonly unknown[]>(dataArray: T, count: number): Array<T[number]> => {\n if (!dataArray || dataArray.length === 0) {\n return [];\n }\n\n const selectedItems: Array<T[number]> = [];\n\n if (dataArray.length === 1) {\n for (let i = 0; i < count; i++) {\n selectedItems.push(dataArray[0]);\n }\n return selectedItems;\n }\n\n for (let i = 0; i < count; i++) {\n const targetIndex = Math.round((i * (dataArray.length - 1)) / (count - 1));\n const boundedIndex = Math.max(0, Math.min(targetIndex, dataArray.length - 1));\n selectedItems.push(dataArray[boundedIndex]);\n }\n\n return selectedItems;\n};\n\n/**\n * Renders the legend content for a chart.\n * @param reversed - Whether to reverse the payload.\n * @param payload - The payload of the legend.\n * @param align - The alignment of the legend.\n * @param layout - The layout of the legend.\n * @param className - The class name of the legend.\n * @returns The legend content.\n */\nexport const ChartLegendContent = ({ reversed, payload, align, layout, className }: LegendContentProps & { reversed?: boolean; className?: string }) => {\n payload = reversed ? payload?.toReversed() : payload;\n\n return (\n <ul\n className={cx(\n \"flex\",\n layout === \"vertical\"\n ? `flex-col gap-1 pl-4 ${align === \"center\" ? \"items-center\" : align === \"right\" ? \"items-start\" : \"items-start\"}`\n : `flex-row gap-3 ${align === \"center\" ? \"justify-center\" : align === \"right\" ? \"justify-end\" : \"justify-start\"}`,\n className,\n )}\n >\n {payload?.map((entry, index) => (\n <li className=\"text-muted flex items-center gap-2 text-sm\" key={entry.value ?? index}>\n <span className={cx(\"h-2 w-2 rounded-full bg-current\", (entry.payload as { className?: string })?.className)} />\n {entry.value}\n </li>\n ))}\n </ul>\n );\n};\n\ninterface ChartTooltipContentProps extends TooltipProps<ValueType, NameType> {\n isRadialChart?: boolean;\n isPieChart?: boolean;\n label?: string;\n // We have to use `any` here because the `payload` prop is not typed correctly in the `recharts` library.\n // biome-ignore lint/suspicious/noExplicitAny: recharts library typing limitation\n payload?: any;\n}\n\nexport const ChartTooltipContent = ({ active, payload, label, isRadialChart, isPieChart, formatter, labelFormatter }: ChartTooltipContentProps) => {\n const canRender = active && payload && payload.length;\n\n if (!canRender) {\n return null;\n }\n\n const isSingleDataPoint = payload.length === 1;\n\n // If it's a single data point, we use the value as the title and\n // the name as the secondary title.\n let title = isSingleDataPoint ? (isRadialChart ? payload[0].value : isPieChart ? payload[0].value : payload[0].value) : label;\n let secondaryTitle = isSingleDataPoint ? (isRadialChart ? payload[0].payload.name : isPieChart ? payload[0].name : label) : payload;\n\n title =\n isSingleDataPoint && formatter\n ? formatter(title, payload?.[0].name || label, payload[0], 0, payload)\n : labelFormatter\n ? labelFormatter(title, payload)\n : title;\n secondaryTitle = isSingleDataPoint && labelFormatter ? labelFormatter(secondaryTitle, payload) : secondaryTitle;\n\n return (\n <div className=\"bg-base-solid flex flex-col gap-0.5 rounded-lg px-3 py-2 shadow-lg\">\n <p className=\"text-xs font-semibold text-white\">{title}</p>\n\n {!secondaryTitle ? null : Array.isArray(secondaryTitle) ? (\n <div>\n {secondaryTitle.map((entry, index) => (\n <p key={entry.name ?? index} className={cx(\"text-xs text-tooltip-supporting-text\")}>\n {`${entry.name}: ${formatter ? formatter(entry.value, entry.name, entry, index, entry.payload) : entry.value}`}\n </p>\n ))}\n </div>\n ) : (\n <p className=\"text-xs text-tooltip-supporting-text\">{secondaryTitle}</p>\n )}\n </div>\n );\n};\n\ninterface ChartActiveDotProps extends DotProps {\n // We have to use `any` here because the `payload` prop is not typed correctly in the `recharts` library.\n // biome-ignore lint/suspicious/noExplicitAny: recharts library typing limitation\n payload?: any;\n}\n\nexport const ChartActiveDot = ({ cx = 0, cy = 0 }: ChartActiveDotProps) => {\n const size = 12;\n\n return (\n <svg x={cx - size / 2} y={cy - size / 2} width={size} height={size} viewBox=\"0 0 12 12\" fill=\"none\">\n <title>Active data point indicator</title>\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"6\" className=\"stroke-brand-medium fill-bg-base\" strokeWidth=\"2\" />\n </svg>\n );\n};\n"],"mappings":"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","names":["cx"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@enact-ui/charts",
3
+ "version": "1.0.0",
4
+ "description": "Chart components for ENACT UI built on Recharts. Adds ~200KB to bundle. Only install if you need charts.",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "sideEffects": false,
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc --build && tsup",
22
+ "dev": "tsup --watch",
23
+ "type-check": "tsc --noEmit",
24
+ "lint": "biome check --write .",
25
+ "lint:check": "biome check .",
26
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
27
+ },
28
+ "peerDependencies": {
29
+ "@enact-ui/react": "^0.0.0",
30
+ "react": "^18.0.0 || ^19.0.0",
31
+ "react-dom": "^18.0.0 || ^19.0.0",
32
+ "recharts": "^3.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/react": "^19.1.9",
36
+ "@types/react-dom": "^19.1.7",
37
+ "typescript": "^5.9.2"
38
+ },
39
+ "keywords": [
40
+ "react",
41
+ "charts",
42
+ "recharts",
43
+ "visualization",
44
+ "enact-ui"
45
+ ],
46
+ "engines": {
47
+ "node": ">=24.0.0",
48
+ "npm": ">=10.0.0"
49
+ },
50
+ "author": "Enact UI",
51
+ "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/enact-ui/enact-ui.git",
55
+ "directory": "packages/charts"
56
+ },
57
+ "bugs": {
58
+ "url": "https://github.com/enact-ui/enact-ui/issues"
59
+ },
60
+ "homepage": "https://enact-ui.com"
61
+ }