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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-background.tsx","../src/components/charts/radial-chart.tsx"],"sourcesContent":["import * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\tforwardRef,\n\tuseId,\n\tcreateContext,\n\tuseContext,\n\ttype ComponentProps,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nconst THEMES = { light: \"\", dark: '[data-theme=\"dark\"]' } as const\n\ntype ThemeKey = keyof typeof THEMES\n\ntype ThemeColorsBase = {\n\t[K in ThemeKey]?: string[]\n}\n\ntype AtLeastOneThemeColor = {\n\t[K in ThemeKey]: Required<Pick<ThemeColorsBase, K>> &\n\t\tPartial<Omit<ThemeColorsBase, K>>\n}[ThemeKey]\n\nconst VALID_THEME_KEYS = Object.keys(THEMES) as ThemeKey[]\n\nconst DEFAULT_PALETTE = [\n\t\"var(--color-bruv-chart-1)\",\n\t\"var(--color-bruv-chart-2)\",\n\t\"var(--color-bruv-chart-3)\",\n\t\"var(--color-bruv-chart-4)\",\n\t\"var(--color-bruv-chart-5)\",\n\t\"var(--color-bruv-chart-6)\",\n] as const\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\tlabel?: ReactNode\n\t\ticon?: ComponentType\n\t\tcolor?: string\n\t\tcolors?: AtLeastOneThemeColor\n\t}\n>\n\ninterface ChartContextProps {\n\tconfig: ChartConfig\n}\n\nconst ChartContext = createContext<ChartContextProps | null>(null)\n\nexport function useChart() {\n\tconst context = useContext(ChartContext)\n\tif (!context) {\n\t\tthrow new Error(\"useChart must be used within a <Chart />\")\n\t}\n\treturn context\n}\n\nfunction validateChartConfigColors(config: ChartConfig): void {\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value.colors) {\n\t\t\tconst hasValidThemeKey = VALID_THEME_KEYS.some(\n\t\t\t\tthemeKey => value.colors?.[themeKey] !== undefined,\n\t\t\t)\n\t\t\tif (!hasValidThemeKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[BruvCharts] Invalid chart config for \"${key}\": colors object must have at least one theme key (${VALID_THEME_KEYS.join(\", \")}).`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function applyDefaultChartColors(config: ChartConfig): ChartConfig {\n\tconst entries = Object.entries(config)\n\treturn Object.fromEntries(\n\t\tentries.map(([key, item], index) => {\n\t\t\tif (item.colors || item.color) {\n\t\t\t\tif (item.color && !item.colors) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tcolors: {\n\t\t\t\t\t\t\t\tlight: [item.color],\n\t\t\t\t\t\t\t\tdark: [item.color],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [key, item]\n\t\t\t}\n\t\t\tconst paletteColor =\n\t\t\t\tDEFAULT_PALETTE[index % DEFAULT_PALETTE.length] ?? DEFAULT_PALETTE[0]\n\t\t\treturn [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\t...item,\n\t\t\t\t\tcolors: {\n\t\t\t\t\t\tlight: [paletteColor],\n\t\t\t\t\t\tdark: [paletteColor],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t}),\n\t)\n}\n\nexport interface ChartProps\n\textends\n\t\tOmit<ComponentProps<\"div\">, \"children\">,\n\t\tPick<\n\t\t\tComponentProps<typeof RechartsPrimitive.ResponsiveContainer>,\n\t\t\t| \"initialDimension\"\n\t\t\t| \"aspect\"\n\t\t\t| \"debounce\"\n\t\t\t| \"minHeight\"\n\t\t\t| \"minWidth\"\n\t\t\t| \"maxHeight\"\n\t\t\t| \"height\"\n\t\t\t| \"width\"\n\t\t\t| \"onResize\"\n\t\t\t| \"children\"\n\t\t> {\n\tconfig: ChartConfig\n\tinnerResponsiveContainerStyle?: ComponentProps<\n\t\ttypeof RechartsPrimitive.ResponsiveContainer\n\t>[\"style\"]\n\tfooter?: ReactNode\n}\n\nexport const Chart = forwardRef<HTMLDivElement, ChartProps>(function Chart(\n\t{\n\t\tid,\n\t\tconfig,\n\t\tinitialDimension = { width: 320, height: 200 },\n\t\tclassName,\n\t\tchildren,\n\t\tfooter,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst uniqueId = useId()\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\tconst resolvedConfig = applyDefaultChartColors(config)\n\n\tvalidateChartConfigColors(resolvedConfig)\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config: resolvedConfig }}>\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bruv-chart relative flex min-h-0 w-full flex-1 flex-col justify-center text-bruv-sm text-bruv-secondary\",\n\t\t\t\t\t\"[&_.recharts-cartesian-axis-tick_text]:fill-bruv-chart-axis [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-bruv-chart-grid/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-bruv-chart-cursor [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-radial-bar-background-sector]:fill-bruv-subtle [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-bruv-subtle [&_.recharts-reference-line_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n\t\t\t\t\t!footer && \"aspect-video\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChartStyle id={chartId} config={resolvedConfig} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer\n\t\t\t\t\tclassName=\"min-h-0 w-full flex-1\"\n\t\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t)\n})\n\nexport function LoadingIndicator({ isLoading }: { isLoading: boolean }) {\n\tif (!isLoading) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n\t\t\t<div className=\"border-bruv-neutral bg-bruv-base-2 text-bruv-sm text-bruv-primary rounded-bruv-md flex items-center justify-center gap-2 border px-2 py-0.5\">\n\t\t\t\t<div className=\"border-bruv-neutral border-t-bruv-accent size-3 animate-spin rounded-full border\" />\n\t\t\t\t<span>Loading</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction distributeColors(colorsArray: string[], maxCount: number): string[] {\n\tconst availableCount = colorsArray.length\n\tif (availableCount >= maxCount) {\n\t\treturn colorsArray.slice(0, maxCount)\n\t}\n\n\tconst result: string[] = []\n\tconst baseSlots = Math.floor(maxCount / availableCount)\n\tconst extraSlots = maxCount % availableCount\n\n\tfor (let colorIdx = 0; colorIdx < availableCount; colorIdx++) {\n\t\tconst isExtraColor = colorIdx >= availableCount - extraSlots\n\t\tconst slotsForThisColor = baseSlots + (isExtraColor ? 1 : 0)\n\t\tfor (let j = 0; j < slotsForThisColor; j++) {\n\t\t\tconst color = colorsArray[colorIdx]\n\t\t\tif (color) result.push(color)\n\t\t}\n\t}\n\n\treturn result\n}\n\nexport function ChartStyle({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n}) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.colors)\n\n\tif (!colorConfig.length) return null\n\n\tconst generateCssVars = (theme: keyof typeof THEMES) =>\n\t\tcolorConfig\n\t\t\t.flatMap(([key, itemConfig]) => {\n\t\t\t\tconst colorsArray = itemConfig.colors?.[theme]\n\t\t\t\tif (!colorsArray?.length) return []\n\n\t\t\t\tconst maxCount = getColorsCount(itemConfig)\n\t\t\t\tconst distributedColors = distributeColors(colorsArray, maxCount)\n\n\t\t\t\treturn distributedColors.map(\n\t\t\t\t\t(color, index) => ` --color-${key}-${index}: ${color};`,\n\t\t\t\t)\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\n\tconst css = Object.entries(THEMES)\n\t\t.map(\n\t\t\t([theme, prefix]) =>\n\t\t\t\t`${prefix} [data-chart=${id}] {\\n${generateCssVars(theme as keyof typeof THEMES)}\\n}`,\n\t\t)\n\t\t.join(\"\\n\")\n\n\treturn <style dangerouslySetInnerHTML={{ __html: css }} />\n}\n\nexport function getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== \"object\" || payload === null) return undefined\n\n\tconst payloadPayload =\n\t\t\"payload\" in payload &&\n\t\ttypeof payload.payload === \"object\" &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined\n\n\tlet configLabelKey: string = key\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport function axisValueToPercentFormatter(value: number) {\n\treturn `${Math.round(value * 100).toFixed(0)}%`\n}\n\nexport function getColorsCount(config: ChartConfig[string]): number {\n\tif (!config.colors) return 1\n\tconst counts = VALID_THEME_KEYS.map(\n\t\ttheme => config.colors?.[theme]?.length ?? 0,\n\t)\n\treturn Math.max(...counts, 1)\n}\n\nexport const getLoadingData = (\n\tpoints: number = 10,\n\tmin: number = 0,\n\tmax: number = 70,\n) => {\n\tconst range = max - min\n\treturn Array.from({ length: points }, () => ({\n\t\tloading: Math.floor(Math.random() * range) + min,\n\t}))\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport type {\n\tNameType,\n\tValueType,\n} from \"recharts/types/component/DefaultTooltipContent\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype TooltipRoundness = \"sm\" | \"md\" | \"lg\" | \"xl\"\ntype TooltipVariant = \"default\" | \"frosted-glass\"\n\nconst roundnessMap: Record<TooltipRoundness, string> = {\n\tsm: \"rounded-bruv-sm\",\n\tmd: \"rounded-bruv-md\",\n\tlg: \"rounded-bruv-lg\",\n\txl: \"rounded-bruv-xl\",\n}\n\nconst variantMap: Record<TooltipVariant, string> = {\n\tdefault: \"bg-bruv-base-2\",\n\t\"frosted-glass\": \"bg-bruv-base-2/70 backdrop-blur-sm\",\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = \"dot\",\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tnameKey,\n\tlabelKey,\n\tselected,\n\troundness = \"lg\",\n\tvariant = \"default\",\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n\tReact.ComponentProps<\"div\"> & {\n\t\thideLabel?: boolean\n\t\thideIndicator?: boolean\n\t\tindicator?: \"line\" | \"dot\" | \"dashed\"\n\t\tnameKey?: string\n\t\tlabelKey?: string\n\t\tselected?: string | null\n\t\troundness?: TooltipRoundness\n\t\tvariant?: TooltipVariant\n\t} & Omit<\n\t\tRechartsPrimitive.DefaultTooltipContentProps<ValueType, NameType>,\n\t\t\"accessibilityLayer\"\n\t>) {\n\tconst { config } = useChart()\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst [item] = payload\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\tconst value =\n\t\t\t!labelKey && typeof label === \"string\"\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"font-medium\", labelClassName)}>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t])\n\n\tif (!active || !payload?.length) {\n\t\t// Empty tooltip - to prevent position getting 0.0 so it doesnt animate tooltip every time from 0.0 origin\n\t\treturn <span className=\"p-4\" />\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"border-bruv-neutral/50 grid min-w-32 items-start gap-1.5 border px-2.5 py-1.5 text-xs shadow-xl\",\n\t\t\t\troundnessMap[roundness],\n\t\t\t\tvariantMap[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel ? tooltipLabel : null}\n\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t// For pie charts, item.name contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t\t// For other charts, item.name or item.dataKey contains the series name\n\t\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst key = `${payloadName ?? item.name ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n\t\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5\",\n\t\t\t\t\t\t\t\t\tindicator === \"dot\" && \"items-center\",\n\t\t\t\t\t\t\t\t\tselected != null && selected !== item.dataKey && \"opacity-30\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{formatter && item?.value !== undefined && item.name ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"h-2.5 w-2.5\": indicator === \"dot\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-1\": indicator === \"line\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-0 border-[1.5px] border-dashed bg-transparent!\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"my-0.5\": nestLabel && indicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={getIndicatorColorStyle(key, colorsCount)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-1 justify-between gap-4 leading-none\",\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? \"items-end\" : \"items-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel ? tooltipLabel : null}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value != null && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary font-mono font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof item.value === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? item.value.toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getIndicatorColorStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { background: `var(--color-${dataKey}-0)` }\n\t}\n\n\t// Multiple colors: create linear gradient with evenly distributed stops\n\tconst stops = Array.from({ length: colorsCount }, (_, index) => {\n\t\tconst offset = (index / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${index}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\nconst ChartTooltip = ({\n\tanimationDuration = 200,\n\t...props\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) => (\n\t<RechartsPrimitive.Tooltip animationDuration={animationDuration} {...props} />\n)\n\nexport { ChartTooltip, ChartTooltipContent }\nexport type { TooltipRoundness, TooltipVariant }\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype ChartLegendVariant =\n\t| \"square\"\n\t| \"circle\"\n\t| \"circle-outline\"\n\t| \"rounded-square\"\n\t| \"rounded-square-outline\"\n\t| \"vertical-bar\"\n\t| \"horizontal-bar\"\n\nfunction ChartLegendContent({\n\tclassName,\n\thideIcon = false,\n\tnameKey,\n\tpayload,\n\tverticalAlign,\n\talign = \"right\",\n\tselected,\n\tonSelectChange,\n\tisClickable,\n\tvariant = \"rounded-square\",\n}: React.ComponentProps<\"div\"> & {\n\thideIcon?: boolean\n\tnameKey?: string\n\tselected?: string | null\n\tisClickable?: boolean\n\tonSelectChange?: (selected: string | null) => void\n\tvariant?: ChartLegendVariant\n} & RechartsPrimitive.DefaultLegendContentProps) {\n\tconst { config } = useChart()\n\n\tif (!payload?.length) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-4 select-none\",\n\t\t\t\talign === \"left\" && \"justify-start\",\n\t\t\t\talign === \"center\" && \"justify-center\",\n\t\t\t\talign === \"right\" && \"justify-end\",\n\t\t\t\tverticalAlign === \"top\" ? \"pb-4\" : \"pt-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{payload\n\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t.map(item => {\n\t\t\t\t\t// For pie charts, item.value contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t// For other charts, item.dataKey contains the series name (e.g., \"desktop\")\n\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\tconst key = `${payloadName ?? item.value ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\t\t\t\tconst isSelected = selected === null || selected === key\n\n\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex items-center gap-1.5 transition-opacity [&>svg]:h-3 [&>svg]:w-3\",\n\t\t\t\t\t\t\t\t!isSelected && \"opacity-30\",\n\t\t\t\t\t\t\t\tisClickable && \"cursor-pointer\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\t\t\tonSelectChange?.(selected === key ? null : key)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{itemConfig?.icon && !hideIcon ? (\n\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<LegendIndicator\n\t\t\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\t\t\tdataKey={key}\n\t\t\t\t\t\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{itemConfig?.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Legend indicator — each variant gets its own branch so future variants\n// can diverge freely in markup & style.\n// ---------------------------------------------------------------------------\n\nfunction LegendIndicator({\n\tvariant,\n\tdataKey,\n\tcolorsCount,\n}: {\n\tvariant: ChartLegendVariant\n\tdataKey: string\n\tcolorsCount: number\n}) {\n\tconst fillStyle = getLegendFillStyle(dataKey, colorsCount)\n\tconst outlineStyle = getLegendOutlineStyle(dataKey, colorsCount)\n\n\tswitch (variant) {\n\t\tcase \"square\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0\" style={fillStyle} />\n\n\t\tcase \"circle\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0 rounded-full\" style={fillStyle} />\n\n\t\tcase \"circle-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-full p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"vertical-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-3 w-1 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"horizontal-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-1 w-3 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"rounded-square-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-[3px] p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"rounded-square\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className=\"h-2 w-2 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Style helpers\n// ---------------------------------------------------------------------------\n\n/** Solid fill / gradient background for filled variants. */\nfunction getLegendFillStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { backgroundColor: `var(--color-${dataKey}-0)` }\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\n/**\n * Outline style for stroke variants.\n * Uses background + mask-composite to punch out the center, leaving only the\n * \"border\" visible. Works with both solid colors and gradients, and respects\n * border-radius — unlike plain `border-color`.\n */\nfunction getLegendOutlineStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tconst maskStyle: React.CSSProperties = {\n\t\tWebkitMask:\n\t\t\t\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tWebkitMaskComposite: \"xor\",\n\t\tmask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tmaskComposite: \"exclude\",\n\t}\n\n\tif (colorsCount <= 1) {\n\t\treturn {\n\t\t\tbackgroundColor: `var(--color-${dataKey}-0)`,\n\t\t\t...maskStyle,\n\t\t}\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn {\n\t\tbackground: `linear-gradient(to right, ${stops})`,\n\t\t...maskStyle,\n\t}\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nexport { ChartLegend, ChartLegendContent, type ChartLegendVariant }\n","import { ZIndexLayer } from \"recharts\"\nimport { useId } from \"react\"\n\n// ── Background Variant Types ─────────────────────────────────────────────────\n// To add a new variant:\n// 1. Add its name to the BackgroundVariant union type below\n// 2. Create a pattern component with PatternProps\n// 3. Register it in PATTERN_MAP\n\nexport type BackgroundVariant =\n\t| \"dots\"\n\t| \"grid\"\n\t| \"cross-hatch\"\n\t| \"diagonal-lines\"\n\t| \"plus\"\n\t| \"falling-triangles\"\n\t| \"4-pointed-star\"\n\t| \"tiny-checkers\"\n\t| \"overlapping-circles\"\n\t| \"wiggle-lines\"\n\t| \"bubbles\"\n\n// ── Pattern Components ───────────────────────────────────────────────────────\n\ntype PatternProps = { id: string }\n\nconst DotsPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<circle\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tcx=\"2\"\n\t\t\tcy=\"2\"\n\t\t\tr=\"1\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</pattern>\n)\n\nconst GridPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 20 0 L 0 0 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst CrossHatchPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid/60 text-bruv-chart-grid/50\"\n\t\t\td=\"M 0 0 L 20 20 M 20 0 L 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst DiagonalLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"6\"\n\t\theight=\"6\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"rotate(45)\"\n\t>\n\t\t<line\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"0\"\n\t\t\ty2=\"6\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst PlusPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 8 4 L 8 12 M 4 8 L 12 8\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t/>\n\t</pattern>\n)\n\nconst FallingTrianglesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"18\"\n\t\theight=\"36\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M2 6h12L8 18 2 6zm18 36h12l-6 12-6-12z\"\n\t\t\ttransform=\"scale(0.5)\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst FourPointedStarPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<polygon\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\tpoints=\"5 3 8 4 5 5 4 8 3 5 0 4 3 3 4 0 5 3\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst TinyCheckersPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"8\"\n\t\theight=\"8\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M0 0h4v4H0V0zm4 4h4v4H4V4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.2\"\n\t\t/>\n\t</pattern>\n)\n\nconst OverlappingCirclesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"40\"\n\t\theight=\"40\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M25 25c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5s-5-2.238-5-5 2.238-5 5-5zM5 5c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5S0 12.762 0 10s2.238-5 5-5zm5 4c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4zm20 20c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst WiggleLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"52\"\n\t\theight=\"26\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst BubblesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"100\"\n\t\theight=\"100\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6667)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t\tfillRule=\"evenodd\"\n\t\t/>\n\t</pattern>\n)\n\n// ── Pattern Registry ─────────────────────────────────────────────────────────\n// Map variant names to pattern components\n\nconst PATTERN_MAP: Record<BackgroundVariant, React.FC<PatternProps>> = {\n\tdots: DotsPattern,\n\tgrid: GridPattern,\n\tplus: PlusPattern,\n\tbubbles: BubblesPattern,\n\t\"cross-hatch\": CrossHatchPattern,\n\t\"diagonal-lines\": DiagonalLinesPattern,\n\t\"falling-triangles\": FallingTrianglesPattern,\n\t\"4-pointed-star\": FourPointedStarPattern,\n\t\"tiny-checkers\": TinyCheckersPattern,\n\t\"overlapping-circles\": OverlappingCirclesPattern,\n\t\"wiggle-lines\": WiggleLinesPattern,\n}\n\n// ── Main Component ───────────────────────────────────────────────────────────\n// Usage: Place <ChartBackground variant=\"dots\" /> inside any Recharts chart component.\n// ZIndexLayer with zIndex={-1} ensures the background renders behind all chart content.\n\ninterface ChartBackgroundProps {\n\tvariant: BackgroundVariant\n}\n\nexport function ChartBackground({ variant }: ChartBackgroundProps) {\n\tconst baseId = useId().replace(/:/g, \"\")\n\tconst patternId = `${baseId}-bg-${variant}`\n\tconst maskId = `${baseId}-bg-edge-fade`\n\tconst filterId = `${baseId}-bg-blur`\n\tconst PatternComponent = PATTERN_MAP[variant]\n\n\treturn (\n\t\t<ZIndexLayer zIndex={-1}>\n\t\t\t<defs>\n\t\t\t\t<PatternComponent id={patternId} />\n\t\t\t\t{/* Gaussian blur filter for soft edge fade */}\n\t\t\t\t<filter id={filterId}>\n\t\t\t\t\t<feGaussianBlur stdDeviation=\"25\" />\n\t\t\t\t</filter>\n\t\t\t\t{/* Mask: a slightly inset white rect with blur creates smooth transparent edges */}\n\t\t\t\t<mask id={maskId} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"8%\"\n\t\t\t\t\t\ty=\"20%\"\n\t\t\t\t\t\twidth=\"85%\"\n\t\t\t\t\t\theight=\"60%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tfilter={`url(#${filterId})`}\n\t\t\t\t\t/>\n\t\t\t\t</mask>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tfill={`url(#${patternId})`}\n\t\t\t\tmask={`url(#${maskId})`}\n\t\t\t/>\n\t\t</ZIndexLayer>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tRadialBar as RechartsRadialBar,\n\tRadialBarChart as RechartsRadialBarChart,\n\tSector,\n\ttype SectorProps,\n} from \"recharts\"\nimport type { TypedDataKey } from \"recharts/types/util/typedDataKey\"\n\nconst DEFAULT_INNER_RADIUS = \"30%\"\nconst DEFAULT_OUTER_RADIUS = \"100%\"\nconst DEFAULT_CORNER_RADIUS = 5\nconst DEFAULT_BAR_SIZE = 14\nconst LOADING_BARS = 5\nconst LOADING_ANIMATION_DURATION = 1500\n\ntype RadialBarChartProps = ComponentProps<typeof RechartsRadialBarChart>\ntype RadialBarRechartsProps = ComponentProps<typeof RechartsRadialBar>\n\ntype RadialVariant = \"full\" | \"semi\"\n\ntype RadialChartContextValue = {\n\tconfig: ChartConfig\n\tnameKey: string\n\tchartId: string\n\tisLoading: boolean\n\tselectedBar: string | null\n\tselectBar: (barName: string | null, value?: number) => void\n}\n\nconst RadialChartContext = createContext<RadialChartContextValue | null>(null)\n\nfunction useRadialChart() {\n\tconst context = use(RadialChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radial chart parts (<RadialBar />, <Tooltip />, …) must be used within <RadialChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype RadialChartBaseProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: RadialBarChartProps\n\tvariant?: RadialVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n\tbackgroundVariant?: BackgroundVariant\n}\n\ntype RadialChartProps<TData extends Record<string, unknown>> =\n\tRadialChartBaseProps<TData>\n\nexport type { RadialChartProps }\n\nexport function RadialChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tvariant = \"full\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tbackgroundVariant,\n}: RadialChartProps<TData>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedBar, setSelectedBar] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading)\n\n\tconst variantConfig = getVariantConfig(variant)\n\n\tconst selectBar = useCallback(\n\t\t(barName: string | null, value?: number) => {\n\t\t\tsetSelectedBar(barName)\n\t\t\tonSelectionChange?.(\n\t\t\t\tbarName === null ? null : { dataKey: barName, value: value ?? 0 },\n\t\t\t)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst preparedData = useMemo(\n\t\t() =>\n\t\t\tdata.map(item => ({\n\t\t\t\t...item,\n\t\t\t\tfill: `url(#${chartId}-radial-colors-${item[nameKey] as string})`,\n\t\t\t})),\n\t\t[data, nameKey, chartId],\n\t)\n\n\tconst contextValue = useMemo<RadialChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tnameKey,\n\t\t\tchartId,\n\t\t\tisLoading,\n\t\t\tselectedBar,\n\t\t\tselectBar,\n\t\t}),\n\t\t[config, nameKey, chartId, isLoading, selectedBar, selectBar],\n\t)\n\n\treturn (\n\t\t<RadialChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadialBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : preparedData}\n\t\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\t\touterRadius={outerRadius}\n\t\t\t\t\tstartAngle={variantConfig.startAngle}\n\t\t\t\t\tendAngle={variantConfig.endAngle}\n\t\t\t\t\tcx={variantConfig.cx}\n\t\t\t\t\tcy={variantConfig.cy}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadialBar />}\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ColorGradientStyle config={config} chartId={chartId} />\n\t\t\t\t\t</defs>\n\t\t\t\t</RechartsRadialBarChart>\n\t\t\t</Chart>\n\t\t</RadialChartContext>\n\t)\n}\n\ntype RadialBarProps = {\n\tdataKey: string\n\tcornerRadius?: number\n\tbarSize?: number\n\tshowBackground?: boolean\n\tisClickable?: boolean\n\tradialBarProps?: Omit<RadialBarRechartsProps, \"dataKey\">\n}\n\nexport function RadialBar({\n\tdataKey,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tbarSize = DEFAULT_BAR_SIZE,\n\tshowBackground = true,\n\tisClickable = false,\n\tradialBarProps,\n}: RadialBarProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadialBar\n\t\t\t\tdataKey={dataKey as TypedDataKey<Record<string, unknown>>}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tbarSize={barSize}\n\t\t\t\tbackground={showBackground}\n\t\t\t\tclassName=\"drop-shadow-sm\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(payload, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst entry = payload as Record<string, unknown>\n\t\t\t\t\tconst barName =\n\t\t\t\t\t\t(entry?.[nameKey] as string | undefined) ?? String(index)\n\t\t\t\t\tconst value = Number(entry?.[dataKey] ?? 0)\n\n\t\t\t\t\tselectBar(selectedBar === barName ? null : barName, value)\n\t\t\t\t}}\n\t\t\t\tshape={(props: SectorProps) => {\n\t\t\t\t\tconst barName = (props as unknown as Record<string, unknown>)[\n\t\t\t\t\t\tnameKey\n\t\t\t\t\t] as string\n\t\t\t\t\tconst isSelected = selectedBar === null || selectedBar === barName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\topacity={isClickable && !isSelected ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...radialBarProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { nameKey, isLoading } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedBar}\n\t\t\t\t\tonSelectChange={selectBar}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction getVariantConfig(variant: RadialVariant) {\n\tswitch (variant) {\n\t\tcase \"semi\":\n\t\t\treturn { startAngle: 180, endAngle: 0, cx: \"50%\", cy: \"70%\" }\n\t\tcase \"full\":\n\t\tdefault:\n\t\t\treturn { startAngle: 90, endAngle: -270, cx: \"50%\", cy: \"50%\" }\n\t}\n}\n\nconst ColorGradientStyle = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, colorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(colorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nfunction generateLoadingData() {\n\treturn Array.from({ length: LOADING_BARS }, (_, i) => ({\n\t\tname: `loading${i}`,\n\t\tvalue: 40 + Math.random() * 60,\n\t}))\n}\n\nfunction useLoadingData(isLoading: boolean) {\n\tconst [tick, setTick] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetTick(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(() => generateLoadingData(), [tick])\n\n\treturn loadingData\n}\n\nconst LoadingRadialBar = () => {\n\treturn (\n\t\t<RechartsRadialBar\n\t\t\tdataKey=\"value\"\n\t\t\tcornerRadius={DEFAULT_CORNER_RADIUS}\n\t\t\tbarSize={DEFAULT_BAR_SIZE}\n\t\t\tbackground\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t\tshape={(props: SectorProps) => (\n\t\t\t\t<Sector {...props} fill=\"currentColor\" fillOpacity={0.25} />\n\t\t\t)}\n\t\t/>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","useId","jsx","jsxs","createContext","useId","useMemo","Fragment","jsx","jsxs","Tooltip","Legend"]}
1
+ {"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-legend.tsx","../src/components/charts/chart-background.tsx","../src/components/charts/radial-chart.tsx"],"sourcesContent":["import * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\tforwardRef,\n\tuseId,\n\tcreateContext,\n\tuseContext,\n\ttype ComponentProps,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nconst THEMES = { light: \"\", dark: '[data-theme=\"dark\"]' } as const\n\ntype ThemeKey = keyof typeof THEMES\n\ntype ThemeColorsBase = {\n\t[K in ThemeKey]?: string[]\n}\n\ntype AtLeastOneThemeColor = {\n\t[K in ThemeKey]: Required<Pick<ThemeColorsBase, K>> &\n\t\tPartial<Omit<ThemeColorsBase, K>>\n}[ThemeKey]\n\nconst VALID_THEME_KEYS = Object.keys(THEMES) as ThemeKey[]\n\nconst DEFAULT_PALETTE = [\n\t\"var(--color-bruv-chart-1)\",\n\t\"var(--color-bruv-chart-2)\",\n\t\"var(--color-bruv-chart-3)\",\n\t\"var(--color-bruv-chart-4)\",\n\t\"var(--color-bruv-chart-5)\",\n\t\"var(--color-bruv-chart-6)\",\n] as const\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\tlabel?: ReactNode\n\t\ticon?: ComponentType\n\t\tcolor?: string\n\t\tcolors?: AtLeastOneThemeColor\n\t}\n>\n\ninterface ChartContextProps {\n\tconfig: ChartConfig\n}\n\nconst ChartContext = createContext<ChartContextProps | null>(null)\n\nexport function useChart() {\n\tconst context = useContext(ChartContext)\n\tif (!context) {\n\t\tthrow new Error(\"useChart must be used within a <Chart />\")\n\t}\n\treturn context\n}\n\nfunction validateChartConfigColors(config: ChartConfig): void {\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value.colors) {\n\t\t\tconst hasValidThemeKey = VALID_THEME_KEYS.some(\n\t\t\t\tthemeKey => value.colors?.[themeKey] !== undefined,\n\t\t\t)\n\t\t\tif (!hasValidThemeKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[BruvCharts] Invalid chart config for \"${key}\": colors object must have at least one theme key (${VALID_THEME_KEYS.join(\", \")}).`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function applyDefaultChartColors(config: ChartConfig): ChartConfig {\n\tconst entries = Object.entries(config)\n\treturn Object.fromEntries(\n\t\tentries.map(([key, item], index) => {\n\t\t\tif (item.colors || item.color) {\n\t\t\t\tif (item.color && !item.colors) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tcolors: {\n\t\t\t\t\t\t\t\tlight: [item.color],\n\t\t\t\t\t\t\t\tdark: [item.color],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [key, item]\n\t\t\t}\n\t\t\tconst paletteColor =\n\t\t\t\tDEFAULT_PALETTE[index % DEFAULT_PALETTE.length] ?? DEFAULT_PALETTE[0]\n\t\t\treturn [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\t...item,\n\t\t\t\t\tcolors: {\n\t\t\t\t\t\tlight: [paletteColor],\n\t\t\t\t\t\tdark: [paletteColor],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t}),\n\t)\n}\n\nexport interface ChartProps\n\textends\n\t\tOmit<ComponentProps<\"div\">, \"children\">,\n\t\tPick<\n\t\t\tComponentProps<typeof RechartsPrimitive.ResponsiveContainer>,\n\t\t\t| \"initialDimension\"\n\t\t\t| \"aspect\"\n\t\t\t| \"debounce\"\n\t\t\t| \"minHeight\"\n\t\t\t| \"minWidth\"\n\t\t\t| \"maxHeight\"\n\t\t\t| \"height\"\n\t\t\t| \"width\"\n\t\t\t| \"onResize\"\n\t\t\t| \"children\"\n\t\t> {\n\tconfig: ChartConfig\n\tinnerResponsiveContainerStyle?: ComponentProps<\n\t\ttypeof RechartsPrimitive.ResponsiveContainer\n\t>[\"style\"]\n\tfooter?: ReactNode\n}\n\nexport const Chart = forwardRef<HTMLDivElement, ChartProps>(function Chart(\n\t{\n\t\tid,\n\t\tconfig,\n\t\tinitialDimension = { width: 320, height: 200 },\n\t\tclassName,\n\t\tchildren,\n\t\tfooter,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst uniqueId = useId()\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\tconst resolvedConfig = applyDefaultChartColors(config)\n\n\tvalidateChartConfigColors(resolvedConfig)\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config: resolvedConfig }}>\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bruv-chart relative flex min-h-0 w-full flex-1 flex-col justify-center text-bruv-sm text-bruv-secondary\",\n\t\t\t\t\t\"[&_.recharts-cartesian-axis-tick_text]:fill-bruv-chart-axis [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-bruv-chart-grid/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-bruv-chart-cursor [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-radial-bar-background-sector]:fill-bruv-subtle [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-bruv-subtle [&_.recharts-reference-line_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n\t\t\t\t\t!footer && \"aspect-video\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChartStyle id={chartId} config={resolvedConfig} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer\n\t\t\t\t\tclassName=\"min-h-0 w-full flex-1\"\n\t\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t)\n})\n\nexport function LoadingIndicator({ isLoading }: { isLoading: boolean }) {\n\tif (!isLoading) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n\t\t\t<div className=\"border-bruv-neutral bg-bruv-base-2 text-bruv-sm text-bruv-primary rounded-bruv-md flex items-center justify-center gap-2 border px-2 py-0.5\">\n\t\t\t\t<div className=\"border-bruv-neutral border-t-bruv-accent size-3 animate-spin rounded-full border\" />\n\t\t\t\t<span>Loading</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction distributeColors(colorsArray: string[], maxCount: number): string[] {\n\tconst availableCount = colorsArray.length\n\tif (availableCount >= maxCount) {\n\t\treturn colorsArray.slice(0, maxCount)\n\t}\n\n\tconst result: string[] = []\n\tconst baseSlots = Math.floor(maxCount / availableCount)\n\tconst extraSlots = maxCount % availableCount\n\n\tfor (let colorIdx = 0; colorIdx < availableCount; colorIdx++) {\n\t\tconst isExtraColor = colorIdx >= availableCount - extraSlots\n\t\tconst slotsForThisColor = baseSlots + (isExtraColor ? 1 : 0)\n\t\tfor (let j = 0; j < slotsForThisColor; j++) {\n\t\t\tconst color = colorsArray[colorIdx]\n\t\t\tif (color) result.push(color)\n\t\t}\n\t}\n\n\treturn result\n}\n\nexport function ChartStyle({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n}) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.colors)\n\n\tif (!colorConfig.length) return null\n\n\tconst generateCssVars = (theme: keyof typeof THEMES) =>\n\t\tcolorConfig\n\t\t\t.flatMap(([key, itemConfig]) => {\n\t\t\t\tconst colorsArray = itemConfig.colors?.[theme]\n\t\t\t\tif (!colorsArray?.length) return []\n\n\t\t\t\tconst maxCount = getColorsCount(itemConfig)\n\t\t\t\tconst distributedColors = distributeColors(colorsArray, maxCount)\n\n\t\t\t\treturn distributedColors.map(\n\t\t\t\t\t(color, index) => ` --color-${key}-${index}: ${color};`,\n\t\t\t\t)\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\n\tconst css = Object.entries(THEMES)\n\t\t.map(\n\t\t\t([theme, prefix]) =>\n\t\t\t\t`${prefix} [data-chart=${id}] {\\n${generateCssVars(theme as keyof typeof THEMES)}\\n}`,\n\t\t)\n\t\t.join(\"\\n\")\n\n\treturn <style dangerouslySetInnerHTML={{ __html: css }} />\n}\n\nexport function getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== \"object\" || payload === null) return undefined\n\n\tconst payloadPayload =\n\t\t\"payload\" in payload &&\n\t\ttypeof payload.payload === \"object\" &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined\n\n\tlet configLabelKey: string = key\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport function axisValueToPercentFormatter(value: number) {\n\treturn `${Math.round(value * 100).toFixed(0)}%`\n}\n\nexport function getColorsCount(config: ChartConfig[string]): number {\n\tif (!config.colors) return 1\n\tconst counts = VALID_THEME_KEYS.map(\n\t\ttheme => config.colors?.[theme]?.length ?? 0,\n\t)\n\treturn Math.max(...counts, 1)\n}\n\nexport const getLoadingData = (\n\tpoints: number = 10,\n\tmin: number = 0,\n\tmax: number = 70,\n) => {\n\tconst range = max - min\n\treturn Array.from({ length: points }, () => ({\n\t\tloading: Math.floor(Math.random() * range) + min,\n\t}))\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport type {\n\tNameType,\n\tValueType,\n} from \"recharts/types/component/DefaultTooltipContent\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype TooltipRoundness = \"sm\" | \"md\" | \"lg\" | \"xl\"\ntype TooltipVariant = \"default\" | \"frosted-glass\"\n\nconst roundnessMap: Record<TooltipRoundness, string> = {\n\tsm: \"rounded-bruv-sm\",\n\tmd: \"rounded-bruv-md\",\n\tlg: \"rounded-bruv-lg\",\n\txl: \"rounded-bruv-xl\",\n}\n\nconst variantMap: Record<TooltipVariant, string> = {\n\tdefault: \"bg-bruv-base-2\",\n\t\"frosted-glass\": \"bg-bruv-base-2/70 backdrop-blur-sm\",\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = \"dot\",\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tnameKey,\n\tlabelKey,\n\tselected,\n\troundness = \"lg\",\n\tvariant = \"default\",\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n\tReact.ComponentProps<\"div\"> & {\n\t\thideLabel?: boolean\n\t\thideIndicator?: boolean\n\t\tindicator?: \"line\" | \"dot\" | \"dashed\"\n\t\tnameKey?: string\n\t\tlabelKey?: string\n\t\tselected?: string | null\n\t\troundness?: TooltipRoundness\n\t\tvariant?: TooltipVariant\n\t} & Omit<\n\t\tRechartsPrimitive.DefaultTooltipContentProps<ValueType, NameType>,\n\t\t\"accessibilityLayer\"\n\t>) {\n\tconst { config } = useChart()\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst [item] = payload\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\tconst value =\n\t\t\t!labelKey && typeof label === \"string\"\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"font-medium\", labelClassName)}>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t])\n\n\tif (!active || !payload?.length) {\n\t\t// Empty tooltip - to prevent position getting 0.0 so it doesnt animate tooltip every time from 0.0 origin\n\t\treturn <span className=\"p-4\" />\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"border-bruv-neutral/50 grid min-w-32 items-start gap-1.5 border px-2.5 py-1.5 text-xs shadow-xl\",\n\t\t\t\troundnessMap[roundness],\n\t\t\t\tvariantMap[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel ? tooltipLabel : null}\n\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t// For pie charts, item.name contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t\t// For other charts, item.name or item.dataKey contains the series name\n\t\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst key = `${payloadName ?? item.name ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n\t\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5\",\n\t\t\t\t\t\t\t\t\tindicator === \"dot\" && \"items-center\",\n\t\t\t\t\t\t\t\t\tselected != null && selected !== item.dataKey && \"opacity-30\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{formatter && item?.value !== undefined && item.name ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"h-2.5 w-2.5\": indicator === \"dot\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-1\": indicator === \"line\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-0 border-[1.5px] border-dashed bg-transparent!\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"my-0.5\": nestLabel && indicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={getIndicatorColorStyle(key, colorsCount)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-1 justify-between gap-4 leading-none\",\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? \"items-end\" : \"items-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel ? tooltipLabel : null}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value != null && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary font-mono font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof item.value === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? item.value.toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getIndicatorColorStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { background: `var(--color-${dataKey}-0)` }\n\t}\n\n\t// Multiple colors: create linear gradient with evenly distributed stops\n\tconst stops = Array.from({ length: colorsCount }, (_, index) => {\n\t\tconst offset = (index / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${index}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\nconst ChartTooltip = ({\n\tanimationDuration = 200,\n\t...props\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) => (\n\t<RechartsPrimitive.Tooltip animationDuration={animationDuration} {...props} />\n)\n\nexport { ChartTooltip, ChartTooltipContent }\nexport type { TooltipRoundness, TooltipVariant }\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype ChartLegendVariant =\n\t| \"square\"\n\t| \"circle\"\n\t| \"circle-outline\"\n\t| \"rounded-square\"\n\t| \"rounded-square-outline\"\n\t| \"vertical-bar\"\n\t| \"horizontal-bar\"\n\nfunction ChartLegendContent({\n\tclassName,\n\thideIcon = false,\n\tnameKey,\n\tpayload,\n\tverticalAlign,\n\talign = \"right\",\n\tselected,\n\tonSelectChange,\n\tisClickable,\n\tvariant = \"rounded-square\",\n}: React.ComponentProps<\"div\"> & {\n\thideIcon?: boolean\n\tnameKey?: string\n\tselected?: string | null\n\tisClickable?: boolean\n\tonSelectChange?: (selected: string | null) => void\n\tvariant?: ChartLegendVariant\n} & RechartsPrimitive.DefaultLegendContentProps) {\n\tconst { config } = useChart()\n\n\tif (!payload?.length) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-4 select-none\",\n\t\t\t\talign === \"left\" && \"justify-start\",\n\t\t\t\talign === \"center\" && \"justify-center\",\n\t\t\t\talign === \"right\" && \"justify-end\",\n\t\t\t\tverticalAlign === \"top\" ? \"pb-4\" : \"pt-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{payload\n\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t.map(item => {\n\t\t\t\t\t// For pie charts, item.value contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t// For other charts, item.dataKey contains the series name (e.g., \"desktop\")\n\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\tconst key = `${payloadName ?? item.value ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\t\t\t\tconst isSelected = selected === null || selected === key\n\n\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex items-center gap-1.5 transition-opacity [&>svg]:h-3 [&>svg]:w-3\",\n\t\t\t\t\t\t\t\t!isSelected && \"opacity-30\",\n\t\t\t\t\t\t\t\tisClickable && \"cursor-pointer\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\t\t\t\tonSelectChange?.(selected === key ? null : key)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{itemConfig?.icon && !hideIcon ? (\n\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<LegendIndicator\n\t\t\t\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\t\t\t\tdataKey={key}\n\t\t\t\t\t\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{itemConfig?.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Legend indicator — each variant gets its own branch so future variants\n// can diverge freely in markup & style.\n// ---------------------------------------------------------------------------\n\nfunction LegendIndicator({\n\tvariant,\n\tdataKey,\n\tcolorsCount,\n}: {\n\tvariant: ChartLegendVariant\n\tdataKey: string\n\tcolorsCount: number\n}) {\n\tconst fillStyle = getLegendFillStyle(dataKey, colorsCount)\n\tconst outlineStyle = getLegendOutlineStyle(dataKey, colorsCount)\n\n\tswitch (variant) {\n\t\tcase \"square\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0\" style={fillStyle} />\n\n\t\tcase \"circle\":\n\t\t\treturn <div className=\"h-2 w-2 shrink-0 rounded-full\" style={fillStyle} />\n\n\t\tcase \"circle-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-full p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"vertical-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-3 w-1 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"horizontal-bar\":\n\t\t\treturn (\n\t\t\t\t<div className=\"h-1 w-3 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\n\t\tcase \"rounded-square-outline\":\n\t\t\treturn (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2.5 w-2.5 shrink-0 rounded-[3px] p-[1.5px]\"\n\t\t\t\t\tstyle={outlineStyle}\n\t\t\t\t/>\n\t\t\t)\n\n\t\tcase \"rounded-square\":\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<div className=\"h-2 w-2 shrink-0 rounded-[2px]\" style={fillStyle} />\n\t\t\t)\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Style helpers\n// ---------------------------------------------------------------------------\n\n/** Solid fill / gradient background for filled variants. */\nfunction getLegendFillStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { backgroundColor: `var(--color-${dataKey}-0)` }\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\n/**\n * Outline style for stroke variants.\n * Uses background + mask-composite to punch out the center, leaving only the\n * \"border\" visible. Works with both solid colors and gradients, and respects\n * border-radius — unlike plain `border-color`.\n */\nfunction getLegendOutlineStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tconst maskStyle: React.CSSProperties = {\n\t\tWebkitMask:\n\t\t\t\"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tWebkitMaskComposite: \"xor\",\n\t\tmask: \"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)\",\n\t\tmaskComposite: \"exclude\",\n\t}\n\n\tif (colorsCount <= 1) {\n\t\treturn {\n\t\t\tbackgroundColor: `var(--color-${dataKey}-0)`,\n\t\t\t...maskStyle,\n\t\t}\n\t}\n\n\tconst stops = Array.from({ length: colorsCount }, (_, i) => {\n\t\tconst offset = (i / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${i}) ${offset}%`\n\t}).join(\", \")\n\n\treturn {\n\t\tbackground: `linear-gradient(to right, ${stops})`,\n\t\t...maskStyle,\n\t}\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nexport { ChartLegend, ChartLegendContent, type ChartLegendVariant }\n","import { ZIndexLayer } from \"recharts\"\nimport { useId } from \"react\"\n\n// ── Background Variant Types ─────────────────────────────────────────────────\n// To add a new variant:\n// 1. Add its name to the BackgroundVariant union type below\n// 2. Create a pattern component with PatternProps\n// 3. Register it in PATTERN_MAP\n\nexport type BackgroundVariant =\n\t| \"dots\"\n\t| \"grid\"\n\t| \"cross-hatch\"\n\t| \"diagonal-lines\"\n\t| \"plus\"\n\t| \"falling-triangles\"\n\t| \"4-pointed-star\"\n\t| \"tiny-checkers\"\n\t| \"overlapping-circles\"\n\t| \"wiggle-lines\"\n\t| \"bubbles\"\n\n// ── Pattern Components ───────────────────────────────────────────────────────\n\ntype PatternProps = { id: string }\n\nconst DotsPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<circle\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tcx=\"2\"\n\t\t\tcy=\"2\"\n\t\t\tr=\"1\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</pattern>\n)\n\nconst GridPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 20 0 L 0 0 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst CrossHatchPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid/60 text-bruv-chart-grid/50\"\n\t\t\td=\"M 0 0 L 20 20 M 20 0 L 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst DiagonalLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"6\"\n\t\theight=\"6\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"rotate(45)\"\n\t>\n\t\t<line\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"0\"\n\t\t\ty2=\"6\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst PlusPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 8 4 L 8 12 M 4 8 L 12 8\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t/>\n\t</pattern>\n)\n\nconst FallingTrianglesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"18\"\n\t\theight=\"36\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M2 6h12L8 18 2 6zm18 36h12l-6 12-6-12z\"\n\t\t\ttransform=\"scale(0.5)\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst FourPointedStarPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<polygon\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\tpoints=\"5 3 8 4 5 5 4 8 3 5 0 4 3 3 4 0 5 3\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst TinyCheckersPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"8\"\n\t\theight=\"8\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M0 0h4v4H0V0zm4 4h4v4H4V4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.2\"\n\t\t/>\n\t</pattern>\n)\n\nconst OverlappingCirclesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"40\"\n\t\theight=\"40\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M25 25c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5s-5-2.238-5-5 2.238-5 5-5zM5 5c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5S0 12.762 0 10s2.238-5 5-5zm5 4c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4zm20 20c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst WiggleLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"52\"\n\t\theight=\"26\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst BubblesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"100\"\n\t\theight=\"100\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6667)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t\tfillRule=\"evenodd\"\n\t\t/>\n\t</pattern>\n)\n\n// ── Pattern Registry ─────────────────────────────────────────────────────────\n// Map variant names to pattern components\n\nconst PATTERN_MAP: Record<BackgroundVariant, React.FC<PatternProps>> = {\n\tdots: DotsPattern,\n\tgrid: GridPattern,\n\tplus: PlusPattern,\n\tbubbles: BubblesPattern,\n\t\"cross-hatch\": CrossHatchPattern,\n\t\"diagonal-lines\": DiagonalLinesPattern,\n\t\"falling-triangles\": FallingTrianglesPattern,\n\t\"4-pointed-star\": FourPointedStarPattern,\n\t\"tiny-checkers\": TinyCheckersPattern,\n\t\"overlapping-circles\": OverlappingCirclesPattern,\n\t\"wiggle-lines\": WiggleLinesPattern,\n}\n\n// ── Main Component ───────────────────────────────────────────────────────────\n// Usage: Place <ChartBackground variant=\"dots\" /> inside any Recharts chart component.\n// ZIndexLayer with zIndex={-1} ensures the background renders behind all chart content.\n\ninterface ChartBackgroundProps {\n\tvariant: BackgroundVariant\n}\n\nexport function ChartBackground({ variant }: ChartBackgroundProps) {\n\tconst baseId = useId().replace(/:/g, \"\")\n\tconst patternId = `${baseId}-bg-${variant}`\n\tconst maskId = `${baseId}-bg-edge-fade`\n\tconst filterId = `${baseId}-bg-blur`\n\tconst PatternComponent = PATTERN_MAP[variant]\n\n\treturn (\n\t\t<ZIndexLayer zIndex={-1}>\n\t\t\t<defs>\n\t\t\t\t<PatternComponent id={patternId} />\n\t\t\t\t{/* Gaussian blur filter for soft edge fade */}\n\t\t\t\t<filter id={filterId}>\n\t\t\t\t\t<feGaussianBlur stdDeviation=\"25\" />\n\t\t\t\t</filter>\n\t\t\t\t{/* Mask: a slightly inset white rect with blur creates smooth transparent edges */}\n\t\t\t\t<mask id={maskId} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"8%\"\n\t\t\t\t\t\ty=\"20%\"\n\t\t\t\t\t\twidth=\"85%\"\n\t\t\t\t\t\theight=\"60%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tfilter={`url(#${filterId})`}\n\t\t\t\t\t/>\n\t\t\t\t</mask>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tfill={`url(#${patternId})`}\n\t\t\t\tmask={`url(#${maskId})`}\n\t\t\t/>\n\t\t</ZIndexLayer>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tcreateContext,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tRadialBar as RechartsRadialBar,\n\tRadialBarChart as RechartsRadialBarChart,\n\tSector,\n\ttype SectorProps,\n} from \"recharts\"\nimport type { TypedDataKey } from \"recharts/types/util/typedDataKey\"\n\nconst DEFAULT_INNER_RADIUS = \"30%\"\nconst DEFAULT_OUTER_RADIUS = \"100%\"\nconst DEFAULT_CORNER_RADIUS = 5\nconst DEFAULT_BAR_SIZE = 14\nconst LOADING_BARS = 5\nconst LOADING_ANIMATION_DURATION = 1500\n\ntype RadialBarChartProps = ComponentProps<typeof RechartsRadialBarChart>\ntype RadialBarRechartsProps = ComponentProps<typeof RechartsRadialBar>\n\ntype RadialVariant = \"full\" | \"semi\"\n\ntype RadialChartContextValue = {\n\tconfig: ChartConfig\n\tnameKey: string\n\tchartId: string\n\tisLoading: boolean\n\tselectedBar: string | null\n\tselectBar: (barName: string | null, value?: number) => void\n}\n\nconst RadialChartContext = createContext<RadialChartContextValue | null>(null)\n\nfunction useRadialChart() {\n\tconst context = use(RadialChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radial chart parts (<RadialBar />, <Tooltip />, …) must be used within <RadialChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype RadialChartBaseProps<TData extends Record<string, unknown>> = {\n\tconfig: ChartConfig\n\tdata: TData[]\n\tnameKey: keyof TData & string\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: RadialBarChartProps\n\tvariant?: RadialVariant\n\tinnerRadius?: number | string\n\touterRadius?: number | string\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n\tbackgroundVariant?: BackgroundVariant\n}\n\ntype RadialChartProps<TData extends Record<string, unknown>> =\n\tRadialChartBaseProps<TData>\n\nexport type { RadialChartProps }\n\nexport function RadialChart<TData extends Record<string, unknown>>({\n\tconfig,\n\tdata,\n\tnameKey,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tvariant = \"full\",\n\tinnerRadius = DEFAULT_INNER_RADIUS,\n\touterRadius = DEFAULT_OUTER_RADIUS,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tbackgroundVariant,\n}: RadialChartProps<TData>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedBar, setSelectedBar] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading)\n\n\tconst variantConfig = getVariantConfig(variant)\n\n\tconst selectBar = useCallback(\n\t\t(barName: string | null, value?: number) => {\n\t\t\tsetSelectedBar(barName)\n\t\t\tonSelectionChange?.(\n\t\t\t\tbarName === null ? null : { dataKey: barName, value: value ?? 0 },\n\t\t\t)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst preparedData = useMemo(\n\t\t() =>\n\t\t\tdata.map(item => ({\n\t\t\t\t...item,\n\t\t\t\tfill: `url(#${chartId}-radial-colors-${item[nameKey] as string})`,\n\t\t\t})),\n\t\t[data, nameKey, chartId],\n\t)\n\n\tconst contextValue = useMemo<RadialChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tnameKey,\n\t\t\tchartId,\n\t\t\tisLoading,\n\t\t\tselectedBar,\n\t\t\tselectBar,\n\t\t}),\n\t\t[config, nameKey, chartId, isLoading, selectedBar, selectBar],\n\t)\n\n\treturn (\n\t\t<RadialChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadialBarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : preparedData}\n\t\t\t\t\tinnerRadius={innerRadius}\n\t\t\t\t\touterRadius={outerRadius}\n\t\t\t\t\tstartAngle={variantConfig.startAngle}\n\t\t\t\t\tendAngle={variantConfig.endAngle}\n\t\t\t\t\tcx={variantConfig.cx}\n\t\t\t\t\tcy={variantConfig.cy}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadialBar />}\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<ColorGradientStyle config={config} chartId={chartId} />\n\t\t\t\t\t</defs>\n\t\t\t\t</RechartsRadialBarChart>\n\t\t\t</Chart>\n\t\t</RadialChartContext>\n\t)\n}\n\ntype RadialBarProps = {\n\tdataKey: string\n\tcornerRadius?: number\n\tbarSize?: number\n\tshowBackground?: boolean\n\tisClickable?: boolean\n\tradialBarProps?: Omit<RadialBarRechartsProps, \"dataKey\">\n}\n\nexport function RadialBar({\n\tdataKey,\n\tcornerRadius = DEFAULT_CORNER_RADIUS,\n\tbarSize = DEFAULT_BAR_SIZE,\n\tshowBackground = true,\n\tisClickable = false,\n\tradialBarProps,\n}: RadialBarProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadialBar\n\t\t\t\tdataKey={dataKey as TypedDataKey<Record<string, unknown>>}\n\t\t\t\tcornerRadius={cornerRadius}\n\t\t\t\tbarSize={barSize}\n\t\t\t\tbackground={showBackground}\n\t\t\t\tclassName=\"drop-shadow-sm\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={(payload, index) => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tconst entry = payload as Record<string, unknown>\n\t\t\t\t\tconst barName =\n\t\t\t\t\t\t(entry?.[nameKey] as string | undefined) ?? String(index)\n\t\t\t\t\tconst value = Number(entry?.[dataKey] ?? 0)\n\n\t\t\t\t\tselectBar(selectedBar === barName ? null : barName, value)\n\t\t\t\t}}\n\t\t\t\tshape={(props: SectorProps) => {\n\t\t\t\t\tconst barName = (props as unknown as Record<string, unknown>)[\n\t\t\t\t\t\tnameKey\n\t\t\t\t\t] as string\n\t\t\t\t\tconst isSelected = selectedBar === null || selectedBar === barName\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Sector\n\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\topacity={isClickable && !isSelected ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t}}\n\t\t\t\t{...radialBarProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { nameKey, isLoading } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { nameKey, isLoading, selectedBar, selectBar } = useRadialChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedBar}\n\t\t\t\t\tonSelectChange={selectBar}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tnameKey={nameKey}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nfunction getVariantConfig(variant: RadialVariant) {\n\tswitch (variant) {\n\t\tcase \"semi\":\n\t\t\treturn { startAngle: 180, endAngle: 0, cx: \"50%\", cy: \"70%\" }\n\t\tcase \"full\":\n\t\tdefault:\n\t\t\treturn { startAngle: 90, endAngle: -270, cx: \"50%\", cy: \"50%\" }\n\t}\n}\n\nconst ColorGradientStyle = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, colorConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(colorConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-radial-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"1\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nfunction generateLoadingData() {\n\treturn Array.from({ length: LOADING_BARS }, (_, i) => ({\n\t\tname: `loading${i}`,\n\t\tvalue: 40 + Math.random() * 60,\n\t}))\n}\n\nfunction useLoadingData(isLoading: boolean) {\n\tconst [tick, setTick] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetTick(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(() => generateLoadingData(), [tick])\n\n\treturn loadingData\n}\n\nconst LoadingRadialBar = () => {\n\treturn (\n\t\t<RechartsRadialBar\n\t\t\tdataKey=\"value\"\n\t\t\tcornerRadius={DEFAULT_CORNER_RADIUS}\n\t\t\tbarSize={DEFAULT_BAR_SIZE}\n\t\t\tbackground\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t\tshape={(props: SectorProps) => (\n\t\t\t\t<Sector {...props} fill=\"currentColor\" fillOpacity={0.25} />\n\t\t\t)}\n\t\t/>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","useId","jsx","jsxs","createContext","useId","useMemo","Fragment","jsx","jsxs","Tooltip","Legend"]}
@@ -1,3 +1,5 @@
1
+ "use client";
2
+
1
3
  // src/components/charts/chart.tsx
2
4
  import * as RechartsPrimitive from "recharts";
3
5