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/chart-dot.tsx","../src/components/charts/radar-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 { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\nexport type DotVariant = \"default\" | \"border\" | \"colored-border\"\n\ntype ChartDotProps = {\n\tcx?: number\n\tcy?: number\n\tdataKey: string\n\tchartId: string\n\tclassName?: string\n\tfillOpacity?: number\n\ttype?: DotVariant\n\t/** Optional SVG <mask> id — lets the dot share an area's intro reveal wipe. */\n\tmaskId?: string\n}\n\nconst ChartDot = React.memo(function ChartDot({\n\tcx,\n\tcy,\n\tdataKey,\n\tchartId,\n\tclassName,\n\tfillOpacity = 1,\n\ttype = \"default\",\n\tmaskId,\n}: ChartDotProps) {\n\tconst dotId = React.useId().replace(/:/g, \"\")\n\tconst gradientUrl = `url(#${chartId}-colors-${String(dataKey)})`\n\n\tif (cx === undefined || cy === undefined) return null\n\n\tswitch (type) {\n\t\tcase \"border\":\n\t\t\treturn (\n\t\t\t\t<PrimaryBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"colored-border\":\n\t\t\treturn (\n\t\t\t\t<ColoredBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<DefaultDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t}\n})\n\ntype DotVariantProps = {\n\tcx: number\n\tcy: number\n\tdotId: string\n\tfillOpacity: number\n\tgradientUrl: string\n\tclassName?: string\n\tmaskId?: string\n}\n\nconst DefaultDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\treturn (\n\t\t\t<g className={className} mask={maskId ? `url(#${maskId})` : undefined}>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Full-width gradient rectangle clipped to dot shape */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={r * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nDefaultDot.displayName = \"DefaultDot\"\n\nconst PrimaryBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 6\n\t\tconst strokeWidth = 5\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Background stroke (border) */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r} fill=\"currentColor\" />\n\t\t\t\t{/* Inner gradient circle clipped */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - (r - strokeWidth / 2)}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r - strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-inner-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-inner-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nPrimaryBorderDot.displayName = \"PrimaryBorderDot\"\n\nconst ColoredBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\tconst strokeWidth = 1\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r + strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Gradient stroke (border) via clipped rect */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r - strokeWidth / 2}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r + strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t{/* Inner solid fill */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} fill=\"currentColor\" />\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nColoredBorderDot.displayName = \"ColoredBorderDot\"\n\nexport { ChartDot }\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tPolarAngleAxis as RechartsPolarAngleAxis,\n\tPolarGrid as RechartsPolarGrid,\n\tPolarRadiusAxis as RechartsPolarRadiusAxis,\n\tRadar as RechartsRadar,\n\tRadarChart as RechartsRadarChart,\n} from \"recharts\"\n\nconst STROKE_WIDTH = 1\nconst DEFAULT_FILL_OPACITY = 0.3\nconst LOADING_POINTS = 6\nconst LOADING_ANIMATION_DURATION = 1500\nconst LOADING_RADAR_DATA_KEY = \"value\"\n\ntype RadarVariant = \"filled\" | \"lines\"\n\ntype RadarChartContextValue = {\n\tconfig: ChartConfig\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst RadarChartContext = createContext<RadarChartContextValue | null>(null)\n\nfunction useRadarChart() {\n\tconst context = use(RadarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radar chart parts (<Radar />, <PolarAngleAxis />, …) must be used within <RadarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype RadarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsRadarChart>\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n}\n\ntype RadarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = RadarChartBaseProps<TData, TConfig>\n\nexport type { RadarChartProps }\n\nexport function RadarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n}: RadarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading, loadingPoints)\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<RadarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[config, isLoading, selectedDataKey, selectDataKey],\n\t)\n\n\treturn (\n\t\t<RadarChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : data}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadar />}\n\t\t\t\t</RechartsRadarChart>\n\t\t\t</Chart>\n\t\t</RadarChartContext>\n\t)\n}\n\ntype RadarProps = {\n\tdataKey: string\n\tvariant?: RadarVariant\n\tfillOpacity?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tradarProps?: Omit<ComponentProps<typeof RechartsRadar>, \"dataKey\">\n}\n\nexport function Radar({\n\tdataKey,\n\tvariant = \"filled\",\n\tfillOpacity = DEFAULT_FILL_OPACITY,\n\tisClickable = false,\n\tchildren,\n\tradarProps,\n}: RadarProps) {\n\tconst { config, isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\tconst opacity = isClickable && !isSelected ? 0.2 : 1\n\tconst isFilled = variant === \"filled\"\n\n\tconst { dot, activeDot } = resolveDots(children, id, dataKey, opacity)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstroke={`url(#${id}-radar-stroke-${dataKey})`}\n\t\t\t\tstrokeOpacity={opacity}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tfill={isFilled ? `url(#${id}-radar-fill-${dataKey})` : \"none\"}\n\t\t\t\tfillOpacity={isFilled ? fillOpacity * opacity : 0}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...radarProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t<StrokeGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{isFilled && <FillGradient id={id} dataKey={dataKey} config={config} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype PolarGridProps = ComponentProps<typeof RechartsPolarGrid>\n\nexport function PolarGrid({\n\tgridType = \"polygon\",\n\tstroke = \"currentColor\",\n\tstrokeOpacity = 0.2,\n\tstrokeDasharray = \"3 4\",\n\t...props\n}: PolarGridProps) {\n\treturn (\n\t\t<RechartsPolarGrid\n\t\t\tgridType={gridType}\n\t\t\tstroke={stroke}\n\t\t\tstrokeOpacity={strokeOpacity}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype PolarAngleAxisProps = ComponentProps<typeof RechartsPolarAngleAxis>\n\nexport function PolarAngleAxis({\n\ttick = { fill: \"currentColor\", fontSize: 12 },\n\ttickLine = false,\n\t...props\n}: PolarAngleAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn <RechartsPolarAngleAxis tick={tick} tickLine={tickLine} {...props} />\n}\n\ntype PolarRadiusAxisProps = ComponentProps<typeof RechartsPolarRadiusAxis>\n\nexport function PolarRadiusAxis({\n\ttick = { fill: \"currentColor\", fontSize: 10 },\n\ttickLine = false,\n\taxisLine = false,\n\t...props\n}: PolarRadiusAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsPolarRadiusAxis\n\t\t\ttick={tick}\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype RadarDotProp = ComponentProps<typeof RechartsRadar>[\"dot\"]\ntype RadarActiveDotProp = ComponentProps<typeof RechartsRadar>[\"activeDot\"]\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n): { dot: RadarDotProp; activeDot: RadarActiveDotProp } => {\n\tlet dot: RadarDotProp = false\n\tlet activeDot: RadarActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n\tconfig: ChartConfig\n}\n\ntype ColorStopsProps = {\n\tdataKey: string\n\tcolorsCount: number\n\topacities?: number[]\n}\n\nconst ColorStops = ({ dataKey, colorsCount, opacities }: ColorStopsProps) => {\n\tif (colorsCount === 1) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[0]}\n\t\t\t\t/>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[opacities.length - 1]}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{Array.from({ length: colorsCount }, (_, index) => {\n\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\treturn (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\tstopOpacity={opacities?.[index]}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst ColorGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst StrokeGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-radar-stroke-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"1\"\n\t\t>\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst FillGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\tconst opacities =\n\t\tcolorsCount === 1\n\t\t\t? [0.8, 0.3]\n\t\t\t: Array.from({ length: colorsCount }, (_, i) => (i === 0 ? 0.8 : 0.3))\n\n\treturn (\n\t\t<radialGradient\n\t\t\tid={`${id}-radar-fill-${dataKey}`}\n\t\t\tcx=\"50%\"\n\t\t\tcy=\"50%\"\n\t\t\tr=\"50%\"\n\t\t>\n\t\t\t<ColorStops\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\topacities={opacities}\n\t\t\t/>\n\t\t</radialGradient>\n\t)\n}\n\nconst generateLoadingData = (points: number) => {\n\tconst categories = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]\n\n\treturn categories.slice(0, points).map(category => ({\n\t\tskill: category,\n\t\t[LOADING_RADAR_DATA_KEY]: 30 + Math.random() * 70,\n\t}))\n}\n\nexport function useLoadingData(\n\tisLoading: boolean,\n\tloadingPoints: number = LOADING_POINTS,\n) {\n\tconst [refreshKey, setRefreshKey] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetRefreshKey(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => generateLoadingData(loadingPoints),\n\n\t\t[loadingPoints, refreshKey],\n\t)\n\n\treturn loadingData\n}\n\nconst LoadingRadar = () => {\n\treturn (\n\t\t<RechartsRadar\n\t\t\tdataKey={LOADING_RADAR_DATA_KEY}\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeOpacity={0.3}\n\t\t\tstrokeWidth={2}\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity={0.1}\n\t\t\tdot={false}\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t/>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","useId","jsx","jsxs","React","jsx","jsxs","ChartDot","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/chart-dot.tsx","../src/components/charts/radar-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 { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\nexport type DotVariant = \"default\" | \"border\" | \"colored-border\"\n\ntype ChartDotProps = {\n\tcx?: number\n\tcy?: number\n\tdataKey: string\n\tchartId: string\n\tclassName?: string\n\tfillOpacity?: number\n\ttype?: DotVariant\n\t/** Optional SVG <mask> id — lets the dot share an area's intro reveal wipe. */\n\tmaskId?: string\n}\n\nconst ChartDot = React.memo(function ChartDot({\n\tcx,\n\tcy,\n\tdataKey,\n\tchartId,\n\tclassName,\n\tfillOpacity = 1,\n\ttype = \"default\",\n\tmaskId,\n}: ChartDotProps) {\n\tconst dotId = React.useId().replace(/:/g, \"\")\n\tconst gradientUrl = `url(#${chartId}-colors-${String(dataKey)})`\n\n\tif (cx === undefined || cy === undefined) return null\n\n\tswitch (type) {\n\t\tcase \"border\":\n\t\t\treturn (\n\t\t\t\t<PrimaryBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tcase \"colored-border\":\n\t\t\treturn (\n\t\t\t\t<ColoredBorderDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<DefaultDot\n\t\t\t\t\tcx={cx}\n\t\t\t\t\tcy={cy}\n\t\t\t\t\tdotId={dotId}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tgradientUrl={gradientUrl}\n\t\t\t\t\tclassName={className}\n\t\t\t\t\tmaskId={maskId}\n\t\t\t\t/>\n\t\t\t)\n\t}\n})\n\ntype DotVariantProps = {\n\tcx: number\n\tcy: number\n\tdotId: string\n\tfillOpacity: number\n\tgradientUrl: string\n\tclassName?: string\n\tmaskId?: string\n}\n\nconst DefaultDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\treturn (\n\t\t\t<g className={className} mask={maskId ? `url(#${maskId})` : undefined}>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Full-width gradient rectangle clipped to dot shape */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={r * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nDefaultDot.displayName = \"DefaultDot\"\n\nconst PrimaryBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 6\n\t\tconst strokeWidth = 5\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Background stroke (border) */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r} fill=\"currentColor\" />\n\t\t\t\t{/* Inner gradient circle clipped */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - (r - strokeWidth / 2)}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r - strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-inner-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-inner-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nPrimaryBorderDot.displayName = \"PrimaryBorderDot\"\n\nconst ColoredBorderDot = React.memo(\n\t({\n\t\tcx,\n\t\tcy,\n\t\tdotId,\n\t\tfillOpacity,\n\t\tgradientUrl,\n\t\tclassName,\n\t\tmaskId,\n\t}: DotVariantProps) => {\n\t\tconst r = 3\n\t\tconst strokeWidth = 1\n\t\treturn (\n\t\t\t<g\n\t\t\t\tclassName={cn(className, \"text-bruv-base-1\")}\n\t\t\t\tmask={maskId ? `url(#${maskId})` : undefined}\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t<clipPath id={`dot-clip-${dotId}`}>\n\t\t\t\t\t\t<circle cx={cx} cy={cy} r={r + strokeWidth / 2} />\n\t\t\t\t\t</clipPath>\n\t\t\t\t</defs>\n\t\t\t\t{/* Gradient stroke (border) via clipped rect */}\n\t\t\t\t<rect\n\t\t\t\t\tx=\"0\"\n\t\t\t\t\ty={cy - r - strokeWidth / 2}\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight={(r + strokeWidth / 2) * 2}\n\t\t\t\t\tfill={gradientUrl}\n\t\t\t\t\tfillOpacity={fillOpacity}\n\t\t\t\t\tclipPath={`url(#dot-clip-${dotId})`}\n\t\t\t\t/>\n\t\t\t\t{/* Inner solid fill */}\n\t\t\t\t<circle cx={cx} cy={cy} r={r - strokeWidth / 2} fill=\"currentColor\" />\n\t\t\t</g>\n\t\t)\n\t},\n)\n\nColoredBorderDot.displayName = \"ColoredBorderDot\"\n\nexport { ChartDot }\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport {\n\tChartLegend,\n\tChartLegendContent,\n\ttype ChartLegendVariant,\n} from \"./chart-legend\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport { ChartDot, type DotVariant } from \"./chart-dot\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseEffect,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype ComponentProps,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tPolarAngleAxis as RechartsPolarAngleAxis,\n\tPolarGrid as RechartsPolarGrid,\n\tPolarRadiusAxis as RechartsPolarRadiusAxis,\n\tRadar as RechartsRadar,\n\tRadarChart as RechartsRadarChart,\n} from \"recharts\"\n\nconst STROKE_WIDTH = 1\nconst DEFAULT_FILL_OPACITY = 0.3\nconst LOADING_POINTS = 6\nconst LOADING_ANIMATION_DURATION = 1500\nconst LOADING_RADAR_DATA_KEY = \"value\"\n\ntype RadarVariant = \"filled\" | \"lines\"\n\ntype RadarChartContextValue = {\n\tconfig: ChartConfig\n\tisLoading: boolean\n\tselectedDataKey: string | null\n\tselectDataKey: (dataKey: string | null) => void\n}\n\nconst RadarChartContext = createContext<RadarChartContextValue | null>(null)\n\nfunction useRadarChart() {\n\tconst context = use(RadarChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Radar chart parts (<Radar />, <PolarAngleAxis />, …) must be used within <RadarChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype ValidateConfigKeys<TData, TConfig> = {\n\t[K in keyof TConfig]: K extends keyof TData ? ChartConfig[string] : never\n}\n\ntype RadarChartBaseProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = {\n\tconfig: TConfig & ValidateConfigKeys<TData, TConfig>\n\tdata: TData[]\n\tchildren: ReactNode\n\tclassName?: string\n\tchartProps?: ComponentProps<typeof RechartsRadarChart>\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedDataKey?: string | null\n\tonSelectionChange?: (selectedDataKey: string | null) => void\n\tisLoading?: boolean\n\tloadingPoints?: number\n}\n\ntype RadarChartProps<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n> = RadarChartBaseProps<TData, TConfig>\n\nexport type { RadarChartProps }\n\nexport function RadarChart<\n\tTData extends Record<string, unknown>,\n\tTConfig extends Record<string, ChartConfig[string]>,\n>({\n\tconfig,\n\tdata,\n\tchildren,\n\tclassName,\n\tchartProps,\n\tbackgroundVariant,\n\tdefaultSelectedDataKey = null,\n\tonSelectionChange,\n\tisLoading = false,\n\tloadingPoints,\n}: RadarChartProps<TData, TConfig>) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedDataKey, setSelectedDataKey] = useState<string | null>(\n\t\tdefaultSelectedDataKey,\n\t)\n\tconst loadingData = useLoadingData(isLoading, loadingPoints)\n\n\tconst selectDataKey = useCallback(\n\t\t(newSelectedDataKey: string | null) => {\n\t\t\tsetSelectedDataKey(newSelectedDataKey)\n\t\t\tonSelectionChange?.(newSelectedDataKey)\n\t\t},\n\t\t[onSelectionChange],\n\t)\n\n\tconst contextValue = useMemo<RadarChartContextValue>(\n\t\t() => ({\n\t\t\tconfig,\n\t\t\tisLoading,\n\t\t\tselectedDataKey,\n\t\t\tselectDataKey,\n\t\t}),\n\t\t[config, isLoading, selectedDataKey, selectDataKey],\n\t)\n\n\treturn (\n\t\t<RadarChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t<RechartsRadarChart\n\t\t\t\t\tid={chartId}\n\t\t\t\t\tdata={isLoading ? loadingData : data}\n\t\t\t\t\t{...chartProps}\n\t\t\t\t>\n\t\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t\t{children}\n\t\t\t\t\t{isLoading && <LoadingRadar />}\n\t\t\t\t</RechartsRadarChart>\n\t\t\t</Chart>\n\t\t</RadarChartContext>\n\t)\n}\n\ntype RadarProps = {\n\tdataKey: string\n\tvariant?: RadarVariant\n\tfillOpacity?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n\tradarProps?: Omit<ComponentProps<typeof RechartsRadar>, \"dataKey\">\n}\n\nexport function Radar({\n\tdataKey,\n\tvariant = \"filled\",\n\tfillOpacity = DEFAULT_FILL_OPACITY,\n\tisClickable = false,\n\tchildren,\n\tradarProps,\n}: RadarProps) {\n\tconst { config, isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\tconst id = useId().replace(/:/g, \"\")\n\n\tif (isLoading) return null\n\n\tconst isSelected = selectedDataKey === null || selectedDataKey === dataKey\n\tconst opacity = isClickable && !isSelected ? 0.2 : 1\n\tconst isFilled = variant === \"filled\"\n\n\tconst { dot, activeDot } = resolveDots(children, id, dataKey, opacity)\n\n\treturn (\n\t\t<>\n\t\t\t<RechartsRadar\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tstroke={`url(#${id}-radar-stroke-${dataKey})`}\n\t\t\t\tstrokeOpacity={opacity}\n\t\t\t\tstrokeWidth={STROKE_WIDTH}\n\t\t\t\tfill={isFilled ? `url(#${id}-radar-fill-${dataKey})` : \"none\"}\n\t\t\t\tfillOpacity={isFilled ? fillOpacity * opacity : 0}\n\t\t\t\tdot={dot}\n\t\t\t\tactiveDot={activeDot}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\n\t\t\t\t\tselectDataKey(selectedDataKey === dataKey ? null : dataKey)\n\t\t\t\t}}\n\t\t\t\t{...radarProps}\n\t\t\t/>\n\t\t\t<defs>\n\t\t\t\t<ColorGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t<StrokeGradient id={id} dataKey={dataKey} config={config} />\n\t\t\t\t{isFilled && <FillGradient id={id} dataKey={dataKey} config={config} />}\n\t\t\t</defs>\n\t\t</>\n\t)\n}\n\ntype DotProps = {\n\tvariant?: DotVariant\n}\n\nexport const Dot: FC<DotProps> = () => null\n\nexport const ActiveDot: FC<DotProps> = () => null\n\ntype PolarGridProps = ComponentProps<typeof RechartsPolarGrid>\n\nexport function PolarGrid({\n\tgridType = \"polygon\",\n\tstroke = \"currentColor\",\n\tstrokeOpacity = 0.2,\n\tstrokeDasharray = \"3 4\",\n\t...props\n}: PolarGridProps) {\n\treturn (\n\t\t<RechartsPolarGrid\n\t\t\tgridType={gridType}\n\t\t\tstroke={stroke}\n\t\t\tstrokeOpacity={strokeOpacity}\n\t\t\tstrokeDasharray={strokeDasharray}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype PolarAngleAxisProps = ComponentProps<typeof RechartsPolarAngleAxis>\n\nexport function PolarAngleAxis({\n\ttick = { fill: \"currentColor\", fontSize: 12 },\n\ttickLine = false,\n\t...props\n}: PolarAngleAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn <RechartsPolarAngleAxis tick={tick} tickLine={tickLine} {...props} />\n}\n\ntype PolarRadiusAxisProps = ComponentProps<typeof RechartsPolarRadiusAxis>\n\nexport function PolarRadiusAxis({\n\ttick = { fill: \"currentColor\", fontSize: 10 },\n\ttickLine = false,\n\taxisLine = false,\n\t...props\n}: PolarRadiusAxisProps) {\n\tconst { isLoading } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<RechartsPolarRadiusAxis\n\t\t\ttick={tick}\n\t\t\ttickLine={tickLine}\n\t\t\taxisLine={axisLine}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading, selectedDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcursor={false}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype LegendProps = {\n\tvariant?: ChartLegendVariant\n\talign?: \"left\" | \"center\" | \"right\"\n\tverticalAlign?: \"top\" | \"middle\" | \"bottom\"\n\tisClickable?: boolean\n}\n\nexport function Legend({\n\tvariant,\n\talign = \"center\",\n\tverticalAlign = \"bottom\",\n\tisClickable = false,\n}: LegendProps) {\n\tconst { isLoading, selectedDataKey, selectDataKey } = useRadarChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartLegend\n\t\t\tverticalAlign={verticalAlign}\n\t\t\talign={align}\n\t\t\tcontent={\n\t\t\t\t<ChartLegendContent\n\t\t\t\t\tselected={selectedDataKey}\n\t\t\t\t\tonSelectChange={selectDataKey}\n\t\t\t\t\tisClickable={isClickable}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\ntype RadarDotProp = ComponentProps<typeof RechartsRadar>[\"dot\"]\ntype RadarActiveDotProp = ComponentProps<typeof RechartsRadar>[\"activeDot\"]\n\nconst resolveDots = (\n\tchildren: ReactNode,\n\tid: string,\n\tdataKey: string,\n\tdotOpacity: number,\n): { dot: RadarDotProp; activeDot: RadarActiveDotProp } => {\n\tlet dot: RadarDotProp = false\n\tlet activeDot: RadarActiveDotProp = false\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Dot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tdot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\tif (child.type === ActiveDot) {\n\t\t\tconst { variant } = (child as ReactElement<DotProps>).props\n\t\t\tactiveDot = (\n\t\t\t\t<ChartDot\n\t\t\t\t\ttype={variant}\n\t\t\t\t\tdataKey={dataKey}\n\t\t\t\t\tchartId={id}\n\t\t\t\t\tfillOpacity={dotOpacity}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t})\n\n\treturn { dot, activeDot }\n}\n\ntype StyleProps = {\n\tid: string\n\tdataKey: string\n\tconfig: ChartConfig\n}\n\ntype ColorStopsProps = {\n\tdataKey: string\n\tcolorsCount: number\n\topacities?: number[]\n}\n\nconst ColorStops = ({ dataKey, colorsCount, opacities }: ColorStopsProps) => {\n\tif (colorsCount === 1) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"0%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[0]}\n\t\t\t\t/>\n\t\t\t\t<stop\n\t\t\t\t\toffset=\"100%\"\n\t\t\t\t\tstopColor={`var(--color-${dataKey}-0)`}\n\t\t\t\t\tstopOpacity={opacities?.[opacities.length - 1]}\n\t\t\t\t/>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{Array.from({ length: colorsCount }, (_, index) => {\n\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\treturn (\n\t\t\t\t\t<stop\n\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\tstopOpacity={opacities?.[index]}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst ColorGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient id={`${id}-colors-${dataKey}`} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst StrokeGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${id}-radar-stroke-${dataKey}`}\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"1\"\n\t\t\ty2=\"1\"\n\t\t>\n\t\t\t<ColorStops dataKey={dataKey} colorsCount={colorsCount} />\n\t\t</linearGradient>\n\t)\n}\n\nconst FillGradient = ({ id, dataKey, config }: StyleProps) => {\n\tconst colorsCount = getColorsCount(config[dataKey] ?? {})\n\tconst opacities =\n\t\tcolorsCount === 1\n\t\t\t? [0.8, 0.3]\n\t\t\t: Array.from({ length: colorsCount }, (_, i) => (i === 0 ? 0.8 : 0.3))\n\n\treturn (\n\t\t<radialGradient\n\t\t\tid={`${id}-radar-fill-${dataKey}`}\n\t\t\tcx=\"50%\"\n\t\t\tcy=\"50%\"\n\t\t\tr=\"50%\"\n\t\t>\n\t\t\t<ColorStops\n\t\t\t\tdataKey={dataKey}\n\t\t\t\tcolorsCount={colorsCount}\n\t\t\t\topacities={opacities}\n\t\t\t/>\n\t\t</radialGradient>\n\t)\n}\n\nconst generateLoadingData = (points: number) => {\n\tconst categories = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]\n\n\treturn categories.slice(0, points).map(category => ({\n\t\tskill: category,\n\t\t[LOADING_RADAR_DATA_KEY]: 30 + Math.random() * 70,\n\t}))\n}\n\nexport function useLoadingData(\n\tisLoading: boolean,\n\tloadingPoints: number = LOADING_POINTS,\n) {\n\tconst [refreshKey, setRefreshKey] = useState(0)\n\n\tuseEffect(() => {\n\t\tif (!isLoading) return\n\n\t\tconst interval = setInterval(() => {\n\t\t\tsetRefreshKey(prev => prev + 1)\n\t\t}, LOADING_ANIMATION_DURATION)\n\n\t\treturn () => clearInterval(interval)\n\t}, [isLoading])\n\n\tconst loadingData = useMemo(\n\t\t() => generateLoadingData(loadingPoints),\n\n\t\t[loadingPoints, refreshKey],\n\t)\n\n\treturn loadingData\n}\n\nconst LoadingRadar = () => {\n\treturn (\n\t\t<RechartsRadar\n\t\t\tdataKey={LOADING_RADAR_DATA_KEY}\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeOpacity={0.3}\n\t\t\tstrokeWidth={2}\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity={0.1}\n\t\t\tdot={false}\n\t\t\tisAnimationActive\n\t\t\tanimationDuration={LOADING_ANIMATION_DURATION}\n\t\t\tanimationEasing=\"ease-in-out\"\n\t\t/>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","RechartsPrimitive","jsx","jsxs","useId","jsx","jsxs","React","jsx","jsxs","ChartDot","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