bruv-ui 0.3.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.
- package/dist/area-chart.js +2 -0
- package/dist/area-chart.js.map +1 -1
- package/dist/bar-chart.js +2 -0
- package/dist/bar-chart.js.map +1 -1
- package/dist/charts.js +2 -0
- package/dist/charts.js.map +1 -1
- package/dist/composed-chart.js +2 -0
- package/dist/composed-chart.js.map +1 -1
- package/dist/form-rhf.js +2 -0
- package/dist/form-rhf.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/line-chart.js +2 -0
- package/dist/line-chart.js.map +1 -1
- package/dist/pie-chart.js +2 -0
- package/dist/pie-chart.js.map +1 -1
- package/dist/radar-chart.js +2 -0
- package/dist/radar-chart.js.map +1 -1
- package/dist/radial-chart.js +2 -0
- package/dist/radial-chart.js.map +1 -1
- package/dist/sankey-chart.js +2 -0
- package/dist/sankey-chart.js.map +1 -1
- package/package.json +1 -1
package/dist/line-chart.js
CHANGED
package/dist/line-chart.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/line-chart.tsx","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-brush.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-dot.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 {\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 { 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 {\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 { 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"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","ResponsiveContainer","React","Fragment","jsx","jsxs","range","ResponsiveContainer","RechartsPrimitive","jsx","jsxs","React","jsx","jsxs","ChartDot","createContext","useCallback","useId","useMemo","useRef","useState","motion","Fragment","jsx","jsxs","LineChart","Line","Tooltip","Legend"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/line-chart.tsx","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-brush.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-dot.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 {\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 { 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 {\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 { 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"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","ResponsiveContainer","React","Fragment","jsx","jsxs","range","ResponsiveContainer","RechartsPrimitive","jsx","jsxs","React","jsx","jsxs","ChartDot","createContext","useCallback","useId","useMemo","useRef","useState","motion","Fragment","jsx","jsxs","LineChart","Line","Tooltip","Legend"]}
|