@enact-ui/charts 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-schema.json +169 -0
- package/dist/__tests__/recharts-mock.d.ts +2 -0
- package/dist/__tests__/recharts-mock.d.ts.map +1 -0
- package/dist/__tests__/recharts-mock.js +19 -0
- package/dist/__tests__/recharts-mock.js.map +1 -0
- package/dist/__tests__/test-utils.d.ts +76 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +89 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/components/activity-gauges.demo.d.ts +5 -0
- package/dist/components/activity-gauges.demo.d.ts.map +1 -1
- package/dist/components/activity-gauges.demo.js +25 -11
- package/dist/components/activity-gauges.demo.js.map +1 -1
- package/dist/components/activity-gauges.story.d.ts +6 -22
- package/dist/components/activity-gauges.story.d.ts.map +1 -1
- package/dist/components/activity-gauges.story.js +19 -11
- package/dist/components/activity-gauges.story.js.map +1 -1
- package/dist/components/bar-charts.demo.d.ts +6 -0
- package/dist/components/bar-charts.demo.d.ts.map +1 -1
- package/dist/components/bar-charts.demo.js +24 -11
- package/dist/components/bar-charts.demo.js.map +1 -1
- package/dist/components/bar-charts.story.d.ts +6 -18
- package/dist/components/bar-charts.story.d.ts.map +1 -1
- package/dist/components/bar-charts.story.js +19 -9
- package/dist/components/bar-charts.story.js.map +1 -1
- package/dist/components/charts-base.d.ts +0 -8
- package/dist/components/charts-base.d.ts.map +1 -1
- package/dist/components/charts-base.js +2 -28
- package/dist/components/charts-base.js.map +1 -1
- package/dist/components/line-charts.demo.d.ts +6 -0
- package/dist/components/line-charts.demo.d.ts.map +1 -1
- package/dist/components/line-charts.demo.js +32 -18
- package/dist/components/line-charts.demo.js.map +1 -1
- package/dist/components/line-charts.story.d.ts +6 -22
- package/dist/components/line-charts.story.d.ts.map +1 -1
- package/dist/components/line-charts.story.js +19 -11
- package/dist/components/line-charts.story.js.map +1 -1
- package/dist/components/pie-charts.demo.d.ts +5 -0
- package/dist/components/pie-charts.demo.d.ts.map +1 -1
- package/dist/components/pie-charts.demo.js +20 -4
- package/dist/components/pie-charts.demo.js.map +1 -1
- package/dist/components/pie-charts.story.d.ts +6 -26
- package/dist/components/pie-charts.story.d.ts.map +1 -1
- package/dist/components/pie-charts.story.js +19 -13
- package/dist/components/pie-charts.story.js.map +1 -1
- package/dist/components/progress-circles.demo.d.ts +7 -0
- package/dist/components/progress-circles.demo.d.ts.map +1 -1
- package/dist/components/progress-circles.demo.js +11 -6
- package/dist/components/progress-circles.demo.js.map +1 -1
- package/dist/components/progress-circles.story.d.ts +6 -38
- package/dist/components/progress-circles.story.d.ts.map +1 -1
- package/dist/components/progress-circles.story.js +23 -19
- package/dist/components/progress-circles.story.js.map +1 -1
- package/dist/components/radar-charts.demo.d.ts +6 -3
- package/dist/components/radar-charts.demo.d.ts.map +1 -1
- package/dist/components/radar-charts.demo.js +18 -10
- package/dist/components/radar-charts.demo.js.map +1 -1
- package/dist/components/radar-charts.story.d.ts +6 -10
- package/dist/components/radar-charts.story.d.ts.map +1 -1
- package/dist/components/radar-charts.story.js +10 -5
- package/dist/components/radar-charts.story.js.map +1 -1
- package/dist/components/relationship-graph.d.ts +64 -0
- package/dist/components/relationship-graph.d.ts.map +1 -0
- package/dist/components/relationship-graph.demo.d.ts +2 -0
- package/dist/components/relationship-graph.demo.d.ts.map +1 -0
- package/dist/components/relationship-graph.demo.js +61 -0
- package/dist/components/relationship-graph.demo.js.map +1 -0
- package/dist/components/relationship-graph.js +381 -0
- package/dist/components/relationship-graph.js.map +1 -0
- package/dist/components/relationship-graph.story.d.ts +6 -0
- package/dist/components/relationship-graph.story.d.ts.map +1 -0
- package/dist/components/relationship-graph.story.js +13 -0
- package/dist/components/relationship-graph.story.js.map +1 -0
- package/dist/components/trend-indicator.d.ts +40 -0
- package/dist/components/trend-indicator.d.ts.map +1 -0
- package/dist/components/trend-indicator.demo.d.ts +2 -0
- package/dist/components/trend-indicator.demo.d.ts.map +1 -0
- package/dist/components/trend-indicator.demo.js +7 -0
- package/dist/components/trend-indicator.demo.js.map +1 -0
- package/dist/components/trend-indicator.js +50 -0
- package/dist/components/trend-indicator.js.map +1 -0
- package/dist/components/trend-indicator.story.d.ts +6 -0
- package/dist/components/trend-indicator.story.d.ts.map +1 -0
- package/dist/components/trend-indicator.story.js +13 -0
- package/dist/components/trend-indicator.story.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1852 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1837 -9
- package/dist/index.mjs.map +1 -1
- package/dist/utils/chart-utils.d.ts +9 -0
- package/dist/utils/chart-utils.d.ts.map +1 -0
- package/dist/utils/chart-utils.js +26 -0
- package/dist/utils/chart-utils.js.map +1 -0
- package/package.json +8 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/bar-charts.demo.tsx","../src/utils/chart-utils.ts","../src/components/charts-base.tsx","../src/components/line-charts.demo.tsx","../src/components/pie-charts.demo.tsx","../src/components/relationship-graph.tsx","../src/components/trend-indicator.tsx"],"sourcesContent":["\"use client\";\n\nimport { useBreakpoint } from \"@enact-ui/react\";\nimport { Bar, CartesianGrid, ComposedChart, Label, Legend, Line, BarChart as RechartsBarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from \"recharts\";\nimport { selectEvenlySpacedItems } from \"../utils/chart-utils\";\nimport { ChartLegendContent, ChartTooltipContent } from \"./charts-base\";\n\nconst barData = [\n // collapse-start\n {\n month: new Date(2025, 0, 1),\n A: 300,\n B: 200,\n C: 350,\n },\n {\n month: new Date(2025, 1, 1),\n A: 320,\n B: 300,\n C: 300,\n },\n {\n month: new Date(2025, 2, 1),\n A: 300,\n B: 200,\n C: 240,\n },\n {\n month: new Date(2025, 3, 1),\n A: 240,\n B: 300,\n C: 280,\n },\n {\n month: new Date(2025, 4, 1),\n A: 320,\n B: 280,\n C: 100,\n },\n {\n month: new Date(2025, 5, 1),\n A: 330,\n B: 300,\n C: 130,\n },\n {\n month: new Date(2025, 6, 1),\n A: 300,\n B: 200,\n C: 100,\n },\n {\n month: new Date(2025, 7, 1),\n A: 350,\n B: 300,\n C: 200,\n },\n {\n month: new Date(2025, 8, 1),\n A: 300,\n B: 200,\n C: 100,\n },\n {\n month: new Date(2025, 9, 1),\n A: 200,\n B: 300,\n C: 280,\n },\n {\n month: new Date(2025, 10, 1),\n A: 240,\n B: 300,\n C: 300,\n },\n {\n month: new Date(2025, 11, 1),\n A: 200,\n B: 400,\n C: 350,\n },\n // collapse-end\n];\n\nexport const BarChart = () => {\n const isDesktop = useBreakpoint(\"lg\");\n\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-content-brand\",\n C: \"text-content-tertiary\",\n };\n\n return (\n <ResponsiveContainer className=\"h-60!\">\n <RechartsBarChart\n data={barData}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n margin={{\n left: 4,\n right: 0,\n top: isDesktop ? 12 : 6,\n bottom: 18,\n }}\n >\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <Legend\n verticalAlign=\"top\"\n align=\"right\"\n layout={isDesktop ? \"vertical\" : \"horizontal\"}\n content={<ChartLegendContent className=\"-translate-y-2\" />}\n />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n tickMargin={11}\n interval=\"preserveStartEnd\"\n dataKey=\"month\"\n tickFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\" })}\n >\n <Label value=\"Month\" fill=\"currentColor\" className=\"!text-xs font-medium\" position=\"bottom\" />\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n labelFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\", year: \"numeric\" })}\n cursor={{\n className: \"fill-gray-light_hover/20\",\n }}\n />\n\n <Bar\n isAnimationActive={false}\n {...(colors.A !== undefined && { className: colors.A })}\n dataKey=\"A\"\n name=\"Series 1\"\n type=\"monotone\"\n stackId=\"a\"\n fill=\"currentColor\"\n maxBarSize={isDesktop ? 32 : 16}\n />\n <Bar\n isAnimationActive={false}\n {...(colors.B !== undefined && { className: colors.B })}\n dataKey=\"B\"\n name=\"Series 2\"\n type=\"monotone\"\n stackId=\"a\"\n fill=\"currentColor\"\n maxBarSize={isDesktop ? 32 : 16}\n />\n <Bar\n isAnimationActive={false}\n {...(colors.C !== undefined && { className: colors.C })}\n dataKey=\"C\"\n name=\"Series 3\"\n type=\"monotone\"\n stackId=\"a\"\n fill=\"currentColor\"\n maxBarSize={isDesktop ? 32 : 16}\n radius={[6, 6, 0, 0]}\n />\n </RechartsBarChart>\n </ResponsiveContainer>\n );\n};\n\nexport const BarChart02 = () => {\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-brand-subtle\",\n };\n\n const data = [\n // collapse-start\n { A: 633, B: 190, date: \"2025-01-01\" },\n { A: 443, B: 228, date: \"2025-01-08\" },\n { A: 506, B: 225, date: \"2025-01-15\" },\n { A: 316, B: 227, date: \"2025-01-22\" },\n { A: 760, B: 209, date: \"2025-01-29\" },\n { A: 950, B: 220, date: \"2025-02-05\" },\n { A: 760, B: 224, date: \"2025-02-12\" },\n { A: 570, B: 279, date: \"2025-02-19\" },\n { A: 253, B: 296, date: \"2025-02-26\" },\n { A: 380, B: 263, date: \"2025-03-05\" },\n { A: 443, B: 333, date: \"2025-03-12\" },\n { A: 443, B: 306, date: \"2025-03-19\" },\n { A: 316, B: 315, date: \"2025-03-26\" },\n { A: 190, B: 325, date: \"2025-04-02\" },\n { A: 380, B: 367, date: \"2025-04-09\" },\n { A: 506, B: 372, date: \"2025-04-16\" },\n { A: 443, B: 374, date: \"2025-04-23\" },\n { A: 696, B: 278, date: \"2025-04-30\" },\n { A: 950, B: 258, date: \"2025-05-07\" },\n { A: 633, B: 357, date: \"2025-05-14\" },\n { A: 570, B: 372, date: \"2025-05-21\" },\n { A: 253, B: 404, date: \"2025-05-28\" },\n { A: 316, B: 314, date: \"2025-06-04\" },\n { A: 380, B: 359, date: \"2025-06-11\" },\n { A: 253, B: 400, date: \"2025-06-18\" },\n { A: 190, B: 381, date: \"2025-06-25\" },\n { A: 316, B: 427, date: \"2025-07-02\" },\n { A: 633, B: 371, date: \"2025-07-09\" },\n { A: 570, B: 382, date: \"2025-07-16\" },\n { A: 760, B: 383, date: \"2025-07-23\" },\n { A: 950, B: 361, date: \"2025-07-30\" },\n { A: 696, B: 405, date: \"2025-08-06\" },\n { A: 570, B: 400, date: \"2025-08-13\" },\n { A: 443, B: 391, date: \"2025-08-20\" },\n { A: 316, B: 425, date: \"2025-08-27\" },\n { A: 253, B: 406, date: \"2025-09-03\" },\n { A: 380, B: 472, date: \"2025-09-10\" },\n { A: 633, B: 477, date: \"2025-09-17\" },\n { A: 570, B: 465, date: \"2025-09-24\" },\n { A: 443, B: 488, date: \"2025-10-01\" },\n { A: 380, B: 501, date: \"2025-10-08\" },\n { A: 316, B: 615, date: \"2025-10-15\" },\n { A: 570, B: 612, date: \"2025-10-22\" },\n { A: 506, B: 673, date: \"2025-10-29\" },\n { A: 443, B: 630, date: \"2025-11-05\" },\n { A: 760, B: 630, date: \"2025-11-12\" },\n { A: 443, B: 597, date: \"2025-11-19\" },\n { A: 506, B: 572, date: \"2025-11-26\" },\n { A: 316, B: 636, date: \"2025-12-03\" },\n { A: 633, B: 664, date: \"2025-12-10\" },\n { A: 380, B: 742, date: \"2025-12-17\" },\n { A: 633, B: 808, date: \"2025-12-24\" },\n // collapse-end\n ];\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <ComposedChart\n data={data}\n margin={{\n left: 4,\n right: 0,\n top: 12,\n bottom: 18,\n }}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n >\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n tickMargin={12}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n tickFormatter={(value) => new Date(value).toLocaleDateString(undefined, { month: \"short\" })}\n ticks={selectEvenlySpacedItems(data, 12).map((item) => item.date)}\n >\n <Label value=\"Month\" fill=\"currentColor\" className=\"!text-xs font-medium\" position=\"bottom\" />\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n // Custom label formatter to show the week range\n labelFormatter={(value) => {\n const date = new Date(value);\n const endDate = new Date(date);\n endDate.setDate(date.getDate() + 6); // Set end date to 7 days after start date\n\n // If the start and end dates are in the same month, shorten the label (Jun 1-7, 2025)\n if (date.getMonth() === endDate.getMonth()) {\n return `${date.toLocaleDateString(undefined, { month: \"long\" })} ${date.getDate()}-${endDate.getDate()}, ${endDate.getFullYear()}`;\n }\n\n // Otherwise, show the full month range (May 30 - Jun 5, 2025)\n return `${date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" })} - ${endDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" })}`;\n }}\n cursor={{\n className: \"fill-gray-light_hover/20\",\n }}\n />\n\n <Bar\n isAnimationActive={false}\n {...(colors.A !== undefined && { className: colors.A })}\n name=\"Mobile\"\n dataKey=\"A\"\n type=\"monotone\"\n stackId=\"a\"\n fill=\"currentColor\"\n maxBarSize={12}\n radius={[4, 4, 0, 0]}\n />\n <Line\n isAnimationActive={false}\n {...(colors.B !== undefined && { className: colors.B })}\n dataKey=\"B\"\n name=\"Desktop\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeDasharray=\"0.1 8\"\n strokeLinecap=\"round\"\n activeDot={false}\n dot={false}\n />\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\nexport const BarChart03 = () => {\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-brand-subtle\",\n };\n\n const data = [\n // collapse-start\n { A: 633, B: 190, date: \"2025-01-01\" },\n { A: 443, B: 228, date: \"2025-01-08\" },\n { A: 506, B: 225, date: \"2025-01-15\" },\n { A: 316, B: 227, date: \"2025-01-22\" },\n { A: 760, B: 209, date: \"2025-01-29\" },\n { A: 950, B: 220, date: \"2025-02-05\" },\n { A: 760, B: 224, date: \"2025-02-12\" },\n { A: 570, B: 279, date: \"2025-02-19\" },\n { A: 253, B: 296, date: \"2025-02-26\" },\n { A: 380, B: 263, date: \"2025-03-05\" },\n { A: 443, B: 333, date: \"2025-03-12\" },\n { A: 443, B: 306, date: \"2025-03-19\" },\n { A: 316, B: 315, date: \"2025-03-26\" },\n { A: 190, B: 325, date: \"2025-04-02\" },\n { A: 380, B: 367, date: \"2025-04-09\" },\n { A: 506, B: 372, date: \"2025-04-16\" },\n { A: 443, B: 374, date: \"2025-04-23\" },\n { A: 696, B: 278, date: \"2025-04-30\" },\n { A: 950, B: 258, date: \"2025-05-07\" },\n { A: 633, B: 357, date: \"2025-05-14\" },\n { A: 570, B: 372, date: \"2025-05-21\" },\n { A: 253, B: 404, date: \"2025-05-28\" },\n { A: 316, B: 314, date: \"2025-06-04\" },\n { A: 380, B: 359, date: \"2025-06-11\" },\n { A: 253, B: 400, date: \"2025-06-18\" },\n { A: 190, B: 381, date: \"2025-06-25\" },\n { A: 316, B: 427, date: \"2025-07-02\" },\n { A: 633, B: 371, date: \"2025-07-09\" },\n { A: 570, B: 382, date: \"2025-07-16\" },\n { A: 760, B: 383, date: \"2025-07-23\" },\n { A: 950, B: 361, date: \"2025-07-30\" },\n { A: 696, B: 405, date: \"2025-08-06\" },\n { A: 570, B: 400, date: \"2025-08-13\" },\n { A: 443, B: 391, date: \"2025-08-20\" },\n { A: 316, B: 425, date: \"2025-08-27\" },\n { A: 253, B: 406, date: \"2025-09-03\" },\n { A: 380, B: 472, date: \"2025-09-10\" },\n { A: 633, B: 477, date: \"2025-09-17\" },\n { A: 570, B: 465, date: \"2025-09-24\" },\n { A: 443, B: 488, date: \"2025-10-01\" },\n { A: 380, B: 501, date: \"2025-10-08\" },\n { A: 316, B: 615, date: \"2025-10-15\" },\n { A: 570, B: 612, date: \"2025-10-22\" },\n { A: 506, B: 673, date: \"2025-10-29\" },\n { A: 443, B: 630, date: \"2025-11-05\" },\n { A: 760, B: 630, date: \"2025-11-12\" },\n { A: 443, B: 597, date: \"2025-11-19\" },\n { A: 506, B: 572, date: \"2025-11-26\" },\n { A: 316, B: 636, date: \"2025-12-03\" },\n { A: 633, B: 664, date: \"2025-12-10\" },\n { A: 380, B: 742, date: \"2025-12-17\" },\n { A: 633, B: 808, date: \"2025-12-24\" },\n // collapse-end\n ];\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <ComposedChart\n data={data}\n margin={{\n left: 4,\n right: 0,\n top: 12,\n bottom: 18,\n }}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n >\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n tickMargin={12}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n tickFormatter={(value) => new Date(value).toLocaleDateString(undefined, { month: \"short\" })}\n ticks={selectEvenlySpacedItems(data, 12).map((item) => item.date)}\n >\n <Label value=\"Month\" fill=\"currentColor\" className=\"!text-xs font-medium\" position=\"bottom\" />\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n // Custom label formatter to show the week range\n labelFormatter={(value) => {\n const date = new Date(value);\n const endDate = new Date(date);\n endDate.setDate(date.getDate() + 6); // Set end date to 7 days after start date\n\n // If the start and end dates are in the same month, shorten the label (Jun 1-7, 2025)\n if (date.getMonth() === endDate.getMonth()) {\n return `${date.toLocaleDateString(undefined, { month: \"long\" })} ${date.getDate()}-${endDate.getDate()}, ${endDate.getFullYear()}`;\n }\n\n // Otherwise, show the full month range (May 30 - Jun 5, 2025)\n return `${date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" })} - ${endDate.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" })}`;\n }}\n cursor={{\n className: \"fill-gray-light_hover/20\",\n }}\n />\n\n <Bar\n isAnimationActive={false}\n {...(colors.A !== undefined && { className: colors.A })}\n name=\"Mobile\"\n dataKey=\"A\"\n type=\"monotone\"\n stackId=\"a\"\n fill=\"currentColor\"\n maxBarSize={8}\n radius={[4, 4, 0, 0]}\n />\n <Line\n isAnimationActive={false}\n {...(colors.B !== undefined && { className: colors.B })}\n dataKey=\"B\"\n name=\"Desktop\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeDasharray=\"0.1 8\"\n strokeLinecap=\"round\"\n activeDot={false}\n dot={false}\n />\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\ninterface BarChartPlaygroundProps {\n variant?: \"default\" | \"02\" | \"03\";\n}\n\nexport const BarChartPlayground = ({ variant = \"default\" }: BarChartPlaygroundProps) => {\n switch (variant) {\n case \"02\":\n return <BarChart02 />;\n case \"03\":\n return <BarChart03 />;\n default:\n return <BarChart />;\n }\n};\n\nexport const BarChartVariations = () => {\n return (\n <div className=\"flex flex-col gap-8\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Default</div>\n <BarChart />\n </div>\n\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Bar Chart 02</div>\n <BarChart02 />\n </div>\n\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Bar Chart 03</div>\n <BarChart03 />\n </div>\n </div>\n );\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","\"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 * 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-content-tertiary 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-primary-solid flex flex-col gap-0.5 rounded-lg px-3 py-2 shadow-lg\">\n <p className=\"text-xs font-semibold text-content-on-brand\">{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-content-tertiary\")}>\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-content-tertiary\">{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","\"use client\";\n\nimport { cx, useBreakpoint } from \"@enact-ui/react\";\nimport { Area, AreaChart, CartesianGrid, Label, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis } from \"recharts\";\nimport { ChartLegendContent, ChartTooltipContent } from \"./charts-base\";\n\nconst lineData = [\n // collapse-start\n {\n date: new Date(2025, 0, 1),\n A: 600,\n B: 400,\n C: 100,\n },\n {\n date: new Date(2025, 1, 1),\n A: 620,\n B: 405,\n C: 160,\n },\n {\n date: new Date(2025, 2, 1),\n A: 630,\n B: 400,\n C: 170,\n },\n {\n date: new Date(2025, 3, 1),\n A: 650,\n B: 410,\n C: 190,\n },\n {\n date: new Date(2025, 4, 1),\n A: 600,\n B: 320,\n C: 200,\n },\n {\n date: new Date(2025, 5, 1),\n A: 650,\n B: 430,\n C: 230,\n },\n {\n date: new Date(2025, 6, 1),\n A: 620,\n B: 400,\n C: 200,\n },\n {\n date: new Date(2025, 7, 1),\n A: 750,\n B: 540,\n C: 300,\n },\n {\n date: new Date(2025, 8, 1),\n A: 780,\n B: 490,\n C: 390,\n },\n {\n date: new Date(2025, 9, 1),\n A: 750,\n B: 450,\n C: 300,\n },\n {\n date: new Date(2025, 10, 1),\n A: 780,\n B: 480,\n C: 340,\n },\n {\n date: new Date(2025, 11, 1),\n A: 820,\n B: 500,\n C: 450,\n },\n // collapse-end\n];\n\nexport const LineChart01 = () => {\n const isDesktop = useBreakpoint(\"lg\");\n\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-brand-subtle\",\n C: \"text-content-brand\",\n };\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <AreaChart\n data={lineData}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n margin={{\n top: isDesktop ? 12 : 6,\n bottom: isDesktop ? 16 : 0,\n }}\n >\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"currentColor\" className=\"text-content-brand\" stopOpacity=\"0.7\" />\n <stop offset=\"95%\" stopColor=\"currentColor\" className=\"text-content-brand\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <Legend\n align=\"right\"\n verticalAlign=\"top\"\n layout={isDesktop ? \"vertical\" : \"horizontal\"}\n content={<ChartLegendContent className=\"-translate-y-2\" />}\n />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n tickFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\" })}\n padding={{ left: 10, right: 10 }}\n >\n {isDesktop && (\n <Label fill=\"currentColor\" className=\"!text-xs font-medium max-lg:hidden\" position=\"bottom\">\n Month\n </Label>\n )}\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n labelFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\", year: \"numeric\" })}\n cursor={{\n className: \"stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.A, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"A\"\n name=\"Series 1\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"url(#gradient)\"\n fillOpacity={0.1}\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.B, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"B\"\n name=\"Series 2\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.C, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"C\"\n name=\"Series 3\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\nexport const LineChart02 = () => {\n const isDesktop = useBreakpoint(\"lg\");\n\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-brand-subtle\",\n C: \"text-content-brand\",\n };\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <AreaChart\n data={lineData}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n margin={{\n left: 5,\n right: 5,\n top: isDesktop ? 12 : 6,\n bottom: isDesktop ? 16 : 0,\n }}\n >\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"currentColor\" className=\"text-content-brand\" stopOpacity=\"0.7\" />\n <stop offset=\"95%\" stopColor=\"currentColor\" className=\"text-content-brand\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <Legend\n verticalAlign=\"top\"\n align=\"right\"\n layout={isDesktop ? \"vertical\" : \"horizontal\"}\n content={<ChartLegendContent className=\"-translate-y-2\" />}\n />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n tickFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\" })}\n padding={{ left: 10, right: 10 }}\n >\n {isDesktop && (\n <Label fill=\"currentColor\" className=\"!text-xs font-medium max-lg:hidden\" position=\"bottom\">\n Month\n </Label>\n )}\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n labelFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\", year: \"numeric\" })}\n cursor={{\n className: \"stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.A, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"A\"\n name=\"Series 1\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"url(#gradient)\"\n fillOpacity={0.1}\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.B, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"B\"\n name=\"Series 2\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n strokeDasharray=\"0.1 8\"\n strokeLinecap=\"round\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.C, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"C\"\n name=\"Series 3\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n strokeDasharray=\"0.1 8\"\n strokeLinecap=\"round\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\nexport const LineChart03 = () => {\n const isDesktop = useBreakpoint(\"lg\");\n\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-brand-subtle\",\n C: \"text-content-brand\",\n };\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <AreaChart\n data={lineData}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n margin={{\n left: 5,\n right: 5,\n top: isDesktop ? 12 : 6,\n bottom: isDesktop ? 16 : 0,\n }}\n >\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"currentColor\" className=\"text-content-secondary\" stopOpacity=\"0.8\" />\n <stop offset=\"80%\" stopColor=\"currentColor\" className=\"text-content-secondary\" stopOpacity=\"0\" />\n </linearGradient>\n\n <pattern id=\"verticalLines\" width=\"8\" height=\"100%\" fill=\"url(#gradient)\" patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"100%\" stroke=\"currentColor\" className=\"text-content-tertiary\" strokeWidth=\"1.5\" />\n <rect width=\"100%\" height=\"100%\" fill=\"url(#gradient)\" fillOpacity={0.15} />\n </pattern>\n </defs>\n\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <Legend\n verticalAlign=\"top\"\n align=\"right\"\n layout={isDesktop ? \"vertical\" : \"horizontal\"}\n content={<ChartLegendContent className=\"-translate-y-2\" />}\n />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n tickMargin={10}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n padding={{ left: 10, right: 10 }}\n tickFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\" })}\n >\n {isDesktop && (\n <Label fill=\"currentColor\" className=\"!text-xs font-medium max-lg:hidden\" position=\"bottom\">\n Month\n </Label>\n )}\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n labelFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\", year: \"numeric\" })}\n cursor={{\n className: \"stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.A, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"A\"\n name=\"Series 1\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"url(#verticalLines)\"\n fillOpacity={1}\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.B, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"B\"\n name=\"Series 2\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.C, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"C\"\n name=\"Series 3\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\nexport const LineChart04 = () => {\n const isDesktop = useBreakpoint(\"lg\");\n\n const colors: Record<string, string> = {\n A: \"text-content-brand\",\n B: \"text-content-secondary\",\n C: \"text-content-tertiary\",\n };\n\n return (\n <div className=\"flex h-60 flex-col gap-2\">\n <ResponsiveContainer className=\"h-full\">\n <AreaChart\n data={lineData}\n className=\"text-content-tertiary [&_.recharts-text]:text-xs\"\n margin={{\n left: 5,\n right: 5,\n top: isDesktop ? 12 : 6,\n bottom: isDesktop ? 16 : 0,\n }}\n >\n <defs>\n <linearGradient id=\"gradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"currentColor\" className=\"text-content-secondary\" stopOpacity=\"0.7\" />\n <stop offset=\"95%\" stopColor=\"currentColor\" className=\"text-content-secondary\" stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} stroke=\"currentColor\" className=\"text-content-tertiary\" />\n\n <Legend\n verticalAlign=\"top\"\n align=\"right\"\n layout={isDesktop ? \"vertical\" : \"horizontal\"}\n content={<ChartLegendContent className=\"-translate-y-2\" />}\n />\n\n <XAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n tickMargin={10}\n interval=\"preserveStartEnd\"\n dataKey=\"date\"\n tickFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\" })}\n padding={{ left: 10, right: 10 }}\n >\n {isDesktop && (\n <Label fill=\"currentColor\" className=\"!text-xs font-medium max-lg:hidden\" position=\"bottom\">\n Month\n </Label>\n )}\n </XAxis>\n\n <YAxis\n fill=\"currentColor\"\n axisLine={false}\n tickLine={false}\n interval=\"preserveStartEnd\"\n tickFormatter={(value) => Number(value).toLocaleString()}\n >\n <Label\n value=\"Active users\"\n fill=\"currentColor\"\n className=\"!text-xs font-medium\"\n style={{ textAnchor: \"middle\" }}\n angle={-90}\n position=\"insideLeft\"\n />\n </YAxis>\n\n <Tooltip\n content={<ChartTooltipContent />}\n formatter={(value) => Number(value).toLocaleString()}\n labelFormatter={(value) => value.toLocaleDateString(undefined, { month: \"short\", year: \"numeric\" })}\n cursor={{\n className: \"stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.A, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"A\"\n name=\"Series 1\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"url(#gradient)\"\n fillOpacity={0.1}\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.B, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"B\"\n name=\"Series 2\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n\n <Area\n isAnimationActive={false}\n className={cx(colors.C, \"[&_.recharts-area-area]:translate-y-1.5 [&_.recharts-area-area]:[clip-path:inset(0_0_6px_0)]\")}\n dataKey=\"C\"\n name=\"Series 3\"\n type=\"monotone\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fill=\"none\"\n activeDot={{\n className: \"fill-bg-base stroke-brand-medium stroke-2\",\n }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\ninterface LineChartPlaygroundProps {\n variant?: \"01\" | \"02\" | \"03\" | \"04\";\n}\n\nexport const LineChartPlayground = ({ variant = \"01\" }: LineChartPlaygroundProps) => {\n switch (variant) {\n case \"02\":\n return <LineChart02 />;\n case \"03\":\n return <LineChart03 />;\n case \"04\":\n return <LineChart04 />;\n default:\n return <LineChart01 />;\n }\n};\n\nexport const LineChartVariations = () => {\n return (\n <div className=\"flex flex-col gap-8\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Line Chart 01</div>\n <LineChart01 />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Line Chart 02</div>\n <LineChart02 />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Line Chart 03</div>\n <LineChart03 />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">Line Chart 04</div>\n <LineChart04 />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport { Legend, Pie, PieChart as RechartsPieChart, ResponsiveContainer, Tooltip } from \"recharts\";\nimport { ChartLegendContent, ChartTooltipContent } from \"./charts-base\";\n\nconst pieChartData = [\n // collapse-start\n {\n name: \"Series 1\",\n value: 200,\n className: \"text-content-brand\",\n },\n {\n name: \"Series 2\",\n value: 350,\n className: \"text-content-brand\",\n },\n {\n name: \"Series 3\",\n value: 100,\n className: \"text-brand-subtle\",\n },\n {\n name: \"Series 4\",\n value: 120,\n className: \"text-brand-subtle\",\n },\n {\n name: \"Series 5\",\n value: 230,\n className: \"text-content-tertiary\",\n },\n // collapse-end\n];\n\ninterface PieChartProps {\n data?: { name: string; value: number; className?: string }[];\n}\n\nexport const PieChartXxs = ({ data = pieChartData }: PieChartProps) => {\n return (\n <ResponsiveContainer height={120} className=\"max-w-52.5\">\n <RechartsPieChart\n margin={{\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n }}\n >\n {/* biome-ignore lint/suspicious/noExplicitAny: Recharts Legend content prop type mismatch with exactOptionalPropertyTypes */}\n <Legend verticalAlign=\"top\" align=\"right\" layout=\"vertical\" content={ChartLegendContent as any} />\n <Tooltip content={<ChartTooltipContent isPieChart />} />\n\n <Pie\n isAnimationActive={false}\n startAngle={-270}\n endAngle={-630}\n stroke=\"none\"\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n fill=\"currentColor\"\n innerRadius={30}\n outerRadius={60}\n />\n </RechartsPieChart>\n </ResponsiveContainer>\n );\n};\n\nexport const PieChartXs = ({ data = pieChartData }: PieChartProps) => {\n return (\n <ResponsiveContainer height={160} className=\"max-w-62.5\">\n <RechartsPieChart\n margin={{\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n }}\n >\n {/* biome-ignore lint/suspicious/noExplicitAny: Recharts Legend content prop type mismatch with exactOptionalPropertyTypes */}\n <Legend verticalAlign=\"top\" align=\"right\" layout=\"vertical\" content={ChartLegendContent as any} />\n <Tooltip content={<ChartTooltipContent isPieChart />} />\n\n <Pie\n isAnimationActive={false}\n startAngle={-270}\n endAngle={-630}\n stroke=\"none\"\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n fill=\"currentColor\"\n innerRadius={40}\n outerRadius={80}\n />\n </RechartsPieChart>\n </ResponsiveContainer>\n );\n};\n\nexport const PieChartSm = ({ data = pieChartData }: PieChartProps) => {\n return (\n <ResponsiveContainer height={200} className=\"max-w-72.5\">\n <RechartsPieChart\n margin={{\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n }}\n >\n {/* biome-ignore lint/suspicious/noExplicitAny: Recharts Legend content prop type mismatch with exactOptionalPropertyTypes */}\n <Legend verticalAlign=\"top\" align=\"right\" layout=\"vertical\" content={ChartLegendContent as any} />\n <Tooltip content={<ChartTooltipContent isPieChart />} />\n\n <Pie\n isAnimationActive={false}\n startAngle={-270}\n endAngle={-630}\n stroke=\"none\"\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n fill=\"currentColor\"\n innerRadius={50}\n outerRadius={100}\n />\n </RechartsPieChart>\n </ResponsiveContainer>\n );\n};\n\nexport const PieChartMd = ({ data = pieChartData }: PieChartProps) => {\n return (\n <ResponsiveContainer height={240} className=\"max-w-96\">\n <RechartsPieChart\n margin={{\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n }}\n >\n {/* biome-ignore lint/suspicious/noExplicitAny: Recharts Legend content prop type mismatch with exactOptionalPropertyTypes */}\n <Legend verticalAlign=\"top\" align=\"right\" layout=\"vertical\" content={ChartLegendContent as any} />\n <Tooltip content={<ChartTooltipContent isPieChart />} />\n\n <Pie\n isAnimationActive={false}\n startAngle={-270}\n endAngle={-630}\n stroke=\"none\"\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n fill=\"currentColor\"\n innerRadius={60}\n outerRadius={120}\n />\n </RechartsPieChart>\n </ResponsiveContainer>\n );\n};\n\nexport const PieChartLg = ({ data = pieChartData }: PieChartProps) => {\n return (\n <ResponsiveContainer height={280} className=\"max-w-96\">\n <RechartsPieChart\n margin={{\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n }}\n >\n {/* biome-ignore lint/suspicious/noExplicitAny: Recharts Legend content prop type mismatch with exactOptionalPropertyTypes */}\n <Legend verticalAlign=\"top\" align=\"right\" layout=\"vertical\" content={ChartLegendContent as any} />\n <Tooltip content={<ChartTooltipContent isPieChart />} />\n\n <Pie\n isAnimationActive={false}\n startAngle={-270}\n endAngle={-630}\n stroke=\"none\"\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n fill=\"currentColor\"\n innerRadius={70}\n outerRadius={140}\n />\n </RechartsPieChart>\n </ResponsiveContainer>\n );\n};\n\ninterface PieChartPlaygroundProps {\n size?: \"xxs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\nexport const PieChartPlayground = ({ size = \"md\" }: PieChartPlaygroundProps) => {\n switch (size) {\n case \"xxs\":\n return <PieChartXxs />;\n case \"xs\":\n return <PieChartXs />;\n case \"sm\":\n return <PieChartSm />;\n case \"lg\":\n return <PieChartLg />;\n default:\n return <PieChartMd />;\n }\n};\n\nexport const PieChartVariations = () => {\n return (\n <div className=\"flex flex-col gap-8\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">XXS Size</div>\n <PieChartXxs />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">XS Size</div>\n <PieChartXs />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">SM Size</div>\n <PieChartSm />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">MD Size (Default)</div>\n <PieChartMd />\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-medium text-content-tertiary\">LG Size</div>\n <PieChartLg />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport { cx } from \"@enact-ui/react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Node in the relationship graph\n */\nexport interface GraphNode {\n id: string;\n type: string;\n label: string;\n metadata?: Record<string, string>;\n isRoot?: boolean;\n color?: string;\n icon?: string;\n}\n\n/**\n * Edge connecting two nodes\n */\nexport interface GraphEdge {\n id: string;\n source: string;\n target: string;\n label?: string;\n type?: \"default\" | \"dashed\" | \"dotted\";\n color?: string;\n strength?: number; // 0-1, affects line thickness\n}\n\n/**\n * Props for RelationshipGraph component\n */\nexport interface RelationshipGraphProps {\n nodes: GraphNode[];\n edges: GraphEdge[];\n onNodeClick?: (node: GraphNode) => void;\n onEdgeClick?: (edge: GraphEdge) => void;\n width?: number;\n height?: number;\n animate?: boolean;\n layout?: \"force\" | \"hierarchical\" | \"radial\";\n className?: string;\n showLabels?: boolean;\n showLegend?: boolean;\n interactive?: boolean;\n highlightNode?: string | undefined;\n /** Custom colors for node types */\n typeColors?: Record<string, string>;\n}\n\ninterface PositionedNode extends GraphNode {\n x: number;\n y: number;\n vx: number;\n vy: number;\n}\n\ninterface PositionedEdge extends GraphEdge {\n sourceNode: PositionedNode;\n targetNode: PositionedNode;\n}\n\n// Default type colors\nconst DEFAULT_TYPE_COLORS: Record<string, string> = {\n product: \"#0284C7\",\n ingredient: \"#059669\",\n plant: \"#65A30D\",\n recipe: \"#F59E0B\",\n variant: \"#8B5CF6\",\n field: \"#6366F1\",\n domain: \"#EC4899\",\n default: \"#6B7280\",\n};\n\n// Edge type styles\nconst EDGE_STYLES: Record<string, { dashArray?: string }> = {\n default: {},\n dashed: { dashArray: \"4,4\" },\n dotted: { dashArray: \"2,2\" },\n};\n\n// =============================================================================\n// Layout Algorithms\n// =============================================================================\n\n/**\n * Simple force-directed layout algorithm\n */\nfunction useForceLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n width: number,\n height: number,\n): { positionedNodes: PositionedNode[]; positionedEdges: PositionedEdge[] } {\n const [positionedNodes, setPositionedNodes] = useState<PositionedNode[]>([]);\n\n useEffect(() => {\n if (nodes.length === 0) return;\n\n const centerX = width / 2;\n const centerY = height / 2;\n const radius = Math.min(width, height) * 0.35;\n\n const positioned: PositionedNode[] = nodes.map((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length;\n return {\n ...node,\n x: node.isRoot ? centerX : centerX + radius * Math.cos(angle),\n y: node.isRoot ? centerY : centerY + radius * Math.sin(angle),\n vx: 0,\n vy: 0,\n };\n });\n\n // Run force simulation\n const iterations = 50;\n const repulsion = 5000;\n const attraction = 0.05;\n const damping = 0.9;\n const centerForce = 0.01;\n\n for (let iter = 0; iter < iterations; iter++) {\n for (let i = 0; i < positioned.length; i++) {\n const node = positioned[i];\n if (!node) continue;\n\n // Repulsion from other nodes\n for (let j = 0; j < positioned.length; j++) {\n if (i === j) continue;\n const other = positioned[j];\n if (!other) continue;\n const dx = node.x - other.x;\n const dy = node.y - other.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n const force = repulsion / (dist * dist);\n node.vx += (dx / dist) * force;\n node.vy += (dy / dist) * force;\n }\n\n // Attraction along edges\n edges.forEach((edge) => {\n if (edge.source === node.id || edge.target === node.id) {\n const otherId = edge.source === node.id ? edge.target : edge.source;\n const other = positioned.find((n) => n.id === otherId);\n if (other) {\n const dx = other.x - node.x;\n const dy = other.y - node.y;\n node.vx += dx * attraction;\n node.vy += dy * attraction;\n }\n }\n });\n\n // Center gravity\n node.vx += (centerX - node.x) * centerForce;\n node.vy += (centerY - node.y) * centerForce;\n\n // Keep root node centered\n if (node.isRoot) {\n node.vx = (centerX - node.x) * 0.5;\n node.vy = (centerY - node.y) * 0.5;\n }\n }\n\n // Apply velocities and damping\n for (const node of positioned) {\n node.x += node.vx;\n node.y += node.vy;\n node.vx *= damping;\n node.vy *= damping;\n\n // Bounds\n const padding = 60;\n node.x = Math.max(padding, Math.min(width - padding, node.x));\n node.y = Math.max(padding, Math.min(height - padding, node.y));\n }\n }\n\n setPositionedNodes(positioned);\n }, [nodes, edges, width, height]);\n\n const positionedEdges: PositionedEdge[] = useMemo(() => {\n return edges\n .map((edge) => {\n const sourceNode = positionedNodes.find((n) => n.id === edge.source);\n const targetNode = positionedNodes.find((n) => n.id === edge.target);\n if (!sourceNode || !targetNode) return null;\n return { ...edge, sourceNode, targetNode };\n })\n .filter(Boolean) as PositionedEdge[];\n }, [edges, positionedNodes]);\n\n return { positionedNodes, positionedEdges };\n}\n\n/**\n * Hierarchical layout algorithm\n */\nfunction useHierarchicalLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n width: number,\n height: number,\n): { positionedNodes: PositionedNode[]; positionedEdges: PositionedEdge[] } {\n const positionedNodes = useMemo(() => {\n if (nodes.length === 0) return [];\n\n const rootNode = nodes.find((n) => n.isRoot) || nodes[0];\n if (!rootNode) return [];\n const children: Record<string, string[]> = {};\n nodes.forEach((n) => {\n children[n.id] = [];\n });\n edges.forEach((edge) => {\n const sourceChildren = children[edge.source];\n if (sourceChildren) sourceChildren.push(edge.target);\n });\n\n // BFS to assign levels\n const levels: Record<string, number> = { [rootNode.id]: 0 };\n const queue = [rootNode.id];\n const visited = new Set([rootNode.id]);\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n const currentLevel = levels[current];\n if (currentLevel !== undefined) {\n children[current]?.forEach((childId) => {\n if (!visited.has(childId)) {\n visited.add(childId);\n levels[childId] = currentLevel + 1;\n queue.push(childId);\n }\n });\n }\n }\n\n // Handle disconnected nodes\n nodes.forEach((n) => {\n if (levels[n.id] === undefined) levels[n.id] = 1;\n });\n\n // Group nodes by level\n const nodesByLevel: Record<number, GraphNode[]> = {};\n nodes.forEach((n) => {\n const level = levels[n.id];\n if (level !== undefined) {\n if (!nodesByLevel[level]) nodesByLevel[level] = [];\n nodesByLevel[level].push(n);\n }\n });\n\n const maxLevel = Math.max(...Object.keys(nodesByLevel).map(Number));\n const levelHeight = height / (maxLevel + 2);\n\n return nodes.map((node) => {\n const level = levels[node.id];\n if (level === undefined) {\n return { ...node, x: 0, y: 0, vx: 0, vy: 0 };\n }\n const nodesAtLevel = nodesByLevel[level];\n if (!nodesAtLevel) {\n return { ...node, x: 0, y: 0, vx: 0, vy: 0 };\n }\n const indexAtLevel = nodesAtLevel.indexOf(node);\n const levelWidth = width / (nodesAtLevel.length + 1);\n return {\n ...node,\n x: levelWidth * (indexAtLevel + 1),\n y: levelHeight * (level + 1),\n vx: 0,\n vy: 0,\n };\n });\n }, [nodes, edges, width, height]);\n\n const positionedEdges = useMemo(() => {\n return edges\n .map((edge) => {\n const sourceNode = positionedNodes.find((n) => n.id === edge.source);\n const targetNode = positionedNodes.find((n) => n.id === edge.target);\n if (!sourceNode || !targetNode) return null;\n return { ...edge, sourceNode, targetNode };\n })\n .filter(Boolean) as PositionedEdge[];\n }, [edges, positionedNodes]);\n\n return { positionedNodes, positionedEdges };\n}\n\n/**\n * Radial layout algorithm\n */\nfunction useRadialLayout(\n nodes: GraphNode[],\n edges: GraphEdge[],\n width: number,\n height: number,\n): { positionedNodes: PositionedNode[]; positionedEdges: PositionedEdge[] } {\n const positionedNodes = useMemo(() => {\n if (nodes.length === 0) return [];\n\n const centerX = width / 2;\n const centerY = height / 2;\n const rootNode = nodes.find((n) => n.isRoot) || nodes[0];\n if (!rootNode) return [];\n\n // Build distance from root\n const distances: Record<string, number> = { [rootNode.id]: 0 };\n const queue = [rootNode.id];\n const visited = new Set([rootNode.id]);\n\n const adjacent: Record<string, Set<string>> = {};\n nodes.forEach((n) => {\n adjacent[n.id] = new Set();\n });\n edges.forEach((e) => {\n adjacent[e.source]?.add(e.target);\n adjacent[e.target]?.add(e.source);\n });\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n const currentDist = distances[current];\n if (currentDist !== undefined) {\n adjacent[current]?.forEach((neighborId) => {\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n distances[neighborId] = currentDist + 1;\n queue.push(neighborId);\n }\n });\n }\n }\n\n nodes.forEach((n) => {\n if (distances[n.id] === undefined) distances[n.id] = 1;\n });\n\n const nodesByDistance: Record<number, GraphNode[]> = {};\n nodes.forEach((n) => {\n const dist = distances[n.id];\n if (dist !== undefined) {\n if (!nodesByDistance[dist]) nodesByDistance[dist] = [];\n nodesByDistance[dist].push(n);\n }\n });\n\n const maxDistance = Math.max(...Object.keys(nodesByDistance).map(Number));\n const radiusStep = (Math.min(width, height) * 0.35) / Math.max(maxDistance, 1);\n\n return nodes.map((node) => {\n const dist = distances[node.id];\n if (dist === undefined) {\n return { ...node, x: centerX, y: centerY, vx: 0, vy: 0 };\n }\n if (dist === 0) return { ...node, x: centerX, y: centerY, vx: 0, vy: 0 };\n\n const nodesAtDist = nodesByDistance[dist];\n if (!nodesAtDist) {\n return { ...node, x: centerX, y: centerY, vx: 0, vy: 0 };\n }\n const indexAtDist = nodesAtDist.indexOf(node);\n const angle = (2 * Math.PI * indexAtDist) / nodesAtDist.length;\n const radius = radiusStep * dist;\n\n return {\n ...node,\n x: centerX + radius * Math.cos(angle),\n y: centerY + radius * Math.sin(angle),\n vx: 0,\n vy: 0,\n };\n });\n }, [nodes, edges, width, height]);\n\n const positionedEdges = useMemo(() => {\n return edges\n .map((edge) => {\n const sourceNode = positionedNodes.find((n) => n.id === edge.source);\n const targetNode = positionedNodes.find((n) => n.id === edge.target);\n if (!sourceNode || !targetNode) return null;\n return { ...edge, sourceNode, targetNode };\n })\n .filter(Boolean) as PositionedEdge[];\n }, [edges, positionedNodes]);\n\n return { positionedNodes, positionedEdges };\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nconst GraphNodeComponent: React.FC<{\n node: PositionedNode;\n onClick?: () => void;\n showLabel: boolean;\n isHighlighted: boolean;\n isHovered: boolean;\n onHover: (hovering: boolean) => void;\n typeColors: Record<string, string>;\n}> = ({ node, onClick, showLabel, isHighlighted, isHovered, onHover, typeColors }) => {\n const nodeColor = node.color || typeColors[node.type] || typeColors.default || DEFAULT_TYPE_COLORS.default;\n const nodeSize = node.isRoot ? 28 : 22;\n\n return (\n <motion.g\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: isHovered || isHighlighted ? 1.2 : 1, opacity: 1 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 20 }}\n style={{ cursor: onClick ? \"pointer\" : \"default\" }}\n onClick={onClick}\n onMouseEnter={() => onHover(true)}\n onMouseLeave={() => onHover(false)}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <circle\n cx={node.x}\n cy={node.y}\n r={nodeSize}\n fill={nodeColor}\n stroke={isHighlighted ? \"#1F2937\" : \"white\"}\n strokeWidth={isHighlighted ? 3 : 2}\n style={{ filter: isHovered ? \"drop-shadow(0 4px 6px rgba(0, 0, 0, 0.3))\" : undefined }}\n />\n <text x={node.x} y={node.y} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"white\" fontSize={node.isRoot ? 12 : 10} fontWeight=\"bold\">\n {node.label.charAt(0).toUpperCase()}\n </text>\n {showLabel && (\n <text x={node.x} y={node.y + nodeSize + 14} textAnchor=\"middle\" fill=\"#374151\" fontSize={11} fontWeight={node.isRoot ? 600 : 400}>\n {node.label.length > 20 ? `${node.label.substring(0, 18)}...` : node.label}\n </text>\n )}\n </motion.g>\n );\n};\n\nconst GraphEdgeComponent: React.FC<{\n edge: PositionedEdge;\n onClick?: () => void;\n isHighlighted: boolean;\n showLabel: boolean;\n}> = ({ edge, onClick, isHighlighted, showLabel }) => {\n const edgeType = edge.type || \"default\";\n const style = EDGE_STYLES[edgeType] ?? EDGE_STYLES.default ?? {};\n const dashArray = style.dashArray;\n const strokeWidth = (edge.strength || 0.5) * 2 + 1;\n const edgeColor = edge.color || \"#6B7280\";\n\n const dx = edge.targetNode.x - edge.sourceNode.x;\n const dy = edge.targetNode.y - edge.sourceNode.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n\n const sourceRadius = edge.sourceNode.isRoot ? 28 : 22;\n const targetRadius = edge.targetNode.isRoot ? 28 : 22;\n\n const startX = edge.sourceNode.x + (dx / dist) * sourceRadius;\n const startY = edge.sourceNode.y + (dy / dist) * sourceRadius;\n const endX = edge.targetNode.x - (dx / dist) * targetRadius;\n const endY = edge.targetNode.y - (dy / dist) * targetRadius;\n\n const midX = (startX + endX) / 2;\n const midY = (startY + endY) / 2;\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: SVG g element needs role=\"button\" for accessibility when interactive\n <g style={{ cursor: onClick ? \"pointer\" : \"default\" }} onClick={onClick} role={onClick ? \"button\" : undefined} tabIndex={onClick ? 0 : undefined}>\n <motion.line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={isHighlighted ? \"#1F2937\" : edgeColor}\n strokeWidth={isHighlighted ? strokeWidth + 1 : strokeWidth}\n strokeDasharray={dashArray}\n initial={{ pathLength: 0, opacity: 0 }}\n animate={{ pathLength: 1, opacity: 0.7 }}\n transition={{ duration: 0.5, delay: 0.2 }}\n markerEnd=\"url(#arrowhead)\"\n />\n {showLabel && edge.label && (\n <g>\n <rect x={midX - 30} y={midY - 8} width={60} height={16} rx={4} fill=\"white\" fillOpacity={0.9} />\n <text x={midX} y={midY + 4} textAnchor=\"middle\" fill=\"#6B7280\" fontSize={9}>\n {edge.label}\n </text>\n </g>\n )}\n </g>\n );\n};\n\nconst NodeTooltip: React.FC<{ node: PositionedNode; typeColors: Record<string, string> }> = ({ node, typeColors }) => {\n const nodeColor = node.color || typeColors[node.type] || typeColors.default || DEFAULT_TYPE_COLORS.default;\n\n return (\n <motion.foreignObject\n x={node.x + 30}\n y={node.y - 40}\n width={200}\n height={100}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n >\n <div className=\"rounded-lg border bg-white p-3 shadow-lg\">\n <div className=\"mb-1 flex items-center gap-2\">\n <span className=\"h-2 w-2 rounded-full\" style={{ background: nodeColor }} />\n <strong className=\"text-sm\">{node.label}</strong>\n </div>\n <div className=\"text-content-tertiary text-xs\">Type: {node.type}</div>\n {node.metadata &&\n Object.entries(node.metadata).map(([key, value]) => (\n <div key={key} className=\"text-content-tertiary text-xs\">\n {key}: {value}\n </div>\n ))}\n </div>\n </motion.foreignObject>\n );\n};\n\nconst GraphLegend: React.FC<{ nodes: GraphNode[]; typeColors: Record<string, string> }> = ({ nodes, typeColors }) => {\n const types = useMemo(() => Array.from(new Set(nodes.map((n) => n.type))), [nodes]);\n\n return (\n <div className=\"absolute bottom-3 left-3 rounded-lg bg-white p-2 text-xs shadow-md\">\n <div className=\"text-content-primary mb-1.5 font-semibold\">Legend</div>\n {types.map((type) => (\n <div key={type} className=\"mb-0.5 flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 rounded-full\" style={{ background: typeColors[type] || typeColors.default || DEFAULT_TYPE_COLORS.default }} />\n <span className=\"text-content-tertiary capitalize\">{type}</span>\n </div>\n ))}\n </div>\n );\n};\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\n/**\n * RelationshipGraph - Visualizes relationships between entities using an interactive SVG graph.\n * Supports force-directed, hierarchical, and radial layouts.\n *\n * @example\n * ```tsx\n * const nodes = [\n * { id: \"1\", type: \"product\", label: \"Product A\", isRoot: true },\n * { id: \"2\", type: \"ingredient\", label: \"Ingredient B\" },\n * ];\n * const edges = [\n * { id: \"e1\", source: \"1\", target: \"2\", label: \"contains\" },\n * ];\n *\n * <RelationshipGraph nodes={nodes} edges={edges} layout=\"force\" />\n * ```\n */\nexport function RelationshipGraph({\n nodes,\n edges,\n onNodeClick,\n onEdgeClick,\n width = 600,\n height = 400,\n animate: _animate = true,\n layout = \"force\",\n className,\n showLabels = true,\n showLegend = true,\n interactive = true,\n highlightNode,\n typeColors = DEFAULT_TYPE_COLORS,\n}: RelationshipGraphProps) {\n const [hoveredNode, setHoveredNode] = useState<string | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n\n const mergedColors = { ...DEFAULT_TYPE_COLORS, ...typeColors };\n\n // Select layout algorithm\n const forceLayout = useForceLayout(layout === \"force\" ? nodes : [], layout === \"force\" ? edges : [], width, height);\n const hierarchicalLayout = useHierarchicalLayout(layout === \"hierarchical\" ? nodes : [], layout === \"hierarchical\" ? edges : [], width, height);\n const radialLayout = useRadialLayout(layout === \"radial\" ? nodes : [], layout === \"radial\" ? edges : [], width, height);\n\n const { positionedNodes, positionedEdges } = layout === \"force\" ? forceLayout : layout === \"hierarchical\" ? hierarchicalLayout : radialLayout;\n\n const handleNodeClick = useCallback(\n (node: PositionedNode) => {\n if (onNodeClick && interactive) onNodeClick(node);\n },\n [onNodeClick, interactive],\n );\n\n const handleEdgeClick = useCallback(\n (edge: PositionedEdge) => {\n if (onEdgeClick && interactive) onEdgeClick(edge);\n },\n [onEdgeClick, interactive],\n );\n\n const hoveredNodeData = useMemo(() => positionedNodes.find((n) => n.id === hoveredNode), [positionedNodes, hoveredNode]);\n\n if (nodes.length === 0) {\n return (\n <div className={cx(\"flex items-center justify-center rounded-lg border border-dashed bg-gray-50\", className)} style={{ width, height }}>\n <p className=\"text-content-tertiary text-sm\">No relationships to display</p>\n </div>\n );\n }\n\n return (\n <div className={cx(\"relative\", className)} style={{ width, height }}>\n <svg ref={svgRef} width={width} height={height} className=\"rounded-lg border bg-gray-50\" role=\"img\" aria-label=\"Relationship graph visualization\">\n <defs>\n <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#6B7280\" />\n </marker>\n </defs>\n\n <g className=\"edges\">\n {positionedEdges.map((edge) => (\n <GraphEdgeComponent\n key={edge.id}\n edge={edge}\n {...(onEdgeClick ? { onClick: () => handleEdgeClick(edge) } : {})}\n isHighlighted={\n hoveredNode === edge.source || hoveredNode === edge.target || highlightNode === edge.source || highlightNode === edge.target\n }\n showLabel={showLabels}\n />\n ))}\n </g>\n\n <g className=\"nodes\">\n {positionedNodes.map((node) => (\n <GraphNodeComponent\n key={node.id}\n node={node}\n {...(onNodeClick ? { onClick: () => handleNodeClick(node) } : {})}\n showLabel={showLabels}\n isHighlighted={highlightNode === node.id}\n isHovered={hoveredNode === node.id}\n onHover={(hovering) => setHoveredNode(hovering ? node.id : null)}\n typeColors={mergedColors}\n />\n ))}\n </g>\n\n <AnimatePresence>{interactive && hoveredNodeData && <NodeTooltip node={hoveredNodeData} typeColors={mergedColors} />}</AnimatePresence>\n </svg>\n\n {showLegend && <GraphLegend nodes={nodes} typeColors={mergedColors} />}\n </div>\n );\n}\n\nexport default RelationshipGraph;\n","\"use client\";\n\nimport { cx } from \"@enact-ui/react\";\nimport { ArrowDown, ArrowUp, Minus } from \"lucide-react\";\nimport type { FC } from \"react\";\n\nexport type TrendDirection = \"up\" | \"down\" | \"neutral\";\n\nexport interface TrendIndicatorProps {\n /** The trend direction */\n direction: TrendDirection;\n /** The percentage value to display */\n value: number;\n /** Whether the trend is inverted (e.g., \"down\" is good for \"errors\") */\n inverted?: boolean;\n /** Size variant */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Whether to show the percentage sign */\n showPercent?: boolean;\n /** Additional className */\n className?: string;\n}\n\nconst sizeStyles = {\n sm: {\n container: \"text-xs gap-0.5\",\n icon: \"h-3 w-3\",\n },\n md: {\n container: \"text-sm gap-1\",\n icon: \"h-4 w-4\",\n },\n lg: {\n container: \"text-base gap-1\",\n icon: \"h-5 w-5\",\n },\n};\n\n/**\n * TrendIndicator - Displays a trend direction with percentage change\n *\n * @example\n * ```tsx\n * <TrendIndicator direction=\"up\" value={5} />\n * <TrendIndicator direction=\"down\" value={3} inverted />\n * ```\n */\nexport const TrendIndicator: FC<TrendIndicatorProps> = ({ direction, value, inverted = false, size = \"md\", showPercent = true, className }) => {\n const isPositive = inverted ? direction === \"down\" : direction === \"up\";\n const isNegative = inverted ? direction === \"up\" : direction === \"down\";\n\n const colorClass = isPositive ? \"text-content-success\" : isNegative ? \"text-content-error\" : \"text-content-tertiary\";\n\n const Icon = direction === \"up\" ? ArrowUp : direction === \"down\" ? ArrowDown : Minus;\n\n const styles = sizeStyles[size];\n\n return (\n <span className={cx(\"inline-flex items-center font-medium\", styles.container, colorClass, className)}>\n <Icon className={styles.icon} />\n <span>\n {value}\n {showPercent && \"%\"}\n </span>\n </span>\n );\n};\n\nexport interface TrendBadgeProps extends TrendIndicatorProps {\n /** Label to show before the trend */\n label?: string;\n}\n\n/**\n * TrendBadge - A badge variant with optional label\n *\n * @example\n * ```tsx\n * <TrendBadge label=\"vs last month\" direction=\"up\" value={12} />\n * ```\n */\nexport const TrendBadge: FC<TrendBadgeProps> = ({ label, className, ...props }) => {\n const isPositive = props.inverted ? props.direction === \"down\" : props.direction === \"up\";\n const isNegative = props.inverted ? props.direction === \"up\" : props.direction === \"down\";\n\n const bgClass = isPositive ? \"bg-surface-success-subtle\" : isNegative ? \"bg-surface-error-subtle\" : \"bg-surface-raised\";\n\n return (\n <span className={cx(\"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5\", bgClass, className)}>\n {label && <span className=\"text-content-secondary text-xs\">{label}</span>}\n <TrendIndicator {...props} />\n </span>\n );\n};\n"],"mappings":"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MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM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AK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,GAAG,KAAK,MAAM,aAAa;AAAA,IACrC,EAAE,GAAG,KAAK,G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","names":["cx","jsx","jsxs","cx","useBreakpoint","CartesianGrid","Label","Legend","ResponsiveContainer","Tooltip","XAxis","YAxis","jsx","jsxs","useBreakpoint","ResponsiveContainer","CartesianGrid","Legend","XAxis","Label","YAxis","Tooltip","cx","Legend","ResponsiveContainer","Tooltip","jsx","jsxs","ResponsiveContainer","Legend","Tooltip","cx","jsx","jsxs","cx","jsx","jsxs"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selects evenly spaced items from an array. Used for rendering
|
|
3
|
+
* certain number of x-axis labels.
|
|
4
|
+
* @param dataArray - The array of items to select from.
|
|
5
|
+
* @param count - The number of items to select.
|
|
6
|
+
* @returns The selected items.
|
|
7
|
+
*/
|
|
8
|
+
export declare const selectEvenlySpacedItems: <T extends readonly unknown[]>(dataArray: T, count: number) => Array<T[number]>;
|
|
9
|
+
//# sourceMappingURL=chart-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-utils.d.ts","sourceRoot":"","sources":["../../src/utils/chart-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,SAAS,OAAO,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,MAAM,KAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAqBlH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selects evenly spaced items from an array. Used for rendering
|
|
3
|
+
* certain number of x-axis labels.
|
|
4
|
+
* @param dataArray - The array of items to select from.
|
|
5
|
+
* @param count - The number of items to select.
|
|
6
|
+
* @returns The selected items.
|
|
7
|
+
*/
|
|
8
|
+
export const selectEvenlySpacedItems = (dataArray, count) => {
|
|
9
|
+
if (!dataArray || dataArray.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const selectedItems = [];
|
|
13
|
+
if (dataArray.length === 1) {
|
|
14
|
+
for (let i = 0; i < count; i++) {
|
|
15
|
+
selectedItems.push(dataArray[0]);
|
|
16
|
+
}
|
|
17
|
+
return selectedItems;
|
|
18
|
+
}
|
|
19
|
+
for (let i = 0; i < count; i++) {
|
|
20
|
+
const targetIndex = Math.round((i * (dataArray.length - 1)) / (count - 1));
|
|
21
|
+
const boundedIndex = Math.max(0, Math.min(targetIndex, dataArray.length - 1));
|
|
22
|
+
selectedItems.push(dataArray[boundedIndex]);
|
|
23
|
+
}
|
|
24
|
+
return selectedItems;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=chart-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-utils.js","sourceRoot":"","sources":["../../src/utils/chart-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAA+B,SAAY,EAAE,KAAa,EAAoB,EAAE;IACnH,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAqB,EAAE,CAAC;IAE3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9E,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enact-ui/charts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Chart components for ENACT UI built on Recharts. Adds ~200KB to bundle. Only install if you need charts.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"files": [
|
|
17
17
|
"dist",
|
|
18
|
+
"api-schema.json",
|
|
18
19
|
"README.md"
|
|
19
20
|
],
|
|
20
21
|
"scripts": {
|
|
@@ -26,15 +27,19 @@
|
|
|
26
27
|
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
29
|
-
"@enact-ui/react": "^0.
|
|
30
|
+
"@enact-ui/react": "^0.1.0",
|
|
31
|
+
"framer-motion": "^11.0.0",
|
|
32
|
+
"lucide-react": ">=0.400.0",
|
|
30
33
|
"react": "^18.0.0 || ^19.0.0",
|
|
31
34
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
32
35
|
"recharts": "^3.0.0"
|
|
33
36
|
},
|
|
34
37
|
"devDependencies": {
|
|
38
|
+
"@storybook/react": "^10.3.3",
|
|
35
39
|
"@types/react": "^19.1.9",
|
|
36
40
|
"@types/react-dom": "^19.1.7",
|
|
37
|
-
"
|
|
41
|
+
"framer-motion": "^11.0.0",
|
|
42
|
+
"typescript": "^5.9.3"
|
|
38
43
|
},
|
|
39
44
|
"keywords": [
|
|
40
45
|
"react",
|