bruv-ui 0.2.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-dot.tsx","../src/components/charts/chart-background.tsx","../src/components/charts/chart-brush.tsx","../src/components/charts/area-chart.tsx","../src/components/charts/bar-chart.tsx","../src/components/charts/line-chart.tsx","../src/components/charts/composed-chart.tsx","../src/components/charts/pie-chart.tsx","../src/components/charts/radar-chart.tsx","../src/components/charts/radial-chart.tsx","../src/components/charts/sankey-chart.tsx"],"sourcesContent":["import * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\tforwardRef,\n\tuseId,\n\tcreateContext,\n\tuseContext,\n\ttype ComponentProps,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nconst THEMES = { light: \"\", dark: '[data-theme=\"dark\"]' } as const\n\ntype ThemeKey = keyof typeof THEMES\n\ntype ThemeColorsBase = {\n\t[K in ThemeKey]?: string[]\n}\n\ntype AtLeastOneThemeColor = {\n\t[K in ThemeKey]: Required<Pick<ThemeColorsBase, K>> &\n\t\tPartial<Omit<ThemeColorsBase, K>>\n}[ThemeKey]\n\nconst VALID_THEME_KEYS = Object.keys(THEMES) as ThemeKey[]\n\nconst DEFAULT_PALETTE = [\n\t\"var(--color-bruv-chart-1)\",\n\t\"var(--color-bruv-chart-2)\",\n\t\"var(--color-bruv-chart-3)\",\n\t\"var(--color-bruv-chart-4)\",\n\t\"var(--color-bruv-chart-5)\",\n\t\"var(--color-bruv-chart-6)\",\n] as const\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\tlabel?: ReactNode\n\t\ticon?: ComponentType\n\t\tcolor?: string\n\t\tcolors?: AtLeastOneThemeColor\n\t}\n>\n\ninterface ChartContextProps {\n\tconfig: ChartConfig\n}\n\nconst ChartContext = createContext<ChartContextProps | null>(null)\n\nexport function useChart() {\n\tconst context = useContext(ChartContext)\n\tif (!context) {\n\t\tthrow new Error(\"useChart must be used within a <Chart />\")\n\t}\n\treturn context\n}\n\nfunction validateChartConfigColors(config: ChartConfig): void {\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value.colors) {\n\t\t\tconst hasValidThemeKey = VALID_THEME_KEYS.some(\n\t\t\t\tthemeKey => value.colors?.[themeKey] !== undefined,\n\t\t\t)\n\t\t\tif (!hasValidThemeKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[BruvCharts] Invalid chart config for \"${key}\": colors object must have at least one theme key (${VALID_THEME_KEYS.join(\", \")}).`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function applyDefaultChartColors(config: ChartConfig): ChartConfig {\n\tconst entries = Object.entries(config)\n\treturn Object.fromEntries(\n\t\tentries.map(([key, item], index) => {\n\t\t\tif (item.colors || item.color) {\n\t\t\t\tif (item.color && !item.colors) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tcolors: {\n\t\t\t\t\t\t\t\tlight: [item.color],\n\t\t\t\t\t\t\t\tdark: [item.color],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [key, item]\n\t\t\t}\n\t\t\tconst paletteColor =\n\t\t\t\tDEFAULT_PALETTE[index % DEFAULT_PALETTE.length] ?? DEFAULT_PALETTE[0]\n\t\t\treturn [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\t...item,\n\t\t\t\t\tcolors: {\n\t\t\t\t\t\tlight: [paletteColor],\n\t\t\t\t\t\tdark: [paletteColor],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t}),\n\t)\n}\n\nexport interface ChartProps\n\textends\n\t\tOmit<ComponentProps<\"div\">, \"children\">,\n\t\tPick<\n\t\t\tComponentProps<typeof RechartsPrimitive.ResponsiveContainer>,\n\t\t\t| \"initialDimension\"\n\t\t\t| \"aspect\"\n\t\t\t| \"debounce\"\n\t\t\t| \"minHeight\"\n\t\t\t| \"minWidth\"\n\t\t\t| \"maxHeight\"\n\t\t\t| \"height\"\n\t\t\t| \"width\"\n\t\t\t| \"onResize\"\n\t\t\t| \"children\"\n\t\t> {\n\tconfig: ChartConfig\n\tinnerResponsiveContainerStyle?: ComponentProps<\n\t\ttypeof RechartsPrimitive.ResponsiveContainer\n\t>[\"style\"]\n\tfooter?: ReactNode\n}\n\nexport const Chart = forwardRef<HTMLDivElement, ChartProps>(function Chart(\n\t{\n\t\tid,\n\t\tconfig,\n\t\tinitialDimension = { width: 320, height: 200 },\n\t\tclassName,\n\t\tchildren,\n\t\tfooter,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst uniqueId = useId()\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\tconst resolvedConfig = applyDefaultChartColors(config)\n\n\tvalidateChartConfigColors(resolvedConfig)\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config: resolvedConfig }}>\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bruv-chart relative flex min-h-0 w-full flex-1 flex-col justify-center text-bruv-sm text-bruv-secondary\",\n\t\t\t\t\t\"[&_.recharts-cartesian-axis-tick_text]:fill-bruv-chart-axis [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-bruv-chart-grid/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-bruv-chart-cursor [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-radial-bar-background-sector]:fill-bruv-subtle [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-bruv-subtle [&_.recharts-reference-line_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n\t\t\t\t\t!footer && \"aspect-video\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChartStyle id={chartId} config={resolvedConfig} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer\n\t\t\t\t\tclassName=\"min-h-0 w-full flex-1\"\n\t\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t)\n})\n\nexport function LoadingIndicator({ isLoading }: { isLoading: boolean }) {\n\tif (!isLoading) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n\t\t\t<div className=\"border-bruv-neutral bg-bruv-base-2 text-bruv-sm text-bruv-primary rounded-bruv-md flex items-center justify-center gap-2 border px-2 py-0.5\">\n\t\t\t\t<div className=\"border-bruv-neutral border-t-bruv-accent size-3 animate-spin rounded-full border\" />\n\t\t\t\t<span>Loading</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction distributeColors(colorsArray: string[], maxCount: number): string[] {\n\tconst availableCount = colorsArray.length\n\tif (availableCount >= maxCount) {\n\t\treturn colorsArray.slice(0, maxCount)\n\t}\n\n\tconst result: string[] = []\n\tconst baseSlots = Math.floor(maxCount / availableCount)\n\tconst extraSlots = maxCount % availableCount\n\n\tfor (let colorIdx = 0; colorIdx < availableCount; colorIdx++) {\n\t\tconst isExtraColor = colorIdx >= availableCount - extraSlots\n\t\tconst slotsForThisColor = baseSlots + (isExtraColor ? 1 : 0)\n\t\tfor (let j = 0; j < slotsForThisColor; j++) {\n\t\t\tconst color = colorsArray[colorIdx]\n\t\t\tif (color) result.push(color)\n\t\t}\n\t}\n\n\treturn result\n}\n\nexport function ChartStyle({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n}) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.colors)\n\n\tif (!colorConfig.length) return null\n\n\tconst generateCssVars = (theme: keyof typeof THEMES) =>\n\t\tcolorConfig\n\t\t\t.flatMap(([key, itemConfig]) => {\n\t\t\t\tconst colorsArray = itemConfig.colors?.[theme]\n\t\t\t\tif (!colorsArray?.length) return []\n\n\t\t\t\tconst maxCount = getColorsCount(itemConfig)\n\t\t\t\tconst distributedColors = distributeColors(colorsArray, maxCount)\n\n\t\t\t\treturn distributedColors.map(\n\t\t\t\t\t(color, index) => ` --color-${key}-${index}: ${color};`,\n\t\t\t\t)\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\n\tconst css = Object.entries(THEMES)\n\t\t.map(\n\t\t\t([theme, prefix]) =>\n\t\t\t\t`${prefix} [data-chart=${id}] {\\n${generateCssVars(theme as keyof typeof THEMES)}\\n}`,\n\t\t)\n\t\t.join(\"\\n\")\n\n\treturn <style dangerouslySetInnerHTML={{ __html: css }} />\n}\n\nexport function getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== \"object\" || payload === null) return undefined\n\n\tconst payloadPayload =\n\t\t\"payload\" in payload &&\n\t\ttypeof payload.payload === \"object\" &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined\n\n\tlet configLabelKey: string = key\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport function axisValueToPercentFormatter(value: number) {\n\treturn `${Math.round(value * 100).toFixed(0)}%`\n}\n\nexport function getColorsCount(config: ChartConfig[string]): number {\n\tif (!config.colors) return 1\n\tconst counts = VALID_THEME_KEYS.map(\n\t\ttheme => config.colors?.[theme]?.length ?? 0,\n\t)\n\treturn Math.max(...counts, 1)\n}\n\nexport const getLoadingData = (\n\tpoints: number = 10,\n\tmin: number = 0,\n\tmax: number = 70,\n) => {\n\tconst range = max - min\n\treturn Array.from({ length: points }, () => ({\n\t\tloading: Math.floor(Math.random() * range) + min,\n\t}))\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport type {\n\tNameType,\n\tValueType,\n} from \"recharts/types/component/DefaultTooltipContent\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype TooltipRoundness = \"sm\" | \"md\" | \"lg\" | \"xl\"\ntype TooltipVariant = \"default\" | \"frosted-glass\"\n\nconst roundnessMap: Record<TooltipRoundness, string> = {\n\tsm: \"rounded-bruv-sm\",\n\tmd: \"rounded-bruv-md\",\n\tlg: \"rounded-bruv-lg\",\n\txl: \"rounded-bruv-xl\",\n}\n\nconst variantMap: Record<TooltipVariant, string> = {\n\tdefault: \"bg-bruv-base-2\",\n\t\"frosted-glass\": \"bg-bruv-base-2/70 backdrop-blur-sm\",\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = \"dot\",\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tnameKey,\n\tlabelKey,\n\tselected,\n\troundness = \"lg\",\n\tvariant = \"default\",\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n\tReact.ComponentProps<\"div\"> & {\n\t\thideLabel?: boolean\n\t\thideIndicator?: boolean\n\t\tindicator?: \"line\" | \"dot\" | \"dashed\"\n\t\tnameKey?: string\n\t\tlabelKey?: string\n\t\tselected?: string | null\n\t\troundness?: TooltipRoundness\n\t\tvariant?: TooltipVariant\n\t} & Omit<\n\t\tRechartsPrimitive.DefaultTooltipContentProps<ValueType, NameType>,\n\t\t\"accessibilityLayer\"\n\t>) {\n\tconst { config } = useChart()\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst [item] = payload\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\tconst value =\n\t\t\t!labelKey && typeof label === \"string\"\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"font-medium\", labelClassName)}>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t])\n\n\tif (!active || !payload?.length) {\n\t\t// Empty tooltip - to prevent position getting 0.0 so it doesnt animate tooltip every time from 0.0 origin\n\t\treturn <span className=\"p-4\" />\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"border-bruv-neutral/50 grid min-w-32 items-start gap-1.5 border px-2.5 py-1.5 text-xs shadow-xl\",\n\t\t\t\troundnessMap[roundness],\n\t\t\t\tvariantMap[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel ? tooltipLabel : null}\n\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t// For pie charts, item.name contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t\t// For other charts, item.name or item.dataKey contains the series name\n\t\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst key = `${payloadName ?? item.name ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n\t\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5\",\n\t\t\t\t\t\t\t\t\tindicator === \"dot\" && \"items-center\",\n\t\t\t\t\t\t\t\t\tselected != null && selected !== item.dataKey && \"opacity-30\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{formatter && item?.value !== undefined && item.name ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"h-2.5 w-2.5\": indicator === \"dot\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-1\": indicator === \"line\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-0 border-[1.5px] border-dashed bg-transparent!\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"my-0.5\": nestLabel && indicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={getIndicatorColorStyle(key, colorsCount)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-1 justify-between gap-4 leading-none\",\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? \"items-end\" : \"items-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel ? tooltipLabel : null}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value != null && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary font-mono font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof item.value === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? item.value.toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getIndicatorColorStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { background: `var(--color-${dataKey}-0)` }\n\t}\n\n\t// Multiple colors: create linear gradient with evenly distributed stops\n\tconst stops = Array.from({ length: colorsCount }, (_, index) => {\n\t\tconst offset = (index / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${index}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\nconst ChartTooltip = ({\n\tanimationDuration = 200,\n\t...props\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) => (\n\t<RechartsPrimitive.Tooltip animationDuration={animationDuration} {...props} />\n)\n\nexport { ChartTooltip, ChartTooltipContent }\nexport type { TooltipRoundness, TooltipVariant }\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype ChartLegendVariant =\n\t| \"square\"\n\t| \"circle\"\n\t| \"circle-outline\"\n\t| \"rounded-square\"\n\t| \"rounded-square-outline\"\n\t| \"vertical-bar\"\n\t| \"horizontal-bar\"\n\nfunction ChartLegendContent({\n\tclassName,\n\thideIcon = false,\n\tnameKey,\n\tpayload,\n\tverticalAlign,\n\talign = \"right\",\n\tselected,\n\tonSelectChange,\n\tisClickable,\n\tvariant = \"rounded-square\",\n}: React.ComponentProps<\"div\"> & {\n\thideIcon?: boolean\n\tnameKey?: string\n\tselected?: string | null\n\tisClickable?: boolean\n\tonSelectChange?: (selected: string | null) => void\n\tvariant?: ChartLegendVariant\n} & RechartsPrimitive.DefaultLegendContentProps) {\n\tconst { config } = useChart()\n\n\tif (!payload?.length) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-4 select-none\",\n\t\t\t\talign === \"left\" && \"justify-start\",\n\t\t\t\talign === \"center\" && \"justify-center\",\n\t\t\t\talign === \"right\" && \"justify-end\",\n\t\t\t\tverticalAlign === \"top\" ? \"pb-4\" : \"pt-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{payload\n\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t.map(item => {\n\t\t\t\t\t// For pie charts, item.value contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t// For other charts, item.dataKey contains the series name (e.g., \"desktop\")\n\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\tconst key = `${payloadName ?? item.value ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\t\t\t\tconst isSelected = selected === null || selected === key\n\n\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex items-center gap-1.5 transition-opacity [&>svg]:h-3 [&>svg]:w-3\",\n\t\t\t\t\t\t\t\t!isSelected && \"opacity-30\",\n\t\t\t\t\t\t\t\tisClickable && \"cursor-pointer\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\t\t\tonSelectChange?.(selected === key ? null : key)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{itemConfig?.icon && !hideIcon ? (\n\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<LegendIndicator\n\t\t\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\t\t\tdataKey={key}\n\t\t\t\t\t\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{itemConfig?.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Legend indicator — each variant gets its own branch so future variants\n// can diverge freely in markup & style.\n// ---------------------------------------------------------------------------\n\nfunction LegendIndicator({\n\tvariant,\n\tdataKey,\n\tcolorsCount,\n}: {\n\tvariant: ChartLegendVariant\n\tdataKey: string\n\tcolorsCount: number\n}) {\n\tconst fillStyle = getLegendFillStyle(dataKey, colorsCount)\n\tconst outlineStyle = getLegendOutlineStyle(dataKey, colorsCount)\n\n\tswitch (variant) {\n\t\tcase \"square\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0\" style={fillStyle} />\n\n\t\tcase \"circle\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0 rounded-full\" style={fillStyle} />\n\n\t\tcase \"circle-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-full p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"vertical-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-3 w-1 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"horizontal-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-1 w-3 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"rounded-square-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-[3px] p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"rounded-square\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className=\"h-2 w-2 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Style helpers\n// ---------------------------------------------------------------------------\n\n/** Solid fill / gradient background for filled variants. */\nfunction getLegendFillStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { backgroundColor: `var(--color-${dataKey}-0)` }\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\n/**\n * Outline style for stroke variants.\n * Uses background + mask-composite to punch out the center, leaving only the\n * \"border\" visible. Works with both solid colors and gradients, and respects\n * border-radius — unlike plain `border-color`.\n */\nfunction getLegendOutlineStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tconst maskStyle: React.CSSProperties = {\n\t\tWebkitMask:\n\t\t\t\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tWebkitMaskComposite: \"xor\",\n\t\tmask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tmaskComposite: \"exclude\",\n\t}\n\n\tif (colorsCount <= 1) {\n\t\treturn {\n\t\t\tbackgroundColor: `var(--color-${dataKey}-0)`,\n\t\t\t...maskStyle,\n\t\t}\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn {\n\t\tbackground: `linear-gradient(to right, ${stops})`,\n\t\t...maskStyle,\n\t}\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nexport { ChartLegend, ChartLegendContent, type ChartLegendVariant }\n","import { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\nexport type DotVariant = \"default\" | \"border\" | \"colored-border\"\n\ntype ChartDotProps = {\n\tcx?: number\n\tcy?: number\n\tdataKey: string\n\tchartId: string\n\tclassName?: string\n\tfillOpacity?: number\n\ttype?: DotVariant\n\t/** Optional SVG <mask> id — lets the dot share an area's intro reveal wipe. */\n\tmaskId?: string\n}\n\nconst ChartDot = React.memo(function ChartDot({\n\tcx,\n\tcy,\n\tdataKey,\n\tchartId,\n\tclassName,\n\tfillOpacity = 1,\n\ttype = \"default\",\n\tmaskId,\n}: ChartDotProps) {\n\tconst dotId = React.useId().replace(/:/g, \"\")\n\tconst gradientUrl = `url(#${chartId}-colors-${String(dataKey)})`\n\n\tif (cx === undefined || cy === undefined) return null\n\n\tswitch (type) {\n\t\tcase \"border\":\n\t\t\treturn (\n\t\t\t\t<PrimaryBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"colored-border\":\n\t\t\treturn (\n\t\t\t\t<ColoredBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<DefaultDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t}\n})\n\ntype DotVariantProps = {\n\tcx: number\n\tcy: number\n\tdotId: string\n\tfillOpacity: number\n\tgradientUrl: string\n\tclassName?: string\n\tmaskId?: string\n}\n\nconst DefaultDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\treturn (\n\t\t\t<g className={className} mask={maskId ? `url(#${maskId})` : undefined}>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Full-width gradient rectangle clipped to dot shape */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={r * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nDefaultDot.displayName = \"DefaultDot\"\n\nconst PrimaryBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 6\n\t\tconst strokeWidth = 5\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Background stroke (border) */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r} fill=\"currentColor\" />\n\t\t\t\t{/* Inner gradient circle clipped */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - (r - strokeWidth / 2)}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r - strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-inner-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-inner-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nPrimaryBorderDot.displayName = \"PrimaryBorderDot\"\n\nconst ColoredBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\tconst strokeWidth = 1\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r + strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Gradient stroke (border) via clipped rect */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r - strokeWidth / 2}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r + strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t{/* Inner solid fill */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} fill=\"currentColor\" />\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nColoredBorderDot.displayName = \"ColoredBorderDot\"\n\nexport { ChartDot }\n","import { ZIndexLayer } from \"recharts\"\nimport { useId } from \"react\"\n\n// ── Background Variant Types ─────────────────────────────────────────────────\n// To add a new variant:\n// 1. Add its name to the BackgroundVariant union type below\n// 2. Create a pattern component with PatternProps\n// 3. Register it in PATTERN_MAP\n\nexport type BackgroundVariant =\n\t| \"dots\"\n\t| \"grid\"\n\t| \"cross-hatch\"\n\t| \"diagonal-lines\"\n\t| \"plus\"\n\t| \"falling-triangles\"\n\t| \"4-pointed-star\"\n\t| \"tiny-checkers\"\n\t| \"overlapping-circles\"\n\t| \"wiggle-lines\"\n\t| \"bubbles\"\n\n// ── Pattern Components ───────────────────────────────────────────────────────\n\ntype PatternProps = { id: string }\n\nconst DotsPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<circle\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tcx=\"2\"\n\t\t\tcy=\"2\"\n\t\t\tr=\"1\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</pattern>\n)\n\nconst GridPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 20 0 L 0 0 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst CrossHatchPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid/60 text-bruv-chart-grid/50\"\n\t\t\td=\"M 0 0 L 20 20 M 20 0 L 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst DiagonalLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"6\"\n\t\theight=\"6\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"rotate(45)\"\n\t>\n\t\t<line\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"0\"\n\t\t\ty2=\"6\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst PlusPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 8 4 L 8 12 M 4 8 L 12 8\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t/>\n\t</pattern>\n)\n\nconst FallingTrianglesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"18\"\n\t\theight=\"36\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M2 6h12L8 18 2 6zm18 36h12l-6 12-6-12z\"\n\t\t\ttransform=\"scale(0.5)\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst FourPointedStarPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<polygon\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\tpoints=\"5 3 8 4 5 5 4 8 3 5 0 4 3 3 4 0 5 3\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst TinyCheckersPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"8\"\n\t\theight=\"8\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M0 0h4v4H0V0zm4 4h4v4H4V4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.2\"\n\t\t/>\n\t</pattern>\n)\n\nconst OverlappingCirclesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"40\"\n\t\theight=\"40\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M25 25c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5s-5-2.238-5-5 2.238-5 5-5zM5 5c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5S0 12.762 0 10s2.238-5 5-5zm5 4c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4zm20 20c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst WiggleLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"52\"\n\t\theight=\"26\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst BubblesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"100\"\n\t\theight=\"100\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6667)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t\tfillRule=\"evenodd\"\n\t\t/>\n\t</pattern>\n)\n\n// ── Pattern Registry ─────────────────────────────────────────────────────────\n// Map variant names to pattern components\n\nconst PATTERN_MAP: Record<BackgroundVariant, React.FC<PatternProps>> = {\n\tdots: DotsPattern,\n\tgrid: GridPattern,\n\tplus: PlusPattern,\n\tbubbles: BubblesPattern,\n\t\"cross-hatch\": CrossHatchPattern,\n\t\"diagonal-lines\": DiagonalLinesPattern,\n\t\"falling-triangles\": FallingTrianglesPattern,\n\t\"4-pointed-star\": FourPointedStarPattern,\n\t\"tiny-checkers\": TinyCheckersPattern,\n\t\"overlapping-circles\": OverlappingCirclesPattern,\n\t\"wiggle-lines\": WiggleLinesPattern,\n}\n\n// ── Main Component ───────────────────────────────────────────────────────────\n// Usage: Place <ChartBackground variant=\"dots\" /> inside any Recharts chart component.\n// ZIndexLayer with zIndex={-1} ensures the background renders behind all chart content.\n\ninterface ChartBackgroundProps {\n\tvariant: BackgroundVariant\n}\n\nexport function ChartBackground({ variant }: ChartBackgroundProps) {\n\tconst baseId = useId().replace(/:/g, \"\")\n\tconst patternId = `${baseId}-bg-${variant}`\n\tconst maskId = `${baseId}-bg-edge-fade`\n\tconst filterId = `${baseId}-bg-blur`\n\tconst PatternComponent = PATTERN_MAP[variant]\n\n\treturn (\n\t\t<ZIndexLayer zIndex={-1}>\n\t\t\t<defs>\n\t\t\t\t<PatternComponent id={patternId} />\n\t\t\t\t{/* Gaussian blur filter for soft edge fade */}\n\t\t\t\t<filter id={filterId}>\n\t\t\t\t\t<feGaussianBlur stdDeviation=\"25\" />\n\t\t\t\t</filter>\n\t\t\t\t{/* Mask: a slightly inset white rect with blur creates smooth transparent edges */}\n\t\t\t\t<mask id={maskId} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"8%\"\n\t\t\t\t\t\ty=\"20%\"\n\t\t\t\t\t\twidth=\"85%\"\n\t\t\t\t\t\theight=\"60%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tfilter={`url(#${filterId})`}\n\t\t\t\t\t/>\n\t\t\t\t</mask>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tfill={`url(#${patternId})`}\n\t\t\t\tmask={`url(#${maskId})`}\n\t\t\t/>\n\t\t</ZIndexLayer>\n\t)\n}\n","import {\n\tmotion,\n\tuseMotionValue,\n\tuseMotionValueEvent,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\"\nimport {\n\tResponsiveContainer,\n\tAreaChart,\n\tArea,\n\tLineChart,\n\tLine,\n\tBarChart,\n\tBar,\n} from \"recharts\"\nimport { ChartStyle, getColorsCount, type ChartConfig } from \"./chart\"\nimport { useCallback, useEffect, type ComponentProps } from \"react\"\nimport type { MotionValue } from \"motion/react\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ntype BrushVariant = \"line\" | \"area\" | \"bar\"\ntype CurveType = ComponentProps<typeof Area>[\"type\"]\n\ninterface BrushRange {\n\tstartIndex: number\n\tendIndex: number\n}\n\ninterface BrushProps {\n\t/** Full dataset – always rendered in the miniature chart */\n\tdata: Record<string, unknown>[]\n\t/** Chart config with colour definitions */\n\tchartConfig: ChartConfig\n\t/** Data keys to plot (default: all keys from chartConfig) */\n\tdataKeys?: string[]\n\t/** X-axis data key – used for handle labels */\n\txDataKey?: string\n\t/** Visual variant of the mini chart */\n\tvariant?: BrushVariant\n\t/** Pixel height of the brush */\n\theight?: number\n\t/** Extra className */\n\tclassName?: string\n\t/** Whether areas/bars should be stacked in the mini chart */\n\tstacked?: boolean\n\t/** Stroke variant for line / area strokes in the mini chart */\n\tstrokeVariant?: \"solid\" | \"dashed\" | \"animated-dashed\"\n\t/** Whether to connect null data points in line / area variants */\n\tconnectNulls?: boolean\n\t/** Radius for bar corners in the bar variant */\n\tbarRadius?: number\n\n\t// ── Controlled mode ──────────────────────────────────────────────────\n\t/** Controlled start index */\n\tstartIndex?: number\n\t/** Controlled end index */\n\tendIndex?: number\n\n\t// ── Uncontrolled mode ────────────────────────────────────────────────\n\t/** Initial start index (uncontrolled) */\n\tdefaultStartIndex?: number\n\t/** Initial end index (uncontrolled) */\n\tdefaultEndIndex?: number\n\n\t/** Fired whenever the visible range changes */\n\tonChange?: (range: BrushRange) => void\n\t/** Format the handle label from the xDataKey value */\n\tformatLabel?: (value: unknown, index: number) => string\n\t/** Curve type for line / area variants */\n\tcurveType?: CurveType\n\t/** Minimum number of data points that must remain selected */\n\tminSpan?: number\n\t/** Whether to render labels on the handles */\n\tshowLabels?: boolean\n\t/** Skip rendering own ChartStyle (when inside a Chart that already provides CSS vars) */\n\tskipStyle?: boolean\n}\n\n// ─── Spring config ──────────────────────────────────────────────────────────\n\nconst SPRING_CONFIG = { stiffness: 300, damping: 35, mass: 0.8 }\n\n// ─── Pointer-capture drag hook ──────────────────────────────────────────────\n// Replaces raw addEventListener with the modern Pointer Events API.\n// setPointerCapture routes all pointer events to the originating element,\n// so we get mouse + touch + pen support with zero global listeners.\n\ntype DragType = \"left\" | \"right\" | \"middle\"\n\ninterface DragState {\n\ttype: DragType\n\toriginX: number\n\toriginRange: BrushRange\n}\n\nfunction useBrushDrag({\n\trange,\n\ttotalPoints,\n\tcontainerRef,\n\tcommit,\n}: {\n\trange: BrushRange\n\ttotalPoints: number\n\tcontainerRef: React.RefObject<HTMLDivElement | null>\n\tcommit: (next: BrushRange, mode?: DragType) => void\n}) {\n\tconst dragRef = React.useRef<DragState | null>(null)\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\n\tconst toIndexDelta = useCallback(\n\t\t(px: number) => {\n\t\t\tif (!containerRef.current || totalPoints <= 1) return 0\n\t\t\treturn Math.round(\n\t\t\t\t(px / containerRef.current.getBoundingClientRect().width) *\n\t\t\t\t\t(totalPoints - 1),\n\t\t\t)\n\t\t},\n\t\t[totalPoints, containerRef],\n\t)\n\n\tconst onPointerDown = useCallback(\n\t\t(e: React.PointerEvent, type: DragType) => {\n\t\t\te.preventDefault()\n\t\t\t;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n\t\t\tdragRef.current = { type, originX: e.clientX, originRange: { ...range } }\n\t\t\tsetIsDragging(true)\n\t\t},\n\t\t[range],\n\t)\n\n\tconst onPointerMove = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tconst d = dragRef.current\n\t\t\tif (!d) return\n\n\t\t\tconst delta = toIndexDelta(e.clientX - d.originX)\n\t\t\tconst { type, originRange: o } = d\n\n\t\t\tif (type === \"left\") {\n\t\t\t\tcommit(\n\t\t\t\t\t{ startIndex: o.startIndex + delta, endIndex: o.endIndex },\n\t\t\t\t\t\"left\",\n\t\t\t\t)\n\t\t\t} else if (type === \"right\") {\n\t\t\t\tcommit(\n\t\t\t\t\t{ startIndex: o.startIndex, endIndex: o.endIndex + delta },\n\t\t\t\t\t\"right\",\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst span = o.endIndex - o.startIndex\n\t\t\t\tlet s = o.startIndex + delta\n\t\t\t\tlet e2 = s + span\n\t\t\t\tif (s < 0) {\n\t\t\t\t\ts = 0\n\t\t\t\t\te2 = span\n\t\t\t\t}\n\t\t\t\tif (e2 > totalPoints - 1) {\n\t\t\t\t\te2 = totalPoints - 1\n\t\t\t\t\ts = Math.max(0, e2 - span)\n\t\t\t\t}\n\t\t\t\tcommit({ startIndex: s, endIndex: e2 }, \"middle\")\n\t\t\t}\n\t\t},\n\t\t[toIndexDelta, totalPoints, commit],\n\t)\n\n\tconst onPointerUp = useCallback((e: React.PointerEvent) => {\n\t\t;(e.target as HTMLElement).releasePointerCapture(e.pointerId)\n\t\tdragRef.current = null\n\t\tsetIsDragging(false)\n\t}, [])\n\n\t// Helper to bind all three pointer handlers for a given drag type\n\tconst bind = useCallback(\n\t\t(type: DragType) => ({\n\t\t\tonPointerDown: (e: React.PointerEvent) => onPointerDown(e, type),\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t}),\n\t\t[onPointerDown, onPointerMove, onPointerUp],\n\t)\n\n\treturn { isDragging, bind }\n}\n\n// ─── Brush ────────────────────────────────────────────────────────────\n\nfunction Brush({\n\tdata,\n\tchartConfig,\n\tdataKeys,\n\txDataKey,\n\tvariant = \"area\",\n\theight = 56,\n\tclassName,\n\tstacked = false,\n\tstrokeVariant = \"solid\",\n\tconnectNulls = false,\n\tbarRadius,\n\tstartIndex: controlledStart,\n\tendIndex: controlledEnd,\n\tdefaultStartIndex = 0,\n\tdefaultEndIndex,\n\tonChange,\n\tformatLabel,\n\tcurveType = \"monotone\",\n\tminSpan = 2,\n\tshowLabels = true,\n\tskipStyle = false,\n}: BrushProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null)\n\tconst keys = React.useMemo(\n\t\t() => dataKeys ?? Object.keys(chartConfig),\n\t\t[dataKeys, chartConfig],\n\t)\n\tconst totalPoints = data.length\n\tconst chartId = React.useId().replace(/:/g, \"\")\n\n\t// ── Controlled vs uncontrolled ──────────────────────────────────────────\n\n\tconst isControlled =\n\t\tcontrolledStart !== undefined && controlledEnd !== undefined\n\n\tconst [internalRange, setInternalRange] = React.useState<BrushRange>(() => ({\n\t\tstartIndex: Math.max(0, Math.min(defaultStartIndex, totalPoints - 1)),\n\t\tendIndex: Math.max(\n\t\t\t0,\n\t\t\tMath.min(defaultEndIndex ?? totalPoints - 1, totalPoints - 1),\n\t\t),\n\t}))\n\n\t// Track the last committed range to avoid duplicate updates when small\n\t// mouse movements don't produce index changes (e.g., at boundaries)\n\tconst lastCommittedRef = React.useRef<BrushRange>(internalRange)\n\n\tuseEffect(() => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalRange(prev => {\n\t\t\t\tconst adjusted = {\n\t\t\t\t\tstartIndex: Math.min(prev.startIndex, Math.max(0, totalPoints - 1)),\n\t\t\t\t\tendIndex: Math.min(prev.endIndex, Math.max(0, totalPoints - 1)),\n\t\t\t\t}\n\t\t\t\tlastCommittedRef.current = adjusted\n\t\t\t\treturn adjusted\n\t\t\t})\n\t\t}\n\t}, [totalPoints, isControlled])\n\n\t// ── Clamping & committing ───────────────────────────────────────────────\n\n\tconst clampRange = useCallback(\n\t\t(range: BrushRange, mode?: DragType): BrushRange => {\n\t\t\tlet { startIndex, endIndex } = range\n\t\t\tconst maxIndex = Math.max(0, totalPoints - 1)\n\n\t\t\tstartIndex = Math.max(0, Math.min(startIndex, maxIndex))\n\t\t\tendIndex = Math.max(0, Math.min(endIndex, maxIndex))\n\n\t\t\tif (mode === \"left\") {\n\t\t\t\tconst maxStart = Math.max(0, endIndex - minSpan)\n\t\t\t\tstartIndex = Math.min(startIndex, maxStart)\n\t\t\t\treturn { startIndex, endIndex }\n\t\t\t}\n\n\t\t\tif (mode === \"right\") {\n\t\t\t\tconst minEnd = Math.min(maxIndex, startIndex + minSpan)\n\t\t\t\tendIndex = Math.max(endIndex, minEnd)\n\t\t\t\treturn { startIndex, endIndex }\n\t\t\t}\n\n\t\t\tif (endIndex - startIndex < minSpan) {\n\t\t\t\tendIndex = Math.min(startIndex + minSpan, maxIndex)\n\t\t\t\tif (endIndex - startIndex < minSpan) {\n\t\t\t\t\tstartIndex = Math.max(0, endIndex - minSpan)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { startIndex, endIndex }\n\t\t},\n\t\t[totalPoints, minSpan],\n\t)\n\n\tconst commit = useCallback(\n\t\t(next: BrushRange, mode?: DragType) => {\n\t\t\tconst clamped = clampRange(next, mode)\n\t\t\tconst last = lastCommittedRef.current\n\n\t\t\t// Only update if the range has actually changed — avoids unnecessary\n\t\t\t// re-renders when the brush is at a boundary and small mouse movements\n\t\t\t// don't produce index changes\n\t\t\tif (\n\t\t\t\tlast.startIndex === clamped.startIndex &&\n\t\t\t\tlast.endIndex === clamped.endIndex\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlastCommittedRef.current = clamped\n\t\t\tsetInternalRange(clamped)\n\t\t\t// Defer the parent callback — chart re-render happens at lower priority,\n\t\t\t// React can skip intermediate frames during fast drags\n\t\t\tReact.startTransition(() => {\n\t\t\t\tonChange?.(clamped)\n\t\t\t})\n\t\t},\n\t\t[clampRange, onChange],\n\t)\n\n\t// ── Drag ────────────────────────────────────────────────────────────────\n\n\tconst { isDragging, bind } = useBrushDrag({\n\t\trange: internalRange,\n\t\ttotalPoints,\n\t\tcontainerRef,\n\t\tcommit,\n\t})\n\n\t// Position always driven by internalRange (never lags behind controlled props)\n\tconst range = internalRange\n\n\t// Sync internalRange with controlled props when not dragging\n\tuseEffect(() => {\n\t\tif (isControlled && !isDragging) {\n\t\t\tconst syncedRange = {\n\t\t\t\tstartIndex: controlledStart,\n\t\t\t\tendIndex: controlledEnd,\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/set-state-in-effect\n\t\t\tsetInternalRange(syncedRange)\n\t\t\tlastCommittedRef.current = syncedRange\n\t\t}\n\t}, [isControlled, controlledStart, controlledEnd, isDragging])\n\n\t// ── Computed positions (%) ──────────────────────────────────────────────\n\n\tconst leftPct =\n\t\ttotalPoints > 1 ? (range.startIndex / (totalPoints - 1)) * 100 : 0\n\tconst rightPct =\n\t\ttotalPoints > 1 ? (range.endIndex / (totalPoints - 1)) * 100 : 100\n\n\t// Drive all moving brush UI from the same springed edge values.\n\tconst leftTarget = useMotionValue(leftPct)\n\tconst rightTarget = useMotionValue(rightPct)\n\tif (leftTarget.get() !== leftPct) leftTarget.set(leftPct)\n\tif (rightTarget.get() !== rightPct) rightTarget.set(rightPct)\n\n\tconst leftSpring = useSpring(leftTarget, SPRING_CONFIG)\n\tconst rightSpring = useSpring(rightTarget, SPRING_CONFIG)\n\tconst leftPosition = useTransform(leftSpring, (v: number) => `${v}%`)\n\tconst rightPosition = useTransform(rightSpring, (v: number) => `${v}%`)\n\tconst leftOverlayWidth = useTransform(leftSpring, (v: number) => `${v}%`)\n\tconst rightOverlayWidth = useTransform(\n\t\trightSpring,\n\t\t(v: number) => `${Math.max(0, 100 - v)}%`,\n\t)\n\tconst selectedWidth = useMotionValue(`${Math.max(0, rightPct - leftPct)}%`)\n\n\tconst updateSelectedWidth = useCallback(() => {\n\t\tselectedWidth.set(`${Math.max(0, rightSpring.get() - leftSpring.get())}%`)\n\t}, [leftSpring, rightSpring, selectedWidth])\n\n\tuseMotionValueEvent(leftSpring, \"change\", updateSelectedWidth)\n\tuseMotionValueEvent(rightSpring, \"change\", updateSelectedWidth)\n\n\tconst getLabel = useCallback(\n\t\t(idx: number) => {\n\t\t\tif (!xDataKey) return String(idx)\n\t\t\tconst v = data[idx]?.[xDataKey]\n\t\t\treturn formatLabel ? formatLabel(v, idx) : String(v ?? idx)\n\t\t},\n\t\t[data, xDataKey, formatLabel],\n\t)\n\n\t// ── Render ──────────────────────────────────────────────────────────────\n\n\tif (totalPoints === 0) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tdata-chart={skipStyle ? undefined : chartId}\n\t\t\tclassName={cn(\"group relative select-none\", className)}\n\t\t\tstyle={{ height }}\n\t\t>\n\t\t\t{!skipStyle && <ChartStyle id={chartId} config={chartConfig} />}\n\n\t\t\t{/* Mini chart – always shows all data */}\n\t\t\t<div className=\"rounded-bruv-md absolute inset-0 overflow-hidden\">\n\t\t\t\t<MiniChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tkeys={keys}\n\t\t\t\t\tchartConfig={chartConfig}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\tchartId={chartId}\n\t\t\t\t\tstacked={stacked}\n\t\t\t\t\tstrokeVariant={\n\t\t\t\t\t\tstrokeVariant === \"animated-dashed\" ? \"dashed\" : strokeVariant\n\t\t\t\t\t}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tbarRadius={barRadius}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Dim overlay – left */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"bg-bruv-base-2/70 pointer-events-none absolute inset-y-0 left-0 rounded-l-md backdrop-blur-[2px]\"\n\t\t\t\tstyle={{ width: leftOverlayWidth }}\n\t\t\t/>\n\t\t\t{/* Dim overlay – right */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"bg-bruv-base-2/70 pointer-events-none absolute inset-y-0 right-0 rounded-r-md backdrop-blur-[2px]\"\n\t\t\t\tstyle={{ width: rightOverlayWidth }}\n\t\t\t/>\n\n\t\t\t{/* Selected region – draggable to pan */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"rounded-bruv-sm absolute inset-y-0 cursor-grab touch-none border active:cursor-grabbing\"\n\t\t\t\tstyle={{ left: leftPosition, width: selectedWidth }}\n\t\t\t\t{...bind(\"middle\")}\n\t\t\t/>\n\n\t\t\t{/* Left handle */}\n\t\t\t<BrushHandle\n\t\t\t\tside=\"left\"\n\t\t\t\tposition={leftPosition}\n\t\t\t\tlabel={showLabels ? getLabel(range.startIndex) : undefined}\n\t\t\t\tbind={bind(\"left\")}\n\t\t\t/>\n\n\t\t\t{/* Right handle */}\n\t\t\t<BrushHandle\n\t\t\t\tside=\"right\"\n\t\t\t\tposition={rightPosition}\n\t\t\t\tlabel={showLabels ? getLabel(range.endIndex) : undefined}\n\t\t\t\tbind={bind(\"right\")}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ─── Brush Handle ───────────────────────────────────────────────────────────\n\nfunction BrushHandle({\n\tside,\n\tposition,\n\tlabel,\n\tbind,\n}: {\n\tside: \"left\" | \"right\"\n\tposition: MotionValue<string>\n\tlabel?: string\n\tbind: {\n\t\tonPointerDown: (e: React.PointerEvent) => void\n\t\tonPointerMove: (e: React.PointerEvent) => void\n\t\tonPointerUp: (e: React.PointerEvent) => void\n\t}\n}) {\n\tconst isLeft = side === \"left\"\n\n\treturn (\n\t\t<motion.div className=\"absolute inset-y-0 z-10\" style={{ left: position }}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group absolute inset-y-0 flex w-3 cursor-ew-resize touch-none items-center justify-center after:absolute after:inset-y-0 after:-left-4 after:w-11 after:content-['']\",\n\t\t\t\t\tisLeft ? \"\" : \"-translate-x-full\",\n\t\t\t\t)}\n\t\t\t\t{...bind}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-muted-foreground group-hover:bg-foreground relative flex h-4 w-1.5 items-center justify-center rounded-bruv-md transition-colors\",\n\t\t\t\t\t\tisLeft ? \"-left-[5.5px]\" : \"-right-[5.5px]\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex flex-col gap-[2px]\">\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{label && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-foreground text-bruv-base-1 pointer-events-none absolute -bottom-3 -translate-y-1/2 rounded-[3px] px-1 py-px text-[8px] leading-tight font-medium whitespace-nowrap opacity-0 group-hover:opacity-100\",\n\t\t\t\t\t\tisLeft ? \"left-1.5\" : \"right-1.5\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</motion.div>\n\t)\n}\n\n// ─── Mini Chart ─────────────────────────────────────────────────────────────\n\nfunction MiniChart({\n\tdata,\n\tkeys,\n\tchartConfig,\n\tvariant,\n\tcurveType,\n\tchartId,\n\tstacked,\n\tstrokeVariant = \"solid\",\n\tconnectNulls = false,\n\tbarRadius,\n}: {\n\tdata: Record<string, unknown>[]\n\tkeys: string[]\n\tchartConfig: ChartConfig\n\tvariant: BrushVariant\n\tcurveType: CurveType\n\tchartId: string\n\tstacked: boolean\n\tstrokeVariant?: \"solid\" | \"dashed\" | \"animated-dashed\"\n\tconnectNulls?: boolean\n\tbarRadius?: number\n}) {\n\tconst gradients = React.useMemo(\n\t\t() =>\n\t\t\tObject.entries(chartConfig)\n\t\t\t\t.filter(([key]) => keys.includes(key))\n\t\t\t\t.map(([dataKey, config]) => ({\n\t\t\t\t\tdataKey,\n\t\t\t\t\tcolorsCount: getColorsCount(config),\n\t\t\t\t})),\n\t\t[chartConfig, keys],\n\t)\n\n\tconst dashArray =\n\t\tstrokeVariant === \"dashed\" || strokeVariant === \"animated-dashed\"\n\t\t\t? \"4 4\"\n\t\t\t: undefined\n\n\tconst defsContent = (\n\t\t<>\n\t\t\t{/* Vertical fade gradient for area fill mask */}\n\t\t\t{variant === \"area\" && (\n\t\t\t\t<linearGradient\n\t\t\t\t\tid={`${chartId}-zm-vertical-fade`}\n\t\t\t\t\tx1=\"0\"\n\t\t\t\t\ty1=\"0\"\n\t\t\t\t\tx2=\"0\"\n\t\t\t\t\ty2=\"1\"\n\t\t\t\t>\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.15} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t\t</linearGradient>\n\t\t\t)}\n\t\t\t{gradients.map(({ dataKey, colorsCount }) => {\n\t\t\t\tconst colorStops =\n\t\t\t\t\tcolorsCount === 1 ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, i) => (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\toffset={`${(i / (colorsCount - 1)) * 100}%`}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${i}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t)\n\n\t\t\t\treturn (\n\t\t\t\t\t<React.Fragment key={dataKey}>\n\t\t\t\t\t\t{/* Vertical color gradient (stroke + bar fill) */}\n\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\tid={`${chartId}-zm-${dataKey}`}\n\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{colorStops}\n\t\t\t\t\t\t</linearGradient>\n\n\t\t\t\t\t\t{/* Area fill: color gradient masked with vertical fade */}\n\t\t\t\t\t\t{variant === \"area\" && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<mask id={`${chartId}-zm-fill-mask-${dataKey}`}>\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-vertical-fade)`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</mask>\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\tid={`${chartId}-zm-fill-${dataKey}`}\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-${dataKey})`}\n\t\t\t\t\t\t\t\t\t\tmask={`url(#${chartId}-zm-fill-mask-${dataKey})`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</React.Fragment>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n\n\tif (variant === \"line\") {\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<LineChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tmargin={{ top: 4, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t>\n\t\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t\t<Line\n\t\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\t\ttype={curveType}\n\t\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\t\tstroke={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\t\t\t\tstrokeDasharray={dashArray}\n\t\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</LineChart>\n\t\t\t</ResponsiveContainer>\n\t\t)\n\t}\n\n\tif (variant === \"bar\") {\n\t\tconst r = barRadius ?? 3\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<BarChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tmargin={{ top: 2, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\tbarGap={2}\n\t\t\t\t\tbarSize={14}\n\t\t\t\t>\n\t\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t\t<Bar\n\t\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\t\tfillOpacity={0.35}\n\t\t\t\t\t\t\tstackId={stacked ? \"zm-stack\" : undefined}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\tradius={[r, r, r, r]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</BarChart>\n\t\t\t</ResponsiveContainer>\n\t\t)\n\t}\n\n\t// Default: area\n\treturn (\n\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t<AreaChart data={data} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t<Area\n\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\ttype={curveType}\n\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\tstroke={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\tfill={`url(#${chartId}-zm-fill-${dk})`}\n\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\t\t\tstrokeDasharray={dashArray}\n\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\tfillOpacity={1}\n\t\t\t\t\t\tstackId={stacked ? \"zm-stack\" : undefined}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</AreaChart>\n\t\t</ResponsiveContainer>\n\t)\n}\n\n// ─── useBrush Hook ──────────────────────────────────────────────────────\n\nfunction useBrush<TData extends Record<string, unknown>>({\n\tdata,\n\tdefaultStartIndex = 0,\n\tdefaultEndIndex,\n}: {\n\tdata: TData[]\n\tdefaultStartIndex?: number\n\tdefaultEndIndex?: number\n}) {\n\tconst [range, setRange] = React.useState<BrushRange>({\n\t\tstartIndex: defaultStartIndex,\n\t\tendIndex: defaultEndIndex ?? Math.max(0, data.length - 1),\n\t})\n\n\t// Defer the range used for data slicing — the brush handles move at the\n\n\t// immediate `range` cadence while the expensive chart re-render uses the\n\t// deferred value. React can skip intermediate slices during fast drags.\n\tconst deferredRange = React.useDeferredValue(range)\n\n\tuseEffect(() => {\n\t\t// eslint-disable-next-line react-hooks/set-state-in-effect\n\t\tsetRange({\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: Math.max(0, data.length - 1),\n\t\t})\n\t}, [data.length])\n\n\tconst visibleData = React.useMemo(\n\t\t() => data.slice(deferredRange.startIndex, deferredRange.endIndex + 1),\n\t\t[data, deferredRange.startIndex, deferredRange.endIndex],\n\t)\n\n\treturn {\n\t\trange,\n\t\tvisibleData,\n\t\tbrushProps: {\n\t\t\tstartIndex: range.startIndex,\n\t\t\tendIndex: range.endIndex,\n\t\t\tonChange: setRange,\n\t\t} satisfies Pick<BrushProps, \"startIndex\" | \"endIndex\" | \"onChange\">,\n\t}\n}\n\nexport { Brush, useBrush, type BrushProps, type BrushRange, type BrushVariant }\n","import {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\taxisValueToPercentFormatter,\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tArea as RechartsArea,\n\tAreaChart as RechartsAreaChart,\n\tCartesianGrid,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 0.8\nconst LOADING_AREA_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst STACK_ID = \"evil-stacked\"\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype CurveType = ComponentProps<typeof RechartsArea>[\"type\"]\ntype AreaDotProp = ComponentProps<typeof RechartsArea>[\"dot\"]\ntype AreaActiveDotProp = ComponentProps<typeof RechartsArea>[\"activeDot\"]\ntype AreaVariant = \"gradient\" | \"gradient-reverse\" | \"solid\"\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\ntype StackType = \"default\" | \"expanded\" | \"stacked\"\n\ntype AreaAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<AreaAnimationType, \"none\">\n\ntype AreaChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: AreaAnimationType\n\tisStacked: boolean\n\tisExpanded: boolean\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst AreaChartContext = createContext<AreaChartContextValue | null>(null)\n\nfunction useAreaChart() {\n\tconst context = use(AreaChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Area chart parts (<Area />, <XAxis />, …) must be used within <AreaChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype AreaChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsAreaChart>\n\tcurveType?: CurveType\n\tanimationType?: AreaAnimationType\n\tstackType?: StackType\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype AreaChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = AreaChartBaseProps<TData, TConfig>\n\nexport type { AreaChartProps }\n\nexport function AreaChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tstackType = \"default\",\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: AreaChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst { loadingData, onShimmerExit } = useLoadingData(\n\t\tisLoading,\n\t\tloadingPoints,\n\t)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst isExpanded = stackType === \"expanded\"\n\tconst isStacked = stackType === \"stacked\" || isExpanded\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<AreaChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisStacked,\n\t\t\tisExpanded,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisStacked,\n\t\t\tisExpanded,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<AreaChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"area\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tstacked={isStacked}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsAreaChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tstackOffset={isExpanded ? \"expand\" : undefined}\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingArea\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsAreaChart>\n\t\t\t</Chart>\n\t\t</AreaChartContext>\n\t)\n}\n\ntype AreaProps = {\n\tdataKey: string\n\tvariant?: AreaVariant\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: AreaAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tareaProps?: ComponentProps<typeof RechartsArea>\n}\n\nexport function Area({\n\tdataKey,\n\tvariant = \"gradient\",\n\tstrokeVariant = \"dashed\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tchildren,\n\tareaProps,\n}: AreaProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisStacked,\n\t\tisExpanded,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useAreaChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: AreaAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst isSelected = selectedDataKey === dataKey\n\tconst hasSelection = selectedDataKey !== null\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\tconst showUnselected = hasSelection && !isSelected\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsArea\n\t\t\t\ttype={resolvedCurve}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\tfillOpacity={opacity.fill}\n\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\tfill={getFillPattern(variant, showUnselected, id)}\n\t\t\t\tstroke={`url(#${id}-colors-${dataKey})`}\n\t\t\t\tstackId={isStacked ? STACK_ID : undefined}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstrokeDasharray={isDashed ? \"3 3\" : undefined}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={{\n\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t...(isClickable ? { cursor: \"pointer\" } : {}),\n\t\t\t\t}}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...areaProps}\n\t\t\t>\n\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t</RechartsArea>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<ColorGradient\n\t\t\t\t\tid={id}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconfig={config}\n\t\t\t\t\tisExpanded={isExpanded}\n\t\t\t\t/>\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient-reverse\" && (\n\t\t\t\t\t<ReverseGradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"solid\" && <SolidPattern id={id} dataKey={dataKey} />}\n\t\t\t\t{showUnselected && <UnselectedPattern id={id} dataKey={dataKey} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\ttickFormatter,\n\t...props\n}: YAxisProps) {\n\tconst { isLoading, isExpanded } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\ttickFormatter={isExpanded ? axisValueToPercentFormatter : tickFormatter}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useAreaChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { fill: 0.8, stroke: 0.8, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { fill: 0.8, stroke: 0.8, dot: 1 }\n\t\t: { fill: 0.2, stroke: 0.3, dot: 0.3 }\n}\n\nconst getFillPattern = (\n\tvariant: AreaVariant,\n\tshowUnselected: boolean,\n\tid: string,\n): string => {\n\tif (showUnselected) return `url(#${id}-unselected)`\n\n\treturn `url(#${id}-${variant})`\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: AreaDotProp; activeDot: AreaActiveDotProp } => {\n\tlet dot: AreaDotProp = false\n\tlet activeDot: AreaActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"3 3; 0 3; 3 3\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -6\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n\tisExpanded,\n}: StyleProps & { config: ChartConfig; isExpanded: boolean }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-colors-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"0\"\n\t\t\tgradientUnits={isExpanded ? \"userSpaceOnUse\" : \"objectBoundingBox\"}\n\t\t>\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst GradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient id={`${id}-vertical-fade`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask`}>\n\t\t\t\t<rect width=\"100%\" height=\"100%\" fill={`url(#${id}-vertical-fade)`} />\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst ReverseGradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-vertical-fade-reverse`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-reverse-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-vertical-fade-reverse)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient-reverse`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-reverse-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst SolidPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient id={`${id}-solid-fade`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-solid-mask`}>\n\t\t\t\t<rect width=\"100%\" height=\"100%\" fill={`url(#${id}-solid-fade)`} />\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-solid`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-solid-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst UnselectedPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-unselected-texture`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"5\"\n\t\t\t\theight=\"5\"\n\t\t\t\tpatternTransform=\"rotate(45)\"\n\t\t\t>\n\t\t\t\t<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"5\" stroke=\"white\" strokeWidth=\"1\" />\n\t\t\t</pattern>\n\t\t\t<mask id={`${id}-unselected-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-unselected-texture)`}\n\t\t\t\t\tfillOpacity=\"0.3\"\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-unselected`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-unselected-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingPoints: number = 14) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingPoints),\n\n\t\t[loadingPoints, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingArea = ({\n\tchartId,\n\tcurveType,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tcurveType: CurveType\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsArea\n\t\t\t\ttype={curveType}\n\t\t\t\tdataKey={LOADING_AREA_DATA_KEY}\n\t\t\t\tfillOpacity={0.05}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\ttooltipType=\"none\"\n\t\t\t\tactiveDot={false}\n\t\t\t\tdot={false}\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tBar as RechartsBar,\n\tBarChart as RechartsBarChart,\n\tCartesianGrid,\n\tRectangle,\n\tReferenceLine,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport type { RectRadius } from \"recharts/types/shape/Rectangle\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst DEFAULT_BAR_RADIUS = 2\nconst LOADING_BAR_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst STACK_ID = \"evil-stacked\"\nconst BAR_GROW_DURATION = 0.5\nconst BAR_STAGGER = 0.05\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype BarVariant =\n\t| \"default\"\n\t| \"duotone\"\n\t| \"duotone-reverse\"\n\t| \"gradient\"\n\t| \"stripped\"\ntype StackType = \"default\" | \"stacked\" | \"percent\"\ntype BarLayout = \"vertical\" | \"horizontal\"\n\ntype BarAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\n\ntype BarChartContextValue = {\n\tconfig: ChartConfig\n\tisStacked: boolean\n\tisHorizontal: boolean\n\tisLoading: boolean\n\tbarRadius: number\n\tanimationType: BarAnimationType\n\tintroStartedAt: number\n\tdataLength: number\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n\tisMouseInChart: boolean\n}\n\nconst BarChartContext = createContext<BarChartContextValue | null>(null)\n\nfunction useBarChart() {\n\tconst context = use(BarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Bar chart parts (<Bar />, <XAxis />, …) must be used within <BarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype BarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsBarChart>\n\tstackType?: StackType\n\tlayout?: BarLayout\n\tbarRadius?: number\n\tanimationType?: BarAnimationType\n\tbarGap?: number\n\tbarCategoryGap?: number\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingBars?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype BarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = BarChartBaseProps<TData, TConfig>\n\nexport type { BarChartProps }\n\nexport function BarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tstackType = \"default\",\n\tlayout = \"vertical\",\n\tbarRadius = DEFAULT_BAR_RADIUS,\n\tanimationType = \"left-to-right\",\n\tbarGap,\n\tbarCategoryGap,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingBars,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: BarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\n\tconst [introStartedAt] = useState(() => Date.now())\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst [isMouseInChart, setIsMouseInChart] = useState(false)\n\tconst { loadingData, onShimmerExit } = useLoadingData(isLoading, loadingBars)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst isStacked = stackType === \"stacked\" || stackType === \"percent\"\n\tconst isHorizontal = layout === \"horizontal\"\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<BarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisStacked,\n\t\t\tisHorizontal,\n\t\t\tisLoading,\n\t\t\tbarRadius,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdataLength: displayData.length,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t\tisMouseInChart,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tisStacked,\n\t\t\tisHorizontal,\n\t\t\tisLoading,\n\t\t\tbarRadius,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdisplayData.length,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t\tisMouseInChart,\n\t\t],\n\t)\n\n\treturn (\n\t\t<BarChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"bar\"\n\t\t\t\t\t\t\tbarRadius={barRadius}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tstacked={isStacked}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tlayout={isHorizontal ? \"vertical\" : \"horizontal\"}\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\tbarGap={barGap}\n\t\t\t\t\tbarCategoryGap={barCategoryGap}\n\t\t\t\t\tstackOffset={stackType === \"percent\" ? \"expand\" : undefined}\n\t\t\t\t\tonMouseEnter={() => setIsMouseInChart(true)}\n\t\t\t\t\tonMouseLeave={() => setIsMouseInChart(false)}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t<ReferenceLine color=\"white\" />\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingBar chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t\t\t)}\n\t\t\t\t</RechartsBarChart>\n\t\t\t</Chart>\n\t\t</BarChartContext>\n\t)\n}\n\ntype BarProps = {\n\tdataKey: string\n\tvariant?: BarVariant\n\tradius?: number\n\tanimationType?: BarAnimationType\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tbufferBar?: boolean\n\tbarProps?: ComponentProps<typeof RechartsBar>\n}\n\nexport function Bar({\n\tdataKey,\n\tvariant = \"default\",\n\tradius,\n\tanimationType,\n\tisClickable = false,\n\tenableHoverHighlight = false,\n\tbufferBar = false,\n\tbarProps,\n}: BarProps) {\n\tconst {\n\t\tconfig,\n\t\tisStacked,\n\t\tisHorizontal,\n\t\tisLoading,\n\t\tbarRadius: defaultRadius,\n\t\tanimationType: defaultAnimation,\n\t\tintroStartedAt,\n\t\tdataLength,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t\tisMouseInChart,\n\t} = useBarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedRadius = radius ?? defaultRadius\n\tconst isSelected = selectedDataKey === dataKey\n\n\tconst revealType: BarAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\n\tconst customBarProps = {\n\t\tid,\n\t\tdataKey,\n\t\tvariant,\n\t\tbarRadius: resolvedRadius,\n\t\tbufferBar,\n\t\tisClickable,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisHorizontal,\n\t\tintroStartedAt,\n\t\tselectedDataKey,\n\t\tdataLength,\n\t\tonClick: () => {\n\t\t\tif (!isClickable) return\n\n\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t},\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstackId={isStacked ? STACK_ID : undefined}\n\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\tradius={resolvedRadius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={\n\t\t\t\t\tisClickable || enableHoverHighlight\n\t\t\t\t\t\t? { cursor: \"pointer\" }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tshape={(props: unknown) => (\n\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t{...(props as BarShapeProps)}\n\t\t\t\t\t\t{...customBarProps}\n\t\t\t\t\t\tanimationType={revealType}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\tactiveBar={(props: unknown) => (\n\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t{...(props as BarShapeProps)}\n\t\t\t\t\t\t{...customBarProps}\n\t\t\t\t\t\tanimationType=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{...barProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{variant === \"duotone\" && (\n\t\t\t\t\t<DuotonePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"duotone-reverse\" && (\n\t\t\t\t\t<DuotoneReversePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"stripped\" && (\n\t\t\t\t\t<StrippedPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\ttype,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading, isHorizontal } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\ttype={type ?? (isHorizontal ? \"number\" : \"category\")}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\ttype,\n\t...props\n}: YAxisProps) {\n\tconst { isLoading, isHorizontal } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\ttype={type ?? (isHorizontal ? \"category\" : \"number\")}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tstrokeDasharray = \"3 3\",\n\tvertical,\n\thorizontal,\n\t...props\n}: GridProps) {\n\tconst { isHorizontal } = useBarChart()\n\n\treturn (\n\t\t<CartesianGrid\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\tvertical={vertical ?? isHorizontal}\n\t\t\thorizontal={horizontal ?? !isHorizontal}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tcursor={false}\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useBarChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype BarShapeProps = {\n\tx?: number\n\ty?: number\n\twidth?: number\n\theight?: number\n\tfill?: string\n\tfillOpacity?: number\n\tdataKey?: string\n\tindex?: number\n\t[key: string]: unknown\n}\n\ntype CustomBarProps = {\n\tid: string\n\tdataKey: string\n\tvariant: BarVariant\n\tbarRadius: number\n\tbufferBar?: boolean\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tisMouseInChart?: boolean\n\tisHorizontal?: boolean\n\tanimationType?: BarAnimationType\n\tintroStartedAt?: number\n\tselectedDataKey?: string | null\n\tisActive?: boolean\n\tdataLength?: number\n\tonClick?: () => void\n} & BarShapeProps\n\nconst CustomBar = (props: CustomBarProps) => {\n\tconst {\n\t\tx = 0,\n\t\ty = 0,\n\t\twidth = 0,\n\t\theight = 0,\n\t\tid,\n\t\tdataKey,\n\t\tvariant,\n\t\tbarRadius,\n\t\tbufferBar,\n\t\tisClickable,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisHorizontal = false,\n\t\tanimationType = \"none\",\n\t\tintroStartedAt = 0,\n\t\tselectedDataKey,\n\t\tisActive,\n\t\tdataLength = 0,\n\t\tonClick,\n\t} = props\n\n\tconst index = typeof props.index === \"number\" ? props.index : -1\n\tconst isLastBar = bufferBar && dataLength > 0 && index === dataLength - 1\n\tconst isStripped = variant === \"stripped\"\n\tconst grow = getBarGrowAnimation(\n\t\tanimationType,\n\t\tindex,\n\t\tdataLength,\n\t\tisHorizontal,\n\t\tintroStartedAt,\n\t)\n\n\tconst fill = getVariantFill(variant, id, dataKey)\n\n\tconst fillOpacity = getBarOpacity({\n\t\tisClickable,\n\t\tselectedDataKey,\n\t\tdataKey,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisActive,\n\t})\n\tconst barFillOpacity = isLastBar ? fillOpacity * 0.35 : fillOpacity\n\tconst cursorStyle =\n\t\tisClickable || enableHoverHighlight ? { cursor: \"pointer\" } : undefined\n\n\tconst radius: RectRadius = isStripped\n\t\t? [barRadius, barRadius, 0, 0]\n\t\t: barRadius\n\n\tconst visibleBar = (\n\t\t<>\n\t\t\t<Rectangle\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\topacity={barFillOpacity}\n\t\t\t\theight={Math.max(0, height - 3)}\n\t\t\t\tradius={radius}\n\t\t\t\tfill={fill}\n\t\t\t\tstroke={isLastBar ? `url(#${id}-colors-${dataKey})` : undefined}\n\t\t\t\tstrokeWidth={isLastBar ? 1 : undefined}\n\t\t\t\tstrokeDasharray={isLastBar ? \"4 4\" : undefined}\n\t\t\t\tstrokeOpacity={isLastBar ? 0.6 : undefined}\n\t\t\t/>\n\t\t\t{isStripped && (\n\t\t\t\t<Rectangle\n\t\t\t\t\tx={x}\n\t\t\t\t\ty={y - 4}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={2}\n\t\t\t\t\tradius={1}\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t)\n\n\treturn (\n\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t<Rectangle {...props} fill=\"transparent\" />\n\t\t\t{grow ? (\n\t\t\t\t<motion.g\n\t\t\t\t\tinitial={grow.initial}\n\t\t\t\t\tanimate={grow.animate}\n\t\t\t\t\ttransition={grow.transition}\n\t\t\t\t\tstyle={grow.style}\n\t\t\t\t>\n\t\t\t\t\t{visibleBar}\n\t\t\t\t</motion.g>\n\t\t\t) : (\n\t\t\t\tvisibleBar\n\t\t\t)}\n\t\t</g>\n\t)\n}\n\nconst getBarGrowAnimation = (\n\tanimationType: BarAnimationType,\n\tindex: number,\n\tdataLength: number,\n\tisHorizontal: boolean,\n\tintroStartedAt: number,\n) => {\n\tif (animationType === \"none\" || index < 0 || dataLength <= 0) return null\n\n\tconst lastIndex = dataLength - 1\n\tconst center = lastIndex / 2\n\n\tlet step: number\n\tswitch (animationType) {\n\t\tcase \"right-to-left\":\n\t\t\tstep = lastIndex - index\n\t\t\tbreak\n\t\tcase \"center-out\":\n\t\t\tstep = Math.abs(index - center)\n\t\t\tbreak\n\t\tcase \"edges-in\":\n\t\t\tstep = center - Math.abs(index - center)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tstep = index\n\t}\n\n\tconst startMs = step * BAR_STAGGER * 1000\n\tconst durationMs = BAR_GROW_DURATION * 1000\n\tconst endMs = startMs + durationMs\n\tconst elapsed = Date.now() - introStartedAt\n\n\tif (elapsed >= endMs) return null\n\n\tconst from = elapsed <= startMs ? 0 : (elapsed - startMs) / durationMs\n\tconst transition = {\n\t\tduration: (endMs - Math.max(elapsed, startMs)) / 1000,\n\t\tease: REVEAL_EASE,\n\t\tdelay: Math.max(0, startMs - elapsed) / 1000,\n\t}\n\n\treturn isHorizontal\n\t\t? {\n\t\t\t\tinitial: { scaleX: from },\n\t\t\t\tanimate: { scaleX: 1 },\n\t\t\t\ttransition,\n\t\t\t\tstyle: { originX: 0 },\n\t\t\t}\n\t\t: {\n\t\t\t\tinitial: { scaleY: from },\n\t\t\t\tanimate: { scaleY: 1 },\n\t\t\t\ttransition,\n\t\t\t\tstyle: { originY: 1 },\n\t\t\t}\n}\n\nconst getVariantFill = (\n\tvariant: BarVariant,\n\tid: string,\n\tdataKey: string,\n): string => {\n\tswitch (variant) {\n\t\tcase \"duotone\":\n\t\t\treturn `url(#${id}-duotone-${dataKey})`\n\t\tcase \"duotone-reverse\":\n\t\t\treturn `url(#${id}-duotone-reverse-${dataKey})`\n\t\tcase \"gradient\":\n\t\t\treturn `url(#${id}-gradient-${dataKey})`\n\t\tcase \"stripped\":\n\t\t\treturn `url(#${id}-stripped-${dataKey})`\n\t\tdefault:\n\t\t\treturn `url(#${id}-colors-${dataKey})`\n\t}\n}\n\nconst getBarOpacity = ({\n\tisClickable,\n\tselectedDataKey,\n\tdataKey,\n\tenableHoverHighlight,\n\tisMouseInChart,\n\tisActive,\n}: {\n\tisClickable?: boolean\n\tselectedDataKey?: string | null\n\tdataKey: string\n\tenableHoverHighlight?: boolean\n\tisMouseInChart?: boolean\n\tisActive?: boolean\n}) => {\n\tconst isSelectedDataKey =\n\t\tselectedDataKey === null || selectedDataKey === dataKey\n\tconst clickOpacity =\n\t\tisClickable && selectedDataKey !== null ? (isSelectedDataKey ? 1 : 0.3) : 1\n\n\tif (enableHoverHighlight && isMouseInChart) {\n\t\treturn isActive ? clickOpacity : clickOpacity * 0.3\n\t}\n\n\treturn clickOpacity\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst DuotonePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-mask-gradient-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-colors-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-mask-${dataKey}`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-mask-gradient-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-${dataKey}`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-duotone-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst DuotoneReversePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-mask-gradient-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-colors-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-reverse-mask-${dataKey}`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-mask-gradient-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-reverse-${dataKey}`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-duotone-reverse-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst GradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-gradient-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"20%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"90%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask-${dataKey}`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-gradient-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient-${dataKey}`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst StrippedPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-stripped-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.2} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.2} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-stripped-mask-${dataKey}`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-stripped-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-stripped-${dataKey}`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-stripped-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingBars: number = 12) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingBars, 20, 80),\n\n\t\t[loadingBars, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingBar = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={LOADING_BAR_DATA_KEY}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity={0.15}\n\t\t\t\tradius={DEFAULT_BAR_RADIUS}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingBarPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingBarPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-mask-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-mask-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-mask-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tCartesianGrid,\n\tCurve,\n\tLine as RechartsLine,\n\tLineChart as RechartsLineChart,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n\ttype CurveProps,\n} from \"recharts\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 1\nconst LOADING_LINE_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype CurveType = ComponentProps<typeof RechartsLine>[\"type\"]\ntype LineDotProp = ComponentProps<typeof RechartsLine>[\"dot\"]\ntype LineActiveDotProp = ComponentProps<typeof RechartsLine>[\"activeDot\"]\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\n\ntype LineAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<LineAnimationType, \"none\">\n\ntype LineChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: LineAnimationType\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst LineChartContext = createContext<LineChartContextValue | null>(null)\n\nfunction useLineChart() {\n\tconst context = use(LineChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Line chart parts (<Line />, <XAxis />, …) must be used within <LineChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype LineChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsLineChart>\n\tcurveType?: CurveType\n\tanimationType?: LineAnimationType\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype LineChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = LineChartBaseProps<TData, TConfig>\n\nexport type { LineChartProps }\n\nexport function LineChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: LineChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst { loadingData, onShimmerExit } = useLoadingData(\n\t\tisLoading,\n\t\tloadingPoints,\n\t)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<LineChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<LineChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"line\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsLineChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingLine\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsLineChart>\n\t\t\t</Chart>\n\t\t</LineChartContext>\n\t)\n}\n\ntype LineProps = {\n\tdataKey: string\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: LineAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tenableBufferLine?: boolean\n\tchildren?: ReactNode\n\tlineProps?: ComponentProps<typeof RechartsLine>\n}\n\nexport function Line({\n\tdataKey,\n\tstrokeVariant = \"solid\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tenableBufferLine = false,\n\tchildren,\n\tlineProps,\n}: LineProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useLineChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: LineAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst isSelected = selectedDataKey === dataKey\n\tconst hasSelection = selectedDataKey !== null\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\treturn (\n\t\t<>\n\t\t\t<g key={dataKey}>\n\t\t\t\t{isClickable && (\n\t\t\t\t\t<RechartsLine\n\t\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\t\tstrokeWidth={15}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\tlegendType=\"none\"\n\t\t\t\t\t\ttooltipType=\"none\"\n\t\t\t\t\t\tstyle={{ cursor: \"pointer\" }}\n\t\t\t\t\t\tonClick={() => selectDataKey(isSelected ? null : dataKey)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<RechartsLine\n\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\t\tstroke={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tdot={dot}\n\t\t\t\t\tactiveDot={activeDot}\n\t\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\t\tstrokeDasharray={getStrokeDasharray(enableBufferLine, isDashed)}\n\t\t\t\t\tshape={enableBufferLine ? bufferLineShape : undefined}\n\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t\t...(isClickable ? { cursor: \"pointer\" } : {}),\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t\t\t\t}}\n\t\t\t\t\t{...lineProps}\n\t\t\t\t>\n\t\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t\t</RechartsLine>\n\t\t\t</g>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\t...props\n}: YAxisProps) {\n\tconst { isLoading } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useLineChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { stroke: 1, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { stroke: 1, dot: 1 }\n\t\t: { stroke: 0.3, dot: 0.3 }\n}\n\nconst getStrokeDasharray = (enableBufferLine: boolean, isDashed: boolean) => {\n\tif (enableBufferLine) return undefined\n\n\treturn isDashed ? \"5 5\" : undefined\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: LineDotProp; activeDot: LineActiveDotProp } => {\n\tlet dot: LineDotProp = false\n\tlet activeDot: LineActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype CurvePoint = NonNullable<NonNullable<CurveProps[\"points\"]>[number]>\ntype DrawableCurvePoint = CurvePoint & { x: number; y: number }\n\nconst isDrawableCurvePoint = (\n\tpoint: CurvePoint,\n): point is DrawableCurvePoint => {\n\treturn typeof point.x === \"number\" && typeof point.y === \"number\"\n}\n\nconst BUFFER_DASH_SIZE = 4\nconst BUFFER_GAP_SIZE = 3\n\nconst findLengthAtX = (\n\tpath: SVGPathElement,\n\ttotalLength: number,\n\ttargetX: number,\n): number => {\n\tlet lo = 0\n\tlet hi = totalLength\n\n\twhile (hi - lo > 0.5) {\n\t\tconst mid = (lo + hi) / 2\n\t\tconst pt = path.getPointAtLength(mid)\n\t\tif (pt.x < targetX) lo = mid\n\t\telse hi = mid\n\t}\n\treturn (lo + hi) / 2\n}\n\nconst bufferLineShape = (props: CurveProps) => {\n\tconst { points, ...rest } = props\n\n\tif (!points || points.length < 2) {\n\t\treturn <Curve {...props} />\n\t}\n\n\tconst drawablePoints = points.filter(isDrawableCurvePoint)\n\n\tif (drawablePoints.length < 2) {\n\t\treturn <Curve {...props} />\n\t}\n\n\tconst splitX = drawablePoints[drawablePoints.length - 2].x\n\n\tconst gRef = (g: SVGGElement | null) => {\n\t\tif (!g) return\n\t\tconst path = g.querySelector(\"path\")\n\t\tif (!path) return\n\n\t\tconst totalLength = path.getTotalLength()\n\t\tconst solidLength = findLengthAtX(path, totalLength, splitX)\n\t\tconst lastSegmentLength = totalLength - solidLength\n\n\t\tconst reps =\n\t\t\tMath.ceil(lastSegmentLength / (BUFFER_DASH_SIZE + BUFFER_GAP_SIZE)) + 1\n\t\tconst dashedPart = Array.from(\n\t\t\t{ length: reps },\n\t\t\t() => `${BUFFER_DASH_SIZE} ${BUFFER_GAP_SIZE}`,\n\t\t).join(\" \")\n\n\t\tpath.setAttribute(\"stroke-dasharray\", `${solidLength} 0 ${dashedPart}`)\n\t}\n\n\treturn (\n\t\t<g ref={gRef}>\n\t\t\t<Curve {...rest} points={drawablePoints} />\n\t\t</g>\n\t)\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"5 5; 0 5; 5 5\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -10\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingPoints: number = 14) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingPoints),\n\n\t\t[loadingPoints, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingLine = ({\n\tchartId,\n\tcurveType,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tcurveType: CurveType\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsLine\n\t\t\t\ttype={curveType}\n\t\t\t\tdataKey={LOADING_LINE_DATA_KEY}\n\t\t\t\tmin={0}\n\t\t\t\tmax={100}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\ttooltipType=\"none\"\n\t\t\t\tactiveDot={false}\n\t\t\t\tdot={false}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tBar as RechartsBar,\n\tCartesianGrid,\n\tComposedChart as RechartsComposedChart,\n\tLine as RechartsLine,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 2\nconst DEFAULT_BAR_RADIUS = 4\nconst LOADING_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\nconst BAR_GROW_DURATION = 0.5\nconst BAR_STAGGER = 0.05\n\ntype CurveType = ComponentProps<typeof RechartsLine>[\"type\"]\ntype LineDotProp = ComponentProps<typeof RechartsLine>[\"dot\"]\ntype LineActiveDotProp = ComponentProps<typeof RechartsLine>[\"activeDot\"]\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\ntype BarVariant =\n\t| \"default\"\n\t| \"duotone\"\n\t| \"duotone-reverse\"\n\t| \"gradient\"\n\t| \"stripped\"\n\ntype ComposedAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<ComposedAnimationType, \"none\">\n\ntype ComposedChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: ComposedAnimationType\n\tintroStartedAt: number\n\tdataLength: number\n\tisLoading: boolean\n\thoveredIndex: number | null\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst ComposedChartContext = createContext<ComposedChartContextValue | null>(\n\tnull,\n)\n\nfunction useComposedChart() {\n\tconst context = use(ComposedChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Composed chart parts (<Bar />, <Line />, <XAxis />, …) must be used within <ComposedChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype ComposedChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsComposedChart>\n\tcurveType?: CurveType\n\tanimationType?: ComposedAnimationType\n\tbarGap?: number\n\tbarCategoryGap?: number\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingBars?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype ComposedChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = ComposedChartBaseProps<TData, TConfig>\n\nexport type { ComposedChartProps }\n\nexport function ComposedChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tbarGap,\n\tbarCategoryGap,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingBars,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: ComposedChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\n\tconst [introStartedAt] = useState(() => Date.now())\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\tconst { loadingData, onShimmerExit } = useLoadingData(isLoading, loadingBars)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<ComposedChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdataLength: displayData.length,\n\t\t\tisLoading,\n\t\t\thoveredIndex,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdisplayData.length,\n\t\t\tisLoading,\n\t\t\thoveredIndex,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<ComposedChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"area\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsComposedChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\tbarGap={barGap}\n\t\t\t\t\tbarCategoryGap={barCategoryGap}\n\t\t\t\t\tonMouseLeave={() => setHoveredIndex(null)}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingBar\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tbarRadius={DEFAULT_BAR_RADIUS}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsComposedChart>\n\t\t\t</Chart>\n\t\t</ComposedChartContext>\n\t)\n}\n\ntype BarProps = {\n\tdataKey: string\n\tvariant?: BarVariant\n\tradius?: number\n\tanimationType?: ComposedAnimationType\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tbarProps?: ComponentProps<typeof RechartsBar>\n}\n\nexport function Bar({\n\tdataKey,\n\tvariant = \"default\",\n\tradius = DEFAULT_BAR_RADIUS,\n\tanimationType,\n\tisClickable = false,\n\tenableHoverHighlight = false,\n\tbarProps,\n}: BarProps) {\n\tconst {\n\t\tconfig,\n\t\tanimationType: defaultAnimation,\n\t\tintroStartedAt,\n\t\tdataLength,\n\t\tisLoading,\n\t\thoveredIndex,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useComposedChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\n\tconst revealType: ComposedAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\tradius={radius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={\n\t\t\t\t\tisClickable || enableHoverHighlight\n\t\t\t\t\t\t? { cursor: \"pointer\" }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tshape={(props: unknown) => {\n\t\t\t\t\tconst barShapeProps = props as BarShapeProps\n\t\t\t\t\tconst index =\n\t\t\t\t\t\ttypeof barShapeProps.index === \"number\" ? barShapeProps.index : -1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t\t{...barShapeProps}\n\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\tbarRadius={radius}\n\t\t\t\t\t\t\tfillOpacity={getBarOpacity({\n\t\t\t\t\t\t\t\tisClickable,\n\t\t\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\t\t\tselectedDataKey,\n\t\t\t\t\t\t\t\tenableHoverHighlight,\n\t\t\t\t\t\t\t\thoveredIndex,\n\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\t\t\tenableHoverHighlight={enableHoverHighlight}\n\t\t\t\t\t\t\tanimationType={revealType}\n\t\t\t\t\t\t\tdataLength={dataLength}\n\t\t\t\t\t\t\tintroStartedAt={introStartedAt}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...barProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<VerticalColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{variant === \"duotone\" && (\n\t\t\t\t\t<DuotonePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"duotone-reverse\" && (\n\t\t\t\t\t<DuotoneReversePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"stripped\" && (\n\t\t\t\t\t<StrippedPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype LineProps = {\n\tdataKey: string\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: ComposedAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tlineProps?: ComponentProps<typeof RechartsLine>\n}\n\nexport function Line({\n\tdataKey,\n\tstrokeVariant = \"solid\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tchildren,\n\tlineProps,\n}: LineProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useComposedChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: ComposedAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\tconst hasSelection = selectedDataKey !== null\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\tconst handleLineClick = () => {\n\t\tif (!isClickable) return\n\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{isClickable && (\n\t\t\t\t<RechartsLine\n\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\tstrokeWidth={20}\n\t\t\t\t\tdot={false}\n\t\t\t\t\tactiveDot={false}\n\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\tlegendType=\"none\"\n\t\t\t\t\ttooltipType=\"none\"\n\t\t\t\t\tstyle={{ cursor: \"pointer\" }}\n\t\t\t\t\tonClick={handleLineClick}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<RechartsLine\n\t\t\t\ttype={resolvedCurve}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\tstroke={`url(#${id}-line-colors-${dataKey})`}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstrokeDasharray={isDashed ? \"5 5\" : undefined}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={{\n\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t...(isClickable ? { cursor: \"pointer\", pointerEvents: \"none\" } : {}),\n\t\t\t\t}}\n\t\t\t\t{...lineProps}\n\t\t\t>\n\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t</RechartsLine>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<HorizontalColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\t...props\n}: YAxisProps) {\n\tconst { isLoading } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useComposedChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { stroke: 1, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { stroke: 1, dot: 1 }\n\t\t: { stroke: 0.3, dot: 0.3 }\n}\n\nconst getBarOpacity = ({\n\tisClickable,\n\tisSelected,\n\tselectedDataKey,\n\tenableHoverHighlight,\n\thoveredIndex,\n\tindex,\n}: {\n\tisClickable: boolean\n\tisSelected: boolean\n\tselectedDataKey: string | null\n\tenableHoverHighlight: boolean\n\thoveredIndex: number | null\n\tindex: number\n}) => {\n\tconst clickOpacity =\n\t\tisClickable && selectedDataKey !== null ? (isSelected ? 1 : 0.3) : 1\n\n\tif (enableHoverHighlight && hoveredIndex !== null) {\n\t\treturn hoveredIndex === index ? clickOpacity : clickOpacity * 0.3\n\t}\n\n\treturn clickOpacity\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: LineDotProp; activeDot: LineActiveDotProp } => {\n\tlet dot: LineDotProp = false\n\tlet activeDot: LineActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={`${id}-line`}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={`${id}-line`}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype BarShapeProps = {\n\tx?: number\n\ty?: number\n\twidth?: number\n\theight?: number\n\tfill?: string\n\tfillOpacity?: number\n\tdataKey?: string\n\tindex?: number\n\tbackground?: {\n\t\tx?: number\n\t\ty?: number\n\t\twidth?: number\n\t\theight?: number\n\t}\n\t[key: string]: unknown\n}\n\ntype CustomBarProps = {\n\tid: string\n\tvariant: BarVariant\n\tbarRadius: number\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tanimationType?: ComposedAnimationType\n\tdataLength?: number\n\tintroStartedAt?: number\n\tonClick?: () => void\n} & BarShapeProps\n\nconst CustomBar = ({\n\tx = 0,\n\ty = 0,\n\twidth = 0,\n\theight = 0,\n\tfillOpacity = 1,\n\tbackground,\n\tindex = -1,\n\tid,\n\tvariant,\n\tbarRadius,\n\tisClickable,\n\tenableHoverHighlight,\n\tanimationType = \"none\",\n\tdataLength = 0,\n\tintroStartedAt = 0,\n\tonClick,\n}: CustomBarProps) => {\n\tconst cursorStyle =\n\t\tisClickable || enableHoverHighlight ? { cursor: \"pointer\" } : undefined\n\tconst hitAreaX = background?.x ?? x\n\tconst hitAreaY = background?.y ?? y\n\tconst hitAreaWidth = background?.width ?? width\n\tconst hitAreaHeight = background?.height ?? height\n\n\tconst grow =\n\t\tgetBarGrowAnimation(animationType, index, dataLength, introStartedAt) ?? {}\n\n\tconst getFill = () => {\n\t\tswitch (variant) {\n\t\t\tcase \"duotone\":\n\t\t\t\treturn `url(#${id}-duotone)`\n\t\t\tcase \"duotone-reverse\":\n\t\t\t\treturn `url(#${id}-duotone-reverse)`\n\t\t\tcase \"gradient\":\n\t\t\t\treturn `url(#${id}-gradient)`\n\t\t\tcase \"stripped\":\n\t\t\t\treturn `url(#${id}-stripped)`\n\t\t\tdefault:\n\t\t\t\treturn `url(#${id}-bar-colors)`\n\t\t}\n\t}\n\n\tconst hitArea = enableHoverHighlight ? (\n\t\t<rect\n\t\t\tx={hitAreaX}\n\t\t\ty={hitAreaY}\n\t\t\twidth={hitAreaWidth}\n\t\t\theight={hitAreaHeight}\n\t\t\tfill=\"transparent\"\n\t\t/>\n\t) : null\n\n\tif (variant === \"stripped\") {\n\t\treturn (\n\t\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t\t<motion.g\n\t\t\t\t\t{...grow}\n\t\t\t\t\topacity={fillOpacity}\n\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t>\n\t\t\t\t\t<rect x={x} y={y} width={width} height={height} fill={getFill()} />\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={x}\n\t\t\t\t\t\ty={y}\n\t\t\t\t\t\twidth={width}\n\t\t\t\t\t\theight={2}\n\t\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\t/>\n\t\t\t\t</motion.g>\n\t\t\t\t{hitArea}\n\t\t\t</g>\n\t\t)\n\t}\n\n\treturn (\n\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t<motion.g {...grow}>\n\t\t\t\t<rect\n\t\t\t\t\tx={x}\n\t\t\t\t\ty={y}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\trx={barRadius}\n\t\t\t\t\try={barRadius}\n\t\t\t\t\tfill={getFill()}\n\t\t\t\t\topacity={fillOpacity}\n\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t/>\n\t\t\t</motion.g>\n\t\t\t{hitArea}\n\t\t</g>\n\t)\n}\n\nconst getBarGrowAnimation = (\n\tanimationType: ComposedAnimationType,\n\tindex: number,\n\tdataLength: number,\n\tintroStartedAt: number,\n) => {\n\tif (animationType === \"none\" || index < 0 || dataLength <= 0) return null\n\n\tconst lastIndex = dataLength - 1\n\tconst center = lastIndex / 2\n\n\tlet step: number\n\tswitch (animationType) {\n\t\tcase \"right-to-left\":\n\t\t\tstep = lastIndex - index\n\t\t\tbreak\n\t\tcase \"center-out\":\n\t\t\tstep = Math.abs(index - center)\n\t\t\tbreak\n\t\tcase \"edges-in\":\n\t\t\tstep = center - Math.abs(index - center)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tstep = index\n\t}\n\n\tconst startMs = step * BAR_STAGGER * 1000\n\tconst durationMs = BAR_GROW_DURATION * 1000\n\tconst endMs = startMs + durationMs\n\tconst elapsed = Date.now() - introStartedAt\n\n\tif (elapsed >= endMs) return null\n\n\tconst from = elapsed <= startMs ? 0 : (elapsed - startMs) / durationMs\n\n\treturn {\n\t\tinitial: { scaleY: from },\n\t\tanimate: { scaleY: 1 },\n\t\ttransition: {\n\t\t\tduration: (endMs - Math.max(elapsed, startMs)) / 1000,\n\t\t\tease: REVEAL_EASE,\n\t\t\tdelay: Math.max(0, startMs - elapsed) / 1000,\n\t\t},\n\t\tstyle: { originY: 1 },\n\t}\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"5 5; 0 5; 5 5\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -10\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst VerticalColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-bar-colors`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst HorizontalColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-line-colors-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"0\"\n\t\t>\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst DuotonePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-mask-gradient`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-colors`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-duotone-mask`} maskContentUnits=\"objectBoundingBox\">\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-colors)`}\n\t\t\t\t\tmask={`url(#${id}-duotone-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst DuotoneReversePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-mask-gradient`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-colors`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-reverse-mask`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-reverse`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-colors)`}\n\t\t\t\t\tmask={`url(#${id}-duotone-reverse-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst GradientPattern = ({ id }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-gradient-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"20%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"90%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-gradient-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst StrippedPattern = ({ id }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-stripped-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-stripped-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-stripped-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-stripped`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\tmask={`url(#${id}-stripped-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingBars: number = 12) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingBars, 20, 80),\n\n\t\t[loadingBars, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingBar = ({\n\tchartId,\n\tbarRadius,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tbarRadius: number\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={LOADING_DATA_KEY}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity={0.15}\n\t\t\t\tradius={barRadius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tLabelList as RechartsLabelList,\n\tPie as RechartsPie,\n\tPieChart as RechartsPieChart,\n\tSector,\n\ttype PieSectorShapeProps,\n} from \"recharts\"\nimport { motion } from \"motion/react\"\n\nconst LOADING_SECTORS = 5\nconst LOADING_ANIMATION_DURATION = 2000\nconst DEFAULT_INNER_RADIUS = 0\nconst DEFAULT_OUTER_RADIUS = \"80%\"\nconst DEFAULT_CORNER_RADIUS = 0\nconst DEFAULT_PADDING_ANGLE = 0\nconst DEFAULT_START_ANGLE = 0\nconst DEFAULT_END_ANGLE = 360\ntype LabelListProps = ComponentProps<typeof RechartsLabelList>\n\ntype PieChartContextValue = {\n\tconfig: ChartConfig\n\tdata: Record<string, unknown>[]\n\tdataKey: string\n\tnameKey: string\n\tisLoading: boolean\n\tselectedSector: string | null\n\tselectSector: (sectorName: string | null) => void\n}\n\nconst PieChartContext = createContext<PieChartContextValue | null>(null)\n\nfunction usePieChart() {\n\tconst context = use(PieChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Pie chart parts (<Pie />, <Tooltip />, …) must be used within <PieChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype PieChartProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tdataKey: keyof TData & string\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsPieChart>\n\tdefaultSelectedSector?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n}\n\nexport type { PieChartProps }\n\nexport function PieChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tdataKey,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tdefaultSelectedSector = null,\n\tonSelectionChange,\n\tisLoading = false,\n}: PieChartProps<TData>) {\n\tconst [selectedSector, setSelectedSector] = useState<string | null>(\n\t\tdefaultSelectedSector,\n\t)\n\n\tconst selectSector = useCallback(\n\t\t(sectorName: string | null) => {\n\t\t\tsetSelectedSector(sectorName)\n\n\t\t\tif (sectorName === null) {\n\t\t\t\tonSelectionChange?.(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst selectedItem = data.find(\n\t\t\t\titem => (item[nameKey] as string) === sectorName,\n\t\t\t)\n\n\t\t\tif (selectedItem) {\n\t\t\t\tonSelectionChange?.({\n\t\t\t\t\tdataKey: sectorName,\n\t\t\t\t\tvalue: selectedItem[dataKey] as number,\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[data, dataKey, nameKey, onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<PieChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tdata,\n\t\t\tdataKey,\n\t\t\tnameKey,\n\t\t\tisLoading,\n\t\t\tselectedSector,\n\t\t\tselectSector,\n\t\t}),\n\t\t[config, data, dataKey, nameKey, isLoading, selectedSector, selectSector],\n\t)\n\n\treturn (\n\t\t<PieChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsPieChart\n\t\t\t\t\tid=\"evil-charts-pie-chart\"\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPieChart>\n\t\t\t</Chart>\n\t\t</PieChartContext>\n\t)\n}\n\ntype PieProps = {\n\tvariant?: PieVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tcornerRadius?: number\n\tpaddingAngle?: number\n\tstartAngle?: number\n\tendAngle?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tpieProps?: Omit<\n\t\tComponentProps<typeof RechartsPie>,\n\t\t\"data\" | \"dataKey\" | \"nameKey\"\n\t>\n}\n\nexport function Pie({\n\tvariant = \"gradient\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tpaddingAngle = DEFAULT_PADDING_ANGLE,\n\tstartAngle = DEFAULT_START_ANGLE,\n\tendAngle = DEFAULT_END_ANGLE,\n\tisClickable = false,\n\tchildren,\n\tpieProps,\n}: PieProps) {\n\tconst {\n\t\tconfig,\n\t\tdata,\n\t\tdataKey,\n\t\tnameKey,\n\t\tisLoading,\n\t\tselectedSector,\n\t\tselectSector,\n\t} = usePieChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<RechartsPie\n\t\t\t\tdata={LOADING_PIE_DATA}\n\t\t\t\tdataKey=\"value\"\n\t\t\t\tnameKey=\"name\"\n\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\touterRadius={outerRadius}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tpaddingAngle={paddingAngle}\n\t\t\t\tstartAngle={startAngle}\n\t\t\t\tendAngle={endAngle}\n\t\t\t\tstrokeWidth={0}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tshape={props => <AnimatedLoadingSector {...props} />}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst label = resolveLabel(children, dataKey)\n\n\tconst preparedData = data.map(item => ({\n\t\t...item,\n\t\tfill: `url(#${id}-colors-${item[nameKey] as string})`,\n\t}))\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsPie\n\t\t\t\tdata={preparedData}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tnameKey={nameKey}\n\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\touterRadius={outerRadius}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tpaddingAngle={paddingAngle}\n\t\t\t\tstartAngle={startAngle}\n\t\t\t\tendAngle={endAngle}\n\t\t\t\tstrokeWidth={0}\n\t\t\t\tisAnimationActive\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(_, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst clickedName = data[index]?.[nameKey] as string\n\n\t\t\t\t\tselectSector(selectedSector === clickedName ? null : clickedName)\n\t\t\t\t}}\n\t\t\t\tshape={(props: PieSectorShapeProps) => {\n\t\t\t\t\tconst sectorName = data[props.index ?? 0]?.[nameKey] as string\n\t\t\t\t\tconst isDimmed =\n\t\t\t\t\t\tisClickable &&\n\t\t\t\t\t\tselectedSector !== null &&\n\t\t\t\t\t\tselectedSector !== sectorName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\tfill={`url(#${id}-colors-${sectorName})`}\n\t\t\t\t\t\t\tstroke={paddingAngle < 0 ? \"var(--background)\" : \"none\"}\n\t\t\t\t\t\t\tstrokeWidth={paddingAngle < 0 ? 5 : 0}\n\t\t\t\t\t\t\topacity={isDimmed ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...pieProps}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</RechartsPie>\n\t\t\t<defs>\n\t\t\t\t<RadialColorGradient id={id} config={config} variant={variant} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype LabelProps = {\n\tdataKey?: string\n\tlabelListProps?: Omit<LabelListProps, \"dataKey\">\n}\n\nexport const Label: FC<LabelProps> = () => null\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, nameKey } = usePieChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, selectedSector, selectSector } = usePieChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedSector}\n\t\t\t\t\tonSelectChange={selectSector}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype BackgroundProps = {\n\tvariant?: BackgroundVariant\n}\n\nexport function Background({ variant = \"dots\" }: BackgroundProps) {\n\treturn <ChartBackground variant={variant} />\n}\n\nconst resolveLabel = (children: ReactNode, valueKey: string): ReactNode => {\n\tlet label: ReactNode = null\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child) || child.type !== Label) return\n\n\t\tconst { dataKey, labelListProps } = (child as ReactElement<LabelProps>)\n\t\t\t.props\n\n\t\tlabel = (\n\t\t\t<RechartsLabelList\n\t\t\t\tdataKey={dataKey ?? valueKey}\n\t\t\t\tstroke=\"none\"\n\t\t\t\tfontSize={12}\n\t\t\t\tfontWeight={500}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tclassName=\"fill-background\"\n\t\t\t\t{...labelListProps}\n\t\t\t/>\n\t\t)\n\t})\n\n\treturn label\n}\n\ntype PieVariant = \"gradient\"\n\nconst RadialColorGradient = ({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n\tvariant: PieVariant\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([sectorKey, sectorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(sectorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${id}-colors-${sectorKey}`}\n\t\t\t\t\t\tid={`${id}-colors-${sectorKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${sectorKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${sectorKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${sectorKey}-${index}, var(--color-${sectorKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst LOADING_PIE_DATA = Array.from({ length: LOADING_SECTORS }, (_, i) => ({\n\tname: `loading${i}`,\n\tvalue: 100 / LOADING_SECTORS,\n}))\n\nconst AnimatedLoadingSector = (\n\tprops: ComponentProps<typeof Sector> & { index?: number },\n) => {\n\tconst { index = 0, ...sectorProps } = props\n\n\tconst delay = (index / LOADING_SECTORS) * (LOADING_ANIMATION_DURATION / 1000)\n\n\treturn (\n\t\t<motion.g\n\t\t\tinitial={{ opacity: 0.15 }}\n\t\t\tanimate={{ opacity: [0.15, 0.5, 0.15] }}\n\t\t\ttransition={{\n\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\tdelay,\n\t\t\t\trepeat: Infinity,\n\t\t\t\tease: \"easeInOut\",\n\t\t\t}}\n\t\t>\n\t\t\t<Sector {...sectorProps} fill=\"currentColor\" />\n\t\t</motion.g>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tPolarAngleAxis as RechartsPolarAngleAxis,\n\tPolarGrid as RechartsPolarGrid,\n\tPolarRadiusAxis as RechartsPolarRadiusAxis,\n\tRadar as RechartsRadar,\n\tRadarChart as RechartsRadarChart,\n} from \"recharts\"\n\nconst STROKE_WIDTH = 1\nconst DEFAULT_FILL_OPACITY = 0.3\nconst LOADING_POINTS = 6\nconst LOADING_ANIMATION_DURATION = 1500\nconst LOADING_RADAR_DATA_KEY = \"value\"\n\ntype RadarVariant = \"filled\" | \"lines\"\n\ntype RadarChartContextValue = {\n\tconfig: ChartConfig\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst RadarChartContext = createContext<RadarChartContextValue | null>(null)\n\nfunction useRadarChart() {\n\tconst context = use(RadarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radar chart parts (<Radar />, <PolarAngleAxis />, …) must be used within <RadarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype RadarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsRadarChart>\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n}\n\ntype RadarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = RadarChartBaseProps<TData, TConfig>\n\nexport type { RadarChartProps }\n\nexport function RadarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n}: RadarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading, loadingPoints)\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<RadarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[config, isLoading, selectedDataKey, selectDataKey],\n\t)\n\n\treturn (\n\t\t<RadarChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : data}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadar />}\n\t\t\t\t</RechartsRadarChart>\n\t\t\t</Chart>\n\t\t</RadarChartContext>\n\t)\n}\n\ntype RadarProps = {\n\tdataKey: string\n\tvariant?: RadarVariant\n\tfillOpacity?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tradarProps?: Omit<ComponentProps<typeof RechartsRadar>, \"dataKey\">\n}\n\nexport function Radar({\n\tdataKey,\n\tvariant = \"filled\",\n\tfillOpacity = DEFAULT_FILL_OPACITY,\n\tisClickable = false,\n\tchildren,\n\tradarProps,\n}: RadarProps) {\n\tconst { config, isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\tconst opacity = isClickable && !isSelected ? 0.2 : 1\n\tconst isFilled = variant === \"filled\"\n\n\tconst { dot, activeDot } = resolveDots(children, id, dataKey, opacity)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstroke={`url(#${id}-radar-stroke-${dataKey})`}\n\t\t\t\tstrokeOpacity={opacity}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tfill={isFilled ? `url(#${id}-radar-fill-${dataKey})` : \"none\"}\n\t\t\t\tfillOpacity={isFilled ? fillOpacity * opacity : 0}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...radarProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t<StrokeGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{isFilled && <FillGradient id={id} dataKey={dataKey} config={config} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype PolarGridProps = ComponentProps<typeof RechartsPolarGrid>\n\nexport function PolarGrid({\n\tgridType = \"polygon\",\n\tstroke = \"currentColor\",\n\tstrokeOpacity = 0.2,\n\tstrokeDasharray = \"3 4\",\n\t...props\n}: PolarGridProps) {\n\treturn (\n\t\t<RechartsPolarGrid\n\t\t\tgridType={gridType}\n\t\t\tstroke={stroke}\n\t\t\tstrokeOpacity={strokeOpacity}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype PolarAngleAxisProps = ComponentProps<typeof RechartsPolarAngleAxis>\n\nexport function PolarAngleAxis({\n\ttick = { fill: \"currentColor\", fontSize: 12 },\n\ttickLine = false,\n\t...props\n}: PolarAngleAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn <RechartsPolarAngleAxis tick={tick} tickLine={tickLine} {...props} />\n}\n\ntype PolarRadiusAxisProps = ComponentProps<typeof RechartsPolarRadiusAxis>\n\nexport function PolarRadiusAxis({\n\ttick = { fill: \"currentColor\", fontSize: 10 },\n\ttickLine = false,\n\taxisLine = false,\n\t...props\n}: PolarRadiusAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsPolarRadiusAxis\n\t\t\ttick={tick}\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype RadarDotProp = ComponentProps<typeof RechartsRadar>[\"dot\"]\ntype RadarActiveDotProp = ComponentProps<typeof RechartsRadar>[\"activeDot\"]\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n): { dot: RadarDotProp; activeDot: RadarActiveDotProp } => {\n\tlet dot: RadarDotProp = false\n\tlet activeDot: RadarActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n\tconfig: ChartConfig\n}\n\ntype ColorStopsProps = {\n\tdataKey: string\n\tcolorsCount: number\n\topacities?: number[]\n}\n\nconst ColorStops = ({ dataKey, colorsCount, opacities }: ColorStopsProps) => {\n\tif (colorsCount === 1) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[0]}\n\t\t\t\t/>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[opacities.length - 1]}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{Array.from({ length: colorsCount }, (_, index) => {\n\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\treturn (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\tstopOpacity={opacities?.[index]}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst ColorGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst StrokeGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-radar-stroke-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"1\"\n\t\t>\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst FillGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\tconst opacities =\n\t\tcolorsCount === 1\n\t\t\t? [0.8, 0.3]\n\t\t\t: Array.from({ length: colorsCount }, (_, i) => (i === 0 ? 0.8 : 0.3))\n\n\treturn (\n\t\t<radialGradient\n\t\t\tid={`${id}-radar-fill-${dataKey}`}\n\t\t\tcx=\"50%\"\n\t\t\tcy=\"50%\"\n\t\t\tr=\"50%\"\n\t\t>\n\t\t\t<ColorStops\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\topacities={opacities}\n\t\t\t/>\n\t\t</radialGradient>\n\t)\n}\n\nconst generateLoadingData = (points: number) => {\n\tconst categories = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]\n\n\treturn categories.slice(0, points).map(category => ({\n\t\tskill: category,\n\t\t[LOADING_RADAR_DATA_KEY]: 30 + Math.random() * 70,\n\t}))\n}\n\nexport function useLoadingData(\n\tisLoading: boolean,\n\tloadingPoints: number = LOADING_POINTS,\n) {\n\tconst [refreshKey, setRefreshKey] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetRefreshKey(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => generateLoadingData(loadingPoints),\n\n\t\t[loadingPoints, refreshKey],\n\t)\n\n\treturn loadingData\n}\n\nconst LoadingRadar = () => {\n\treturn (\n\t\t<RechartsRadar\n\t\t\tdataKey={LOADING_RADAR_DATA_KEY}\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeOpacity={0.3}\n\t\t\tstrokeWidth={2}\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity={0.1}\n\t\t\tdot={false}\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t/>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tRadialBar as RechartsRadialBar,\n\tRadialBarChart as RechartsRadialBarChart,\n\tSector,\n\ttype SectorProps,\n} from \"recharts\"\nimport type { TypedDataKey } from \"recharts/types/util/typedDataKey\"\n\nconst DEFAULT_INNER_RADIUS = \"30%\"\nconst DEFAULT_OUTER_RADIUS = \"100%\"\nconst DEFAULT_CORNER_RADIUS = 5\nconst DEFAULT_BAR_SIZE = 14\nconst LOADING_BARS = 5\nconst LOADING_ANIMATION_DURATION = 1500\n\ntype RadialBarChartProps = ComponentProps<typeof RechartsRadialBarChart>\ntype RadialBarRechartsProps = ComponentProps<typeof RechartsRadialBar>\n\ntype RadialVariant = \"full\" | \"semi\"\n\ntype RadialChartContextValue = {\n\tconfig: ChartConfig\n\tnameKey: string\n\tchartId: string\n\tisLoading: boolean\n\tselectedBar: string | null\n\tselectBar: (barName: string | null, value?: number) => void\n}\n\nconst RadialChartContext = createContext<RadialChartContextValue | null>(null)\n\nfunction useRadialChart() {\n\tconst context = use(RadialChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radial chart parts (<RadialBar />, <Tooltip />, …) must be used within <RadialChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype RadialChartBaseProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: RadialBarChartProps\n\tvariant?: RadialVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n\tbackgroundVariant?: BackgroundVariant\n}\n\ntype RadialChartProps<TData extends Record<string, unknown>> =\n\tRadialChartBaseProps<TData>\n\nexport type { RadialChartProps }\n\nexport function RadialChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tvariant = \"full\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tbackgroundVariant,\n}: RadialChartProps<TData>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedBar, setSelectedBar] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading)\n\n\tconst variantConfig = getVariantConfig(variant)\n\n\tconst selectBar = useCallback(\n\t\t(barName: string | null, value?: number) => {\n\t\t\tsetSelectedBar(barName)\n\t\t\tonSelectionChange?.(\n\t\t\t\tbarName === null ? null : { dataKey: barName, value: value ?? 0 },\n\t\t\t)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst preparedData = useMemo(\n\t\t() =>\n\t\t\tdata.map(item => ({\n\t\t\t\t...item,\n\t\t\t\tfill: `url(#${chartId}-radial-colors-${item[nameKey] as string})`,\n\t\t\t})),\n\t\t[data, nameKey, chartId],\n\t)\n\n\tconst contextValue = useMemo<RadialChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tnameKey,\n\t\t\tchartId,\n\t\t\tisLoading,\n\t\t\tselectedBar,\n\t\t\tselectBar,\n\t\t}),\n\t\t[config, nameKey, chartId, isLoading, selectedBar, selectBar],\n\t)\n\n\treturn (\n\t\t<RadialChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadialBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : preparedData}\n\t\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\t\touterRadius={outerRadius}\n\t\t\t\t\tstartAngle={variantConfig.startAngle}\n\t\t\t\t\tendAngle={variantConfig.endAngle}\n\t\t\t\t\tcx={variantConfig.cx}\n\t\t\t\t\tcy={variantConfig.cy}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadialBar />}\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ColorGradientStyle config={config} chartId={chartId} />\n\t\t\t\t\t</defs>\n\t\t\t\t</RechartsRadialBarChart>\n\t\t\t</Chart>\n\t\t</RadialChartContext>\n\t)\n}\n\ntype RadialBarProps = {\n\tdataKey: string\n\tcornerRadius?: number\n\tbarSize?: number\n\tshowBackground?: boolean\n\tisClickable?: boolean\n\tradialBarProps?: Omit<RadialBarRechartsProps, \"dataKey\">\n}\n\nexport function RadialBar({\n\tdataKey,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tbarSize = DEFAULT_BAR_SIZE,\n\tshowBackground = true,\n\tisClickable = false,\n\tradialBarProps,\n}: RadialBarProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadialBar\n\t\t\t\tdataKey={dataKey as TypedDataKey<Record<string, unknown>>}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tbarSize={barSize}\n\t\t\t\tbackground={showBackground}\n\t\t\t\tclassName=\"drop-shadow-sm\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(payload, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst entry = payload as Record<string, unknown>\n\t\t\t\t\tconst barName =\n\t\t\t\t\t\t(entry?.[nameKey] as string | undefined) ?? String(index)\n\t\t\t\t\tconst value = Number(entry?.[dataKey] ?? 0)\n\n\t\t\t\t\tselectBar(selectedBar === barName ? null : barName, value)\n\t\t\t\t}}\n\t\t\t\tshape={(props: SectorProps) => {\n\t\t\t\t\tconst barName = (props as unknown as Record<string, unknown>)[\n\t\t\t\t\t\tnameKey\n\t\t\t\t\t] as string\n\t\t\t\t\tconst isSelected = selectedBar === null || selectedBar === barName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\topacity={isClickable && !isSelected ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...radialBarProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { nameKey, isLoading } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedBar}\n\t\t\t\t\tonSelectChange={selectBar}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction getVariantConfig(variant: RadialVariant) {\n\tswitch (variant) {\n\t\tcase \"semi\":\n\t\t\treturn { startAngle: 180, endAngle: 0, cx: \"50%\", cy: \"70%\" }\n\t\tcase \"full\":\n\t\tdefault:\n\t\t\treturn { startAngle: 90, endAngle: -270, cx: \"50%\", cy: \"50%\" }\n\t}\n}\n\nconst ColorGradientStyle = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, colorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(colorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nfunction generateLoadingData() {\n\treturn Array.from({ length: LOADING_BARS }, (_, i) => ({\n\t\tname: `loading${i}`,\n\t\tvalue: 40 + Math.random() * 60,\n\t}))\n}\n\nfunction useLoadingData(isLoading: boolean) {\n\tconst [tick, setTick] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetTick(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(() => generateLoadingData(), [tick])\n\n\treturn loadingData\n}\n\nconst LoadingRadialBar = () => {\n\treturn (\n\t\t<RechartsRadialBar\n\t\t\tdataKey=\"value\"\n\t\t\tcornerRadius={DEFAULT_CORNER_RADIUS}\n\t\t\tbarSize={DEFAULT_BAR_SIZE}\n\t\t\tbackground\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t\tshape={(props: SectorProps) => (\n\t\t\t\t<Sector {...props} fill=\"currentColor\" fillOpacity={0.25} />\n\t\t\t)}\n\t\t/>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tSankey as RechartsSankey,\n\tLayer,\n\ttype SankeyProps,\n\ttype SankeyNodeProps,\n\ttype SankeyLinkProps,\n\ttype SankeyData,\n\ttype SankeyNode as RechartsSankeyNode,\n} from \"recharts\"\nimport { motion } from \"motion/react\"\n\nconst LOADING_ANIMATION_DURATION = 2000\nconst DEFAULT_NODE_WIDTH = 10\nconst DEFAULT_NODE_PADDING = 10\nconst DEFAULT_LINK_CURVATURE = 0.5\nconst DEFAULT_ITERATIONS = 32\n\ntype LinkVariant = \"gradient\" | \"solid\" | \"source\" | \"target\"\ntype NodeLabelPosition = \"inside\" | \"outside\"\n\ntype SankeyChartContextValue = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchartId: string\n\tisLoading: boolean\n\tselectedNode: string | null\n\tselectNode: (nodeName: string | null) => void\n}\n\nconst SankeyChartContext = createContext<SankeyChartContextValue | null>(null)\n\nfunction useSankeyChart() {\n\tconst context = use(SankeyChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Sankey chart parts (<Node />, <Link />, <Tooltip />, …) must be used within <SankeyChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype SankeyChartBaseProps = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchildren: ReactNode\n\tclassName?: string\n\tsankeyProps?: Omit<SankeyProps, \"data\">\n\tnodeWidth?: number\n\tnodePadding?: number\n\tlinkCurvature?: number\n\titerations?: number\n\tsort?: boolean\n\talign?: \"left\" | \"justify\"\n\tverticalAlign?: \"justify\" | \"top\"\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedNode?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n}\n\ntype SankeyChartProps = SankeyChartBaseProps\n\nexport type { SankeyChartProps }\n\nexport function SankeyChart({\n\tdata,\n\tconfig,\n\tchildren,\n\tclassName,\n\tsankeyProps,\n\tnodeWidth = DEFAULT_NODE_WIDTH,\n\tnodePadding = DEFAULT_NODE_PADDING,\n\tlinkCurvature = DEFAULT_LINK_CURVATURE,\n\titerations = DEFAULT_ITERATIONS,\n\tsort = true,\n\talign = \"justify\",\n\tverticalAlign = \"justify\",\n\tbackgroundVariant,\n\tdefaultSelectedNode = null,\n\tonSelectionChange,\n\tisLoading = false,\n}: SankeyChartProps) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedNode, setSelectedNode] = useState<string | null>(\n\t\tdefaultSelectedNode,\n\t)\n\n\tconst selectNode = useCallback(\n\t\t(nodeName: string | null) => {\n\t\t\tsetSelectedNode(nodeName)\n\n\t\t\tif (!onSelectionChange) return\n\n\t\t\tif (nodeName === null) {\n\t\t\t\tonSelectionChange(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tonSelectionChange({\n\t\t\t\tdataKey: nodeName,\n\t\t\t\tvalue: getNodeValue(data, nodeName),\n\t\t\t})\n\t\t},\n\t\t[onSelectionChange, data],\n\t)\n\n\tconst contextValue = useMemo<SankeyChartContextValue>(\n\t\t() => ({ data, config, chartId, isLoading, selectedNode, selectNode }),\n\t\t[data, config, chartId, isLoading, selectedNode, selectNode],\n\t)\n\n\treturn (\n\t\t<SankeyChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t{!isLoading && (\n\t\t\t\t\t<RechartsSankey\n\t\t\t\t\t\tid={chartId}\n\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\tnodeWidth={nodeWidth}\n\t\t\t\t\t\tnodePadding={nodePadding}\n\t\t\t\t\t\tlinkCurvature={linkCurvature}\n\t\t\t\t\t\titerations={iterations}\n\t\t\t\t\t\tsort={sort}\n\t\t\t\t\t\talign={align}\n\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t{...resolveSankeyRenderers(children)}\n\t\t\t\t\t\t{...sankeyProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<NodeColorGradients config={config} chartId={chartId} />\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t</RechartsSankey>\n\t\t\t\t)}\n\t\t\t\t{isLoading && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tviewBox=\"0 0 500 250\"\n\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LoadingSankey />\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\t\t\t</Chart>\n\t\t</SankeyChartContext>\n\t)\n}\n\ntype NodeProps = {\n\tradius?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n}\n\nexport const Node: FC<NodeProps> = () => null\n\ntype NodeLabelProps = {\n\tposition?: NodeLabelPosition\n\tshowValues?: boolean\n\tvalueFormatter?: (value: number) => string\n}\n\nexport const NodeLabel: FC<NodeLabelProps> = () => null\n\ntype LinkProps = {\n\tvariant?: LinkVariant\n\tverticalPadding?: number\n}\n\nexport const Link: FC<LinkProps> = () => null\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading } = useSankeyChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getNodeValue = (data: SankeyData, nodeName: string): number => {\n\tconst nodeIndex = data.nodes.findIndex(node => node.name === nodeName)\n\tif (nodeIndex === -1) return 0\n\n\tconst outgoing = data.links\n\t\t.filter(link => link.source === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\tconst incoming = data.links\n\t\t.filter(link => link.target === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\n\treturn outgoing > 0 ? outgoing : incoming\n}\n\nconst resolveSankeyRenderers = (\n\tchildren: ReactNode,\n): Pick<SankeyProps, \"node\" | \"link\"> => {\n\tlet nodeProps: NodeProps | null = null\n\tlet linkProps: LinkProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Node) {\n\t\t\tnodeProps = (child as ReactElement<NodeProps>).props\n\t\t}\n\n\t\tif (child.type === Link) {\n\t\t\tlinkProps = (child as ReactElement<LinkProps>).props\n\t\t}\n\t})\n\n\treturn {\n\t\tnode: (props: SankeyNodeProps) => (\n\t\t\t<SankeyNode {...props} nodeConfig={nodeProps} />\n\t\t),\n\t\tlink: (props: SankeyLinkProps) => (\n\t\t\t<SankeyLink {...props} linkConfig={linkProps} />\n\t\t),\n\t}\n}\n\nconst resolveNodeLabel = (children: ReactNode): NodeLabelProps | null => {\n\tlet label: NodeLabelProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (isValidElement(child) && child.type === NodeLabel) {\n\t\t\tlabel = (child as ReactElement<NodeLabelProps>).props\n\t\t}\n\t})\n\n\treturn label\n}\n\ntype SankeyNodeRendererProps = SankeyNodeProps & {\n\tnodeConfig: NodeProps | null\n}\n\nconst SankeyNode = ({\n\tx,\n\ty,\n\twidth,\n\theight,\n\tpayload,\n\tnodeConfig,\n}: SankeyNodeRendererProps) => {\n\tconst { config, chartId, data, selectedNode, selectNode } = useSankeyChart()\n\n\tconst radius = nodeConfig?.radius ?? 0\n\tconst isClickable = nodeConfig?.isClickable ?? false\n\tconst label = resolveNodeLabel(nodeConfig?.children)\n\n\tconst nodeName = payload.name\n\tconst nodeValue = payload.value\n\tconst nodeIcon = (payload as RechartsSankeyNode & { icon?: ReactNode }).icon\n\n\tconst isHighlighted = isNodeConnected(data, selectedNode, nodeName)\n\tconst hasConfigColor = nodeName in config\n\tconst configLabel = config[nodeName]?.label ?? nodeName\n\tconst dimmed = isClickable && !isHighlighted\n\n\tconst valueFormatter =\n\t\tlabel?.valueFormatter ?? ((value: number) => value.toLocaleString())\n\tconst showValues = label?.showValues ?? false\n\n\tconst labelX = x + width / 2\n\tconst labelY = showValues ? y + height / 2 - 8 : y + height / 2\n\tconst valueY = y + height / 2 + 8\n\tconst outsideLabelX = x + width + 8\n\tconst outsideLabelY = y + height / 2\n\n\treturn (\n\t\t<Layer>\n\t\t\t<rect\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\trx={radius}\n\t\t\t\try={radius}\n\t\t\t\tfill={\n\t\t\t\t\thasConfigColor\n\t\t\t\t\t\t? `url(#${chartId}-sankey-colors-${nodeName})`\n\t\t\t\t\t\t: \"currentColor\"\n\t\t\t\t}\n\t\t\t\tfillOpacity={dimmed ? 0.3 : 0.9}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tselectNode(selectedNode === nodeName ? null : nodeName)\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{label?.position === \"inside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={x + 1}\n\t\t\t\t\t\ty={y + 1}\n\t\t\t\t\t\twidth={width - 2}\n\t\t\t\t\t\theight={height - 2}\n\t\t\t\t\t\trx={Math.max(0, radius - 1)}\n\t\t\t\t\t\try={Math.max(0, radius - 1)}\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tclassName=\"fill-white/50 transition-opacity duration-200 dark:fill-black/60\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t/>\n\t\t\t\t\t{nodeIcon && (\n\t\t\t\t\t\t<foreignObject\n\t\t\t\t\t\t\tx={labelX - 8}\n\t\t\t\t\t\t\ty={labelY - 30}\n\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"text-bruv-primary/80 flex items-center justify-center dark:text-white/80\">\n\t\t\t\t\t\t\t\t{nodeIcon}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</foreignObject>\n\t\t\t\t\t)}\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\ty={nodeIcon ? labelY - 4 : labelY}\n\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-[10px] font-medium transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\t\ty={valueY}\n\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\tclassName=\"fill-foreground/60 font-mono text-xs font-medium tabular-nums transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 0.6}\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{label?.position === \"outside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\ty={outsideLabelY - (showValues ? 8 : 0)}\n\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-xs\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\t\ty={outsideLabelY + 8}\n\t\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\topacity={0.5}\n\t\t\t\t\t\t\tclassName=\"fill-foreground font-mono text-xs tabular-nums dark:fill-white\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Layer>\n\t)\n}\n\ntype SankeyLinkRendererProps = SankeyLinkProps & {\n\tlinkConfig: LinkProps | null\n}\n\nconst SankeyLink = ({\n\tsourceX,\n\ttargetX,\n\tsourceY,\n\ttargetY,\n\tsourceControlX,\n\ttargetControlX,\n\tlinkWidth,\n\tindex,\n\tpayload,\n\tlinkConfig,\n}: SankeyLinkRendererProps) => {\n\tconst { config, chartId, selectedNode } = useSankeyChart()\n\n\tconst variant = linkConfig?.variant ?? \"gradient\"\n\tconst verticalPadding = linkConfig?.verticalPadding ?? 0\n\n\tconst sourceName = payload.source.name\n\tconst targetName = payload.target.name\n\n\tconst isConnected =\n\t\tselectedNode === null ||\n\t\tselectedNode === sourceName ||\n\t\tselectedNode === targetName\n\n\tconst paddedLinkWidth = Math.max(1, linkWidth - verticalPadding)\n\tconst halfWidth = paddedLinkWidth / 2\n\n\tconst linkAreaPath = `M${sourceX},${sourceY - halfWidth}\n C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}\n L${targetX},${targetY + halfWidth}\n C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}\n Z`\n\n\treturn (\n\t\t<Layer>\n\t\t\t<defs>\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<LinkGradient\n\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\tconfig={config}\n\t\t\t\t\t\tsourceName={sourceName}\n\t\t\t\t\t\ttargetName={targetName}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<LinkStrokeGradient chartId={chartId} index={index} />\n\t\t\t</defs>\n\t\t\t<path\n\t\t\t\td={linkAreaPath}\n\t\t\t\tfill={getLinkFill(\n\t\t\t\t\tvariant,\n\t\t\t\t\tchartId,\n\t\t\t\t\tindex,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsourceName,\n\t\t\t\t\ttargetName,\n\t\t\t\t)}\n\t\t\t\tfillOpacity={isConnected ? 0.4 : 0.1}\n\t\t\t\tstroke={\n\t\t\t\t\tselectedNode !== null && isConnected\n\t\t\t\t\t\t? `url(#${chartId}-link-stroke-${index})`\n\t\t\t\t\t\t: \"none\"\n\t\t\t\t}\n\t\t\t\tstrokeWidth={1}\n\t\t\t\tstrokeOpacity={0.3}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t/>\n\t\t</Layer>\n\t)\n}\n\nconst isNodeConnected = (\n\tdata: SankeyData,\n\tselectedNode: string | null,\n\tnodeName: string,\n): boolean => {\n\tif (selectedNode === null || selectedNode === nodeName) return true\n\n\tconst selectedIdx = data.nodes.findIndex(node => node.name === selectedNode)\n\tconst nodeIdx = data.nodes.findIndex(node => node.name === nodeName)\n\n\treturn data.links.some(\n\t\tlink =>\n\t\t\t(link.source === selectedIdx && link.target === nodeIdx) ||\n\t\t\t(link.source === nodeIdx && link.target === selectedIdx),\n\t)\n}\n\nconst getLinkFill = (\n\tvariant: LinkVariant,\n\tchartId: string,\n\tindex: number,\n\tconfig: ChartConfig,\n\tsourceName: string,\n\ttargetName: string,\n): string => {\n\tswitch (variant) {\n\t\tcase \"gradient\":\n\t\t\treturn `url(#${chartId}-link-gradient-${index})`\n\t\tcase \"source\":\n\t\t\treturn sourceName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${sourceName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"target\":\n\t\t\treturn targetName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${targetName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"solid\":\n\t\tdefault:\n\t\t\treturn \"currentColor\"\n\t}\n}\n\nconst NodeColorGradients = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, nodeConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(nodeConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst LinkGradient = ({\n\tchartId,\n\tindex,\n\tconfig,\n\tsourceName,\n\ttargetName,\n}: {\n\tchartId: string\n\tindex: number\n\tconfig: ChartConfig\n\tsourceName: string\n\ttargetName: string\n}) => {\n\tconst sourceColor =\n\t\tsourceName in config ? `var(--color-${sourceName}-0)` : \"currentColor\"\n\tconst targetColor =\n\t\ttargetName in config ? `var(--color-${targetName}-0)` : \"currentColor\"\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-gradient-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor={sourceColor} stopOpacity={0.2} />\n\t\t\t<stop offset=\"50%\" stopColor={sourceColor} stopOpacity={0.5} />\n\t\t\t<stop offset=\"100%\" stopColor={targetColor} stopOpacity={0.2} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LinkStrokeGradient = ({\n\tchartId,\n\tindex,\n}: {\n\tchartId: string\n\tindex: number\n}) => {\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-stroke-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t\t<stop offset=\"15%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"50%\" stopColor=\"var(--primary)\" stopOpacity={1} />\n\t\t\t<stop offset=\"85%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"100%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LoadingSankey = () => {\n\tconst nodes = [\n\t\t{ x: 30, y: 25, width: 12, height: 65, delay: 0 },\n\t\t{ x: 30, y: 110, width: 12, height: 50, delay: 0.3 },\n\t\t{ x: 30, y: 180, width: 12, height: 45, delay: 0.15 },\n\t\t{ x: 244, y: 20, width: 12, height: 55, delay: 0.45 },\n\t\t{ x: 244, y: 95, width: 12, height: 75, delay: 0.6 },\n\t\t{ x: 244, y: 190, width: 12, height: 40, delay: 0.25 },\n\t\t{ x: 458, y: 35, width: 12, height: 80, delay: 0.5 },\n\t\t{ x: 458, y: 135, width: 12, height: 90, delay: 0.1 },\n\t]\n\n\tconst links = [\n\t\t{ from: 0, to: 3, width: 26, delay: 0.2 },\n\t\t{ from: 0, to: 4, width: 18, delay: 0.7 },\n\t\t{ from: 1, to: 4, width: 24, delay: 0.4 },\n\t\t{ from: 1, to: 5, width: 12, delay: 0.9 },\n\t\t{ from: 2, to: 4, width: 16, delay: 0.1 },\n\t\t{ from: 2, to: 5, width: 14, delay: 0.55 },\n\t\t{ from: 3, to: 6, width: 22, delay: 0.35 },\n\t\t{ from: 3, to: 7, width: 18, delay: 0.8 },\n\t\t{ from: 4, to: 6, width: 28, delay: 0.05 },\n\t\t{ from: 4, to: 7, width: 32, delay: 0.65 },\n\t\t{ from: 5, to: 7, width: 16, delay: 0.45 },\n\t]\n\n\tconst getLinkPath = (fromIdx: number, toIdx: number) => {\n\t\tconst from = nodes[fromIdx]\n\t\tconst to = nodes[toIdx]\n\t\tconst startX = from.x + from.width\n\t\tconst startY = from.y + from.height / 2\n\t\tconst endX = to.x\n\t\tconst endY = to.y + to.height / 2\n\t\tconst controlX1 = startX + (endX - startX) * 0.4\n\t\tconst controlX2 = startX + (endX - startX) * 0.6\n\t\treturn `M${startX},${startY} C${controlX1},${startY} ${controlX2},${endY} ${endX},${endY}`\n\t}\n\n\tconst baseDuration = LOADING_ANIMATION_DURATION / 1000\n\n\treturn (\n\t\t<>\n\t\t\t{links.map((link, i) => (\n\t\t\t\t<motion.path\n\t\t\t\t\tkey={`loading-link-${link.from}-${link.to}`}\n\t\t\t\t\td={getLinkPath(link.from, link.to)}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={link.width}\n\t\t\t\t\tinitial={{ opacity: 0.04 }}\n\t\t\t\t\tanimate={{ opacity: [0.04, 0.14, 0.04] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.8 + (i % 3) * 0.2),\n\t\t\t\t\t\tdelay: link.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{nodes.map((node, i) => (\n\t\t\t\t<motion.rect\n\t\t\t\t\tkey={`loading-node-${node.x}-${node.y}`}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\trx={2}\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tinitial={{ opacity: 0.15 }}\n\t\t\t\t\tanimate={{ opacity: [0.15, 0.4, 0.15] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.9 + (i % 4) * 0.1),\n\t\t\t\t\t\tdelay: node.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","React","jsx","jsxs","ChartDot","useId","jsx","jsxs","ResponsiveContainer","React","Fragment","jsx","jsxs","range","ResponsiveContainer","createContext","useCallback","useId","useMemo","useRef","useState","motion","Fragment","jsx","jsxs","createContext","AreaChart","useId","useState","useCallback","useMemo","Area","jsx","jsxs","Fragment","motion","useState","useCallback","useMemo","useRef","createContext","use","useCallback","useId","useMemo","useRef","useState","CartesianGrid","RechartsXAxis","RechartsYAxis","motion","useReducedMotion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","STACK_ID","REVEAL_EASE","BarChart","useLoadingData","Bar","ColorGradient","GradientPattern","jsxs","Fragment","jsx","motion","REVEAL_EASE","ColorGradient","GradientPattern","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","useRef","LOADING_ANIMATION_DURATION","CartesianGrid","RechartsXAxis","RechartsYAxis","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useRef","useState","motion","useReducedMotion","Fragment","jsx","jsxs","STROKE_WIDTH","LOADING_ANIMATION_DURATION","REVEAL_DURATION","REVEAL_EASE","LineChart","useLoadingData","Line","getOpacity","resolveDots","AnimatedDashedStroke","RevealMask","ColorGradient","Dot","ActiveDot","getOpacity","resolveDots","Children","isValidElement","Dot","jsx","ActiveDot","AnimatedDashedStroke","jsxs","Fragment","SINGLE_REVEAL_ORIGIN","RevealMask","REVEAL_DURATION","REVEAL_EASE","motion","ColorGradient","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","STROKE_WIDTH","LoadingPattern","useRef","LOADING_ANIMATION_DURATION","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useRef","useState","RechartsBar","CartesianGrid","RechartsLine","RechartsXAxis","RechartsYAxis","motion","useReducedMotion","Fragment","jsx","jsxs","DEFAULT_BAR_RADIUS","LOADING_ANIMATION_DURATION","createContext","useId","useState","useLoadingData","useCallback","useMemo","jsx","jsxs","LoadingBar","DEFAULT_BAR_RADIUS","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","LoadingBar","jsxs","Fragment","jsx","RechartsBar","LoadingPattern","useRef","motion","LOADING_ANIMATION_DURATION","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useState","motion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","Children","isValidElement","jsx","Fragment","jsxs","LOADING_ANIMATION_DURATION","motion","Children","createContext","isValidElement","use","useCallback","useEffect","useId","useMemo","useState","Fragment","jsx","jsxs","STROKE_WIDTH","LOADING_ANIMATION_DURATION","useLoadingData","resolveDots","ColorGradient","Dot","ActiveDot","resolveDots","Children","isValidElement","Dot","jsx","ActiveDot","jsxs","Fragment","ColorGradient","useLoadingData","useState","useEffect","LOADING_ANIMATION_DURATION","useMemo","createContext","use","useCallback","useEffect","useId","useMemo","useState","Sector","Fragment","jsx","jsxs","DEFAULT_INNER_RADIUS","DEFAULT_OUTER_RADIUS","DEFAULT_CORNER_RADIUS","LOADING_ANIMATION_DURATION","useLoadingData","jsx","Fragment","jsxs","generateLoadingData","useLoadingData","useState","useEffect","LOADING_ANIMATION_DURATION","useMemo","DEFAULT_CORNER_RADIUS","Sector","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useState","motion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","Children","isValidElement","jsx","jsxs","Fragment","LOADING_ANIMATION_DURATION","motion"]}
1
+ {"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-dot.tsx","../src/components/charts/chart-background.tsx","../src/components/charts/chart-brush.tsx","../src/components/charts/area-chart.tsx","../src/components/charts/bar-chart.tsx","../src/components/charts/line-chart.tsx","../src/components/charts/composed-chart.tsx","../src/components/charts/pie-chart.tsx","../src/components/charts/radar-chart.tsx","../src/components/charts/radial-chart.tsx","../src/components/charts/sankey-chart.tsx"],"sourcesContent":["import * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\tforwardRef,\n\tuseId,\n\tcreateContext,\n\tuseContext,\n\ttype ComponentProps,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nconst THEMES = { light: \"\", dark: '[data-theme=\"dark\"]' } as const\n\ntype ThemeKey = keyof typeof THEMES\n\ntype ThemeColorsBase = {\n\t[K in ThemeKey]?: string[]\n}\n\ntype AtLeastOneThemeColor = {\n\t[K in ThemeKey]: Required<Pick<ThemeColorsBase, K>> &\n\t\tPartial<Omit<ThemeColorsBase, K>>\n}[ThemeKey]\n\nconst VALID_THEME_KEYS = Object.keys(THEMES) as ThemeKey[]\n\nconst DEFAULT_PALETTE = [\n\t\"var(--color-bruv-chart-1)\",\n\t\"var(--color-bruv-chart-2)\",\n\t\"var(--color-bruv-chart-3)\",\n\t\"var(--color-bruv-chart-4)\",\n\t\"var(--color-bruv-chart-5)\",\n\t\"var(--color-bruv-chart-6)\",\n] as const\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\tlabel?: ReactNode\n\t\ticon?: ComponentType\n\t\tcolor?: string\n\t\tcolors?: AtLeastOneThemeColor\n\t}\n>\n\ninterface ChartContextProps {\n\tconfig: ChartConfig\n}\n\nconst ChartContext = createContext<ChartContextProps | null>(null)\n\nexport function useChart() {\n\tconst context = useContext(ChartContext)\n\tif (!context) {\n\t\tthrow new Error(\"useChart must be used within a <Chart />\")\n\t}\n\treturn context\n}\n\nfunction validateChartConfigColors(config: ChartConfig): void {\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value.colors) {\n\t\t\tconst hasValidThemeKey = VALID_THEME_KEYS.some(\n\t\t\t\tthemeKey => value.colors?.[themeKey] !== undefined,\n\t\t\t)\n\t\t\tif (!hasValidThemeKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[BruvCharts] Invalid chart config for \"${key}\": colors object must have at least one theme key (${VALID_THEME_KEYS.join(\", \")}).`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function applyDefaultChartColors(config: ChartConfig): ChartConfig {\n\tconst entries = Object.entries(config)\n\treturn Object.fromEntries(\n\t\tentries.map(([key, item], index) => {\n\t\t\tif (item.colors || item.color) {\n\t\t\t\tif (item.color && !item.colors) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tcolors: {\n\t\t\t\t\t\t\t\tlight: [item.color],\n\t\t\t\t\t\t\t\tdark: [item.color],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [key, item]\n\t\t\t}\n\t\t\tconst paletteColor =\n\t\t\t\tDEFAULT_PALETTE[index % DEFAULT_PALETTE.length] ?? DEFAULT_PALETTE[0]\n\t\t\treturn [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\t...item,\n\t\t\t\t\tcolors: {\n\t\t\t\t\t\tlight: [paletteColor],\n\t\t\t\t\t\tdark: [paletteColor],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t}),\n\t)\n}\n\nexport interface ChartProps\n\textends\n\t\tOmit<ComponentProps<\"div\">, \"children\">,\n\t\tPick<\n\t\t\tComponentProps<typeof RechartsPrimitive.ResponsiveContainer>,\n\t\t\t| \"initialDimension\"\n\t\t\t| \"aspect\"\n\t\t\t| \"debounce\"\n\t\t\t| \"minHeight\"\n\t\t\t| \"minWidth\"\n\t\t\t| \"maxHeight\"\n\t\t\t| \"height\"\n\t\t\t| \"width\"\n\t\t\t| \"onResize\"\n\t\t\t| \"children\"\n\t\t> {\n\tconfig: ChartConfig\n\tinnerResponsiveContainerStyle?: ComponentProps<\n\t\ttypeof RechartsPrimitive.ResponsiveContainer\n\t>[\"style\"]\n\tfooter?: ReactNode\n}\n\nexport const Chart = forwardRef<HTMLDivElement, ChartProps>(function Chart(\n\t{\n\t\tid,\n\t\tconfig,\n\t\tinitialDimension = { width: 320, height: 200 },\n\t\tclassName,\n\t\tchildren,\n\t\tfooter,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst uniqueId = useId()\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\tconst resolvedConfig = applyDefaultChartColors(config)\n\n\tvalidateChartConfigColors(resolvedConfig)\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config: resolvedConfig }}>\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bruv-chart relative flex min-h-0 w-full flex-1 flex-col justify-center text-bruv-sm text-bruv-secondary\",\n\t\t\t\t\t\"[&_.recharts-cartesian-axis-tick_text]:fill-bruv-chart-axis [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-bruv-chart-grid/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-bruv-chart-cursor [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-radial-bar-background-sector]:fill-bruv-subtle [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-bruv-subtle [&_.recharts-reference-line_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n\t\t\t\t\t!footer && \"aspect-video\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChartStyle id={chartId} config={resolvedConfig} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer\n\t\t\t\t\tclassName=\"min-h-0 w-full flex-1\"\n\t\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t)\n})\n\nexport function LoadingIndicator({ isLoading }: { isLoading: boolean }) {\n\tif (!isLoading) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n\t\t\t<div className=\"border-bruv-neutral bg-bruv-base-2 text-bruv-sm text-bruv-primary rounded-bruv-md flex items-center justify-center gap-2 border px-2 py-0.5\">\n\t\t\t\t<div className=\"border-bruv-neutral border-t-bruv-accent size-3 animate-spin rounded-full border\" />\n\t\t\t\t<span>Loading</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction distributeColors(colorsArray: string[], maxCount: number): string[] {\n\tconst availableCount = colorsArray.length\n\tif (availableCount >= maxCount) {\n\t\treturn colorsArray.slice(0, maxCount)\n\t}\n\n\tconst result: string[] = []\n\tconst baseSlots = Math.floor(maxCount / availableCount)\n\tconst extraSlots = maxCount % availableCount\n\n\tfor (let colorIdx = 0; colorIdx < availableCount; colorIdx++) {\n\t\tconst isExtraColor = colorIdx >= availableCount - extraSlots\n\t\tconst slotsForThisColor = baseSlots + (isExtraColor ? 1 : 0)\n\t\tfor (let j = 0; j < slotsForThisColor; j++) {\n\t\t\tconst color = colorsArray[colorIdx]\n\t\t\tif (color) result.push(color)\n\t\t}\n\t}\n\n\treturn result\n}\n\nexport function ChartStyle({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n}) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.colors)\n\n\tif (!colorConfig.length) return null\n\n\tconst generateCssVars = (theme: keyof typeof THEMES) =>\n\t\tcolorConfig\n\t\t\t.flatMap(([key, itemConfig]) => {\n\t\t\t\tconst colorsArray = itemConfig.colors?.[theme]\n\t\t\t\tif (!colorsArray?.length) return []\n\n\t\t\t\tconst maxCount = getColorsCount(itemConfig)\n\t\t\t\tconst distributedColors = distributeColors(colorsArray, maxCount)\n\n\t\t\t\treturn distributedColors.map(\n\t\t\t\t\t(color, index) => ` --color-${key}-${index}: ${color};`,\n\t\t\t\t)\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\n\tconst css = Object.entries(THEMES)\n\t\t.map(\n\t\t\t([theme, prefix]) =>\n\t\t\t\t`${prefix} [data-chart=${id}] {\\n${generateCssVars(theme as keyof typeof THEMES)}\\n}`,\n\t\t)\n\t\t.join(\"\\n\")\n\n\treturn <style dangerouslySetInnerHTML={{ __html: css }} />\n}\n\nexport function getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== \"object\" || payload === null) return undefined\n\n\tconst payloadPayload =\n\t\t\"payload\" in payload &&\n\t\ttypeof payload.payload === \"object\" &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined\n\n\tlet configLabelKey: string = key\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport function axisValueToPercentFormatter(value: number) {\n\treturn `${Math.round(value * 100).toFixed(0)}%`\n}\n\nexport function getColorsCount(config: ChartConfig[string]): number {\n\tif (!config.colors) return 1\n\tconst counts = VALID_THEME_KEYS.map(\n\t\ttheme => config.colors?.[theme]?.length ?? 0,\n\t)\n\treturn Math.max(...counts, 1)\n}\n\nexport const getLoadingData = (\n\tpoints: number = 10,\n\tmin: number = 0,\n\tmax: number = 70,\n) => {\n\tconst range = max - min\n\treturn Array.from({ length: points }, () => ({\n\t\tloading: Math.floor(Math.random() * range) + min,\n\t}))\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport type {\n\tNameType,\n\tValueType,\n} from \"recharts/types/component/DefaultTooltipContent\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype TooltipRoundness = \"sm\" | \"md\" | \"lg\" | \"xl\"\ntype TooltipVariant = \"default\" | \"frosted-glass\"\n\nconst roundnessMap: Record<TooltipRoundness, string> = {\n\tsm: \"rounded-bruv-sm\",\n\tmd: \"rounded-bruv-md\",\n\tlg: \"rounded-bruv-lg\",\n\txl: \"rounded-bruv-xl\",\n}\n\nconst variantMap: Record<TooltipVariant, string> = {\n\tdefault: \"bg-bruv-base-2\",\n\t\"frosted-glass\": \"bg-bruv-base-2/70 backdrop-blur-sm\",\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = \"dot\",\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tnameKey,\n\tlabelKey,\n\tselected,\n\troundness = \"lg\",\n\tvariant = \"default\",\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n\tReact.ComponentProps<\"div\"> & {\n\t\thideLabel?: boolean\n\t\thideIndicator?: boolean\n\t\tindicator?: \"line\" | \"dot\" | \"dashed\"\n\t\tnameKey?: string\n\t\tlabelKey?: string\n\t\tselected?: string | null\n\t\troundness?: TooltipRoundness\n\t\tvariant?: TooltipVariant\n\t} & Omit<\n\t\tRechartsPrimitive.DefaultTooltipContentProps<ValueType, NameType>,\n\t\t\"accessibilityLayer\"\n\t>) {\n\tconst { config } = useChart()\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst [item] = payload\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\tconst value =\n\t\t\t!labelKey && typeof label === \"string\"\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"font-medium\", labelClassName)}>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t])\n\n\tif (!active || !payload?.length) {\n\t\t// Empty tooltip - to prevent position getting 0.0 so it doesnt animate tooltip every time from 0.0 origin\n\t\treturn <span className=\"p-4\" />\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"border-bruv-neutral/50 grid min-w-32 items-start gap-1.5 border px-2.5 py-1.5 text-xs shadow-xl\",\n\t\t\t\troundnessMap[roundness],\n\t\t\t\tvariantMap[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel ? tooltipLabel : null}\n\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t// For pie charts, item.name contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t\t// For other charts, item.name or item.dataKey contains the series name\n\t\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst key = `${payloadName ?? item.name ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n\t\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5\",\n\t\t\t\t\t\t\t\t\tindicator === \"dot\" && \"items-center\",\n\t\t\t\t\t\t\t\t\tselected != null && selected !== item.dataKey && \"opacity-30\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{formatter && item?.value !== undefined && item.name ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"h-2.5 w-2.5\": indicator === \"dot\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-1\": indicator === \"line\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-0 border-[1.5px] border-dashed bg-transparent!\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"my-0.5\": nestLabel && indicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={getIndicatorColorStyle(key, colorsCount)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-1 justify-between gap-4 leading-none\",\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? \"items-end\" : \"items-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel ? tooltipLabel : null}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value != null && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary font-mono font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof item.value === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? item.value.toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getIndicatorColorStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { background: `var(--color-${dataKey}-0)` }\n\t}\n\n\t// Multiple colors: create linear gradient with evenly distributed stops\n\tconst stops = Array.from({ length: colorsCount }, (_, index) => {\n\t\tconst offset = (index / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${index}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\nconst ChartTooltip = ({\n\tanimationDuration = 200,\n\t...props\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) => (\n\t<RechartsPrimitive.Tooltip animationDuration={animationDuration} {...props} />\n)\n\nexport { ChartTooltip, ChartTooltipContent }\nexport type { TooltipRoundness, TooltipVariant }\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype ChartLegendVariant =\n\t| \"square\"\n\t| \"circle\"\n\t| \"circle-outline\"\n\t| \"rounded-square\"\n\t| \"rounded-square-outline\"\n\t| \"vertical-bar\"\n\t| \"horizontal-bar\"\n\nfunction ChartLegendContent({\n\tclassName,\n\thideIcon = false,\n\tnameKey,\n\tpayload,\n\tverticalAlign,\n\talign = \"right\",\n\tselected,\n\tonSelectChange,\n\tisClickable,\n\tvariant = \"rounded-square\",\n}: React.ComponentProps<\"div\"> & {\n\thideIcon?: boolean\n\tnameKey?: string\n\tselected?: string | null\n\tisClickable?: boolean\n\tonSelectChange?: (selected: string | null) => void\n\tvariant?: ChartLegendVariant\n} & RechartsPrimitive.DefaultLegendContentProps) {\n\tconst { config } = useChart()\n\n\tif (!payload?.length) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-4 select-none\",\n\t\t\t\talign === \"left\" && \"justify-start\",\n\t\t\t\talign === \"center\" && \"justify-center\",\n\t\t\t\talign === \"right\" && \"justify-end\",\n\t\t\t\tverticalAlign === \"top\" ? \"pb-4\" : \"pt-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{payload\n\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t.map(item => {\n\t\t\t\t\t// For pie charts, item.value contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t// For other charts, item.dataKey contains the series name (e.g., \"desktop\")\n\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\tconst key = `${payloadName ?? item.value ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\t\t\t\tconst isSelected = selected === null || selected === key\n\n\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex items-center gap-1.5 transition-opacity [&>svg]:h-3 [&>svg]:w-3\",\n\t\t\t\t\t\t\t\t!isSelected && \"opacity-30\",\n\t\t\t\t\t\t\t\tisClickable && \"cursor-pointer\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\t\t\tonSelectChange?.(selected === key ? null : key)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{itemConfig?.icon && !hideIcon ? (\n\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<LegendIndicator\n\t\t\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\t\t\tdataKey={key}\n\t\t\t\t\t\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{itemConfig?.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Legend indicator — each variant gets its own branch so future variants\n// can diverge freely in markup & style.\n// ---------------------------------------------------------------------------\n\nfunction LegendIndicator({\n\tvariant,\n\tdataKey,\n\tcolorsCount,\n}: {\n\tvariant: ChartLegendVariant\n\tdataKey: string\n\tcolorsCount: number\n}) {\n\tconst fillStyle = getLegendFillStyle(dataKey, colorsCount)\n\tconst outlineStyle = getLegendOutlineStyle(dataKey, colorsCount)\n\n\tswitch (variant) {\n\t\tcase \"square\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0\" style={fillStyle} />\n\n\t\tcase \"circle\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0 rounded-full\" style={fillStyle} />\n\n\t\tcase \"circle-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-full p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"vertical-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-3 w-1 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"horizontal-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-1 w-3 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"rounded-square-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-[3px] p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"rounded-square\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className=\"h-2 w-2 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Style helpers\n// ---------------------------------------------------------------------------\n\n/** Solid fill / gradient background for filled variants. */\nfunction getLegendFillStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { backgroundColor: `var(--color-${dataKey}-0)` }\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\n/**\n * Outline style for stroke variants.\n * Uses background + mask-composite to punch out the center, leaving only the\n * \"border\" visible. Works with both solid colors and gradients, and respects\n * border-radius — unlike plain `border-color`.\n */\nfunction getLegendOutlineStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tconst maskStyle: React.CSSProperties = {\n\t\tWebkitMask:\n\t\t\t\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tWebkitMaskComposite: \"xor\",\n\t\tmask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tmaskComposite: \"exclude\",\n\t}\n\n\tif (colorsCount <= 1) {\n\t\treturn {\n\t\t\tbackgroundColor: `var(--color-${dataKey}-0)`,\n\t\t\t...maskStyle,\n\t\t}\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn {\n\t\tbackground: `linear-gradient(to right, ${stops})`,\n\t\t...maskStyle,\n\t}\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nexport { ChartLegend, ChartLegendContent, type ChartLegendVariant }\n","import { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\nexport type DotVariant = \"default\" | \"border\" | \"colored-border\"\n\ntype ChartDotProps = {\n\tcx?: number\n\tcy?: number\n\tdataKey: string\n\tchartId: string\n\tclassName?: string\n\tfillOpacity?: number\n\ttype?: DotVariant\n\t/** Optional SVG <mask> id — lets the dot share an area's intro reveal wipe. */\n\tmaskId?: string\n}\n\nconst ChartDot = React.memo(function ChartDot({\n\tcx,\n\tcy,\n\tdataKey,\n\tchartId,\n\tclassName,\n\tfillOpacity = 1,\n\ttype = \"default\",\n\tmaskId,\n}: ChartDotProps) {\n\tconst dotId = React.useId().replace(/:/g, \"\")\n\tconst gradientUrl = `url(#${chartId}-colors-${String(dataKey)})`\n\n\tif (cx === undefined || cy === undefined) return null\n\n\tswitch (type) {\n\t\tcase \"border\":\n\t\t\treturn (\n\t\t\t\t<PrimaryBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"colored-border\":\n\t\t\treturn (\n\t\t\t\t<ColoredBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<DefaultDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t}\n})\n\ntype DotVariantProps = {\n\tcx: number\n\tcy: number\n\tdotId: string\n\tfillOpacity: number\n\tgradientUrl: string\n\tclassName?: string\n\tmaskId?: string\n}\n\nconst DefaultDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\treturn (\n\t\t\t<g className={className} mask={maskId ? `url(#${maskId})` : undefined}>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Full-width gradient rectangle clipped to dot shape */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={r * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nDefaultDot.displayName = \"DefaultDot\"\n\nconst PrimaryBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 6\n\t\tconst strokeWidth = 5\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Background stroke (border) */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r} fill=\"currentColor\" />\n\t\t\t\t{/* Inner gradient circle clipped */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - (r - strokeWidth / 2)}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r - strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-inner-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-inner-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nPrimaryBorderDot.displayName = \"PrimaryBorderDot\"\n\nconst ColoredBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\tconst strokeWidth = 1\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r + strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Gradient stroke (border) via clipped rect */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r - strokeWidth / 2}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r + strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t{/* Inner solid fill */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} fill=\"currentColor\" />\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nColoredBorderDot.displayName = \"ColoredBorderDot\"\n\nexport { ChartDot }\n","import { ZIndexLayer } from \"recharts\"\nimport { useId } from \"react\"\n\n// ── Background Variant Types ─────────────────────────────────────────────────\n// To add a new variant:\n// 1. Add its name to the BackgroundVariant union type below\n// 2. Create a pattern component with PatternProps\n// 3. Register it in PATTERN_MAP\n\nexport type BackgroundVariant =\n\t| \"dots\"\n\t| \"grid\"\n\t| \"cross-hatch\"\n\t| \"diagonal-lines\"\n\t| \"plus\"\n\t| \"falling-triangles\"\n\t| \"4-pointed-star\"\n\t| \"tiny-checkers\"\n\t| \"overlapping-circles\"\n\t| \"wiggle-lines\"\n\t| \"bubbles\"\n\n// ── Pattern Components ───────────────────────────────────────────────────────\n\ntype PatternProps = { id: string }\n\nconst DotsPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<circle\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tcx=\"2\"\n\t\t\tcy=\"2\"\n\t\t\tr=\"1\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</pattern>\n)\n\nconst GridPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 20 0 L 0 0 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst CrossHatchPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid/60 text-bruv-chart-grid/50\"\n\t\t\td=\"M 0 0 L 20 20 M 20 0 L 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst DiagonalLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"6\"\n\t\theight=\"6\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"rotate(45)\"\n\t>\n\t\t<line\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"0\"\n\t\t\ty2=\"6\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst PlusPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 8 4 L 8 12 M 4 8 L 12 8\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t/>\n\t</pattern>\n)\n\nconst FallingTrianglesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"18\"\n\t\theight=\"36\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M2 6h12L8 18 2 6zm18 36h12l-6 12-6-12z\"\n\t\t\ttransform=\"scale(0.5)\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst FourPointedStarPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<polygon\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\tpoints=\"5 3 8 4 5 5 4 8 3 5 0 4 3 3 4 0 5 3\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst TinyCheckersPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"8\"\n\t\theight=\"8\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M0 0h4v4H0V0zm4 4h4v4H4V4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.2\"\n\t\t/>\n\t</pattern>\n)\n\nconst OverlappingCirclesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"40\"\n\t\theight=\"40\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M25 25c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5s-5-2.238-5-5 2.238-5 5-5zM5 5c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5S0 12.762 0 10s2.238-5 5-5zm5 4c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4zm20 20c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst WiggleLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"52\"\n\t\theight=\"26\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst BubblesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"100\"\n\t\theight=\"100\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6667)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t\tfillRule=\"evenodd\"\n\t\t/>\n\t</pattern>\n)\n\n// ── Pattern Registry ─────────────────────────────────────────────────────────\n// Map variant names to pattern components\n\nconst PATTERN_MAP: Record<BackgroundVariant, React.FC<PatternProps>> = {\n\tdots: DotsPattern,\n\tgrid: GridPattern,\n\tplus: PlusPattern,\n\tbubbles: BubblesPattern,\n\t\"cross-hatch\": CrossHatchPattern,\n\t\"diagonal-lines\": DiagonalLinesPattern,\n\t\"falling-triangles\": FallingTrianglesPattern,\n\t\"4-pointed-star\": FourPointedStarPattern,\n\t\"tiny-checkers\": TinyCheckersPattern,\n\t\"overlapping-circles\": OverlappingCirclesPattern,\n\t\"wiggle-lines\": WiggleLinesPattern,\n}\n\n// ── Main Component ───────────────────────────────────────────────────────────\n// Usage: Place <ChartBackground variant=\"dots\" /> inside any Recharts chart component.\n// ZIndexLayer with zIndex={-1} ensures the background renders behind all chart content.\n\ninterface ChartBackgroundProps {\n\tvariant: BackgroundVariant\n}\n\nexport function ChartBackground({ variant }: ChartBackgroundProps) {\n\tconst baseId = useId().replace(/:/g, \"\")\n\tconst patternId = `${baseId}-bg-${variant}`\n\tconst maskId = `${baseId}-bg-edge-fade`\n\tconst filterId = `${baseId}-bg-blur`\n\tconst PatternComponent = PATTERN_MAP[variant]\n\n\treturn (\n\t\t<ZIndexLayer zIndex={-1}>\n\t\t\t<defs>\n\t\t\t\t<PatternComponent id={patternId} />\n\t\t\t\t{/* Gaussian blur filter for soft edge fade */}\n\t\t\t\t<filter id={filterId}>\n\t\t\t\t\t<feGaussianBlur stdDeviation=\"25\" />\n\t\t\t\t</filter>\n\t\t\t\t{/* Mask: a slightly inset white rect with blur creates smooth transparent edges */}\n\t\t\t\t<mask id={maskId} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"8%\"\n\t\t\t\t\t\ty=\"20%\"\n\t\t\t\t\t\twidth=\"85%\"\n\t\t\t\t\t\theight=\"60%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tfilter={`url(#${filterId})`}\n\t\t\t\t\t/>\n\t\t\t\t</mask>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tfill={`url(#${patternId})`}\n\t\t\t\tmask={`url(#${maskId})`}\n\t\t\t/>\n\t\t</ZIndexLayer>\n\t)\n}\n","import {\n\tmotion,\n\tuseMotionValue,\n\tuseMotionValueEvent,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\"\nimport {\n\tResponsiveContainer,\n\tAreaChart,\n\tArea,\n\tLineChart,\n\tLine,\n\tBarChart,\n\tBar,\n} from \"recharts\"\nimport { ChartStyle, getColorsCount, type ChartConfig } from \"./chart\"\nimport { useCallback, useEffect, type ComponentProps } from \"react\"\nimport type { MotionValue } from \"motion/react\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ntype BrushVariant = \"line\" | \"area\" | \"bar\"\ntype CurveType = ComponentProps<typeof Area>[\"type\"]\n\ninterface BrushRange {\n\tstartIndex: number\n\tendIndex: number\n}\n\ninterface BrushProps {\n\t/** Full dataset – always rendered in the miniature chart */\n\tdata: Record<string, unknown>[]\n\t/** Chart config with colour definitions */\n\tchartConfig: ChartConfig\n\t/** Data keys to plot (default: all keys from chartConfig) */\n\tdataKeys?: string[]\n\t/** X-axis data key – used for handle labels */\n\txDataKey?: string\n\t/** Visual variant of the mini chart */\n\tvariant?: BrushVariant\n\t/** Pixel height of the brush */\n\theight?: number\n\t/** Extra className */\n\tclassName?: string\n\t/** Whether areas/bars should be stacked in the mini chart */\n\tstacked?: boolean\n\t/** Stroke variant for line / area strokes in the mini chart */\n\tstrokeVariant?: \"solid\" | \"dashed\" | \"animated-dashed\"\n\t/** Whether to connect null data points in line / area variants */\n\tconnectNulls?: boolean\n\t/** Radius for bar corners in the bar variant */\n\tbarRadius?: number\n\n\t// ── Controlled mode ──────────────────────────────────────────────────\n\t/** Controlled start index */\n\tstartIndex?: number\n\t/** Controlled end index */\n\tendIndex?: number\n\n\t// ── Uncontrolled mode ────────────────────────────────────────────────\n\t/** Initial start index (uncontrolled) */\n\tdefaultStartIndex?: number\n\t/** Initial end index (uncontrolled) */\n\tdefaultEndIndex?: number\n\n\t/** Fired whenever the visible range changes */\n\tonChange?: (range: BrushRange) => void\n\t/** Format the handle label from the xDataKey value */\n\tformatLabel?: (value: unknown, index: number) => string\n\t/** Curve type for line / area variants */\n\tcurveType?: CurveType\n\t/** Minimum number of data points that must remain selected */\n\tminSpan?: number\n\t/** Whether to render labels on the handles */\n\tshowLabels?: boolean\n\t/** Skip rendering own ChartStyle (when inside a Chart that already provides CSS vars) */\n\tskipStyle?: boolean\n}\n\n// ─── Spring config ──────────────────────────────────────────────────────────\n\nconst SPRING_CONFIG = { stiffness: 300, damping: 35, mass: 0.8 }\n\n// ─── Pointer-capture drag hook ──────────────────────────────────────────────\n// Replaces raw addEventListener with the modern Pointer Events API.\n// setPointerCapture routes all pointer events to the originating element,\n// so we get mouse + touch + pen support with zero global listeners.\n\ntype DragType = \"left\" | \"right\" | \"middle\"\n\ninterface DragState {\n\ttype: DragType\n\toriginX: number\n\toriginRange: BrushRange\n}\n\nfunction useBrushDrag({\n\trange,\n\ttotalPoints,\n\tcontainerRef,\n\tcommit,\n}: {\n\trange: BrushRange\n\ttotalPoints: number\n\tcontainerRef: React.RefObject<HTMLDivElement | null>\n\tcommit: (next: BrushRange, mode?: DragType) => void\n}) {\n\tconst dragRef = React.useRef<DragState | null>(null)\n\tconst [isDragging, setIsDragging] = React.useState(false)\n\n\tconst toIndexDelta = useCallback(\n\t\t(px: number) => {\n\t\t\tif (!containerRef.current || totalPoints <= 1) return 0\n\t\t\treturn Math.round(\n\t\t\t\t(px / containerRef.current.getBoundingClientRect().width) *\n\t\t\t\t\t(totalPoints - 1),\n\t\t\t)\n\t\t},\n\t\t[totalPoints, containerRef],\n\t)\n\n\tconst onPointerDown = useCallback(\n\t\t(e: React.PointerEvent, type: DragType) => {\n\t\t\te.preventDefault()\n\t\t\t;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n\t\t\tdragRef.current = { type, originX: e.clientX, originRange: { ...range } }\n\t\t\tsetIsDragging(true)\n\t\t},\n\t\t[range],\n\t)\n\n\tconst onPointerMove = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tconst d = dragRef.current\n\t\t\tif (!d) return\n\n\t\t\tconst delta = toIndexDelta(e.clientX - d.originX)\n\t\t\tconst { type, originRange: o } = d\n\n\t\t\tif (type === \"left\") {\n\t\t\t\tcommit(\n\t\t\t\t\t{ startIndex: o.startIndex + delta, endIndex: o.endIndex },\n\t\t\t\t\t\"left\",\n\t\t\t\t)\n\t\t\t} else if (type === \"right\") {\n\t\t\t\tcommit(\n\t\t\t\t\t{ startIndex: o.startIndex, endIndex: o.endIndex + delta },\n\t\t\t\t\t\"right\",\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tconst span = o.endIndex - o.startIndex\n\t\t\t\tlet s = o.startIndex + delta\n\t\t\t\tlet e2 = s + span\n\t\t\t\tif (s < 0) {\n\t\t\t\t\ts = 0\n\t\t\t\t\te2 = span\n\t\t\t\t}\n\t\t\t\tif (e2 > totalPoints - 1) {\n\t\t\t\t\te2 = totalPoints - 1\n\t\t\t\t\ts = Math.max(0, e2 - span)\n\t\t\t\t}\n\t\t\t\tcommit({ startIndex: s, endIndex: e2 }, \"middle\")\n\t\t\t}\n\t\t},\n\t\t[toIndexDelta, totalPoints, commit],\n\t)\n\n\tconst onPointerUp = useCallback((e: React.PointerEvent) => {\n\t\t;(e.target as HTMLElement).releasePointerCapture(e.pointerId)\n\t\tdragRef.current = null\n\t\tsetIsDragging(false)\n\t}, [])\n\n\t// Helper to bind all three pointer handlers for a given drag type\n\tconst bind = useCallback(\n\t\t(type: DragType) => ({\n\t\t\tonPointerDown: (e: React.PointerEvent) => onPointerDown(e, type),\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t}),\n\t\t[onPointerDown, onPointerMove, onPointerUp],\n\t)\n\n\treturn { isDragging, bind }\n}\n\n// ─── Brush ────────────────────────────────────────────────────────────\n\nfunction Brush({\n\tdata,\n\tchartConfig,\n\tdataKeys,\n\txDataKey,\n\tvariant = \"area\",\n\theight = 56,\n\tclassName,\n\tstacked = false,\n\tstrokeVariant = \"solid\",\n\tconnectNulls = false,\n\tbarRadius,\n\tstartIndex: controlledStart,\n\tendIndex: controlledEnd,\n\tdefaultStartIndex = 0,\n\tdefaultEndIndex,\n\tonChange,\n\tformatLabel,\n\tcurveType = \"monotone\",\n\tminSpan = 2,\n\tshowLabels = true,\n\tskipStyle = false,\n}: BrushProps) {\n\tconst containerRef = React.useRef<HTMLDivElement>(null)\n\tconst keys = React.useMemo(\n\t\t() => dataKeys ?? Object.keys(chartConfig),\n\t\t[dataKeys, chartConfig],\n\t)\n\tconst totalPoints = data.length\n\tconst chartId = React.useId().replace(/:/g, \"\")\n\n\t// ── Controlled vs uncontrolled ──────────────────────────────────────────\n\n\tconst isControlled =\n\t\tcontrolledStart !== undefined && controlledEnd !== undefined\n\n\tconst [internalRange, setInternalRange] = React.useState<BrushRange>(() => ({\n\t\tstartIndex: Math.max(0, Math.min(defaultStartIndex, totalPoints - 1)),\n\t\tendIndex: Math.max(\n\t\t\t0,\n\t\t\tMath.min(defaultEndIndex ?? totalPoints - 1, totalPoints - 1),\n\t\t),\n\t}))\n\n\t// Track the last committed range to avoid duplicate updates when small\n\t// mouse movements don't produce index changes (e.g., at boundaries)\n\tconst lastCommittedRef = React.useRef<BrushRange>(internalRange)\n\n\tuseEffect(() => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalRange(prev => {\n\t\t\t\tconst adjusted = {\n\t\t\t\t\tstartIndex: Math.min(prev.startIndex, Math.max(0, totalPoints - 1)),\n\t\t\t\t\tendIndex: Math.min(prev.endIndex, Math.max(0, totalPoints - 1)),\n\t\t\t\t}\n\t\t\t\tlastCommittedRef.current = adjusted\n\t\t\t\treturn adjusted\n\t\t\t})\n\t\t}\n\t}, [totalPoints, isControlled])\n\n\t// ── Clamping & committing ───────────────────────────────────────────────\n\n\tconst clampRange = useCallback(\n\t\t(range: BrushRange, mode?: DragType): BrushRange => {\n\t\t\tlet { startIndex, endIndex } = range\n\t\t\tconst maxIndex = Math.max(0, totalPoints - 1)\n\n\t\t\tstartIndex = Math.max(0, Math.min(startIndex, maxIndex))\n\t\t\tendIndex = Math.max(0, Math.min(endIndex, maxIndex))\n\n\t\t\tif (mode === \"left\") {\n\t\t\t\tconst maxStart = Math.max(0, endIndex - minSpan)\n\t\t\t\tstartIndex = Math.min(startIndex, maxStart)\n\t\t\t\treturn { startIndex, endIndex }\n\t\t\t}\n\n\t\t\tif (mode === \"right\") {\n\t\t\t\tconst minEnd = Math.min(maxIndex, startIndex + minSpan)\n\t\t\t\tendIndex = Math.max(endIndex, minEnd)\n\t\t\t\treturn { startIndex, endIndex }\n\t\t\t}\n\n\t\t\tif (endIndex - startIndex < minSpan) {\n\t\t\t\tendIndex = Math.min(startIndex + minSpan, maxIndex)\n\t\t\t\tif (endIndex - startIndex < minSpan) {\n\t\t\t\t\tstartIndex = Math.max(0, endIndex - minSpan)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { startIndex, endIndex }\n\t\t},\n\t\t[totalPoints, minSpan],\n\t)\n\n\tconst commit = useCallback(\n\t\t(next: BrushRange, mode?: DragType) => {\n\t\t\tconst clamped = clampRange(next, mode)\n\t\t\tconst last = lastCommittedRef.current\n\n\t\t\t// Only update if the range has actually changed — avoids unnecessary\n\t\t\t// re-renders when the brush is at a boundary and small mouse movements\n\t\t\t// don't produce index changes\n\t\t\tif (\n\t\t\t\tlast.startIndex === clamped.startIndex &&\n\t\t\t\tlast.endIndex === clamped.endIndex\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlastCommittedRef.current = clamped\n\t\t\tsetInternalRange(clamped)\n\t\t\t// Defer the parent callback — chart re-render happens at lower priority,\n\t\t\t// React can skip intermediate frames during fast drags\n\t\t\tReact.startTransition(() => {\n\t\t\t\tonChange?.(clamped)\n\t\t\t})\n\t\t},\n\t\t[clampRange, onChange],\n\t)\n\n\t// ── Drag ────────────────────────────────────────────────────────────────\n\n\tconst { isDragging, bind } = useBrushDrag({\n\t\trange: internalRange,\n\t\ttotalPoints,\n\t\tcontainerRef,\n\t\tcommit,\n\t})\n\n\t// Position always driven by internalRange (never lags behind controlled props)\n\tconst range = internalRange\n\n\t// Sync internalRange with controlled props when not dragging\n\tuseEffect(() => {\n\t\tif (isControlled && !isDragging) {\n\t\t\tconst syncedRange = {\n\t\t\t\tstartIndex: controlledStart,\n\t\t\t\tendIndex: controlledEnd,\n\t\t\t}\n\t\t\t// eslint-disable-next-line react-hooks/set-state-in-effect\n\t\t\tsetInternalRange(syncedRange)\n\t\t\tlastCommittedRef.current = syncedRange\n\t\t}\n\t}, [isControlled, controlledStart, controlledEnd, isDragging])\n\n\t// ── Computed positions (%) ──────────────────────────────────────────────\n\n\tconst leftPct =\n\t\ttotalPoints > 1 ? (range.startIndex / (totalPoints - 1)) * 100 : 0\n\tconst rightPct =\n\t\ttotalPoints > 1 ? (range.endIndex / (totalPoints - 1)) * 100 : 100\n\n\t// Drive all moving brush UI from the same springed edge values.\n\tconst leftTarget = useMotionValue(leftPct)\n\tconst rightTarget = useMotionValue(rightPct)\n\tif (leftTarget.get() !== leftPct) leftTarget.set(leftPct)\n\tif (rightTarget.get() !== rightPct) rightTarget.set(rightPct)\n\n\tconst leftSpring = useSpring(leftTarget, SPRING_CONFIG)\n\tconst rightSpring = useSpring(rightTarget, SPRING_CONFIG)\n\tconst leftPosition = useTransform(leftSpring, (v: number) => `${v}%`)\n\tconst rightPosition = useTransform(rightSpring, (v: number) => `${v}%`)\n\tconst leftOverlayWidth = useTransform(leftSpring, (v: number) => `${v}%`)\n\tconst rightOverlayWidth = useTransform(\n\t\trightSpring,\n\t\t(v: number) => `${Math.max(0, 100 - v)}%`,\n\t)\n\tconst selectedWidth = useMotionValue(`${Math.max(0, rightPct - leftPct)}%`)\n\n\tconst updateSelectedWidth = useCallback(() => {\n\t\tselectedWidth.set(`${Math.max(0, rightSpring.get() - leftSpring.get())}%`)\n\t}, [leftSpring, rightSpring, selectedWidth])\n\n\tuseMotionValueEvent(leftSpring, \"change\", updateSelectedWidth)\n\tuseMotionValueEvent(rightSpring, \"change\", updateSelectedWidth)\n\n\tconst getLabel = useCallback(\n\t\t(idx: number) => {\n\t\t\tif (!xDataKey) return String(idx)\n\t\t\tconst v = data[idx]?.[xDataKey]\n\t\t\treturn formatLabel ? formatLabel(v, idx) : String(v ?? idx)\n\t\t},\n\t\t[data, xDataKey, formatLabel],\n\t)\n\n\t// ── Render ──────────────────────────────────────────────────────────────\n\n\tif (totalPoints === 0) return null\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tdata-chart={skipStyle ? undefined : chartId}\n\t\t\tclassName={cn(\"group relative select-none\", className)}\n\t\t\tstyle={{ height }}\n\t\t>\n\t\t\t{!skipStyle && <ChartStyle id={chartId} config={chartConfig} />}\n\n\t\t\t{/* Mini chart – always shows all data */}\n\t\t\t<div className=\"rounded-bruv-md absolute inset-0 overflow-hidden\">\n\t\t\t\t<MiniChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tkeys={keys}\n\t\t\t\t\tchartConfig={chartConfig}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\tchartId={chartId}\n\t\t\t\t\tstacked={stacked}\n\t\t\t\t\tstrokeVariant={\n\t\t\t\t\t\tstrokeVariant === \"animated-dashed\" ? \"dashed\" : strokeVariant\n\t\t\t\t\t}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tbarRadius={barRadius}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Dim overlay – left */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"bg-bruv-base-2/70 pointer-events-none absolute inset-y-0 left-0 rounded-l-md backdrop-blur-[2px]\"\n\t\t\t\tstyle={{ width: leftOverlayWidth }}\n\t\t\t/>\n\t\t\t{/* Dim overlay – right */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"bg-bruv-base-2/70 pointer-events-none absolute inset-y-0 right-0 rounded-r-md backdrop-blur-[2px]\"\n\t\t\t\tstyle={{ width: rightOverlayWidth }}\n\t\t\t/>\n\n\t\t\t{/* Selected region – draggable to pan */}\n\t\t\t<motion.div\n\t\t\t\tclassName=\"rounded-bruv-sm absolute inset-y-0 cursor-grab touch-none border active:cursor-grabbing\"\n\t\t\t\tstyle={{ left: leftPosition, width: selectedWidth }}\n\t\t\t\t{...bind(\"middle\")}\n\t\t\t/>\n\n\t\t\t{/* Left handle */}\n\t\t\t<BrushHandle\n\t\t\t\tside=\"left\"\n\t\t\t\tposition={leftPosition}\n\t\t\t\tlabel={showLabels ? getLabel(range.startIndex) : undefined}\n\t\t\t\tbind={bind(\"left\")}\n\t\t\t/>\n\n\t\t\t{/* Right handle */}\n\t\t\t<BrushHandle\n\t\t\t\tside=\"right\"\n\t\t\t\tposition={rightPosition}\n\t\t\t\tlabel={showLabels ? getLabel(range.endIndex) : undefined}\n\t\t\t\tbind={bind(\"right\")}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ─── Brush Handle ───────────────────────────────────────────────────────────\n\nfunction BrushHandle({\n\tside,\n\tposition,\n\tlabel,\n\tbind,\n}: {\n\tside: \"left\" | \"right\"\n\tposition: MotionValue<string>\n\tlabel?: string\n\tbind: {\n\t\tonPointerDown: (e: React.PointerEvent) => void\n\t\tonPointerMove: (e: React.PointerEvent) => void\n\t\tonPointerUp: (e: React.PointerEvent) => void\n\t}\n}) {\n\tconst isLeft = side === \"left\"\n\n\treturn (\n\t\t<motion.div className=\"absolute inset-y-0 z-10\" style={{ left: position }}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group absolute inset-y-0 flex w-3 cursor-ew-resize touch-none items-center justify-center after:absolute after:inset-y-0 after:-left-4 after:w-11 after:content-['']\",\n\t\t\t\t\tisLeft ? \"\" : \"-translate-x-full\",\n\t\t\t\t)}\n\t\t\t\t{...bind}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-muted-foreground group-hover:bg-foreground relative flex h-4 w-1.5 items-center justify-center rounded-bruv-md transition-colors\",\n\t\t\t\t\t\tisLeft ? \"-left-[5.5px]\" : \"-right-[5.5px]\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex flex-col gap-[2px]\">\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t\t<div className=\"bg-bruv-base-2/70 h-[2px] w-[2px] rounded-full\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{label && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-foreground text-bruv-base-1 pointer-events-none absolute -bottom-3 -translate-y-1/2 rounded-[3px] px-1 py-px text-[8px] leading-tight font-medium whitespace-nowrap opacity-0 group-hover:opacity-100\",\n\t\t\t\t\t\tisLeft ? \"left-1.5\" : \"right-1.5\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</motion.div>\n\t)\n}\n\n// ─── Mini Chart ─────────────────────────────────────────────────────────────\n\nfunction MiniChart({\n\tdata,\n\tkeys,\n\tchartConfig,\n\tvariant,\n\tcurveType,\n\tchartId,\n\tstacked,\n\tstrokeVariant = \"solid\",\n\tconnectNulls = false,\n\tbarRadius,\n}: {\n\tdata: Record<string, unknown>[]\n\tkeys: string[]\n\tchartConfig: ChartConfig\n\tvariant: BrushVariant\n\tcurveType: CurveType\n\tchartId: string\n\tstacked: boolean\n\tstrokeVariant?: \"solid\" | \"dashed\" | \"animated-dashed\"\n\tconnectNulls?: boolean\n\tbarRadius?: number\n}) {\n\tconst gradients = React.useMemo(\n\t\t() =>\n\t\t\tObject.entries(chartConfig)\n\t\t\t\t.filter(([key]) => keys.includes(key))\n\t\t\t\t.map(([dataKey, config]) => ({\n\t\t\t\t\tdataKey,\n\t\t\t\t\tcolorsCount: getColorsCount(config),\n\t\t\t\t})),\n\t\t[chartConfig, keys],\n\t)\n\n\tconst dashArray =\n\t\tstrokeVariant === \"dashed\" || strokeVariant === \"animated-dashed\"\n\t\t\t? \"4 4\"\n\t\t\t: undefined\n\n\tconst defsContent = (\n\t\t<>\n\t\t\t{/* Vertical fade gradient for area fill mask */}\n\t\t\t{variant === \"area\" && (\n\t\t\t\t<linearGradient\n\t\t\t\t\tid={`${chartId}-zm-vertical-fade`}\n\t\t\t\t\tx1=\"0\"\n\t\t\t\t\ty1=\"0\"\n\t\t\t\t\tx2=\"0\"\n\t\t\t\t\ty2=\"1\"\n\t\t\t\t>\n\t\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.15} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t\t</linearGradient>\n\t\t\t)}\n\t\t\t{gradients.map(({ dataKey, colorsCount }) => {\n\t\t\t\tconst colorStops =\n\t\t\t\t\tcolorsCount === 1 ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, i) => (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\toffset={`${(i / (colorsCount - 1)) * 100}%`}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${i}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t)\n\n\t\t\t\treturn (\n\t\t\t\t\t<React.Fragment key={dataKey}>\n\t\t\t\t\t\t{/* Vertical color gradient (stroke + bar fill) */}\n\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\tid={`${chartId}-zm-${dataKey}`}\n\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{colorStops}\n\t\t\t\t\t\t</linearGradient>\n\n\t\t\t\t\t\t{/* Area fill: color gradient masked with vertical fade */}\n\t\t\t\t\t\t{variant === \"area\" && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<mask id={`${chartId}-zm-fill-mask-${dataKey}`}>\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-vertical-fade)`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</mask>\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\tid={`${chartId}-zm-fill-${dataKey}`}\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-${dataKey})`}\n\t\t\t\t\t\t\t\t\t\tmask={`url(#${chartId}-zm-fill-mask-${dataKey})`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</React.Fragment>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n\n\tif (variant === \"line\") {\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<LineChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tmargin={{ top: 4, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t>\n\t\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t\t<Line\n\t\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\t\ttype={curveType}\n\t\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\t\tstroke={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\t\t\t\tstrokeDasharray={dashArray}\n\t\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</LineChart>\n\t\t\t</ResponsiveContainer>\n\t\t)\n\t}\n\n\tif (variant === \"bar\") {\n\t\tconst r = barRadius ?? 3\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<BarChart\n\t\t\t\t\tdata={data}\n\t\t\t\t\tmargin={{ top: 2, right: 0, bottom: 0, left: 0 }}\n\t\t\t\t\tbarGap={2}\n\t\t\t\t\tbarSize={14}\n\t\t\t\t>\n\t\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t\t<Bar\n\t\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\t\tfill={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\t\tfillOpacity={0.35}\n\t\t\t\t\t\t\tstackId={stacked ? \"zm-stack\" : undefined}\n\t\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\t\tradius={[r, r, r, r]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</BarChart>\n\t\t\t</ResponsiveContainer>\n\t\t)\n\t}\n\n\t// Default: area\n\treturn (\n\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t<AreaChart data={data} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n\t\t\t\t<defs>{defsContent}</defs>\n\t\t\t\t{keys.map(dk => (\n\t\t\t\t\t<Area\n\t\t\t\t\t\tkey={dk}\n\t\t\t\t\t\ttype={curveType}\n\t\t\t\t\t\tdataKey={dk}\n\t\t\t\t\t\tstroke={`url(#${chartId}-zm-${dk})`}\n\t\t\t\t\t\tfill={`url(#${chartId}-zm-fill-${dk})`}\n\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\t\t\tstrokeDasharray={dashArray}\n\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\tfillOpacity={1}\n\t\t\t\t\t\tstackId={stacked ? \"zm-stack\" : undefined}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</AreaChart>\n\t\t</ResponsiveContainer>\n\t)\n}\n\n// ─── useBrush Hook ──────────────────────────────────────────────────────\n\nfunction useBrush<TData extends Record<string, unknown>>({\n\tdata,\n\tdefaultStartIndex = 0,\n\tdefaultEndIndex,\n}: {\n\tdata: TData[]\n\tdefaultStartIndex?: number\n\tdefaultEndIndex?: number\n}) {\n\tconst [range, setRange] = React.useState<BrushRange>({\n\t\tstartIndex: defaultStartIndex,\n\t\tendIndex: defaultEndIndex ?? Math.max(0, data.length - 1),\n\t})\n\n\t// Defer the range used for data slicing — the brush handles move at the\n\n\t// immediate `range` cadence while the expensive chart re-render uses the\n\t// deferred value. React can skip intermediate slices during fast drags.\n\tconst deferredRange = React.useDeferredValue(range)\n\n\tuseEffect(() => {\n\t\t// eslint-disable-next-line react-hooks/set-state-in-effect\n\t\tsetRange({\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: Math.max(0, data.length - 1),\n\t\t})\n\t}, [data.length])\n\n\tconst visibleData = React.useMemo(\n\t\t() => data.slice(deferredRange.startIndex, deferredRange.endIndex + 1),\n\t\t[data, deferredRange.startIndex, deferredRange.endIndex],\n\t)\n\n\treturn {\n\t\trange,\n\t\tvisibleData,\n\t\tbrushProps: {\n\t\t\tstartIndex: range.startIndex,\n\t\t\tendIndex: range.endIndex,\n\t\t\tonChange: setRange,\n\t\t} satisfies Pick<BrushProps, \"startIndex\" | \"endIndex\" | \"onChange\">,\n\t}\n}\n\nexport { Brush, useBrush, type BrushProps, type BrushRange, type BrushVariant }\n","import {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\taxisValueToPercentFormatter,\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tArea as RechartsArea,\n\tAreaChart as RechartsAreaChart,\n\tCartesianGrid,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 0.8\nconst LOADING_AREA_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst STACK_ID = \"evil-stacked\"\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype CurveType = ComponentProps<typeof RechartsArea>[\"type\"]\ntype AreaDotProp = ComponentProps<typeof RechartsArea>[\"dot\"]\ntype AreaActiveDotProp = ComponentProps<typeof RechartsArea>[\"activeDot\"]\ntype AreaVariant = \"gradient\" | \"gradient-reverse\" | \"solid\"\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\ntype StackType = \"default\" | \"expanded\" | \"stacked\"\n\ntype AreaAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<AreaAnimationType, \"none\">\n\ntype AreaChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: AreaAnimationType\n\tisStacked: boolean\n\tisExpanded: boolean\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst AreaChartContext = createContext<AreaChartContextValue | null>(null)\n\nfunction useAreaChart() {\n\tconst context = use(AreaChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Area chart parts (<Area />, <XAxis />, …) must be used within <AreaChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype AreaChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsAreaChart>\n\tcurveType?: CurveType\n\tanimationType?: AreaAnimationType\n\tstackType?: StackType\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype AreaChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = AreaChartBaseProps<TData, TConfig>\n\nexport type { AreaChartProps }\n\nexport function AreaChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tstackType = \"default\",\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: AreaChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst { loadingData, onShimmerExit } = useLoadingData(\n\t\tisLoading,\n\t\tloadingPoints,\n\t)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst isExpanded = stackType === \"expanded\"\n\tconst isStacked = stackType === \"stacked\" || isExpanded\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<AreaChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisStacked,\n\t\t\tisExpanded,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisStacked,\n\t\t\tisExpanded,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<AreaChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"area\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tstacked={isStacked}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsAreaChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tstackOffset={isExpanded ? \"expand\" : undefined}\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingArea\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsAreaChart>\n\t\t\t</Chart>\n\t\t</AreaChartContext>\n\t)\n}\n\ntype AreaProps = {\n\tdataKey: string\n\tvariant?: AreaVariant\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: AreaAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tareaProps?: ComponentProps<typeof RechartsArea>\n}\n\nexport function Area({\n\tdataKey,\n\tvariant = \"gradient\",\n\tstrokeVariant = \"dashed\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tchildren,\n\tareaProps,\n}: AreaProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisStacked,\n\t\tisExpanded,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useAreaChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: AreaAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst isSelected = selectedDataKey === dataKey\n\tconst hasSelection = selectedDataKey !== null\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\tconst showUnselected = hasSelection && !isSelected\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsArea\n\t\t\t\ttype={resolvedCurve}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\tfillOpacity={opacity.fill}\n\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\tfill={getFillPattern(variant, showUnselected, id)}\n\t\t\t\tstroke={`url(#${id}-colors-${dataKey})`}\n\t\t\t\tstackId={isStacked ? STACK_ID : undefined}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstrokeDasharray={isDashed ? \"3 3\" : undefined}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={{\n\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t...(isClickable ? { cursor: \"pointer\" } : {}),\n\t\t\t\t}}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...areaProps}\n\t\t\t>\n\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t</RechartsArea>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<ColorGradient\n\t\t\t\t\tid={id}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconfig={config}\n\t\t\t\t\tisExpanded={isExpanded}\n\t\t\t\t/>\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient-reverse\" && (\n\t\t\t\t\t<ReverseGradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"solid\" && <SolidPattern id={id} dataKey={dataKey} />}\n\t\t\t\t{showUnselected && <UnselectedPattern id={id} dataKey={dataKey} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\ttickFormatter,\n\t...props\n}: YAxisProps) {\n\tconst { isLoading, isExpanded } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\ttickFormatter={isExpanded ? axisValueToPercentFormatter : tickFormatter}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useAreaChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useAreaChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { fill: 0.8, stroke: 0.8, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { fill: 0.8, stroke: 0.8, dot: 1 }\n\t\t: { fill: 0.2, stroke: 0.3, dot: 0.3 }\n}\n\nconst getFillPattern = (\n\tvariant: AreaVariant,\n\tshowUnselected: boolean,\n\tid: string,\n): string => {\n\tif (showUnselected) return `url(#${id}-unselected)`\n\n\treturn `url(#${id}-${variant})`\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: AreaDotProp; activeDot: AreaActiveDotProp } => {\n\tlet dot: AreaDotProp = false\n\tlet activeDot: AreaActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"3 3; 0 3; 3 3\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -6\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n\tisExpanded,\n}: StyleProps & { config: ChartConfig; isExpanded: boolean }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-colors-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"0\"\n\t\t\tgradientUnits={isExpanded ? \"userSpaceOnUse\" : \"objectBoundingBox\"}\n\t\t>\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst GradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient id={`${id}-vertical-fade`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask`}>\n\t\t\t\t<rect width=\"100%\" height=\"100%\" fill={`url(#${id}-vertical-fade)`} />\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst ReverseGradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-vertical-fade-reverse`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-reverse-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-vertical-fade-reverse)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient-reverse`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-reverse-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst SolidPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient id={`${id}-solid-fade`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-solid-mask`}>\n\t\t\t\t<rect width=\"100%\" height=\"100%\" fill={`url(#${id}-solid-fade)`} />\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-solid`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-solid-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst UnselectedPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-unselected-texture`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"5\"\n\t\t\t\theight=\"5\"\n\t\t\t\tpatternTransform=\"rotate(45)\"\n\t\t\t>\n\t\t\t\t<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"5\" stroke=\"white\" strokeWidth=\"1\" />\n\t\t\t</pattern>\n\t\t\t<mask id={`${id}-unselected-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-unselected-texture)`}\n\t\t\t\t\tfillOpacity=\"0.3\"\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-unselected`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-unselected-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingPoints: number = 14) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingPoints),\n\n\t\t[loadingPoints, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingArea = ({\n\tchartId,\n\tcurveType,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tcurveType: CurveType\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsArea\n\t\t\t\ttype={curveType}\n\t\t\t\tdataKey={LOADING_AREA_DATA_KEY}\n\t\t\t\tfillOpacity={0.05}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\ttooltipType=\"none\"\n\t\t\t\tactiveDot={false}\n\t\t\t\tdot={false}\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tBar as RechartsBar,\n\tBarChart as RechartsBarChart,\n\tCartesianGrid,\n\tRectangle,\n\tReferenceLine,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport type { RectRadius } from \"recharts/types/shape/Rectangle\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst DEFAULT_BAR_RADIUS = 2\nconst LOADING_BAR_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst STACK_ID = \"evil-stacked\"\nconst BAR_GROW_DURATION = 0.5\nconst BAR_STAGGER = 0.05\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype BarVariant =\n\t| \"default\"\n\t| \"duotone\"\n\t| \"duotone-reverse\"\n\t| \"gradient\"\n\t| \"stripped\"\ntype StackType = \"default\" | \"stacked\" | \"percent\"\ntype BarLayout = \"vertical\" | \"horizontal\"\n\ntype BarAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\n\ntype BarChartContextValue = {\n\tconfig: ChartConfig\n\tisStacked: boolean\n\tisHorizontal: boolean\n\tisLoading: boolean\n\tbarRadius: number\n\tanimationType: BarAnimationType\n\tintroStartedAt: number\n\tdataLength: number\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n\tisMouseInChart: boolean\n}\n\nconst BarChartContext = createContext<BarChartContextValue | null>(null)\n\nfunction useBarChart() {\n\tconst context = use(BarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Bar chart parts (<Bar />, <XAxis />, …) must be used within <BarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype BarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsBarChart>\n\tstackType?: StackType\n\tlayout?: BarLayout\n\tbarRadius?: number\n\tanimationType?: BarAnimationType\n\tbarGap?: number\n\tbarCategoryGap?: number\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingBars?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype BarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = BarChartBaseProps<TData, TConfig>\n\nexport type { BarChartProps }\n\nexport function BarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tstackType = \"default\",\n\tlayout = \"vertical\",\n\tbarRadius = DEFAULT_BAR_RADIUS,\n\tanimationType = \"left-to-right\",\n\tbarGap,\n\tbarCategoryGap,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingBars,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: BarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\n\tconst [introStartedAt] = useState(() => Date.now())\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst [isMouseInChart, setIsMouseInChart] = useState(false)\n\tconst { loadingData, onShimmerExit } = useLoadingData(isLoading, loadingBars)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst isStacked = stackType === \"stacked\" || stackType === \"percent\"\n\tconst isHorizontal = layout === \"horizontal\"\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<BarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisStacked,\n\t\t\tisHorizontal,\n\t\t\tisLoading,\n\t\t\tbarRadius,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdataLength: displayData.length,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t\tisMouseInChart,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tisStacked,\n\t\t\tisHorizontal,\n\t\t\tisLoading,\n\t\t\tbarRadius,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdisplayData.length,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t\tisMouseInChart,\n\t\t],\n\t)\n\n\treturn (\n\t\t<BarChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"bar\"\n\t\t\t\t\t\t\tbarRadius={barRadius}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tstacked={isStacked}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tlayout={isHorizontal ? \"vertical\" : \"horizontal\"}\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\tbarGap={barGap}\n\t\t\t\t\tbarCategoryGap={barCategoryGap}\n\t\t\t\t\tstackOffset={stackType === \"percent\" ? \"expand\" : undefined}\n\t\t\t\t\tonMouseEnter={() => setIsMouseInChart(true)}\n\t\t\t\t\tonMouseLeave={() => setIsMouseInChart(false)}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t<ReferenceLine color=\"white\" />\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingBar chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t\t\t)}\n\t\t\t\t</RechartsBarChart>\n\t\t\t</Chart>\n\t\t</BarChartContext>\n\t)\n}\n\ntype BarProps = {\n\tdataKey: string\n\tvariant?: BarVariant\n\tradius?: number\n\tanimationType?: BarAnimationType\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tbufferBar?: boolean\n\tbarProps?: ComponentProps<typeof RechartsBar>\n}\n\nexport function Bar({\n\tdataKey,\n\tvariant = \"default\",\n\tradius,\n\tanimationType,\n\tisClickable = false,\n\tenableHoverHighlight = false,\n\tbufferBar = false,\n\tbarProps,\n}: BarProps) {\n\tconst {\n\t\tconfig,\n\t\tisStacked,\n\t\tisHorizontal,\n\t\tisLoading,\n\t\tbarRadius: defaultRadius,\n\t\tanimationType: defaultAnimation,\n\t\tintroStartedAt,\n\t\tdataLength,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t\tisMouseInChart,\n\t} = useBarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedRadius = radius ?? defaultRadius\n\tconst isSelected = selectedDataKey === dataKey\n\n\tconst revealType: BarAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\n\tconst customBarProps = {\n\t\tid,\n\t\tdataKey,\n\t\tvariant,\n\t\tbarRadius: resolvedRadius,\n\t\tbufferBar,\n\t\tisClickable,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisHorizontal,\n\t\tintroStartedAt,\n\t\tselectedDataKey,\n\t\tdataLength,\n\t\tonClick: () => {\n\t\t\tif (!isClickable) return\n\n\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t},\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstackId={isStacked ? STACK_ID : undefined}\n\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\tradius={resolvedRadius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={\n\t\t\t\t\tisClickable || enableHoverHighlight\n\t\t\t\t\t\t? { cursor: \"pointer\" }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tshape={(props: unknown) => (\n\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t{...(props as BarShapeProps)}\n\t\t\t\t\t\t{...customBarProps}\n\t\t\t\t\t\tanimationType={revealType}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\tactiveBar={(props: unknown) => (\n\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t{...(props as BarShapeProps)}\n\t\t\t\t\t\t{...customBarProps}\n\t\t\t\t\t\tanimationType=\"none\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{...barProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{variant === \"duotone\" && (\n\t\t\t\t\t<DuotonePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"duotone-reverse\" && (\n\t\t\t\t\t<DuotoneReversePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"stripped\" && (\n\t\t\t\t\t<StrippedPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\ttype,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading, isHorizontal } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\ttype={type ?? (isHorizontal ? \"number\" : \"category\")}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\ttype,\n\t...props\n}: YAxisProps) {\n\tconst { isLoading, isHorizontal } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\ttype={type ?? (isHorizontal ? \"category\" : \"number\")}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tstrokeDasharray = \"3 3\",\n\tvertical,\n\thorizontal,\n\t...props\n}: GridProps) {\n\tconst { isHorizontal } = useBarChart()\n\n\treturn (\n\t\t<CartesianGrid\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\tvertical={vertical ?? isHorizontal}\n\t\t\thorizontal={horizontal ?? !isHorizontal}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useBarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tcursor={false}\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useBarChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype BarShapeProps = {\n\tx?: number\n\ty?: number\n\twidth?: number\n\theight?: number\n\tfill?: string\n\tfillOpacity?: number\n\tdataKey?: string\n\tindex?: number\n\t[key: string]: unknown\n}\n\ntype CustomBarProps = {\n\tid: string\n\tdataKey: string\n\tvariant: BarVariant\n\tbarRadius: number\n\tbufferBar?: boolean\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tisMouseInChart?: boolean\n\tisHorizontal?: boolean\n\tanimationType?: BarAnimationType\n\tintroStartedAt?: number\n\tselectedDataKey?: string | null\n\tisActive?: boolean\n\tdataLength?: number\n\tonClick?: () => void\n} & BarShapeProps\n\nconst CustomBar = (props: CustomBarProps) => {\n\tconst {\n\t\tx = 0,\n\t\ty = 0,\n\t\twidth = 0,\n\t\theight = 0,\n\t\tid,\n\t\tdataKey,\n\t\tvariant,\n\t\tbarRadius,\n\t\tbufferBar,\n\t\tisClickable,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisHorizontal = false,\n\t\tanimationType = \"none\",\n\t\tintroStartedAt = 0,\n\t\tselectedDataKey,\n\t\tisActive,\n\t\tdataLength = 0,\n\t\tonClick,\n\t} = props\n\n\tconst index = typeof props.index === \"number\" ? props.index : -1\n\tconst isLastBar = bufferBar && dataLength > 0 && index === dataLength - 1\n\tconst isStripped = variant === \"stripped\"\n\tconst grow = getBarGrowAnimation(\n\t\tanimationType,\n\t\tindex,\n\t\tdataLength,\n\t\tisHorizontal,\n\t\tintroStartedAt,\n\t)\n\n\tconst fill = getVariantFill(variant, id, dataKey)\n\n\tconst fillOpacity = getBarOpacity({\n\t\tisClickable,\n\t\tselectedDataKey,\n\t\tdataKey,\n\t\tenableHoverHighlight,\n\t\tisMouseInChart,\n\t\tisActive,\n\t})\n\tconst barFillOpacity = isLastBar ? fillOpacity * 0.35 : fillOpacity\n\tconst cursorStyle =\n\t\tisClickable || enableHoverHighlight ? { cursor: \"pointer\" } : undefined\n\n\tconst radius: RectRadius = isStripped\n\t\t? [barRadius, barRadius, 0, 0]\n\t\t: barRadius\n\n\tconst visibleBar = (\n\t\t<>\n\t\t\t<Rectangle\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\topacity={barFillOpacity}\n\t\t\t\theight={Math.max(0, height - 3)}\n\t\t\t\tradius={radius}\n\t\t\t\tfill={fill}\n\t\t\t\tstroke={isLastBar ? `url(#${id}-colors-${dataKey})` : undefined}\n\t\t\t\tstrokeWidth={isLastBar ? 1 : undefined}\n\t\t\t\tstrokeDasharray={isLastBar ? \"4 4\" : undefined}\n\t\t\t\tstrokeOpacity={isLastBar ? 0.6 : undefined}\n\t\t\t/>\n\t\t\t{isStripped && (\n\t\t\t\t<Rectangle\n\t\t\t\t\tx={x}\n\t\t\t\t\ty={y - 4}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={2}\n\t\t\t\t\tradius={1}\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t)\n\n\treturn (\n\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t<Rectangle {...props} fill=\"transparent\" />\n\t\t\t{grow ? (\n\t\t\t\t<motion.g\n\t\t\t\t\tinitial={grow.initial}\n\t\t\t\t\tanimate={grow.animate}\n\t\t\t\t\ttransition={grow.transition}\n\t\t\t\t\tstyle={grow.style}\n\t\t\t\t>\n\t\t\t\t\t{visibleBar}\n\t\t\t\t</motion.g>\n\t\t\t) : (\n\t\t\t\tvisibleBar\n\t\t\t)}\n\t\t</g>\n\t)\n}\n\nconst getBarGrowAnimation = (\n\tanimationType: BarAnimationType,\n\tindex: number,\n\tdataLength: number,\n\tisHorizontal: boolean,\n\tintroStartedAt: number,\n) => {\n\tif (animationType === \"none\" || index < 0 || dataLength <= 0) return null\n\n\tconst lastIndex = dataLength - 1\n\tconst center = lastIndex / 2\n\n\tlet step: number\n\tswitch (animationType) {\n\t\tcase \"right-to-left\":\n\t\t\tstep = lastIndex - index\n\t\t\tbreak\n\t\tcase \"center-out\":\n\t\t\tstep = Math.abs(index - center)\n\t\t\tbreak\n\t\tcase \"edges-in\":\n\t\t\tstep = center - Math.abs(index - center)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tstep = index\n\t}\n\n\tconst startMs = step * BAR_STAGGER * 1000\n\tconst durationMs = BAR_GROW_DURATION * 1000\n\tconst endMs = startMs + durationMs\n\tconst elapsed = Date.now() - introStartedAt\n\n\tif (elapsed >= endMs) return null\n\n\tconst from = elapsed <= startMs ? 0 : (elapsed - startMs) / durationMs\n\tconst transition = {\n\t\tduration: (endMs - Math.max(elapsed, startMs)) / 1000,\n\t\tease: REVEAL_EASE,\n\t\tdelay: Math.max(0, startMs - elapsed) / 1000,\n\t}\n\n\treturn isHorizontal\n\t\t? {\n\t\t\t\tinitial: { scaleX: from },\n\t\t\t\tanimate: { scaleX: 1 },\n\t\t\t\ttransition,\n\t\t\t\tstyle: { originX: 0 },\n\t\t\t}\n\t\t: {\n\t\t\t\tinitial: { scaleY: from },\n\t\t\t\tanimate: { scaleY: 1 },\n\t\t\t\ttransition,\n\t\t\t\tstyle: { originY: 1 },\n\t\t\t}\n}\n\nconst getVariantFill = (\n\tvariant: BarVariant,\n\tid: string,\n\tdataKey: string,\n): string => {\n\tswitch (variant) {\n\t\tcase \"duotone\":\n\t\t\treturn `url(#${id}-duotone-${dataKey})`\n\t\tcase \"duotone-reverse\":\n\t\t\treturn `url(#${id}-duotone-reverse-${dataKey})`\n\t\tcase \"gradient\":\n\t\t\treturn `url(#${id}-gradient-${dataKey})`\n\t\tcase \"stripped\":\n\t\t\treturn `url(#${id}-stripped-${dataKey})`\n\t\tdefault:\n\t\t\treturn `url(#${id}-colors-${dataKey})`\n\t}\n}\n\nconst getBarOpacity = ({\n\tisClickable,\n\tselectedDataKey,\n\tdataKey,\n\tenableHoverHighlight,\n\tisMouseInChart,\n\tisActive,\n}: {\n\tisClickable?: boolean\n\tselectedDataKey?: string | null\n\tdataKey: string\n\tenableHoverHighlight?: boolean\n\tisMouseInChart?: boolean\n\tisActive?: boolean\n}) => {\n\tconst isSelectedDataKey =\n\t\tselectedDataKey === null || selectedDataKey === dataKey\n\tconst clickOpacity =\n\t\tisClickable && selectedDataKey !== null ? (isSelectedDataKey ? 1 : 0.3) : 1\n\n\tif (enableHoverHighlight && isMouseInChart) {\n\t\treturn isActive ? clickOpacity : clickOpacity * 0.3\n\t}\n\n\treturn clickOpacity\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst DuotonePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-mask-gradient-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-colors-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-mask-${dataKey}`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-mask-gradient-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-${dataKey}`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-duotone-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst DuotoneReversePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-mask-gradient-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-colors-${dataKey}`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-reverse-mask-${dataKey}`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-mask-gradient-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-reverse-${dataKey}`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-duotone-reverse-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst GradientPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-gradient-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"20%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"90%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask-${dataKey}`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-gradient-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient-${dataKey}`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst StrippedPattern = ({ id, dataKey }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-stripped-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.2} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.2} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-stripped-mask-${dataKey}`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-stripped-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-stripped-${dataKey}`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tmask={`url(#${id}-stripped-mask-${dataKey})`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingBars: number = 12) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingBars, 20, 80),\n\n\t\t[loadingBars, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingBar = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={LOADING_BAR_DATA_KEY}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity={0.15}\n\t\t\t\tradius={DEFAULT_BAR_RADIUS}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingBarPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingBarPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-mask-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-mask-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-mask-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tCartesianGrid,\n\tCurve,\n\tLine as RechartsLine,\n\tLineChart as RechartsLineChart,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n\ttype CurveProps,\n} from \"recharts\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 1\nconst LOADING_LINE_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\n\ntype CurveType = ComponentProps<typeof RechartsLine>[\"type\"]\ntype LineDotProp = ComponentProps<typeof RechartsLine>[\"dot\"]\ntype LineActiveDotProp = ComponentProps<typeof RechartsLine>[\"activeDot\"]\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\n\ntype LineAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<LineAnimationType, \"none\">\n\ntype LineChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: LineAnimationType\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst LineChartContext = createContext<LineChartContextValue | null>(null)\n\nfunction useLineChart() {\n\tconst context = use(LineChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Line chart parts (<Line />, <XAxis />, …) must be used within <LineChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype LineChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsLineChart>\n\tcurveType?: CurveType\n\tanimationType?: LineAnimationType\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype LineChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = LineChartBaseProps<TData, TConfig>\n\nexport type { LineChartProps }\n\nexport function LineChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: LineChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst { loadingData, onShimmerExit } = useLoadingData(\n\t\tisLoading,\n\t\tloadingPoints,\n\t)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<LineChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<LineChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"line\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsLineChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingLine\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsLineChart>\n\t\t\t</Chart>\n\t\t</LineChartContext>\n\t)\n}\n\ntype LineProps = {\n\tdataKey: string\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: LineAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tenableBufferLine?: boolean\n\tchildren?: ReactNode\n\tlineProps?: ComponentProps<typeof RechartsLine>\n}\n\nexport function Line({\n\tdataKey,\n\tstrokeVariant = \"solid\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tenableBufferLine = false,\n\tchildren,\n\tlineProps,\n}: LineProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useLineChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: LineAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst isSelected = selectedDataKey === dataKey\n\tconst hasSelection = selectedDataKey !== null\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\treturn (\n\t\t<>\n\t\t\t<g key={dataKey}>\n\t\t\t\t{isClickable && (\n\t\t\t\t\t<RechartsLine\n\t\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\t\tstrokeWidth={15}\n\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\tactiveDot={false}\n\t\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\t\tlegendType=\"none\"\n\t\t\t\t\t\ttooltipType=\"none\"\n\t\t\t\t\t\tstyle={{ cursor: \"pointer\" }}\n\t\t\t\t\t\tonClick={() => selectDataKey(isSelected ? null : dataKey)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<RechartsLine\n\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\t\tstroke={`url(#${id}-colors-${dataKey})`}\n\t\t\t\t\tdot={dot}\n\t\t\t\t\tactiveDot={activeDot}\n\t\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\t\tstrokeDasharray={getStrokeDasharray(enableBufferLine, isDashed)}\n\t\t\t\t\tshape={enableBufferLine ? bufferLineShape : undefined}\n\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t\t...(isClickable ? { cursor: \"pointer\" } : {}),\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\tselectDataKey(isSelected ? null : dataKey)\n\t\t\t\t\t}}\n\t\t\t\t\t{...lineProps}\n\t\t\t\t>\n\t\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t\t</RechartsLine>\n\t\t\t</g>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\t...props\n}: YAxisProps) {\n\tconst { isLoading } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useLineChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useLineChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { stroke: 1, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { stroke: 1, dot: 1 }\n\t\t: { stroke: 0.3, dot: 0.3 }\n}\n\nconst getStrokeDasharray = (enableBufferLine: boolean, isDashed: boolean) => {\n\tif (enableBufferLine) return undefined\n\n\treturn isDashed ? \"5 5\" : undefined\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: LineDotProp; activeDot: LineActiveDotProp } => {\n\tlet dot: LineDotProp = false\n\tlet activeDot: LineActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype CurvePoint = NonNullable<NonNullable<CurveProps[\"points\"]>[number]>\ntype DrawableCurvePoint = CurvePoint & { x: number; y: number }\n\nconst isDrawableCurvePoint = (\n\tpoint: CurvePoint,\n): point is DrawableCurvePoint => {\n\treturn typeof point.x === \"number\" && typeof point.y === \"number\"\n}\n\nconst BUFFER_DASH_SIZE = 4\nconst BUFFER_GAP_SIZE = 3\n\nconst findLengthAtX = (\n\tpath: SVGPathElement,\n\ttotalLength: number,\n\ttargetX: number,\n): number => {\n\tlet lo = 0\n\tlet hi = totalLength\n\n\twhile (hi - lo > 0.5) {\n\t\tconst mid = (lo + hi) / 2\n\t\tconst pt = path.getPointAtLength(mid)\n\t\tif (pt.x < targetX) lo = mid\n\t\telse hi = mid\n\t}\n\treturn (lo + hi) / 2\n}\n\nconst bufferLineShape = (props: CurveProps) => {\n\tconst { points, ...rest } = props\n\n\tif (!points || points.length < 2) {\n\t\treturn <Curve {...props} />\n\t}\n\n\tconst drawablePoints = points.filter(isDrawableCurvePoint)\n\n\tif (drawablePoints.length < 2) {\n\t\treturn <Curve {...props} />\n\t}\n\n\tconst splitX = drawablePoints[drawablePoints.length - 2].x\n\n\tconst gRef = (g: SVGGElement | null) => {\n\t\tif (!g) return\n\t\tconst path = g.querySelector(\"path\")\n\t\tif (!path) return\n\n\t\tconst totalLength = path.getTotalLength()\n\t\tconst solidLength = findLengthAtX(path, totalLength, splitX)\n\t\tconst lastSegmentLength = totalLength - solidLength\n\n\t\tconst reps =\n\t\t\tMath.ceil(lastSegmentLength / (BUFFER_DASH_SIZE + BUFFER_GAP_SIZE)) + 1\n\t\tconst dashedPart = Array.from(\n\t\t\t{ length: reps },\n\t\t\t() => `${BUFFER_DASH_SIZE} ${BUFFER_GAP_SIZE}`,\n\t\t).join(\" \")\n\n\t\tpath.setAttribute(\"stroke-dasharray\", `${solidLength} 0 ${dashedPart}`)\n\t}\n\n\treturn (\n\t\t<g ref={gRef}>\n\t\t\t<Curve {...rest} points={drawablePoints} />\n\t\t</g>\n\t)\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"5 5; 0 5; 5 5\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -10\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\nconst ColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingPoints: number = 14) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingPoints),\n\n\t\t[loadingPoints, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingLine = ({\n\tchartId,\n\tcurveType,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tcurveType: CurveType\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsLine\n\t\t\t\ttype={curveType}\n\t\t\t\tdataKey={LOADING_LINE_DATA_KEY}\n\t\t\t\tmin={0}\n\t\t\t\tmax={100}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeOpacity={0.5}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\ttooltipType=\"none\"\n\t\t\t\tactiveDot={false}\n\t\t\t\tdot={false}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tgetLoadingData,\n\tLoadingIndicator,\n} from \"./chart\"\nimport { Brush, useBrush, type BrushRange } from \"./chart-brush\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tBar as RechartsBar,\n\tCartesianGrid,\n\tComposedChart as RechartsComposedChart,\n\tLine as RechartsLine,\n\tXAxis as RechartsXAxis,\n\tYAxis as RechartsYAxis,\n} from \"recharts\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nconst STROKE_WIDTH = 2\nconst DEFAULT_BAR_RADIUS = 4\nconst LOADING_DATA_KEY = \"loading\"\nconst LOADING_ANIMATION_DURATION = 2000\nconst REVEAL_DURATION = 1\nconst REVEAL_EASE: [number, number, number, number] = [0, 0.7, 0.5, 1]\nconst BAR_GROW_DURATION = 0.5\nconst BAR_STAGGER = 0.05\n\ntype CurveType = ComponentProps<typeof RechartsLine>[\"type\"]\ntype LineDotProp = ComponentProps<typeof RechartsLine>[\"dot\"]\ntype LineActiveDotProp = ComponentProps<typeof RechartsLine>[\"activeDot\"]\ntype StrokeVariant = \"solid\" | \"dashed\" | \"animated-dashed\"\ntype BarVariant =\n\t| \"default\"\n\t| \"duotone\"\n\t| \"duotone-reverse\"\n\t| \"gradient\"\n\t| \"stripped\"\n\ntype ComposedAnimationType =\n\t| \"none\"\n\t| \"left-to-right\"\n\t| \"right-to-left\"\n\t| \"center-out\"\n\t| \"edges-in\"\ntype RevealAnimationType = Exclude<ComposedAnimationType, \"none\">\n\ntype ComposedChartContextValue = {\n\tconfig: ChartConfig\n\tcurveType: CurveType\n\tanimationType: ComposedAnimationType\n\tintroStartedAt: number\n\tdataLength: number\n\tisLoading: boolean\n\thoveredIndex: number | null\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst ComposedChartContext = createContext<ComposedChartContextValue | null>(\n\tnull,\n)\n\nfunction useComposedChart() {\n\tconst context = use(ComposedChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Composed chart parts (<Bar />, <Line />, <XAxis />, …) must be used within <ComposedChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype ComposedChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsComposedChart>\n\tcurveType?: CurveType\n\tanimationType?: ComposedAnimationType\n\tbarGap?: number\n\tbarCategoryGap?: number\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingBars?: number\n\tshowBrush?: boolean\n\txDataKey?: keyof TData & string\n\tbrushHeight?: number\n\tbrushFormatLabel?: (value: unknown, index: number) => string\n\tonBrushChange?: (range: BrushRange) => void\n}\n\ntype ComposedChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = ComposedChartBaseProps<TData, TConfig>\n\nexport type { ComposedChartProps }\n\nexport function ComposedChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tcurveType = \"linear\",\n\tanimationType = \"left-to-right\",\n\tbarGap,\n\tbarCategoryGap,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingBars,\n\tshowBrush = false,\n\txDataKey,\n\tbrushHeight,\n\tbrushFormatLabel,\n\tonBrushChange,\n}: ComposedChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\n\tconst [introStartedAt] = useState(() => Date.now())\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n\tconst { loadingData, onShimmerExit } = useLoadingData(isLoading, loadingBars)\n\tconst { visibleData, brushProps } = useBrush({ data })\n\n\tconst displayData = showBrush && !isLoading ? visibleData : data\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<ComposedChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdataLength: displayData.length,\n\t\t\tisLoading,\n\t\t\thoveredIndex,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[\n\t\t\tconfig,\n\t\t\tcurveType,\n\t\t\tanimationType,\n\t\t\tintroStartedAt,\n\t\t\tdisplayData.length,\n\t\t\tisLoading,\n\t\t\thoveredIndex,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t],\n\t)\n\n\treturn (\n\t\t<ComposedChartContext value={contextValue}>\n\t\t\t<Chart\n\t\t\t\tclassName={className}\n\t\t\t\tconfig={config}\n\t\t\t\tfooter={\n\t\t\t\t\tshowBrush &&\n\t\t\t\t\t!isLoading && (\n\t\t\t\t\t\t<Brush\n\t\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\t\tchartConfig={config}\n\t\t\t\t\t\t\txDataKey={xDataKey}\n\t\t\t\t\t\t\tvariant=\"area\"\n\t\t\t\t\t\t\tcurveType={curveType}\n\t\t\t\t\t\t\theight={brushHeight}\n\t\t\t\t\t\t\tformatLabel={brushFormatLabel}\n\t\t\t\t\t\t\tskipStyle\n\t\t\t\t\t\t\tclassName=\"mt-1\"\n\t\t\t\t\t\t\t{...brushProps}\n\t\t\t\t\t\t\tonChange={range => {\n\t\t\t\t\t\t\t\tbrushProps.onChange(range)\n\t\t\t\t\t\t\t\tonBrushChange?.(range)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsComposedChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\tdata={isLoading ? loadingData : displayData}\n\t\t\t\t\tbarGap={barGap}\n\t\t\t\t\tbarCategoryGap={barCategoryGap}\n\t\t\t\t\tonMouseLeave={() => setHoveredIndex(null)}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && (\n\t\t\t\t\t\t<LoadingBar\n\t\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\t\tbarRadius={DEFAULT_BAR_RADIUS}\n\t\t\t\t\t\t\tonShimmerExit={onShimmerExit}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</RechartsComposedChart>\n\t\t\t</Chart>\n\t\t</ComposedChartContext>\n\t)\n}\n\ntype BarProps = {\n\tdataKey: string\n\tvariant?: BarVariant\n\tradius?: number\n\tanimationType?: ComposedAnimationType\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tbarProps?: ComponentProps<typeof RechartsBar>\n}\n\nexport function Bar({\n\tdataKey,\n\tvariant = \"default\",\n\tradius = DEFAULT_BAR_RADIUS,\n\tanimationType,\n\tisClickable = false,\n\tenableHoverHighlight = false,\n\tbarProps,\n}: BarProps) {\n\tconst {\n\t\tconfig,\n\t\tanimationType: defaultAnimation,\n\t\tintroStartedAt,\n\t\tdataLength,\n\t\tisLoading,\n\t\thoveredIndex,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useComposedChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\n\tconst revealType: ComposedAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\tradius={radius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={\n\t\t\t\t\tisClickable || enableHoverHighlight\n\t\t\t\t\t\t? { cursor: \"pointer\" }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t\tshape={(props: unknown) => {\n\t\t\t\t\tconst barShapeProps = props as BarShapeProps\n\t\t\t\t\tconst index =\n\t\t\t\t\t\ttypeof barShapeProps.index === \"number\" ? barShapeProps.index : -1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<CustomBar\n\t\t\t\t\t\t\t{...barShapeProps}\n\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\tbarRadius={radius}\n\t\t\t\t\t\t\tfillOpacity={getBarOpacity({\n\t\t\t\t\t\t\t\tisClickable,\n\t\t\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\t\t\tselectedDataKey,\n\t\t\t\t\t\t\t\tenableHoverHighlight,\n\t\t\t\t\t\t\t\thoveredIndex,\n\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\t\t\tenableHoverHighlight={enableHoverHighlight}\n\t\t\t\t\t\t\tanimationType={revealType}\n\t\t\t\t\t\t\tdataLength={dataLength}\n\t\t\t\t\t\t\tintroStartedAt={introStartedAt}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...barProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<VerticalColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{variant === \"duotone\" && (\n\t\t\t\t\t<DuotonePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"duotone-reverse\" && (\n\t\t\t\t\t<DuotoneReversePattern id={id} dataKey={dataKey} config={config} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<GradientPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t\t{variant === \"stripped\" && (\n\t\t\t\t\t<StrippedPattern id={id} dataKey={dataKey} />\n\t\t\t\t)}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype LineProps = {\n\tdataKey: string\n\tstrokeVariant?: StrokeVariant\n\tcurveType?: CurveType\n\tanimationType?: ComposedAnimationType\n\tconnectNulls?: boolean\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tlineProps?: ComponentProps<typeof RechartsLine>\n}\n\nexport function Line({\n\tdataKey,\n\tstrokeVariant = \"solid\",\n\tcurveType,\n\tanimationType,\n\tconnectNulls = false,\n\tisClickable = false,\n\tchildren,\n\tlineProps,\n}: LineProps) {\n\tconst {\n\t\tconfig,\n\t\tcurveType: defaultCurve,\n\t\tanimationType: defaultAnimation,\n\t\tisLoading,\n\t\tselectedDataKey,\n\t\tselectDataKey,\n\t} = useComposedChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tconst shouldReduceMotion = useReducedMotion()\n\n\tif (isLoading) return null\n\n\tconst resolvedCurve = curveType ?? defaultCurve\n\n\tconst revealType: ComposedAnimationType = shouldReduceMotion\n\t\t? \"none\"\n\t\t: (animationType ?? defaultAnimation)\n\tconst maskId = revealType === \"none\" ? undefined : `${id}-reveal-mask`\n\n\tconst opacity = getOpacity(selectedDataKey, dataKey)\n\tconst hasSelection = selectedDataKey !== null\n\n\tconst { dot, activeDot } = resolveDots(\n\t\tchildren,\n\t\tid,\n\t\tdataKey,\n\t\topacity.dot,\n\t\tmaskId,\n\t)\n\n\tconst isAnimatedDashed = strokeVariant === \"animated-dashed\"\n\tconst isDashed = strokeVariant === \"dashed\" || isAnimatedDashed\n\n\tconst handleLineClick = () => {\n\t\tif (!isClickable) return\n\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{isClickable && (\n\t\t\t\t<RechartsLine\n\t\t\t\t\ttype={resolvedCurve}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\tstrokeWidth={20}\n\t\t\t\t\tdot={false}\n\t\t\t\t\tactiveDot={false}\n\t\t\t\t\tisAnimationActive={false}\n\t\t\t\t\tlegendType=\"none\"\n\t\t\t\t\ttooltipType=\"none\"\n\t\t\t\t\tstyle={{ cursor: \"pointer\" }}\n\t\t\t\t\tonClick={handleLineClick}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<RechartsLine\n\t\t\t\ttype={resolvedCurve}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tconnectNulls={connectNulls}\n\t\t\t\tstrokeOpacity={opacity.stroke}\n\t\t\t\tstroke={`url(#${id}-line-colors-${dataKey})`}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tstrokeDasharray={isDashed ? \"5 5\" : undefined}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tstyle={{\n\t\t\t\t\t...(maskId ? { mask: `url(#${maskId})` } : {}),\n\t\t\t\t\t...(isClickable ? { cursor: \"pointer\", pointerEvents: \"none\" } : {}),\n\t\t\t\t}}\n\t\t\t\t{...lineProps}\n\t\t\t>\n\t\t\t\t{isAnimatedDashed && !hasSelection && <AnimatedDashedStroke />}\n\t\t\t</RechartsLine>\n\t\t\t<defs>\n\t\t\t\t{revealType !== \"none\" && <RevealMask id={id} type={revealType} />}\n\t\t\t\t<HorizontalColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype XAxisProps = ComponentProps<typeof RechartsXAxis>\n\nexport function XAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\t...props\n}: XAxisProps) {\n\tconst { isLoading } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsXAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype YAxisProps = ComponentProps<typeof RechartsYAxis>\n\nexport function YAxis({\n\ttickLine = false,\n\taxisLine = false,\n\ttickMargin = 8,\n\tminTickGap = 8,\n\twidth = \"auto\",\n\t...props\n}: YAxisProps) {\n\tconst { isLoading } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsYAxis\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\ttickMargin={tickMargin}\n\t\t\tminTickGap={minTickGap}\n\t\t\twidth={width}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype GridProps = ComponentProps<typeof CartesianGrid>\n\nexport function Grid({\n\tvertical = false,\n\tstrokeDasharray = \"3 3\",\n\t...props\n}: GridProps) {\n\treturn (\n\t\t<CartesianGrid\n\t\t\tvertical={vertical}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n\tcursor?: boolean\n}\n\nexport function Tooltip({\n\tvariant,\n\troundness,\n\tdefaultIndex,\n\tcursor = true,\n}: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useComposedChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={\n\t\t\t\tcursor ? { strokeDasharray: \"3 3\", strokeWidth: STROKE_WIDTH } : false\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"right\",\n\tverticalAlign = \"top\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { selectedDataKey, selectDataKey } = useComposedChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getOpacity = (selectedDataKey: string | null, dataKey: string) => {\n\tif (selectedDataKey === null) {\n\t\treturn { stroke: 1, dot: 1 }\n\t}\n\n\treturn selectedDataKey === dataKey\n\t\t? { stroke: 1, dot: 1 }\n\t\t: { stroke: 0.3, dot: 0.3 }\n}\n\nconst getBarOpacity = ({\n\tisClickable,\n\tisSelected,\n\tselectedDataKey,\n\tenableHoverHighlight,\n\thoveredIndex,\n\tindex,\n}: {\n\tisClickable: boolean\n\tisSelected: boolean\n\tselectedDataKey: string | null\n\tenableHoverHighlight: boolean\n\thoveredIndex: number | null\n\tindex: number\n}) => {\n\tconst clickOpacity =\n\t\tisClickable && selectedDataKey !== null ? (isSelected ? 1 : 0.3) : 1\n\n\tif (enableHoverHighlight && hoveredIndex !== null) {\n\t\treturn hoveredIndex === index ? clickOpacity : clickOpacity * 0.3\n\t}\n\n\treturn clickOpacity\n}\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n\tmaskId: string | undefined,\n): { dot: LineDotProp; activeDot: LineActiveDotProp } => {\n\tlet dot: LineDotProp = false\n\tlet activeDot: LineActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={`${id}-line`}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={`${id}-line`}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype BarShapeProps = {\n\tx?: number\n\ty?: number\n\twidth?: number\n\theight?: number\n\tfill?: string\n\tfillOpacity?: number\n\tdataKey?: string\n\tindex?: number\n\tbackground?: {\n\t\tx?: number\n\t\ty?: number\n\t\twidth?: number\n\t\theight?: number\n\t}\n\t[key: string]: unknown\n}\n\ntype CustomBarProps = {\n\tid: string\n\tvariant: BarVariant\n\tbarRadius: number\n\tisClickable?: boolean\n\tenableHoverHighlight?: boolean\n\tanimationType?: ComposedAnimationType\n\tdataLength?: number\n\tintroStartedAt?: number\n\tonClick?: () => void\n} & BarShapeProps\n\nconst CustomBar = ({\n\tx = 0,\n\ty = 0,\n\twidth = 0,\n\theight = 0,\n\tfillOpacity = 1,\n\tbackground,\n\tindex = -1,\n\tid,\n\tvariant,\n\tbarRadius,\n\tisClickable,\n\tenableHoverHighlight,\n\tanimationType = \"none\",\n\tdataLength = 0,\n\tintroStartedAt = 0,\n\tonClick,\n}: CustomBarProps) => {\n\tconst cursorStyle =\n\t\tisClickable || enableHoverHighlight ? { cursor: \"pointer\" } : undefined\n\tconst hitAreaX = background?.x ?? x\n\tconst hitAreaY = background?.y ?? y\n\tconst hitAreaWidth = background?.width ?? width\n\tconst hitAreaHeight = background?.height ?? height\n\n\tconst grow =\n\t\tgetBarGrowAnimation(animationType, index, dataLength, introStartedAt) ?? {}\n\n\tconst getFill = () => {\n\t\tswitch (variant) {\n\t\t\tcase \"duotone\":\n\t\t\t\treturn `url(#${id}-duotone)`\n\t\t\tcase \"duotone-reverse\":\n\t\t\t\treturn `url(#${id}-duotone-reverse)`\n\t\t\tcase \"gradient\":\n\t\t\t\treturn `url(#${id}-gradient)`\n\t\t\tcase \"stripped\":\n\t\t\t\treturn `url(#${id}-stripped)`\n\t\t\tdefault:\n\t\t\t\treturn `url(#${id}-bar-colors)`\n\t\t}\n\t}\n\n\tconst hitArea = enableHoverHighlight ? (\n\t\t<rect\n\t\t\tx={hitAreaX}\n\t\t\ty={hitAreaY}\n\t\t\twidth={hitAreaWidth}\n\t\t\theight={hitAreaHeight}\n\t\t\tfill=\"transparent\"\n\t\t/>\n\t) : null\n\n\tif (variant === \"stripped\") {\n\t\treturn (\n\t\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t\t<motion.g\n\t\t\t\t\t{...grow}\n\t\t\t\t\topacity={fillOpacity}\n\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t>\n\t\t\t\t\t<rect x={x} y={y} width={width} height={height} fill={getFill()} />\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={x}\n\t\t\t\t\t\ty={y}\n\t\t\t\t\t\twidth={width}\n\t\t\t\t\t\theight={2}\n\t\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\t/>\n\t\t\t\t</motion.g>\n\t\t\t\t{hitArea}\n\t\t\t</g>\n\t\t)\n\t}\n\n\treturn (\n\t\t<g style={cursorStyle} onClick={onClick}>\n\t\t\t<motion.g {...grow}>\n\t\t\t\t<rect\n\t\t\t\t\tx={x}\n\t\t\t\t\ty={y}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\trx={barRadius}\n\t\t\t\t\try={barRadius}\n\t\t\t\t\tfill={getFill()}\n\t\t\t\t\topacity={fillOpacity}\n\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t/>\n\t\t\t</motion.g>\n\t\t\t{hitArea}\n\t\t</g>\n\t)\n}\n\nconst getBarGrowAnimation = (\n\tanimationType: ComposedAnimationType,\n\tindex: number,\n\tdataLength: number,\n\tintroStartedAt: number,\n) => {\n\tif (animationType === \"none\" || index < 0 || dataLength <= 0) return null\n\n\tconst lastIndex = dataLength - 1\n\tconst center = lastIndex / 2\n\n\tlet step: number\n\tswitch (animationType) {\n\t\tcase \"right-to-left\":\n\t\t\tstep = lastIndex - index\n\t\t\tbreak\n\t\tcase \"center-out\":\n\t\t\tstep = Math.abs(index - center)\n\t\t\tbreak\n\t\tcase \"edges-in\":\n\t\t\tstep = center - Math.abs(index - center)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tstep = index\n\t}\n\n\tconst startMs = step * BAR_STAGGER * 1000\n\tconst durationMs = BAR_GROW_DURATION * 1000\n\tconst endMs = startMs + durationMs\n\tconst elapsed = Date.now() - introStartedAt\n\n\tif (elapsed >= endMs) return null\n\n\tconst from = elapsed <= startMs ? 0 : (elapsed - startMs) / durationMs\n\n\treturn {\n\t\tinitial: { scaleY: from },\n\t\tanimate: { scaleY: 1 },\n\t\ttransition: {\n\t\t\tduration: (endMs - Math.max(elapsed, startMs)) / 1000,\n\t\t\tease: REVEAL_EASE,\n\t\t\tdelay: Math.max(0, startMs - elapsed) / 1000,\n\t\t},\n\t\tstyle: { originY: 1 },\n\t}\n}\n\nconst SINGLE_REVEAL_ORIGIN: Record<\n\tExclude<RevealAnimationType, \"edges-in\">,\n\tnumber\n> = {\n\t\"left-to-right\": 0,\n\t\"right-to-left\": 1,\n\t\"center-out\": 0.5,\n}\n\nconst RevealMask = ({\n\tid,\n\ttype,\n}: {\n\tid: string\n\ttype: RevealAnimationType\n}) => {\n\tconst reveal = {\n\t\tinitial: { scaleX: 0 },\n\t\tanimate: { scaleX: 1 },\n\t\ttransition: { duration: REVEAL_DURATION, ease: REVEAL_EASE },\n\t}\n\n\treturn (\n\t\t<mask\n\t\t\tid={`${id}-reveal-mask`}\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tmaskContentUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t>\n\t\t\t{type === \"edges-in\" ? (\n\t\t\t\t<>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 0 }}\n\t\t\t\t\t/>\n\t\t\t\t\t<motion.rect\n\t\t\t\t\t\t{...reveal}\n\t\t\t\t\t\tx=\"50%\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\twidth=\"50%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tstyle={{ originX: 1 }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<motion.rect\n\t\t\t\t\t{...reveal}\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill=\"white\"\n\t\t\t\t\tstyle={{ originX: SINGLE_REVEAL_ORIGIN[type] }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</mask>\n\t)\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n}\n\nconst AnimatedDashedStroke = () => {\n\treturn (\n\t\t<>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dasharray\"\n\t\t\t\tvalues=\"5 5; 0 5; 5 5\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;0.5;1\"\n\t\t\t/>\n\t\t\t<animate\n\t\t\t\tattributeName=\"stroke-dashoffset\"\n\t\t\t\tvalues=\"0; -10\"\n\t\t\t\tdur=\"1s\"\n\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\tkeyTimes=\"0;1\"\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nconst VerticalColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-bar-colors`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst HorizontalColorGradient = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-line-colors-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"0\"\n\t\t>\n\t\t\t{colorsCount === 1 ? (\n\t\t\t\t<>\n\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</linearGradient>\n\t)\n}\n\nconst DuotonePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-mask-gradient`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-colors`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-duotone-mask`} maskContentUnits=\"objectBoundingBox\">\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-colors)`}\n\t\t\t\t\tmask={`url(#${id}-duotone-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst DuotoneReversePattern = ({\n\tid,\n\tdataKey,\n\tconfig,\n}: StyleProps & { config: ChartConfig }) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-mask-gradient`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"50%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-duotone-reverse-colors`}\n\t\t\t\tgradientUnits=\"objectBoundingBox\"\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t\t)}\n\t\t\t</linearGradient>\n\t\t\t<mask\n\t\t\t\tid={`${id}-duotone-reverse-mask`}\n\t\t\t\tmaskContentUnits=\"objectBoundingBox\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-duotone-reverse`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\twidth=\"1\"\n\t\t\t\theight=\"1\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${id}-duotone-reverse-colors)`}\n\t\t\t\t\tmask={`url(#${id}-duotone-reverse-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst GradientPattern = ({ id }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-gradient-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"20%\" stopColor=\"white\" stopOpacity={1} />\n\t\t\t\t<stop offset=\"90%\" stopColor=\"white\" stopOpacity={0} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-gradient-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-gradient-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-gradient`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\tmask={`url(#${id}-gradient-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst StrippedPattern = ({ id }: StyleProps) => {\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${id}-stripped-mask-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"0\"\n\t\t\t\ty2=\"1\"\n\t\t\t>\n\t\t\t\t<stop offset=\"0%\" stopColor=\"white\" stopOpacity={0.4} />\n\t\t\t\t<stop offset=\"100%\" stopColor=\"white\" stopOpacity={0.1} />\n\t\t\t</linearGradient>\n\t\t\t<mask id={`${id}-stripped-mask`}>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-stripped-mask-gradient)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t\t<pattern\n\t\t\t\tid={`${id}-stripped`}\n\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${id}-bar-colors)`}\n\t\t\t\t\tmask={`url(#${id}-stripped-mask)`}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t</>\n\t)\n}\n\nconst generateEasedGradientStops = (\n\tsteps: number = 17,\n\tminOpacity: number = 0.05,\n\tmaxOpacity: number = 0.9,\n) => {\n\treturn Array.from({ length: steps }, (_, i) => {\n\t\tconst t = i / (steps - 1)\n\n\t\tconst eased = Math.sin(t * Math.PI) ** 2\n\t\tconst opacity = minOpacity + eased * (maxOpacity - minOpacity)\n\t\treturn {\n\t\t\toffset: `${(t * 100).toFixed(0)}%`,\n\t\t\topacity: Number(opacity.toFixed(3)),\n\t\t}\n\t})\n}\n\nexport function useLoadingData(isLoading: boolean, loadingBars: number = 12) {\n\tconst [loadingDataKey, setLoadingDataKey] = useState(false)\n\n\tconst onShimmerExit = useCallback(() => {\n\t\tif (isLoading) {\n\t\t\tsetLoadingDataKey(prev => !prev)\n\t\t}\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => getLoadingData(loadingBars, 20, 80),\n\n\t\t[loadingBars, loadingDataKey],\n\t)\n\n\treturn { loadingData, onShimmerExit }\n}\n\nconst LoadingBar = ({\n\tchartId,\n\tbarRadius,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tbarRadius: number\n\tonShimmerExit: () => void\n}) => {\n\treturn (\n\t\t<>\n\t\t\t<RechartsBar\n\t\t\t\tdataKey={LOADING_DATA_KEY}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity={0.15}\n\t\t\t\tradius={barRadius}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tlegendType=\"none\"\n\t\t\t\tstyle={{ mask: `url(#${chartId}-loading-mask)` }}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<LoadingPattern chartId={chartId} onShimmerExit={onShimmerExit} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\nconst LoadingPattern = ({\n\tchartId,\n\tonShimmerExit,\n}: {\n\tchartId: string\n\tonShimmerExit: () => void\n}) => {\n\tconst gradientStops = generateEasedGradientStops()\n\n\tconst patternWidth = 3\n\tconst startX = -1\n\tconst endX = 2\n\n\tconst lastXRef = useRef(startX)\n\n\treturn (\n\t\t<>\n\t\t\t<linearGradient\n\t\t\t\tid={`${chartId}-loading-gradient`}\n\t\t\t\tx1=\"0\"\n\t\t\t\ty1=\"0\"\n\t\t\t\tx2=\"1\"\n\t\t\t\ty2=\"0\"\n\t\t\t>\n\t\t\t\t{gradientStops.map(({ offset, opacity }) => (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor=\"white\"\n\t\t\t\t\t\tstopOpacity={opacity}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</linearGradient>\n\t\t\t<pattern\n\t\t\t\tid={`${chartId}-loading-pattern`}\n\t\t\t\tpatternUnits=\"objectBoundingBox\"\n\t\t\t\tpatternContentUnits=\"objectBoundingBox\"\n\t\t\t\tpatternTransform=\"rotate(25)\"\n\t\t\t\twidth={patternWidth}\n\t\t\t\theight=\"1\"\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t>\n\t\t\t\t<motion.rect\n\t\t\t\t\ty=\"0\"\n\t\t\t\t\twidth=\"1\"\n\t\t\t\t\theight=\"1\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-gradient)`}\n\t\t\t\t\tinitial={{ x: startX }}\n\t\t\t\t\tanimate={{ x: endX }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\trepeatType: \"loop\",\n\t\t\t\t\t}}\n\t\t\t\t\tonUpdate={(latest: { x?: number }) => {\n\t\t\t\t\t\tconst xValue = typeof latest.x === \"number\" ? latest.x : startX\n\t\t\t\t\t\tconst lastX = lastXRef.current\n\n\t\t\t\t\t\tif (xValue >= 1 && lastX < 1) {\n\t\t\t\t\t\t\tonShimmerExit()\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlastXRef.current = xValue\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</pattern>\n\t\t\t<mask id={`${chartId}-loading-mask`} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t<rect\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"100%\"\n\t\t\t\t\tfill={`url(#${chartId}-loading-pattern)`}\n\t\t\t\t/>\n\t\t\t</mask>\n\t\t</>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tLabelList as RechartsLabelList,\n\tPie as RechartsPie,\n\tPieChart as RechartsPieChart,\n\tSector,\n\ttype PieSectorShapeProps,\n} from \"recharts\"\nimport { motion } from \"motion/react\"\n\nconst LOADING_SECTORS = 5\nconst LOADING_ANIMATION_DURATION = 2000\nconst DEFAULT_INNER_RADIUS = 0\nconst DEFAULT_OUTER_RADIUS = \"80%\"\nconst DEFAULT_CORNER_RADIUS = 0\nconst DEFAULT_PADDING_ANGLE = 0\nconst DEFAULT_START_ANGLE = 0\nconst DEFAULT_END_ANGLE = 360\ntype LabelListProps = ComponentProps<typeof RechartsLabelList>\n\ntype PieChartContextValue = {\n\tconfig: ChartConfig\n\tdata: Record<string, unknown>[]\n\tdataKey: string\n\tnameKey: string\n\tisLoading: boolean\n\tselectedSector: string | null\n\tselectSector: (sectorName: string | null) => void\n}\n\nconst PieChartContext = createContext<PieChartContextValue | null>(null)\n\nfunction usePieChart() {\n\tconst context = use(PieChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Pie chart parts (<Pie />, <Tooltip />, …) must be used within <PieChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype PieChartProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tdataKey: keyof TData & string\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsPieChart>\n\tdefaultSelectedSector?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n}\n\nexport type { PieChartProps }\n\nexport function PieChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tdataKey,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tdefaultSelectedSector = null,\n\tonSelectionChange,\n\tisLoading = false,\n}: PieChartProps<TData>) {\n\tconst [selectedSector, setSelectedSector] = useState<string | null>(\n\t\tdefaultSelectedSector,\n\t)\n\n\tconst selectSector = useCallback(\n\t\t(sectorName: string | null) => {\n\t\t\tsetSelectedSector(sectorName)\n\n\t\t\tif (sectorName === null) {\n\t\t\t\tonSelectionChange?.(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst selectedItem = data.find(\n\t\t\t\titem => (item[nameKey] as string) === sectorName,\n\t\t\t)\n\n\t\t\tif (selectedItem) {\n\t\t\t\tonSelectionChange?.({\n\t\t\t\t\tdataKey: sectorName,\n\t\t\t\t\tvalue: selectedItem[dataKey] as number,\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t[data, dataKey, nameKey, onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<PieChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tdata,\n\t\t\tdataKey,\n\t\t\tnameKey,\n\t\t\tisLoading,\n\t\t\tselectedSector,\n\t\t\tselectSector,\n\t\t}),\n\t\t[config, data, dataKey, nameKey, isLoading, selectedSector, selectSector],\n\t)\n\n\treturn (\n\t\t<PieChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsPieChart\n\t\t\t\t\tid=\"evil-charts-pie-chart\"\n\t\t\t\t\taccessibilityLayer\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPieChart>\n\t\t\t</Chart>\n\t\t</PieChartContext>\n\t)\n}\n\ntype PieProps = {\n\tvariant?: PieVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tcornerRadius?: number\n\tpaddingAngle?: number\n\tstartAngle?: number\n\tendAngle?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tpieProps?: Omit<\n\t\tComponentProps<typeof RechartsPie>,\n\t\t\"data\" | \"dataKey\" | \"nameKey\"\n\t>\n}\n\nexport function Pie({\n\tvariant = \"gradient\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tpaddingAngle = DEFAULT_PADDING_ANGLE,\n\tstartAngle = DEFAULT_START_ANGLE,\n\tendAngle = DEFAULT_END_ANGLE,\n\tisClickable = false,\n\tchildren,\n\tpieProps,\n}: PieProps) {\n\tconst {\n\t\tconfig,\n\t\tdata,\n\t\tdataKey,\n\t\tnameKey,\n\t\tisLoading,\n\t\tselectedSector,\n\t\tselectSector,\n\t} = usePieChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<RechartsPie\n\t\t\t\tdata={LOADING_PIE_DATA}\n\t\t\t\tdataKey=\"value\"\n\t\t\t\tnameKey=\"name\"\n\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\touterRadius={outerRadius}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tpaddingAngle={paddingAngle}\n\t\t\t\tstartAngle={startAngle}\n\t\t\t\tendAngle={endAngle}\n\t\t\t\tstrokeWidth={0}\n\t\t\t\tisAnimationActive={false}\n\t\t\t\tshape={props => <AnimatedLoadingSector {...props} />}\n\t\t\t/>\n\t\t)\n\t}\n\n\tconst label = resolveLabel(children, dataKey)\n\n\tconst preparedData = data.map(item => ({\n\t\t...item,\n\t\tfill: `url(#${id}-colors-${item[nameKey] as string})`,\n\t}))\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsPie\n\t\t\t\tdata={preparedData}\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tnameKey={nameKey}\n\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\touterRadius={outerRadius}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tpaddingAngle={paddingAngle}\n\t\t\t\tstartAngle={startAngle}\n\t\t\t\tendAngle={endAngle}\n\t\t\t\tstrokeWidth={0}\n\t\t\t\tisAnimationActive\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(_, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst clickedName = data[index]?.[nameKey] as string\n\n\t\t\t\t\tselectSector(selectedSector === clickedName ? null : clickedName)\n\t\t\t\t}}\n\t\t\t\tshape={(props: PieSectorShapeProps) => {\n\t\t\t\t\tconst sectorName = data[props.index ?? 0]?.[nameKey] as string\n\t\t\t\t\tconst isDimmed =\n\t\t\t\t\t\tisClickable &&\n\t\t\t\t\t\tselectedSector !== null &&\n\t\t\t\t\t\tselectedSector !== sectorName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\tfill={`url(#${id}-colors-${sectorName})`}\n\t\t\t\t\t\t\tstroke={paddingAngle < 0 ? \"var(--background)\" : \"none\"}\n\t\t\t\t\t\t\tstrokeWidth={paddingAngle < 0 ? 5 : 0}\n\t\t\t\t\t\t\topacity={isDimmed ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...pieProps}\n\t\t\t>\n\t\t\t\t{label}\n\t\t\t</RechartsPie>\n\t\t\t<defs>\n\t\t\t\t<RadialColorGradient id={id} config={config} variant={variant} />\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype LabelProps = {\n\tdataKey?: string\n\tlabelListProps?: Omit<LabelListProps, \"dataKey\">\n}\n\nexport const Label: FC<LabelProps> = () => null\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, nameKey } = usePieChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, selectedSector, selectSector } = usePieChart()\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedSector}\n\t\t\t\t\tonSelectChange={selectSector}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype BackgroundProps = {\n\tvariant?: BackgroundVariant\n}\n\nexport function Background({ variant = \"dots\" }: BackgroundProps) {\n\treturn <ChartBackground variant={variant} />\n}\n\nconst resolveLabel = (children: ReactNode, valueKey: string): ReactNode => {\n\tlet label: ReactNode = null\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child) || child.type !== Label) return\n\n\t\tconst { dataKey, labelListProps } = (child as ReactElement<LabelProps>)\n\t\t\t.props\n\n\t\tlabel = (\n\t\t\t<RechartsLabelList\n\t\t\t\tdataKey={dataKey ?? valueKey}\n\t\t\t\tstroke=\"none\"\n\t\t\t\tfontSize={12}\n\t\t\t\tfontWeight={500}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tclassName=\"fill-background\"\n\t\t\t\t{...labelListProps}\n\t\t\t/>\n\t\t)\n\t})\n\n\treturn label\n}\n\ntype PieVariant = \"gradient\"\n\nconst RadialColorGradient = ({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n\tvariant: PieVariant\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([sectorKey, sectorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(sectorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${id}-colors-${sectorKey}`}\n\t\t\t\t\t\tid={`${id}-colors-${sectorKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${sectorKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${sectorKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${sectorKey}-${index}, var(--color-${sectorKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst LOADING_PIE_DATA = Array.from({ length: LOADING_SECTORS }, (_, i) => ({\n\tname: `loading${i}`,\n\tvalue: 100 / LOADING_SECTORS,\n}))\n\nconst AnimatedLoadingSector = (\n\tprops: ComponentProps<typeof Sector> & { index?: number },\n) => {\n\tconst { index = 0, ...sectorProps } = props\n\n\tconst delay = (index / LOADING_SECTORS) * (LOADING_ANIMATION_DURATION / 1000)\n\n\treturn (\n\t\t<motion.g\n\t\t\tinitial={{ opacity: 0.15 }}\n\t\t\tanimate={{ opacity: [0.15, 0.5, 0.15] }}\n\t\t\ttransition={{\n\t\t\t\tduration: LOADING_ANIMATION_DURATION / 1000,\n\t\t\t\tdelay,\n\t\t\t\trepeat: Infinity,\n\t\t\t\tease: \"easeInOut\",\n\t\t\t}}\n\t\t>\n\t\t\t<Sector {...sectorProps} fill=\"currentColor\" />\n\t\t</motion.g>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tPolarAngleAxis as RechartsPolarAngleAxis,\n\tPolarGrid as RechartsPolarGrid,\n\tPolarRadiusAxis as RechartsPolarRadiusAxis,\n\tRadar as RechartsRadar,\n\tRadarChart as RechartsRadarChart,\n} from \"recharts\"\n\nconst STROKE_WIDTH = 1\nconst DEFAULT_FILL_OPACITY = 0.3\nconst LOADING_POINTS = 6\nconst LOADING_ANIMATION_DURATION = 1500\nconst LOADING_RADAR_DATA_KEY = \"value\"\n\ntype RadarVariant = \"filled\" | \"lines\"\n\ntype RadarChartContextValue = {\n\tconfig: ChartConfig\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst RadarChartContext = createContext<RadarChartContextValue | null>(null)\n\nfunction useRadarChart() {\n\tconst context = use(RadarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radar chart parts (<Radar />, <PolarAngleAxis />, …) must be used within <RadarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype RadarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsRadarChart>\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n}\n\ntype RadarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = RadarChartBaseProps<TData, TConfig>\n\nexport type { RadarChartProps }\n\nexport function RadarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n}: RadarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading, loadingPoints)\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<RadarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[config, isLoading, selectedDataKey, selectDataKey],\n\t)\n\n\treturn (\n\t\t<RadarChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : data}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadar />}\n\t\t\t\t</RechartsRadarChart>\n\t\t\t</Chart>\n\t\t</RadarChartContext>\n\t)\n}\n\ntype RadarProps = {\n\tdataKey: string\n\tvariant?: RadarVariant\n\tfillOpacity?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tradarProps?: Omit<ComponentProps<typeof RechartsRadar>, \"dataKey\">\n}\n\nexport function Radar({\n\tdataKey,\n\tvariant = \"filled\",\n\tfillOpacity = DEFAULT_FILL_OPACITY,\n\tisClickable = false,\n\tchildren,\n\tradarProps,\n}: RadarProps) {\n\tconst { config, isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\tconst opacity = isClickable && !isSelected ? 0.2 : 1\n\tconst isFilled = variant === \"filled\"\n\n\tconst { dot, activeDot } = resolveDots(children, id, dataKey, opacity)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstroke={`url(#${id}-radar-stroke-${dataKey})`}\n\t\t\t\tstrokeOpacity={opacity}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tfill={isFilled ? `url(#${id}-radar-fill-${dataKey})` : \"none\"}\n\t\t\t\tfillOpacity={isFilled ? fillOpacity * opacity : 0}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...radarProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t<StrokeGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{isFilled && <FillGradient id={id} dataKey={dataKey} config={config} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype PolarGridProps = ComponentProps<typeof RechartsPolarGrid>\n\nexport function PolarGrid({\n\tgridType = \"polygon\",\n\tstroke = \"currentColor\",\n\tstrokeOpacity = 0.2,\n\tstrokeDasharray = \"3 4\",\n\t...props\n}: PolarGridProps) {\n\treturn (\n\t\t<RechartsPolarGrid\n\t\t\tgridType={gridType}\n\t\t\tstroke={stroke}\n\t\t\tstrokeOpacity={strokeOpacity}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype PolarAngleAxisProps = ComponentProps<typeof RechartsPolarAngleAxis>\n\nexport function PolarAngleAxis({\n\ttick = { fill: \"currentColor\", fontSize: 12 },\n\ttickLine = false,\n\t...props\n}: PolarAngleAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn <RechartsPolarAngleAxis tick={tick} tickLine={tickLine} {...props} />\n}\n\ntype PolarRadiusAxisProps = ComponentProps<typeof RechartsPolarRadiusAxis>\n\nexport function PolarRadiusAxis({\n\ttick = { fill: \"currentColor\", fontSize: 10 },\n\ttickLine = false,\n\taxisLine = false,\n\t...props\n}: PolarRadiusAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsPolarRadiusAxis\n\t\t\ttick={tick}\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype RadarDotProp = ComponentProps<typeof RechartsRadar>[\"dot\"]\ntype RadarActiveDotProp = ComponentProps<typeof RechartsRadar>[\"activeDot\"]\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n): { dot: RadarDotProp; activeDot: RadarActiveDotProp } => {\n\tlet dot: RadarDotProp = false\n\tlet activeDot: RadarActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n\tconfig: ChartConfig\n}\n\ntype ColorStopsProps = {\n\tdataKey: string\n\tcolorsCount: number\n\topacities?: number[]\n}\n\nconst ColorStops = ({ dataKey, colorsCount, opacities }: ColorStopsProps) => {\n\tif (colorsCount === 1) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[0]}\n\t\t\t\t/>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[opacities.length - 1]}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{Array.from({ length: colorsCount }, (_, index) => {\n\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\treturn (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\tstopOpacity={opacities?.[index]}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst ColorGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst StrokeGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-radar-stroke-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"1\"\n\t\t>\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst FillGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\tconst opacities =\n\t\tcolorsCount === 1\n\t\t\t? [0.8, 0.3]\n\t\t\t: Array.from({ length: colorsCount }, (_, i) => (i === 0 ? 0.8 : 0.3))\n\n\treturn (\n\t\t<radialGradient\n\t\t\tid={`${id}-radar-fill-${dataKey}`}\n\t\t\tcx=\"50%\"\n\t\t\tcy=\"50%\"\n\t\t\tr=\"50%\"\n\t\t>\n\t\t\t<ColorStops\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\topacities={opacities}\n\t\t\t/>\n\t\t</radialGradient>\n\t)\n}\n\nconst generateLoadingData = (points: number) => {\n\tconst categories = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]\n\n\treturn categories.slice(0, points).map(category => ({\n\t\tskill: category,\n\t\t[LOADING_RADAR_DATA_KEY]: 30 + Math.random() * 70,\n\t}))\n}\n\nexport function useLoadingData(\n\tisLoading: boolean,\n\tloadingPoints: number = LOADING_POINTS,\n) {\n\tconst [refreshKey, setRefreshKey] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetRefreshKey(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => generateLoadingData(loadingPoints),\n\n\t\t[loadingPoints, refreshKey],\n\t)\n\n\treturn loadingData\n}\n\nconst LoadingRadar = () => {\n\treturn (\n\t\t<RechartsRadar\n\t\t\tdataKey={LOADING_RADAR_DATA_KEY}\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeOpacity={0.3}\n\t\t\tstrokeWidth={2}\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity={0.1}\n\t\t\tdot={false}\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t/>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tRadialBar as RechartsRadialBar,\n\tRadialBarChart as RechartsRadialBarChart,\n\tSector,\n\ttype SectorProps,\n} from \"recharts\"\nimport type { TypedDataKey } from \"recharts/types/util/typedDataKey\"\n\nconst DEFAULT_INNER_RADIUS = \"30%\"\nconst DEFAULT_OUTER_RADIUS = \"100%\"\nconst DEFAULT_CORNER_RADIUS = 5\nconst DEFAULT_BAR_SIZE = 14\nconst LOADING_BARS = 5\nconst LOADING_ANIMATION_DURATION = 1500\n\ntype RadialBarChartProps = ComponentProps<typeof RechartsRadialBarChart>\ntype RadialBarRechartsProps = ComponentProps<typeof RechartsRadialBar>\n\ntype RadialVariant = \"full\" | \"semi\"\n\ntype RadialChartContextValue = {\n\tconfig: ChartConfig\n\tnameKey: string\n\tchartId: string\n\tisLoading: boolean\n\tselectedBar: string | null\n\tselectBar: (barName: string | null, value?: number) => void\n}\n\nconst RadialChartContext = createContext<RadialChartContextValue | null>(null)\n\nfunction useRadialChart() {\n\tconst context = use(RadialChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radial chart parts (<RadialBar />, <Tooltip />, …) must be used within <RadialChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype RadialChartBaseProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: RadialBarChartProps\n\tvariant?: RadialVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n\tbackgroundVariant?: BackgroundVariant\n}\n\ntype RadialChartProps<TData extends Record<string, unknown>> =\n\tRadialChartBaseProps<TData>\n\nexport type { RadialChartProps }\n\nexport function RadialChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tvariant = \"full\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tbackgroundVariant,\n}: RadialChartProps<TData>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedBar, setSelectedBar] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading)\n\n\tconst variantConfig = getVariantConfig(variant)\n\n\tconst selectBar = useCallback(\n\t\t(barName: string | null, value?: number) => {\n\t\t\tsetSelectedBar(barName)\n\t\t\tonSelectionChange?.(\n\t\t\t\tbarName === null ? null : { dataKey: barName, value: value ?? 0 },\n\t\t\t)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst preparedData = useMemo(\n\t\t() =>\n\t\t\tdata.map(item => ({\n\t\t\t\t...item,\n\t\t\t\tfill: `url(#${chartId}-radial-colors-${item[nameKey] as string})`,\n\t\t\t})),\n\t\t[data, nameKey, chartId],\n\t)\n\n\tconst contextValue = useMemo<RadialChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tnameKey,\n\t\t\tchartId,\n\t\t\tisLoading,\n\t\t\tselectedBar,\n\t\t\tselectBar,\n\t\t}),\n\t\t[config, nameKey, chartId, isLoading, selectedBar, selectBar],\n\t)\n\n\treturn (\n\t\t<RadialChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadialBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : preparedData}\n\t\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\t\touterRadius={outerRadius}\n\t\t\t\t\tstartAngle={variantConfig.startAngle}\n\t\t\t\t\tendAngle={variantConfig.endAngle}\n\t\t\t\t\tcx={variantConfig.cx}\n\t\t\t\t\tcy={variantConfig.cy}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadialBar />}\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ColorGradientStyle config={config} chartId={chartId} />\n\t\t\t\t\t</defs>\n\t\t\t\t</RechartsRadialBarChart>\n\t\t\t</Chart>\n\t\t</RadialChartContext>\n\t)\n}\n\ntype RadialBarProps = {\n\tdataKey: string\n\tcornerRadius?: number\n\tbarSize?: number\n\tshowBackground?: boolean\n\tisClickable?: boolean\n\tradialBarProps?: Omit<RadialBarRechartsProps, \"dataKey\">\n}\n\nexport function RadialBar({\n\tdataKey,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tbarSize = DEFAULT_BAR_SIZE,\n\tshowBackground = true,\n\tisClickable = false,\n\tradialBarProps,\n}: RadialBarProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadialBar\n\t\t\t\tdataKey={dataKey as TypedDataKey<Record<string, unknown>>}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tbarSize={barSize}\n\t\t\t\tbackground={showBackground}\n\t\t\t\tclassName=\"drop-shadow-sm\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(payload, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst entry = payload as Record<string, unknown>\n\t\t\t\t\tconst barName =\n\t\t\t\t\t\t(entry?.[nameKey] as string | undefined) ?? String(index)\n\t\t\t\t\tconst value = Number(entry?.[dataKey] ?? 0)\n\n\t\t\t\t\tselectBar(selectedBar === barName ? null : barName, value)\n\t\t\t\t}}\n\t\t\t\tshape={(props: SectorProps) => {\n\t\t\t\t\tconst barName = (props as unknown as Record<string, unknown>)[\n\t\t\t\t\t\tnameKey\n\t\t\t\t\t] as string\n\t\t\t\t\tconst isSelected = selectedBar === null || selectedBar === barName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\topacity={isClickable && !isSelected ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...radialBarProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { nameKey, isLoading } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedBar}\n\t\t\t\t\tonSelectChange={selectBar}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction getVariantConfig(variant: RadialVariant) {\n\tswitch (variant) {\n\t\tcase \"semi\":\n\t\t\treturn { startAngle: 180, endAngle: 0, cx: \"50%\", cy: \"70%\" }\n\t\tcase \"full\":\n\t\tdefault:\n\t\t\treturn { startAngle: 90, endAngle: -270, cx: \"50%\", cy: \"50%\" }\n\t}\n}\n\nconst ColorGradientStyle = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, colorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(colorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nfunction generateLoadingData() {\n\treturn Array.from({ length: LOADING_BARS }, (_, i) => ({\n\t\tname: `loading${i}`,\n\t\tvalue: 40 + Math.random() * 60,\n\t}))\n}\n\nfunction useLoadingData(isLoading: boolean) {\n\tconst [tick, setTick] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetTick(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(() => generateLoadingData(), [tick])\n\n\treturn loadingData\n}\n\nconst LoadingRadialBar = () => {\n\treturn (\n\t\t<RechartsRadialBar\n\t\t\tdataKey=\"value\"\n\t\t\tcornerRadius={DEFAULT_CORNER_RADIUS}\n\t\t\tbarSize={DEFAULT_BAR_SIZE}\n\t\t\tbackground\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t\tshape={(props: SectorProps) => (\n\t\t\t\t<Sector {...props} fill=\"currentColor\" fillOpacity={0.25} />\n\t\t\t)}\n\t\t/>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tSankey as RechartsSankey,\n\tLayer,\n\ttype SankeyProps,\n\ttype SankeyNodeProps,\n\ttype SankeyLinkProps,\n\ttype SankeyData,\n\ttype SankeyNode as RechartsSankeyNode,\n} from \"recharts\"\nimport { motion } from \"motion/react\"\n\nconst LOADING_ANIMATION_DURATION = 2000\nconst DEFAULT_NODE_WIDTH = 10\nconst DEFAULT_NODE_PADDING = 10\nconst DEFAULT_LINK_CURVATURE = 0.5\nconst DEFAULT_ITERATIONS = 32\n\ntype LinkVariant = \"gradient\" | \"solid\" | \"source\" | \"target\"\ntype NodeLabelPosition = \"inside\" | \"outside\"\n\ntype SankeyChartContextValue = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchartId: string\n\tisLoading: boolean\n\tselectedNode: string | null\n\tselectNode: (nodeName: string | null) => void\n}\n\nconst SankeyChartContext = createContext<SankeyChartContextValue | null>(null)\n\nfunction useSankeyChart() {\n\tconst context = use(SankeyChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Sankey chart parts (<Node />, <Link />, <Tooltip />, …) must be used within <SankeyChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype SankeyChartBaseProps = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchildren: ReactNode\n\tclassName?: string\n\tsankeyProps?: Omit<SankeyProps, \"data\">\n\tnodeWidth?: number\n\tnodePadding?: number\n\tlinkCurvature?: number\n\titerations?: number\n\tsort?: boolean\n\talign?: \"left\" | \"justify\"\n\tverticalAlign?: \"justify\" | \"top\"\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedNode?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n}\n\ntype SankeyChartProps = SankeyChartBaseProps\n\nexport type { SankeyChartProps }\n\nexport function SankeyChart({\n\tdata,\n\tconfig,\n\tchildren,\n\tclassName,\n\tsankeyProps,\n\tnodeWidth = DEFAULT_NODE_WIDTH,\n\tnodePadding = DEFAULT_NODE_PADDING,\n\tlinkCurvature = DEFAULT_LINK_CURVATURE,\n\titerations = DEFAULT_ITERATIONS,\n\tsort = true,\n\talign = \"justify\",\n\tverticalAlign = \"justify\",\n\tbackgroundVariant,\n\tdefaultSelectedNode = null,\n\tonSelectionChange,\n\tisLoading = false,\n}: SankeyChartProps) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedNode, setSelectedNode] = useState<string | null>(\n\t\tdefaultSelectedNode,\n\t)\n\n\tconst selectNode = useCallback(\n\t\t(nodeName: string | null) => {\n\t\t\tsetSelectedNode(nodeName)\n\n\t\t\tif (!onSelectionChange) return\n\n\t\t\tif (nodeName === null) {\n\t\t\t\tonSelectionChange(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tonSelectionChange({\n\t\t\t\tdataKey: nodeName,\n\t\t\t\tvalue: getNodeValue(data, nodeName),\n\t\t\t})\n\t\t},\n\t\t[onSelectionChange, data],\n\t)\n\n\tconst contextValue = useMemo<SankeyChartContextValue>(\n\t\t() => ({ data, config, chartId, isLoading, selectedNode, selectNode }),\n\t\t[data, config, chartId, isLoading, selectedNode, selectNode],\n\t)\n\n\treturn (\n\t\t<SankeyChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t{!isLoading && (\n\t\t\t\t\t<RechartsSankey\n\t\t\t\t\t\tid={chartId}\n\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\tnodeWidth={nodeWidth}\n\t\t\t\t\t\tnodePadding={nodePadding}\n\t\t\t\t\t\tlinkCurvature={linkCurvature}\n\t\t\t\t\t\titerations={iterations}\n\t\t\t\t\t\tsort={sort}\n\t\t\t\t\t\talign={align}\n\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t{...resolveSankeyRenderers(children)}\n\t\t\t\t\t\t{...sankeyProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<NodeColorGradients config={config} chartId={chartId} />\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t</RechartsSankey>\n\t\t\t\t)}\n\t\t\t\t{isLoading && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tviewBox=\"0 0 500 250\"\n\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LoadingSankey />\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\t\t\t</Chart>\n\t\t</SankeyChartContext>\n\t)\n}\n\ntype NodeProps = {\n\tradius?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n}\n\nexport const Node: FC<NodeProps> = () => null\n\ntype NodeLabelProps = {\n\tposition?: NodeLabelPosition\n\tshowValues?: boolean\n\tvalueFormatter?: (value: number) => string\n}\n\nexport const NodeLabel: FC<NodeLabelProps> = () => null\n\ntype LinkProps = {\n\tvariant?: LinkVariant\n\tverticalPadding?: number\n}\n\nexport const Link: FC<LinkProps> = () => null\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading } = useSankeyChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getNodeValue = (data: SankeyData, nodeName: string): number => {\n\tconst nodeIndex = data.nodes.findIndex(node => node.name === nodeName)\n\tif (nodeIndex === -1) return 0\n\n\tconst outgoing = data.links\n\t\t.filter(link => link.source === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\tconst incoming = data.links\n\t\t.filter(link => link.target === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\n\treturn outgoing > 0 ? outgoing : incoming\n}\n\nconst resolveSankeyRenderers = (\n\tchildren: ReactNode,\n): Pick<SankeyProps, \"node\" | \"link\"> => {\n\tlet nodeProps: NodeProps | null = null\n\tlet linkProps: LinkProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Node) {\n\t\t\tnodeProps = (child as ReactElement<NodeProps>).props\n\t\t}\n\n\t\tif (child.type === Link) {\n\t\t\tlinkProps = (child as ReactElement<LinkProps>).props\n\t\t}\n\t})\n\n\treturn {\n\t\tnode: (props: SankeyNodeProps) => (\n\t\t\t<SankeyNode {...props} nodeConfig={nodeProps} />\n\t\t),\n\t\tlink: (props: SankeyLinkProps) => (\n\t\t\t<SankeyLink {...props} linkConfig={linkProps} />\n\t\t),\n\t}\n}\n\nconst resolveNodeLabel = (children: ReactNode): NodeLabelProps | null => {\n\tlet label: NodeLabelProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (isValidElement(child) && child.type === NodeLabel) {\n\t\t\tlabel = (child as ReactElement<NodeLabelProps>).props\n\t\t}\n\t})\n\n\treturn label\n}\n\ntype SankeyNodeRendererProps = SankeyNodeProps & {\n\tnodeConfig: NodeProps | null\n}\n\nconst SankeyNode = ({\n\tx,\n\ty,\n\twidth,\n\theight,\n\tpayload,\n\tnodeConfig,\n}: SankeyNodeRendererProps) => {\n\tconst { config, chartId, data, selectedNode, selectNode } = useSankeyChart()\n\n\tconst radius = nodeConfig?.radius ?? 0\n\tconst isClickable = nodeConfig?.isClickable ?? false\n\tconst label = resolveNodeLabel(nodeConfig?.children)\n\n\tconst nodeName = payload.name\n\tconst nodeValue = payload.value\n\tconst nodeIcon = (payload as RechartsSankeyNode & { icon?: ReactNode }).icon\n\n\tconst isHighlighted = isNodeConnected(data, selectedNode, nodeName)\n\tconst hasConfigColor = nodeName in config\n\tconst configLabel = config[nodeName]?.label ?? nodeName\n\tconst dimmed = isClickable && !isHighlighted\n\n\tconst valueFormatter =\n\t\tlabel?.valueFormatter ?? ((value: number) => value.toLocaleString())\n\tconst showValues = label?.showValues ?? false\n\n\tconst labelX = x + width / 2\n\tconst labelY = showValues ? y + height / 2 - 8 : y + height / 2\n\tconst valueY = y + height / 2 + 8\n\tconst outsideLabelX = x + width + 8\n\tconst outsideLabelY = y + height / 2\n\n\treturn (\n\t\t<Layer>\n\t\t\t<rect\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\trx={radius}\n\t\t\t\try={radius}\n\t\t\t\tfill={\n\t\t\t\t\thasConfigColor\n\t\t\t\t\t\t? `url(#${chartId}-sankey-colors-${nodeName})`\n\t\t\t\t\t\t: \"currentColor\"\n\t\t\t\t}\n\t\t\t\tfillOpacity={dimmed ? 0.3 : 0.9}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tselectNode(selectedNode === nodeName ? null : nodeName)\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{label?.position === \"inside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={x + 1}\n\t\t\t\t\t\ty={y + 1}\n\t\t\t\t\t\twidth={width - 2}\n\t\t\t\t\t\theight={height - 2}\n\t\t\t\t\t\trx={Math.max(0, radius - 1)}\n\t\t\t\t\t\try={Math.max(0, radius - 1)}\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tclassName=\"fill-white/50 transition-opacity duration-200 dark:fill-black/60\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t/>\n\t\t\t\t\t{nodeIcon && (\n\t\t\t\t\t\t<foreignObject\n\t\t\t\t\t\t\tx={labelX - 8}\n\t\t\t\t\t\t\ty={labelY - 30}\n\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"text-bruv-primary/80 flex items-center justify-center dark:text-white/80\">\n\t\t\t\t\t\t\t\t{nodeIcon}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</foreignObject>\n\t\t\t\t\t)}\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\ty={nodeIcon ? labelY - 4 : labelY}\n\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-[10px] font-medium transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\t\ty={valueY}\n\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\tclassName=\"fill-foreground/60 font-mono text-xs font-medium tabular-nums transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 0.6}\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{label?.position === \"outside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\ty={outsideLabelY - (showValues ? 8 : 0)}\n\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-xs\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\t\ty={outsideLabelY + 8}\n\t\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\topacity={0.5}\n\t\t\t\t\t\t\tclassName=\"fill-foreground font-mono text-xs tabular-nums dark:fill-white\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Layer>\n\t)\n}\n\ntype SankeyLinkRendererProps = SankeyLinkProps & {\n\tlinkConfig: LinkProps | null\n}\n\nconst SankeyLink = ({\n\tsourceX,\n\ttargetX,\n\tsourceY,\n\ttargetY,\n\tsourceControlX,\n\ttargetControlX,\n\tlinkWidth,\n\tindex,\n\tpayload,\n\tlinkConfig,\n}: SankeyLinkRendererProps) => {\n\tconst { config, chartId, selectedNode } = useSankeyChart()\n\n\tconst variant = linkConfig?.variant ?? \"gradient\"\n\tconst verticalPadding = linkConfig?.verticalPadding ?? 0\n\n\tconst sourceName = payload.source.name\n\tconst targetName = payload.target.name\n\n\tconst isConnected =\n\t\tselectedNode === null ||\n\t\tselectedNode === sourceName ||\n\t\tselectedNode === targetName\n\n\tconst paddedLinkWidth = Math.max(1, linkWidth - verticalPadding)\n\tconst halfWidth = paddedLinkWidth / 2\n\n\tconst linkAreaPath = `M${sourceX},${sourceY - halfWidth}\n C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}\n L${targetX},${targetY + halfWidth}\n C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}\n Z`\n\n\treturn (\n\t\t<Layer>\n\t\t\t<defs>\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<LinkGradient\n\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\tconfig={config}\n\t\t\t\t\t\tsourceName={sourceName}\n\t\t\t\t\t\ttargetName={targetName}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<LinkStrokeGradient chartId={chartId} index={index} />\n\t\t\t</defs>\n\t\t\t<path\n\t\t\t\td={linkAreaPath}\n\t\t\t\tfill={getLinkFill(\n\t\t\t\t\tvariant,\n\t\t\t\t\tchartId,\n\t\t\t\t\tindex,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsourceName,\n\t\t\t\t\ttargetName,\n\t\t\t\t)}\n\t\t\t\tfillOpacity={isConnected ? 0.4 : 0.1}\n\t\t\t\tstroke={\n\t\t\t\t\tselectedNode !== null && isConnected\n\t\t\t\t\t\t? `url(#${chartId}-link-stroke-${index})`\n\t\t\t\t\t\t: \"none\"\n\t\t\t\t}\n\t\t\t\tstrokeWidth={1}\n\t\t\t\tstrokeOpacity={0.3}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t/>\n\t\t</Layer>\n\t)\n}\n\nconst isNodeConnected = (\n\tdata: SankeyData,\n\tselectedNode: string | null,\n\tnodeName: string,\n): boolean => {\n\tif (selectedNode === null || selectedNode === nodeName) return true\n\n\tconst selectedIdx = data.nodes.findIndex(node => node.name === selectedNode)\n\tconst nodeIdx = data.nodes.findIndex(node => node.name === nodeName)\n\n\treturn data.links.some(\n\t\tlink =>\n\t\t\t(link.source === selectedIdx && link.target === nodeIdx) ||\n\t\t\t(link.source === nodeIdx && link.target === selectedIdx),\n\t)\n}\n\nconst getLinkFill = (\n\tvariant: LinkVariant,\n\tchartId: string,\n\tindex: number,\n\tconfig: ChartConfig,\n\tsourceName: string,\n\ttargetName: string,\n): string => {\n\tswitch (variant) {\n\t\tcase \"gradient\":\n\t\t\treturn `url(#${chartId}-link-gradient-${index})`\n\t\tcase \"source\":\n\t\t\treturn sourceName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${sourceName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"target\":\n\t\t\treturn targetName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${targetName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"solid\":\n\t\tdefault:\n\t\t\treturn \"currentColor\"\n\t}\n}\n\nconst NodeColorGradients = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, nodeConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(nodeConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst LinkGradient = ({\n\tchartId,\n\tindex,\n\tconfig,\n\tsourceName,\n\ttargetName,\n}: {\n\tchartId: string\n\tindex: number\n\tconfig: ChartConfig\n\tsourceName: string\n\ttargetName: string\n}) => {\n\tconst sourceColor =\n\t\tsourceName in config ? `var(--color-${sourceName}-0)` : \"currentColor\"\n\tconst targetColor =\n\t\ttargetName in config ? `var(--color-${targetName}-0)` : \"currentColor\"\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-gradient-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor={sourceColor} stopOpacity={0.2} />\n\t\t\t<stop offset=\"50%\" stopColor={sourceColor} stopOpacity={0.5} />\n\t\t\t<stop offset=\"100%\" stopColor={targetColor} stopOpacity={0.2} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LinkStrokeGradient = ({\n\tchartId,\n\tindex,\n}: {\n\tchartId: string\n\tindex: number\n}) => {\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-stroke-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t\t<stop offset=\"15%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"50%\" stopColor=\"var(--primary)\" stopOpacity={1} />\n\t\t\t<stop offset=\"85%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"100%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LoadingSankey = () => {\n\tconst nodes = [\n\t\t{ x: 30, y: 25, width: 12, height: 65, delay: 0 },\n\t\t{ x: 30, y: 110, width: 12, height: 50, delay: 0.3 },\n\t\t{ x: 30, y: 180, width: 12, height: 45, delay: 0.15 },\n\t\t{ x: 244, y: 20, width: 12, height: 55, delay: 0.45 },\n\t\t{ x: 244, y: 95, width: 12, height: 75, delay: 0.6 },\n\t\t{ x: 244, y: 190, width: 12, height: 40, delay: 0.25 },\n\t\t{ x: 458, y: 35, width: 12, height: 80, delay: 0.5 },\n\t\t{ x: 458, y: 135, width: 12, height: 90, delay: 0.1 },\n\t]\n\n\tconst links = [\n\t\t{ from: 0, to: 3, width: 26, delay: 0.2 },\n\t\t{ from: 0, to: 4, width: 18, delay: 0.7 },\n\t\t{ from: 1, to: 4, width: 24, delay: 0.4 },\n\t\t{ from: 1, to: 5, width: 12, delay: 0.9 },\n\t\t{ from: 2, to: 4, width: 16, delay: 0.1 },\n\t\t{ from: 2, to: 5, width: 14, delay: 0.55 },\n\t\t{ from: 3, to: 6, width: 22, delay: 0.35 },\n\t\t{ from: 3, to: 7, width: 18, delay: 0.8 },\n\t\t{ from: 4, to: 6, width: 28, delay: 0.05 },\n\t\t{ from: 4, to: 7, width: 32, delay: 0.65 },\n\t\t{ from: 5, to: 7, width: 16, delay: 0.45 },\n\t]\n\n\tconst getLinkPath = (fromIdx: number, toIdx: number) => {\n\t\tconst from = nodes[fromIdx]\n\t\tconst to = nodes[toIdx]\n\t\tconst startX = from.x + from.width\n\t\tconst startY = from.y + from.height / 2\n\t\tconst endX = to.x\n\t\tconst endY = to.y + to.height / 2\n\t\tconst controlX1 = startX + (endX - startX) * 0.4\n\t\tconst controlX2 = startX + (endX - startX) * 0.6\n\t\treturn `M${startX},${startY} C${controlX1},${startY} ${controlX2},${endY} ${endX},${endY}`\n\t}\n\n\tconst baseDuration = LOADING_ANIMATION_DURATION / 1000\n\n\treturn (\n\t\t<>\n\t\t\t{links.map((link, i) => (\n\t\t\t\t<motion.path\n\t\t\t\t\tkey={`loading-link-${link.from}-${link.to}`}\n\t\t\t\t\td={getLinkPath(link.from, link.to)}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={link.width}\n\t\t\t\t\tinitial={{ opacity: 0.04 }}\n\t\t\t\t\tanimate={{ opacity: [0.04, 0.14, 0.04] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.8 + (i % 3) * 0.2),\n\t\t\t\t\t\tdelay: link.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{nodes.map((node, i) => (\n\t\t\t\t<motion.rect\n\t\t\t\t\tkey={`loading-node-${node.x}-${node.y}`}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\trx={2}\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tinitial={{ opacity: 0.15 }}\n\t\t\t\t\tanimate={{ opacity: [0.15, 0.4, 0.15] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.9 + (i % 4) * 0.1),\n\t\t\t\t\t\tdelay: node.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","React","jsx","jsxs","ChartDot","useId","jsx","jsxs","ResponsiveContainer","React","Fragment","jsx","jsxs","range","ResponsiveContainer","createContext","useCallback","useId","useMemo","useRef","useState","motion","Fragment","jsx","jsxs","createContext","AreaChart","useId","useState","useCallback","useMemo","Area","jsx","jsxs","Fragment","motion","useState","useCallback","useMemo","useRef","createContext","use","useCallback","useId","useMemo","useRef","useState","CartesianGrid","RechartsXAxis","RechartsYAxis","motion","useReducedMotion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","STACK_ID","REVEAL_EASE","BarChart","useLoadingData","Bar","ColorGradient","GradientPattern","jsxs","Fragment","jsx","motion","REVEAL_EASE","ColorGradient","GradientPattern","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","useRef","LOADING_ANIMATION_DURATION","CartesianGrid","RechartsXAxis","RechartsYAxis","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useRef","useState","motion","useReducedMotion","Fragment","jsx","jsxs","STROKE_WIDTH","LOADING_ANIMATION_DURATION","REVEAL_DURATION","REVEAL_EASE","LineChart","useLoadingData","Line","getOpacity","resolveDots","AnimatedDashedStroke","RevealMask","ColorGradient","Dot","ActiveDot","getOpacity","resolveDots","Children","isValidElement","Dot","jsx","ActiveDot","AnimatedDashedStroke","jsxs","Fragment","SINGLE_REVEAL_ORIGIN","RevealMask","REVEAL_DURATION","REVEAL_EASE","motion","ColorGradient","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","STROKE_WIDTH","LoadingPattern","useRef","LOADING_ANIMATION_DURATION","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useRef","useState","RechartsBar","CartesianGrid","RechartsLine","RechartsXAxis","RechartsYAxis","motion","useReducedMotion","Fragment","jsx","jsxs","DEFAULT_BAR_RADIUS","LOADING_ANIMATION_DURATION","createContext","useId","useState","useLoadingData","useCallback","useMemo","jsx","jsxs","LoadingBar","DEFAULT_BAR_RADIUS","generateEasedGradientStops","useLoadingData","useState","useCallback","useMemo","LoadingBar","jsxs","Fragment","jsx","RechartsBar","LoadingPattern","useRef","motion","LOADING_ANIMATION_DURATION","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useState","motion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","Children","isValidElement","jsx","Fragment","jsxs","LOADING_ANIMATION_DURATION","motion","Children","createContext","isValidElement","use","useCallback","useEffect","useId","useMemo","useState","Fragment","jsx","jsxs","STROKE_WIDTH","LOADING_ANIMATION_DURATION","useLoadingData","resolveDots","ColorGradient","Dot","ActiveDot","resolveDots","Children","isValidElement","Dot","jsx","ActiveDot","jsxs","Fragment","ColorGradient","useLoadingData","useState","useEffect","LOADING_ANIMATION_DURATION","useMemo","createContext","use","useCallback","useEffect","useId","useMemo","useState","Sector","Fragment","jsx","jsxs","DEFAULT_INNER_RADIUS","DEFAULT_OUTER_RADIUS","DEFAULT_CORNER_RADIUS","LOADING_ANIMATION_DURATION","useLoadingData","jsx","Fragment","jsxs","generateLoadingData","useLoadingData","useState","useEffect","LOADING_ANIMATION_DURATION","useMemo","DEFAULT_CORNER_RADIUS","Sector","Children","createContext","isValidElement","use","useCallback","useId","useMemo","useState","motion","Fragment","jsx","jsxs","LOADING_ANIMATION_DURATION","Children","isValidElement","jsx","jsxs","Fragment","LOADING_ANIMATION_DURATION","motion"]}