bruv-ui 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/area-chart.d.ts +84 -0
  2. package/dist/area-chart.js +2002 -0
  3. package/dist/area-chart.js.map +1 -0
  4. package/dist/bar-chart.d.ts +80 -0
  5. package/dist/bar-chart.js +2251 -0
  6. package/dist/bar-chart.js.map +1 -0
  7. package/dist/chart-background-BK77UXhl.d.ts +9 -0
  8. package/dist/chart-brush-BoxY9aDm.d.ts +72 -0
  9. package/dist/chart-dot-8H287EDv.d.ts +17 -0
  10. package/dist/chart-legend-Dv9pqes-.d.ts +16 -0
  11. package/dist/chart-tooltip-DajpzJRy.d.ts +68 -0
  12. package/dist/charts.d.ts +17 -0
  13. package/dist/charts.js +5097 -0
  14. package/dist/charts.js.map +1 -0
  15. package/dist/composed-chart.d.ts +93 -0
  16. package/dist/composed-chart.js +2338 -0
  17. package/dist/composed-chart.js.map +1 -0
  18. package/dist/form-dK_DJRTw.d.ts +43 -0
  19. package/dist/form-rhf.d.ts +26 -0
  20. package/dist/form-rhf.js +268 -0
  21. package/dist/form-rhf.js.map +1 -0
  22. package/dist/index.d.ts +2881 -0
  23. package/dist/index.js +9368 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/line-chart.d.ts +81 -0
  26. package/dist/line-chart.js +1879 -0
  27. package/dist/line-chart.js.map +1 -0
  28. package/dist/pie-chart.d.ts +64 -0
  29. package/dist/pie-chart.js +1094 -0
  30. package/dist/pie-chart.js.map +1 -0
  31. package/dist/radar-chart.d.ts +67 -0
  32. package/dist/radar-chart.js +1318 -0
  33. package/dist/radar-chart.js.map +1 -0
  34. package/dist/radial-chart.d.ts +56 -0
  35. package/dist/radial-chart.js +1051 -0
  36. package/dist/radial-chart.js.map +1 -0
  37. package/dist/sankey-chart.d.ts +58 -0
  38. package/dist/sankey-chart.js +1179 -0
  39. package/dist/sankey-chart.js.map +1 -0
  40. package/package.json +135 -0
  41. package/src/scales.css +288 -0
  42. package/src/shiki.css +37 -0
  43. package/src/styles.css +23 -0
  44. package/src/theme.css +659 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts/chart.tsx","../src/lib/cn.ts","../src/components/charts/chart-tooltip.tsx","../src/components/charts/chart-background.tsx","../src/components/charts/sankey-chart.tsx"],"sourcesContent":["import * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\tforwardRef,\n\tuseId,\n\tcreateContext,\n\tuseContext,\n\ttype ComponentProps,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nconst THEMES = { light: \"\", dark: '[data-theme=\"dark\"]' } as const\n\ntype ThemeKey = keyof typeof THEMES\n\ntype ThemeColorsBase = {\n\t[K in ThemeKey]?: string[]\n}\n\ntype AtLeastOneThemeColor = {\n\t[K in ThemeKey]: Required<Pick<ThemeColorsBase, K>> &\n\t\tPartial<Omit<ThemeColorsBase, K>>\n}[ThemeKey]\n\nconst VALID_THEME_KEYS = Object.keys(THEMES) as ThemeKey[]\n\nconst DEFAULT_PALETTE = [\n\t\"var(--color-bruv-chart-1)\",\n\t\"var(--color-bruv-chart-2)\",\n\t\"var(--color-bruv-chart-3)\",\n\t\"var(--color-bruv-chart-4)\",\n\t\"var(--color-bruv-chart-5)\",\n\t\"var(--color-bruv-chart-6)\",\n] as const\n\nexport type ChartConfig = Record<\n\tstring,\n\t{\n\t\tlabel?: ReactNode\n\t\ticon?: ComponentType\n\t\tcolor?: string\n\t\tcolors?: AtLeastOneThemeColor\n\t}\n>\n\ninterface ChartContextProps {\n\tconfig: ChartConfig\n}\n\nconst ChartContext = createContext<ChartContextProps | null>(null)\n\nexport function useChart() {\n\tconst context = useContext(ChartContext)\n\tif (!context) {\n\t\tthrow new Error(\"useChart must be used within a <Chart />\")\n\t}\n\treturn context\n}\n\nfunction validateChartConfigColors(config: ChartConfig): void {\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tif (value.colors) {\n\t\t\tconst hasValidThemeKey = VALID_THEME_KEYS.some(\n\t\t\t\tthemeKey => value.colors?.[themeKey] !== undefined,\n\t\t\t)\n\t\t\tif (!hasValidThemeKey) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`[BruvCharts] Invalid chart config for \"${key}\": colors object must have at least one theme key (${VALID_THEME_KEYS.join(\", \")}).`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function applyDefaultChartColors(config: ChartConfig): ChartConfig {\n\tconst entries = Object.entries(config)\n\treturn Object.fromEntries(\n\t\tentries.map(([key, item], index) => {\n\t\t\tif (item.colors || item.color) {\n\t\t\t\tif (item.color && !item.colors) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...item,\n\t\t\t\t\t\t\tcolors: {\n\t\t\t\t\t\t\t\tlight: [item.color],\n\t\t\t\t\t\t\t\tdark: [item.color],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [key, item]\n\t\t\t}\n\t\t\tconst paletteColor =\n\t\t\t\tDEFAULT_PALETTE[index % DEFAULT_PALETTE.length] ?? DEFAULT_PALETTE[0]\n\t\t\treturn [\n\t\t\t\tkey,\n\t\t\t\t{\n\t\t\t\t\t...item,\n\t\t\t\t\tcolors: {\n\t\t\t\t\t\tlight: [paletteColor],\n\t\t\t\t\t\tdark: [paletteColor],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\t\t}),\n\t)\n}\n\nexport interface ChartProps\n\textends\n\t\tOmit<ComponentProps<\"div\">, \"children\">,\n\t\tPick<\n\t\t\tComponentProps<typeof RechartsPrimitive.ResponsiveContainer>,\n\t\t\t| \"initialDimension\"\n\t\t\t| \"aspect\"\n\t\t\t| \"debounce\"\n\t\t\t| \"minHeight\"\n\t\t\t| \"minWidth\"\n\t\t\t| \"maxHeight\"\n\t\t\t| \"height\"\n\t\t\t| \"width\"\n\t\t\t| \"onResize\"\n\t\t\t| \"children\"\n\t\t> {\n\tconfig: ChartConfig\n\tinnerResponsiveContainerStyle?: ComponentProps<\n\t\ttypeof RechartsPrimitive.ResponsiveContainer\n\t>[\"style\"]\n\tfooter?: ReactNode\n}\n\nexport const Chart = forwardRef<HTMLDivElement, ChartProps>(function Chart(\n\t{\n\t\tid,\n\t\tconfig,\n\t\tinitialDimension = { width: 320, height: 200 },\n\t\tclassName,\n\t\tchildren,\n\t\tfooter,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst uniqueId = useId()\n\tconst chartId = `chart-${id ?? uniqueId.replace(/:/g, \"\")}`\n\tconst resolvedConfig = applyDefaultChartColors(config)\n\n\tvalidateChartConfigColors(resolvedConfig)\n\n\treturn (\n\t\t<ChartContext.Provider value={{ config: resolvedConfig }}>\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tdata-slot=\"chart\"\n\t\t\t\tdata-chart={chartId}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bruv-chart relative flex min-h-0 w-full flex-1 flex-col justify-center text-bruv-sm text-bruv-secondary\",\n\t\t\t\t\t\"[&_.recharts-cartesian-axis-tick_text]:fill-bruv-chart-axis [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-bruv-chart-grid/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-bruv-chart-cursor [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-radial-bar-background-sector]:fill-bruv-subtle [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-bruv-subtle [&_.recharts-reference-line_[stroke='#ccc']]:stroke-bruv-chart-grid [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n\t\t\t\t\t!footer && \"aspect-video\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChartStyle id={chartId} config={resolvedConfig} />\n\t\t\t\t<RechartsPrimitive.ResponsiveContainer\n\t\t\t\t\tclassName=\"min-h-0 w-full flex-1\"\n\t\t\t\t\tinitialDimension={initialDimension}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RechartsPrimitive.ResponsiveContainer>\n\t\t\t\t{footer}\n\t\t\t</div>\n\t\t</ChartContext.Provider>\n\t)\n})\n\nexport function LoadingIndicator({ isLoading }: { isLoading: boolean }) {\n\tif (!isLoading) return null\n\n\treturn (\n\t\t<div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n\t\t\t<div className=\"border-bruv-neutral bg-bruv-base-2 text-bruv-sm text-bruv-primary rounded-bruv-md flex items-center justify-center gap-2 border px-2 py-0.5\">\n\t\t\t\t<div className=\"border-bruv-neutral border-t-bruv-accent size-3 animate-spin rounded-full border\" />\n\t\t\t\t<span>Loading</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction distributeColors(colorsArray: string[], maxCount: number): string[] {\n\tconst availableCount = colorsArray.length\n\tif (availableCount >= maxCount) {\n\t\treturn colorsArray.slice(0, maxCount)\n\t}\n\n\tconst result: string[] = []\n\tconst baseSlots = Math.floor(maxCount / availableCount)\n\tconst extraSlots = maxCount % availableCount\n\n\tfor (let colorIdx = 0; colorIdx < availableCount; colorIdx++) {\n\t\tconst isExtraColor = colorIdx >= availableCount - extraSlots\n\t\tconst slotsForThisColor = baseSlots + (isExtraColor ? 1 : 0)\n\t\tfor (let j = 0; j < slotsForThisColor; j++) {\n\t\t\tconst color = colorsArray[colorIdx]\n\t\t\tif (color) result.push(color)\n\t\t}\n\t}\n\n\treturn result\n}\n\nexport function ChartStyle({\n\tid,\n\tconfig,\n}: {\n\tid: string\n\tconfig: ChartConfig\n}) {\n\tconst colorConfig = Object.entries(config).filter(([, item]) => item.colors)\n\n\tif (!colorConfig.length) return null\n\n\tconst generateCssVars = (theme: keyof typeof THEMES) =>\n\t\tcolorConfig\n\t\t\t.flatMap(([key, itemConfig]) => {\n\t\t\t\tconst colorsArray = itemConfig.colors?.[theme]\n\t\t\t\tif (!colorsArray?.length) return []\n\n\t\t\t\tconst maxCount = getColorsCount(itemConfig)\n\t\t\t\tconst distributedColors = distributeColors(colorsArray, maxCount)\n\n\t\t\t\treturn distributedColors.map(\n\t\t\t\t\t(color, index) => ` --color-${key}-${index}: ${color};`,\n\t\t\t\t)\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\n\tconst css = Object.entries(THEMES)\n\t\t.map(\n\t\t\t([theme, prefix]) =>\n\t\t\t\t`${prefix} [data-chart=${id}] {\\n${generateCssVars(theme as keyof typeof THEMES)}\\n}`,\n\t\t)\n\t\t.join(\"\\n\")\n\n\treturn <style dangerouslySetInnerHTML={{ __html: css }} />\n}\n\nexport function getPayloadConfigFromPayload(\n\tconfig: ChartConfig,\n\tpayload: unknown,\n\tkey: string,\n) {\n\tif (typeof payload !== \"object\" || payload === null) return undefined\n\n\tconst payloadPayload =\n\t\t\"payload\" in payload &&\n\t\ttypeof payload.payload === \"object\" &&\n\t\tpayload.payload !== null\n\t\t\t? payload.payload\n\t\t\t: undefined\n\n\tlet configLabelKey: string = key\n\n\tif (\n\t\tkey in payload &&\n\t\ttypeof payload[key as keyof typeof payload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payload[key as keyof typeof payload] as string\n\t} else if (\n\t\tpayloadPayload &&\n\t\tkey in payloadPayload &&\n\t\ttypeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n\t) {\n\t\tconfigLabelKey = payloadPayload[\n\t\t\tkey as keyof typeof payloadPayload\n\t\t] as string\n\t}\n\n\treturn configLabelKey in config ? config[configLabelKey] : config[key]\n}\n\nexport function axisValueToPercentFormatter(value: number) {\n\treturn `${Math.round(value * 100).toFixed(0)}%`\n}\n\nexport function getColorsCount(config: ChartConfig[string]): number {\n\tif (!config.colors) return 1\n\tconst counts = VALID_THEME_KEYS.map(\n\t\ttheme => config.colors?.[theme]?.length ?? 0,\n\t)\n\treturn Math.max(...counts, 1)\n}\n\nexport const getLoadingData = (\n\tpoints: number = 10,\n\tmin: number = 0,\n\tmax: number = 70,\n) => {\n\tconst range = max - min\n\treturn Array.from({ length: points }, () => ({\n\t\tloading: Math.floor(Math.random() * range) + min,\n\t}))\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import { getPayloadConfigFromPayload, getColorsCount, useChart } from \"./chart\"\nimport type {\n\tNameType,\n\tValueType,\n} from \"recharts/types/component/DefaultTooltipContent\"\nimport * as RechartsPrimitive from \"recharts\"\nimport { cn } from \"../../lib/cn\"\nimport * as React from \"react\"\n\ntype TooltipRoundness = \"sm\" | \"md\" | \"lg\" | \"xl\"\ntype TooltipVariant = \"default\" | \"frosted-glass\"\n\nconst roundnessMap: Record<TooltipRoundness, string> = {\n\tsm: \"rounded-bruv-sm\",\n\tmd: \"rounded-bruv-md\",\n\tlg: \"rounded-bruv-lg\",\n\txl: \"rounded-bruv-xl\",\n}\n\nconst variantMap: Record<TooltipVariant, string> = {\n\tdefault: \"bg-bruv-base-2\",\n\t\"frosted-glass\": \"bg-bruv-base-2/70 backdrop-blur-sm\",\n}\n\nfunction ChartTooltipContent({\n\tactive,\n\tpayload,\n\tclassName,\n\tindicator = \"dot\",\n\thideLabel = false,\n\thideIndicator = false,\n\tlabel,\n\tlabelFormatter,\n\tlabelClassName,\n\tformatter,\n\tnameKey,\n\tlabelKey,\n\tselected,\n\troundness = \"lg\",\n\tvariant = \"default\",\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n\tReact.ComponentProps<\"div\"> & {\n\t\thideLabel?: boolean\n\t\thideIndicator?: boolean\n\t\tindicator?: \"line\" | \"dot\" | \"dashed\"\n\t\tnameKey?: string\n\t\tlabelKey?: string\n\t\tselected?: string | null\n\t\troundness?: TooltipRoundness\n\t\tvariant?: TooltipVariant\n\t} & Omit<\n\t\tRechartsPrimitive.DefaultTooltipContentProps<ValueType, NameType>,\n\t\t\"accessibilityLayer\"\n\t>) {\n\tconst { config } = useChart()\n\n\tconst tooltipLabel = React.useMemo(() => {\n\t\tif (hideLabel || !payload?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst [item] = payload\n\t\tconst key = `${labelKey ?? item?.dataKey ?? item?.name ?? \"value\"}`\n\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\t\tconst value =\n\t\t\t!labelKey && typeof label === \"string\"\n\t\t\t\t? (config[label]?.label ?? label)\n\t\t\t\t: itemConfig?.label\n\n\t\tif (labelFormatter) {\n\t\t\treturn (\n\t\t\t\t<div className={cn(\"font-medium\", labelClassName)}>\n\t\t\t\t\t{labelFormatter(value, payload)}\n\t\t\t\t</div>\n\t\t\t)\n\t\t}\n\n\t\tif (!value) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n\t}, [\n\t\tlabel,\n\t\tlabelFormatter,\n\t\tpayload,\n\t\thideLabel,\n\t\tlabelClassName,\n\t\tconfig,\n\t\tlabelKey,\n\t])\n\n\tif (!active || !payload?.length) {\n\t\t// Empty tooltip - to prevent position getting 0.0 so it doesnt animate tooltip every time from 0.0 origin\n\t\treturn <span className=\"p-4\" />\n\t}\n\n\tconst nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"border-bruv-neutral/50 grid min-w-32 items-start gap-1.5 border px-2.5 py-1.5 text-xs shadow-xl\",\n\t\t\t\troundnessMap[roundness],\n\t\t\t\tvariantMap[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{!nestLabel ? tooltipLabel : null}\n\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t{payload\n\t\t\t\t\t.filter(item => item.type !== \"none\")\n\t\t\t\t\t.map((item, index) => {\n\t\t\t\t\t\t// For pie charts, item.name contains the sector name (e.g., \"chrome\")\n\t\t\t\t\t\t// For radial charts, the name is in item.payload[nameKey]\n\t\t\t\t\t\t// For other charts, item.name or item.dataKey contains the series name\n\t\t\t\t\t\tconst payloadName =\n\t\t\t\t\t\t\tnameKey && item.payload\n\t\t\t\t\t\t\t\t? (item.payload as Record<string, unknown>)[nameKey]\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\tconst key = `${payloadName ?? item.name ?? item.dataKey ?? \"value\"}`\n\t\t\t\t\t\tconst itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n\t\t\t\t\t\t// Get colors count for this item to determine gradient vs solid\n\t\t\t\t\t\tconst colorsCount = itemConfig ? getColorsCount(itemConfig) : 1\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"[&>svg]:text-bruv-secondary flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5\",\n\t\t\t\t\t\t\t\t\tindicator === \"dot\" && \"items-center\",\n\t\t\t\t\t\t\t\t\tselected != null && selected !== item.dataKey && \"opacity-30\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{formatter && item?.value !== undefined && item.name ? (\n\t\t\t\t\t\t\t\t\tformatter(item.value, item.name, item, index, item.payload)\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{itemConfig?.icon ? (\n\t\t\t\t\t\t\t\t\t\t\t<itemConfig.icon />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t!hideIndicator && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\"shrink-0 rounded-[2px]\", {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"h-2.5 w-2.5\": indicator === \"dot\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-1\": indicator === \"line\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"w-0 border-[1.5px] border-dashed bg-transparent!\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tindicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"my-0.5\": nestLabel && indicator === \"dashed\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={getIndicatorColorStyle(key, colorsCount)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex flex-1 justify-between gap-4 leading-none\",\n\t\t\t\t\t\t\t\t\t\t\t\tnestLabel ? \"items-end\" : \"items-center\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid gap-1.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{nestLabel ? tooltipLabel : null}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{itemConfig?.label ?? item.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{item.value != null && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary font-mono font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof item.value === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? item.value.toLocaleString()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: String(item.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction getIndicatorColorStyle(\n\tdataKey: string,\n\tcolorsCount: number,\n): React.CSSProperties {\n\tif (colorsCount <= 1) {\n\t\treturn { background: `var(--color-${dataKey}-0)` }\n\t}\n\n\t// Multiple colors: create linear gradient with evenly distributed stops\n\tconst stops = Array.from({ length: colorsCount }, (_, index) => {\n\t\tconst offset = (index / (colorsCount - 1)) * 100\n\t\treturn `var(--color-${dataKey}-${index}) ${offset}%`\n\t}).join(\", \")\n\n\treturn { background: `linear-gradient(to right, ${stops})` }\n}\n\nconst ChartTooltip = ({\n\tanimationDuration = 200,\n\t...props\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) => (\n\t<RechartsPrimitive.Tooltip animationDuration={animationDuration} {...props} />\n)\n\nexport { ChartTooltip, ChartTooltipContent }\nexport type { TooltipRoundness, TooltipVariant }\n","import { ZIndexLayer } from \"recharts\"\nimport { useId } from \"react\"\n\n// ── Background Variant Types ─────────────────────────────────────────────────\n// To add a new variant:\n// 1. Add its name to the BackgroundVariant union type below\n// 2. Create a pattern component with PatternProps\n// 3. Register it in PATTERN_MAP\n\nexport type BackgroundVariant =\n\t| \"dots\"\n\t| \"grid\"\n\t| \"cross-hatch\"\n\t| \"diagonal-lines\"\n\t| \"plus\"\n\t| \"falling-triangles\"\n\t| \"4-pointed-star\"\n\t| \"tiny-checkers\"\n\t| \"overlapping-circles\"\n\t| \"wiggle-lines\"\n\t| \"bubbles\"\n\n// ── Pattern Components ───────────────────────────────────────────────────────\n\ntype PatternProps = { id: string }\n\nconst DotsPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<circle\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tcx=\"2\"\n\t\t\tcy=\"2\"\n\t\t\tr=\"1\"\n\t\t\tfill=\"currentColor\"\n\t\t/>\n\t</pattern>\n)\n\nconst GridPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 20 0 L 0 0 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst CrossHatchPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"20\"\n\t\theight=\"20\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid/60 text-bruv-chart-grid/50\"\n\t\t\td=\"M 0 0 L 20 20 M 20 0 L 0 20\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst DiagonalLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"6\"\n\t\theight=\"6\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"rotate(45)\"\n\t>\n\t\t<line\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tx1=\"0\"\n\t\t\ty1=\"0\"\n\t\t\tx2=\"0\"\n\t\t\ty2=\"6\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t/>\n\t</pattern>\n)\n\nconst PlusPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M 8 4 L 8 12 M 4 8 L 12 8\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"0.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t/>\n\t</pattern>\n)\n\nconst FallingTrianglesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"18\"\n\t\theight=\"36\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M2 6h12L8 18 2 6zm18 36h12l-6 12-6-12z\"\n\t\t\ttransform=\"scale(0.5)\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst FourPointedStarPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<polygon\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\tpoints=\"5 3 8 4 5 5 4 8 3 5 0 4 3 3 4 0 5 3\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst TinyCheckersPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"8\"\n\t\theight=\"8\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M0 0h4v4H0V0zm4 4h4v4H4V4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.2\"\n\t\t/>\n\t</pattern>\n)\n\nconst OverlappingCirclesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"40\"\n\t\theight=\"40\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\tfillRule=\"evenodd\"\n\t\t\td=\"M25 25c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5s-5-2.238-5-5 2.238-5 5-5zM5 5c0-2.762 2.238-5 5-5s5 2.238 5 5-2.238 5-5 5c0 2.762-2.238 5-5 5S0 12.762 0 10s2.238-5 5-5zm5 4c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4zm20 20c2.209 0 4-1.791 4-4s-1.791-4-4-4-4 1.791-4 4 1.791 4 4 4z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst WiggleLinesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"52\"\n\t\theight=\"26\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t/>\n\t</pattern>\n)\n\nconst BubblesPattern = ({ id }: PatternProps) => (\n\t<pattern\n\t\tid={id}\n\t\tx=\"0\"\n\t\ty=\"0\"\n\t\twidth=\"100\"\n\t\theight=\"100\"\n\t\tpatternUnits=\"userSpaceOnUse\"\n\t\tpatternTransform=\"scale(0.6667)\"\n\t>\n\t\t<path\n\t\t\tclassName=\"text-bruv-chart-grid text-bruv-chart-grid\"\n\t\t\td=\"M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z\"\n\t\t\tfill=\"currentColor\"\n\t\t\tfillOpacity=\"0.4\"\n\t\t\tfillRule=\"evenodd\"\n\t\t/>\n\t</pattern>\n)\n\n// ── Pattern Registry ─────────────────────────────────────────────────────────\n// Map variant names to pattern components\n\nconst PATTERN_MAP: Record<BackgroundVariant, React.FC<PatternProps>> = {\n\tdots: DotsPattern,\n\tgrid: GridPattern,\n\tplus: PlusPattern,\n\tbubbles: BubblesPattern,\n\t\"cross-hatch\": CrossHatchPattern,\n\t\"diagonal-lines\": DiagonalLinesPattern,\n\t\"falling-triangles\": FallingTrianglesPattern,\n\t\"4-pointed-star\": FourPointedStarPattern,\n\t\"tiny-checkers\": TinyCheckersPattern,\n\t\"overlapping-circles\": OverlappingCirclesPattern,\n\t\"wiggle-lines\": WiggleLinesPattern,\n}\n\n// ── Main Component ───────────────────────────────────────────────────────────\n// Usage: Place <ChartBackground variant=\"dots\" /> inside any Recharts chart component.\n// ZIndexLayer with zIndex={-1} ensures the background renders behind all chart content.\n\ninterface ChartBackgroundProps {\n\tvariant: BackgroundVariant\n}\n\nexport function ChartBackground({ variant }: ChartBackgroundProps) {\n\tconst baseId = useId().replace(/:/g, \"\")\n\tconst patternId = `${baseId}-bg-${variant}`\n\tconst maskId = `${baseId}-bg-edge-fade`\n\tconst filterId = `${baseId}-bg-blur`\n\tconst PatternComponent = PATTERN_MAP[variant]\n\n\treturn (\n\t\t<ZIndexLayer zIndex={-1}>\n\t\t\t<defs>\n\t\t\t\t<PatternComponent id={patternId} />\n\t\t\t\t{/* Gaussian blur filter for soft edge fade */}\n\t\t\t\t<filter id={filterId}>\n\t\t\t\t\t<feGaussianBlur stdDeviation=\"25\" />\n\t\t\t\t</filter>\n\t\t\t\t{/* Mask: a slightly inset white rect with blur creates smooth transparent edges */}\n\t\t\t\t<mask id={maskId} maskUnits=\"userSpaceOnUse\">\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"8%\"\n\t\t\t\t\t\ty=\"20%\"\n\t\t\t\t\t\twidth=\"85%\"\n\t\t\t\t\t\theight=\"60%\"\n\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\tfilter={`url(#${filterId})`}\n\t\t\t\t\t/>\n\t\t\t\t</mask>\n\t\t\t</defs>\n\t\t\t<rect\n\t\t\t\twidth=\"100%\"\n\t\t\t\theight=\"100%\"\n\t\t\t\tfill={`url(#${patternId})`}\n\t\t\t\tmask={`url(#${maskId})`}\n\t\t\t/>\n\t\t</ZIndexLayer>\n\t)\n}\n","import {\n\ttype ChartConfig,\n\tChart,\n\tgetColorsCount,\n\tLoadingIndicator,\n} from \"./chart\"\nimport {\n\tChartTooltip,\n\tChartTooltipContent,\n\ttype TooltipRoundness,\n\ttype TooltipVariant,\n} from \"./chart-tooltip\"\nimport { ChartBackground, type BackgroundVariant } from \"./chart-background\"\nimport {\n\tChildren,\n\tcreateContext,\n\tisValidElement,\n\tuse,\n\tuseCallback,\n\tuseId,\n\tuseMemo,\n\tuseState,\n\ttype FC,\n\ttype ReactElement,\n\ttype ReactNode,\n} from \"react\"\nimport {\n\tSankey as RechartsSankey,\n\tLayer,\n\ttype SankeyProps,\n\ttype SankeyNodeProps,\n\ttype SankeyLinkProps,\n\ttype SankeyData,\n\ttype SankeyNode as RechartsSankeyNode,\n} from \"recharts\"\nimport { motion } from \"motion/react\"\n\nconst LOADING_ANIMATION_DURATION = 2000\nconst DEFAULT_NODE_WIDTH = 10\nconst DEFAULT_NODE_PADDING = 10\nconst DEFAULT_LINK_CURVATURE = 0.5\nconst DEFAULT_ITERATIONS = 32\n\ntype LinkVariant = \"gradient\" | \"solid\" | \"source\" | \"target\"\ntype NodeLabelPosition = \"inside\" | \"outside\"\n\ntype SankeyChartContextValue = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchartId: string\n\tisLoading: boolean\n\tselectedNode: string | null\n\tselectNode: (nodeName: string | null) => void\n}\n\nconst SankeyChartContext = createContext<SankeyChartContextValue | null>(null)\n\nfunction useSankeyChart() {\n\tconst context = use(SankeyChartContext)\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"Sankey chart parts (<Node />, <Link />, <Tooltip />, …) must be used within <SankeyChart />\",\n\t\t)\n\t}\n\n\treturn context\n}\n\ntype SankeyChartBaseProps = {\n\tdata: SankeyData\n\tconfig: ChartConfig\n\tchildren: ReactNode\n\tclassName?: string\n\tsankeyProps?: Omit<SankeyProps, \"data\">\n\tnodeWidth?: number\n\tnodePadding?: number\n\tlinkCurvature?: number\n\titerations?: number\n\tsort?: boolean\n\talign?: \"left\" | \"justify\"\n\tverticalAlign?: \"justify\" | \"top\"\n\tbackgroundVariant?: BackgroundVariant\n\tdefaultSelectedNode?: string | null\n\tonSelectionChange?: (\n\t\tselection: { dataKey: string; value: number } | null,\n\t) => void\n\tisLoading?: boolean\n}\n\ntype SankeyChartProps = SankeyChartBaseProps\n\nexport type { SankeyChartProps }\n\nexport function SankeyChart({\n\tdata,\n\tconfig,\n\tchildren,\n\tclassName,\n\tsankeyProps,\n\tnodeWidth = DEFAULT_NODE_WIDTH,\n\tnodePadding = DEFAULT_NODE_PADDING,\n\tlinkCurvature = DEFAULT_LINK_CURVATURE,\n\titerations = DEFAULT_ITERATIONS,\n\tsort = true,\n\talign = \"justify\",\n\tverticalAlign = \"justify\",\n\tbackgroundVariant,\n\tdefaultSelectedNode = null,\n\tonSelectionChange,\n\tisLoading = false,\n}: SankeyChartProps) {\n\tconst chartId = useId().replace(/:/g, \"\")\n\tconst [selectedNode, setSelectedNode] = useState<string | null>(\n\t\tdefaultSelectedNode,\n\t)\n\n\tconst selectNode = useCallback(\n\t\t(nodeName: string | null) => {\n\t\t\tsetSelectedNode(nodeName)\n\n\t\t\tif (!onSelectionChange) return\n\n\t\t\tif (nodeName === null) {\n\t\t\t\tonSelectionChange(null)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tonSelectionChange({\n\t\t\t\tdataKey: nodeName,\n\t\t\t\tvalue: getNodeValue(data, nodeName),\n\t\t\t})\n\t\t},\n\t\t[onSelectionChange, data],\n\t)\n\n\tconst contextValue = useMemo<SankeyChartContextValue>(\n\t\t() => ({ data, config, chartId, isLoading, selectedNode, selectNode }),\n\t\t[data, config, chartId, isLoading, selectedNode, selectNode],\n\t)\n\n\treturn (\n\t\t<SankeyChartContext value={contextValue}>\n\t\t\t<Chart className={className} config={config}>\n\t\t\t\t<LoadingIndicator isLoading={isLoading} />\n\t\t\t\t{backgroundVariant && <ChartBackground variant={backgroundVariant} />}\n\t\t\t\t{!isLoading && (\n\t\t\t\t\t<RechartsSankey\n\t\t\t\t\t\tid={chartId}\n\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\tnodeWidth={nodeWidth}\n\t\t\t\t\t\tnodePadding={nodePadding}\n\t\t\t\t\t\tlinkCurvature={linkCurvature}\n\t\t\t\t\t\titerations={iterations}\n\t\t\t\t\t\tsort={sort}\n\t\t\t\t\t\talign={align}\n\t\t\t\t\t\tverticalAlign={verticalAlign}\n\t\t\t\t\t\t{...resolveSankeyRenderers(children)}\n\t\t\t\t\t\t{...sankeyProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<NodeColorGradients config={config} chartId={chartId} />\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t</RechartsSankey>\n\t\t\t\t)}\n\t\t\t\t{isLoading && (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tviewBox=\"0 0 500 250\"\n\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LoadingSankey />\n\t\t\t\t\t</svg>\n\t\t\t\t)}\n\t\t\t</Chart>\n\t\t</SankeyChartContext>\n\t)\n}\n\ntype NodeProps = {\n\tradius?: number\n\tisClickable?: boolean\n\tchildren?: ReactNode\n}\n\nexport const Node: FC<NodeProps> = () => null\n\ntype NodeLabelProps = {\n\tposition?: NodeLabelPosition\n\tshowValues?: boolean\n\tvalueFormatter?: (value: number) => string\n}\n\nexport const NodeLabel: FC<NodeLabelProps> = () => null\n\ntype LinkProps = {\n\tvariant?: LinkVariant\n\tverticalPadding?: number\n}\n\nexport const Link: FC<LinkProps> = () => null\n\ntype TooltipProps = {\n\tvariant?: TooltipVariant\n\troundness?: TooltipRoundness\n\tdefaultIndex?: number\n}\n\nexport function Tooltip({ variant, roundness, defaultIndex }: TooltipProps) {\n\tconst { isLoading } = useSankeyChart()\n\n\tif (isLoading) return null\n\n\treturn (\n\t\t<ChartTooltip\n\t\t\tdefaultIndex={defaultIndex}\n\t\t\tcontent={\n\t\t\t\t<ChartTooltipContent\n\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\thideLabel\n\t\t\t\t\troundness={roundness}\n\t\t\t\t\tvariant={variant}\n\t\t\t\t/>\n\t\t\t}\n\t\t/>\n\t)\n}\n\nconst getNodeValue = (data: SankeyData, nodeName: string): number => {\n\tconst nodeIndex = data.nodes.findIndex(node => node.name === nodeName)\n\tif (nodeIndex === -1) return 0\n\n\tconst outgoing = data.links\n\t\t.filter(link => link.source === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\tconst incoming = data.links\n\t\t.filter(link => link.target === nodeIndex)\n\t\t.reduce((sum, link) => sum + link.value, 0)\n\n\treturn outgoing > 0 ? outgoing : incoming\n}\n\nconst resolveSankeyRenderers = (\n\tchildren: ReactNode,\n): Pick<SankeyProps, \"node\" | \"link\"> => {\n\tlet nodeProps: NodeProps | null = null\n\tlet linkProps: LinkProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (!isValidElement(child)) return\n\n\t\tif (child.type === Node) {\n\t\t\tnodeProps = (child as ReactElement<NodeProps>).props\n\t\t}\n\n\t\tif (child.type === Link) {\n\t\t\tlinkProps = (child as ReactElement<LinkProps>).props\n\t\t}\n\t})\n\n\treturn {\n\t\tnode: (props: SankeyNodeProps) => (\n\t\t\t<SankeyNode {...props} nodeConfig={nodeProps} />\n\t\t),\n\t\tlink: (props: SankeyLinkProps) => (\n\t\t\t<SankeyLink {...props} linkConfig={linkProps} />\n\t\t),\n\t}\n}\n\nconst resolveNodeLabel = (children: ReactNode): NodeLabelProps | null => {\n\tlet label: NodeLabelProps | null = null\n\n\tChildren.forEach(children, child => {\n\t\tif (isValidElement(child) && child.type === NodeLabel) {\n\t\t\tlabel = (child as ReactElement<NodeLabelProps>).props\n\t\t}\n\t})\n\n\treturn label\n}\n\ntype SankeyNodeRendererProps = SankeyNodeProps & {\n\tnodeConfig: NodeProps | null\n}\n\nconst SankeyNode = ({\n\tx,\n\ty,\n\twidth,\n\theight,\n\tpayload,\n\tnodeConfig,\n}: SankeyNodeRendererProps) => {\n\tconst { config, chartId, data, selectedNode, selectNode } = useSankeyChart()\n\n\tconst radius = nodeConfig?.radius ?? 0\n\tconst isClickable = nodeConfig?.isClickable ?? false\n\tconst label = resolveNodeLabel(nodeConfig?.children)\n\n\tconst nodeName = payload.name\n\tconst nodeValue = payload.value\n\tconst nodeIcon = (payload as RechartsSankeyNode & { icon?: ReactNode }).icon\n\n\tconst isHighlighted = isNodeConnected(data, selectedNode, nodeName)\n\tconst hasConfigColor = nodeName in config\n\tconst configLabel = config[nodeName]?.label ?? nodeName\n\tconst dimmed = isClickable && !isHighlighted\n\n\tconst valueFormatter =\n\t\tlabel?.valueFormatter ?? ((value: number) => value.toLocaleString())\n\tconst showValues = label?.showValues ?? false\n\n\tconst labelX = x + width / 2\n\tconst labelY = showValues ? y + height / 2 - 8 : y + height / 2\n\tconst valueY = y + height / 2 + 8\n\tconst outsideLabelX = x + width + 8\n\tconst outsideLabelY = y + height / 2\n\n\treturn (\n\t\t<Layer>\n\t\t\t<rect\n\t\t\t\tx={x}\n\t\t\t\ty={y}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\trx={radius}\n\t\t\t\try={radius}\n\t\t\t\tfill={\n\t\t\t\t\thasConfigColor\n\t\t\t\t\t\t? `url(#${chartId}-sankey-colors-${nodeName})`\n\t\t\t\t\t\t: \"currentColor\"\n\t\t\t\t}\n\t\t\t\tfillOpacity={dimmed ? 0.3 : 0.9}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\tstyle={isClickable ? { cursor: \"pointer\" } : undefined}\n\t\t\t\tonClick={() => {\n\t\t\t\t\tif (!isClickable) return\n\t\t\t\t\tselectNode(selectedNode === nodeName ? null : nodeName)\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{label?.position === \"inside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx={x + 1}\n\t\t\t\t\t\ty={y + 1}\n\t\t\t\t\t\twidth={width - 2}\n\t\t\t\t\t\theight={height - 2}\n\t\t\t\t\t\trx={Math.max(0, radius - 1)}\n\t\t\t\t\t\try={Math.max(0, radius - 1)}\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tclassName=\"fill-white/50 transition-opacity duration-200 dark:fill-black/60\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t/>\n\t\t\t\t\t{nodeIcon && (\n\t\t\t\t\t\t<foreignObject\n\t\t\t\t\t\t\tx={labelX - 8}\n\t\t\t\t\t\t\ty={labelY - 30}\n\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"text-bruv-primary/80 flex items-center justify-center dark:text-white/80\">\n\t\t\t\t\t\t\t\t{nodeIcon}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</foreignObject>\n\t\t\t\t\t)}\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\ty={nodeIcon ? labelY - 4 : labelY}\n\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-[10px] font-medium transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\topacity={dimmed ? 0.3 : 1}\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={labelX}\n\t\t\t\t\t\t\ty={valueY}\n\t\t\t\t\t\t\ttextAnchor=\"middle\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\tclassName=\"fill-foreground/60 font-mono text-xs font-medium tabular-nums transition-opacity duration-200 dark:fill-white\"\n\t\t\t\t\t\t\topacity={dimmed ? 0.3 : 0.6}\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{label?.position === \"outside\" && (\n\t\t\t\t<>\n\t\t\t\t\t<text\n\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\ty={outsideLabelY - (showValues ? 8 : 0)}\n\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\tclassName=\"fill-foreground text-xs\"\n\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{configLabel}\n\t\t\t\t\t</text>\n\t\t\t\t\t{showValues && (\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx={outsideLabelX}\n\t\t\t\t\t\t\ty={outsideLabelY + 8}\n\t\t\t\t\t\t\ttextAnchor=\"start\"\n\t\t\t\t\t\t\tdominantBaseline=\"middle\"\n\t\t\t\t\t\t\topacity={0.5}\n\t\t\t\t\t\t\tclassName=\"fill-foreground font-mono text-xs tabular-nums dark:fill-white\"\n\t\t\t\t\t\t\tstyle={{ pointerEvents: \"none\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{valueFormatter(nodeValue)}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Layer>\n\t)\n}\n\ntype SankeyLinkRendererProps = SankeyLinkProps & {\n\tlinkConfig: LinkProps | null\n}\n\nconst SankeyLink = ({\n\tsourceX,\n\ttargetX,\n\tsourceY,\n\ttargetY,\n\tsourceControlX,\n\ttargetControlX,\n\tlinkWidth,\n\tindex,\n\tpayload,\n\tlinkConfig,\n}: SankeyLinkRendererProps) => {\n\tconst { config, chartId, selectedNode } = useSankeyChart()\n\n\tconst variant = linkConfig?.variant ?? \"gradient\"\n\tconst verticalPadding = linkConfig?.verticalPadding ?? 0\n\n\tconst sourceName = payload.source.name\n\tconst targetName = payload.target.name\n\n\tconst isConnected =\n\t\tselectedNode === null ||\n\t\tselectedNode === sourceName ||\n\t\tselectedNode === targetName\n\n\tconst paddedLinkWidth = Math.max(1, linkWidth - verticalPadding)\n\tconst halfWidth = paddedLinkWidth / 2\n\n\tconst linkAreaPath = `M${sourceX},${sourceY - halfWidth}\n C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}\n L${targetX},${targetY + halfWidth}\n C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}\n Z`\n\n\treturn (\n\t\t<Layer>\n\t\t\t<defs>\n\t\t\t\t{variant === \"gradient\" && (\n\t\t\t\t\t<LinkGradient\n\t\t\t\t\t\tchartId={chartId}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\tconfig={config}\n\t\t\t\t\t\tsourceName={sourceName}\n\t\t\t\t\t\ttargetName={targetName}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<LinkStrokeGradient chartId={chartId} index={index} />\n\t\t\t</defs>\n\t\t\t<path\n\t\t\t\td={linkAreaPath}\n\t\t\t\tfill={getLinkFill(\n\t\t\t\t\tvariant,\n\t\t\t\t\tchartId,\n\t\t\t\t\tindex,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsourceName,\n\t\t\t\t\ttargetName,\n\t\t\t\t)}\n\t\t\t\tfillOpacity={isConnected ? 0.4 : 0.1}\n\t\t\t\tstroke={\n\t\t\t\t\tselectedNode !== null && isConnected\n\t\t\t\t\t\t? `url(#${chartId}-link-stroke-${index})`\n\t\t\t\t\t\t: \"none\"\n\t\t\t\t}\n\t\t\t\tstrokeWidth={1}\n\t\t\t\tstrokeOpacity={0.3}\n\t\t\t\tclassName=\"transition-opacity duration-200\"\n\t\t\t/>\n\t\t</Layer>\n\t)\n}\n\nconst isNodeConnected = (\n\tdata: SankeyData,\n\tselectedNode: string | null,\n\tnodeName: string,\n): boolean => {\n\tif (selectedNode === null || selectedNode === nodeName) return true\n\n\tconst selectedIdx = data.nodes.findIndex(node => node.name === selectedNode)\n\tconst nodeIdx = data.nodes.findIndex(node => node.name === nodeName)\n\n\treturn data.links.some(\n\t\tlink =>\n\t\t\t(link.source === selectedIdx && link.target === nodeIdx) ||\n\t\t\t(link.source === nodeIdx && link.target === selectedIdx),\n\t)\n}\n\nconst getLinkFill = (\n\tvariant: LinkVariant,\n\tchartId: string,\n\tindex: number,\n\tconfig: ChartConfig,\n\tsourceName: string,\n\ttargetName: string,\n): string => {\n\tswitch (variant) {\n\t\tcase \"gradient\":\n\t\t\treturn `url(#${chartId}-link-gradient-${index})`\n\t\tcase \"source\":\n\t\t\treturn sourceName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${sourceName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"target\":\n\t\t\treturn targetName in config\n\t\t\t\t? `url(#${chartId}-sankey-colors-${targetName})`\n\t\t\t\t: \"currentColor\"\n\t\tcase \"solid\":\n\t\tdefault:\n\t\t\treturn \"currentColor\"\n\t}\n}\n\nconst NodeColorGradients = ({\n\tconfig,\n\tchartId,\n}: {\n\tconfig: ChartConfig\n\tchartId: string\n}) => {\n\treturn (\n\t\t<>\n\t\t\t{Object.entries(config).map(([dataKey, nodeConfig]) => {\n\t\t\t\tconst colorsCount = getColorsCount(nodeConfig)\n\n\t\t\t\treturn (\n\t\t\t\t\t<linearGradient\n\t\t\t\t\t\tkey={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tid={`${chartId}-sankey-colors-${dataKey}`}\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{colorsCount === 1 ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<stop offset=\"0%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t\t<stop offset=\"100%\" stopColor={`var(--color-${dataKey}-0)`} />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tArray.from({ length: colorsCount }, (_, index) => {\n\t\t\t\t\t\t\t\tconst offset = `${(index / (colorsCount - 1)) * 100}%`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\t\t\toffset={offset}\n\t\t\t\t\t\t\t\t\t\tstopColor={`var(--color-${dataKey}-${index}, var(--color-${dataKey}-0))`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</linearGradient>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n}\n\nconst LinkGradient = ({\n\tchartId,\n\tindex,\n\tconfig,\n\tsourceName,\n\ttargetName,\n}: {\n\tchartId: string\n\tindex: number\n\tconfig: ChartConfig\n\tsourceName: string\n\ttargetName: string\n}) => {\n\tconst sourceColor =\n\t\tsourceName in config ? `var(--color-${sourceName}-0)` : \"currentColor\"\n\tconst targetColor =\n\t\ttargetName in config ? `var(--color-${targetName}-0)` : \"currentColor\"\n\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-gradient-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor={sourceColor} stopOpacity={0.2} />\n\t\t\t<stop offset=\"50%\" stopColor={sourceColor} stopOpacity={0.5} />\n\t\t\t<stop offset=\"100%\" stopColor={targetColor} stopOpacity={0.2} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LinkStrokeGradient = ({\n\tchartId,\n\tindex,\n}: {\n\tchartId: string\n\tindex: number\n}) => {\n\treturn (\n\t\t<linearGradient\n\t\t\tid={`${chartId}-link-stroke-${index}`}\n\t\t\tx1=\"0%\"\n\t\t\ty1=\"0%\"\n\t\t\tx2=\"100%\"\n\t\t\ty2=\"0%\"\n\t\t>\n\t\t\t<stop offset=\"0%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t\t<stop offset=\"15%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"50%\" stopColor=\"var(--primary)\" stopOpacity={1} />\n\t\t\t<stop offset=\"85%\" stopColor=\"var(--primary)\" stopOpacity={0.8} />\n\t\t\t<stop offset=\"100%\" stopColor=\"var(--primary)\" stopOpacity={0} />\n\t\t</linearGradient>\n\t)\n}\n\nconst LoadingSankey = () => {\n\tconst nodes = [\n\t\t{ x: 30, y: 25, width: 12, height: 65, delay: 0 },\n\t\t{ x: 30, y: 110, width: 12, height: 50, delay: 0.3 },\n\t\t{ x: 30, y: 180, width: 12, height: 45, delay: 0.15 },\n\t\t{ x: 244, y: 20, width: 12, height: 55, delay: 0.45 },\n\t\t{ x: 244, y: 95, width: 12, height: 75, delay: 0.6 },\n\t\t{ x: 244, y: 190, width: 12, height: 40, delay: 0.25 },\n\t\t{ x: 458, y: 35, width: 12, height: 80, delay: 0.5 },\n\t\t{ x: 458, y: 135, width: 12, height: 90, delay: 0.1 },\n\t]\n\n\tconst links = [\n\t\t{ from: 0, to: 3, width: 26, delay: 0.2 },\n\t\t{ from: 0, to: 4, width: 18, delay: 0.7 },\n\t\t{ from: 1, to: 4, width: 24, delay: 0.4 },\n\t\t{ from: 1, to: 5, width: 12, delay: 0.9 },\n\t\t{ from: 2, to: 4, width: 16, delay: 0.1 },\n\t\t{ from: 2, to: 5, width: 14, delay: 0.55 },\n\t\t{ from: 3, to: 6, width: 22, delay: 0.35 },\n\t\t{ from: 3, to: 7, width: 18, delay: 0.8 },\n\t\t{ from: 4, to: 6, width: 28, delay: 0.05 },\n\t\t{ from: 4, to: 7, width: 32, delay: 0.65 },\n\t\t{ from: 5, to: 7, width: 16, delay: 0.45 },\n\t]\n\n\tconst getLinkPath = (fromIdx: number, toIdx: number) => {\n\t\tconst from = nodes[fromIdx]\n\t\tconst to = nodes[toIdx]\n\t\tconst startX = from.x + from.width\n\t\tconst startY = from.y + from.height / 2\n\t\tconst endX = to.x\n\t\tconst endY = to.y + to.height / 2\n\t\tconst controlX1 = startX + (endX - startX) * 0.4\n\t\tconst controlX2 = startX + (endX - startX) * 0.6\n\t\treturn `M${startX},${startY} C${controlX1},${startY} ${controlX2},${endY} ${endX},${endY}`\n\t}\n\n\tconst baseDuration = LOADING_ANIMATION_DURATION / 1000\n\n\treturn (\n\t\t<>\n\t\t\t{links.map((link, i) => (\n\t\t\t\t<motion.path\n\t\t\t\t\tkey={`loading-link-${link.from}-${link.to}`}\n\t\t\t\t\td={getLinkPath(link.from, link.to)}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstrokeWidth={link.width}\n\t\t\t\t\tinitial={{ opacity: 0.04 }}\n\t\t\t\t\tanimate={{ opacity: [0.04, 0.14, 0.04] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.8 + (i % 3) * 0.2),\n\t\t\t\t\t\tdelay: link.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t{nodes.map((node, i) => (\n\t\t\t\t<motion.rect\n\t\t\t\t\tkey={`loading-node-${node.x}-${node.y}`}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\trx={2}\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tinitial={{ opacity: 0.15 }}\n\t\t\t\t\tanimate={{ opacity: [0.15, 0.4, 0.15] }}\n\t\t\t\t\ttransition={{\n\t\t\t\t\t\tduration: baseDuration * (0.9 + (i % 4) * 0.1),\n\t\t\t\t\t\tdelay: node.delay,\n\t\t\t\t\t\trepeat: Infinity,\n\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</>\n\t)\n}\n"],"mappings":"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","names":["Chart","RechartsPrimitive","jsx","jsxs","useId","jsx","jsxs","createContext","useId","useMemo","Fragment","jsx","jsxs","Tooltip"]}
package/package.json ADDED
@@ -0,0 +1,135 @@
1
+ {
2
+ "name": "bruv-ui",
3
+ "version": "0.2.0",
4
+ "description": "React component library built on Base UI, styled with Tailwind CSS v4.",
5
+ "keywords": [
6
+ "design-system",
7
+ "react",
8
+ "tailwindcss",
9
+ "ui"
10
+ ],
11
+ "homepage": "https://github.com/ahmetskilinc/bruv-ui#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/ahmetskilinc/bruv-ui/issues"
14
+ },
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/ahmetskilinc/bruv-ui.git",
19
+ "directory": "packages/ui"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "src/styles.css",
24
+ "src/theme.css",
25
+ "src/scales.css",
26
+ "src/shiki.css",
27
+ "src/index.css"
28
+ ],
29
+ "type": "module",
30
+ "sideEffects": [
31
+ "**/*.css"
32
+ ],
33
+ "main": "./dist/index.js",
34
+ "types": "./dist/index.d.ts",
35
+ "exports": {
36
+ ".": {
37
+ "import": "./dist/index.js",
38
+ "types": "./dist/index.d.ts"
39
+ },
40
+ "./css": "./src/styles.css",
41
+ "./theme": "./src/theme.css",
42
+ "./scales": "./src/scales.css",
43
+ "./charts": {
44
+ "import": "./dist/charts.js",
45
+ "types": "./dist/charts.d.ts"
46
+ },
47
+ "./charts/area-chart": {
48
+ "import": "./dist/area-chart.js",
49
+ "types": "./dist/area-chart.d.ts"
50
+ },
51
+ "./charts/bar-chart": {
52
+ "import": "./dist/bar-chart.js",
53
+ "types": "./dist/bar-chart.d.ts"
54
+ },
55
+ "./charts/line-chart": {
56
+ "import": "./dist/line-chart.js",
57
+ "types": "./dist/line-chart.d.ts"
58
+ },
59
+ "./charts/composed-chart": {
60
+ "import": "./dist/composed-chart.js",
61
+ "types": "./dist/composed-chart.d.ts"
62
+ },
63
+ "./charts/pie-chart": {
64
+ "import": "./dist/pie-chart.js",
65
+ "types": "./dist/pie-chart.d.ts"
66
+ },
67
+ "./charts/radar-chart": {
68
+ "import": "./dist/radar-chart.js",
69
+ "types": "./dist/radar-chart.d.ts"
70
+ },
71
+ "./charts/radial-chart": {
72
+ "import": "./dist/radial-chart.js",
73
+ "types": "./dist/radial-chart.d.ts"
74
+ },
75
+ "./charts/sankey-chart": {
76
+ "import": "./dist/sankey-chart.js",
77
+ "types": "./dist/sankey-chart.d.ts"
78
+ },
79
+ "./form-rhf": {
80
+ "import": "./dist/form-rhf.js",
81
+ "types": "./dist/form-rhf.d.ts"
82
+ }
83
+ },
84
+ "publishConfig": {
85
+ "access": "public"
86
+ },
87
+ "scripts": {
88
+ "build": "tsup",
89
+ "dev": "tsup --watch",
90
+ "typecheck": "tsc --noEmit",
91
+ "test": "bun test",
92
+ "prepublishOnly": "bun run build"
93
+ },
94
+ "dependencies": {
95
+ "@base-ui/react": "^1.3.0",
96
+ "@heroicons/react": "^2.2.0",
97
+ "@tanstack/react-table": "^8.21.3",
98
+ "@tanstack/react-virtual": "^3.13.12",
99
+ "clsx": "^2.1.1",
100
+ "cmdk": "^1.1.1",
101
+ "motion": "^12.38.0",
102
+ "shiki": "^4.0.2",
103
+ "tailwind-merge": "^3.5.0"
104
+ },
105
+ "devDependencies": {
106
+ "@happy-dom/global-registrator": "^20.0.2",
107
+ "@testing-library/jest-dom": "^6.9.1",
108
+ "@testing-library/react": "^16.3.0",
109
+ "@types/node": "^22.15.32",
110
+ "@types/react": "^19.2.14",
111
+ "@types/react-dom": "^19.2.3",
112
+ "bun-types": "^1.3.10",
113
+ "happy-dom": "^20.0.2",
114
+ "react": "^19.2.0",
115
+ "react-dom": "^19.2.0",
116
+ "react-hook-form": "^7.66.0",
117
+ "recharts": "^3.8.1",
118
+ "tsup": "^8.5.0",
119
+ "typescript": "5.8.3"
120
+ },
121
+ "peerDependencies": {
122
+ "react": "^18.3.1 || ^19.0.0",
123
+ "react-dom": "^18.3.1 || ^19.0.0",
124
+ "react-hook-form": "^7.0.0",
125
+ "recharts": "^2.15.0 || ^3.0.0"
126
+ },
127
+ "peerDependenciesMeta": {
128
+ "recharts": {
129
+ "optional": true
130
+ },
131
+ "react-hook-form": {
132
+ "optional": true
133
+ }
134
+ }
135
+ }
package/src/scales.css ADDED
@@ -0,0 +1,288 @@
1
+ /*
2
+ * ═══════════════════════════════════════════════════════════════
3
+ * Color Scales
4
+ *
5
+ * All custom 12-step scales using Radix-style 1-12 numbering.
6
+ * Each scale provides light and dark mode values.
7
+ *
8
+ * Radix semantic step conventions:
9
+ * 1-2: Backgrounds
10
+ * 3-5: Component backgrounds (default, hover, active)
11
+ * 6-8: Borders (subtle, default, strong)
12
+ * 9-10: Solid fills (default, hover)
13
+ * 11: Low-contrast text
14
+ * 12: High-contrast text
15
+ *
16
+ * The mauve scale is custom OKLCH and inverts between modes.
17
+ * Red, amber, and green are based on Radix Colors.
18
+ * Accent is the Bruv brand periwinkle palette.
19
+ *
20
+ * All scales are prefixed with `bruv-` to avoid collisions
21
+ * when imported alongside other design systems.
22
+ *
23
+ * Scales use --color-bruv-* namespace so Tailwind v4
24
+ * auto-generates utilities (bg-bruv-mauve-6, text-bruv-red-12,
25
+ * etc.). Prefer semantic tokens (bg-bruv-base-1, text-bruv-primary)
26
+ * in components.
27
+ * ═══════════════════════════════════════════════════════════════
28
+ */
29
+
30
+ /* ── Mauve ──
31
+ * Purplish-gray neutral in OKLCH (hue 305, chroma 0.002–0.017).
32
+ * Matches mono's --cr-color-grey-* palette.
33
+ * Inverts between modes. Steps cluster tighter near backgrounds.
34
+ */
35
+ :root {
36
+ --color-bruv-mauve-1: oklch(0.994 0.002 305);
37
+ --color-bruv-mauve-2: oklch(0.982 0.0035 305);
38
+ --color-bruv-mauve-3: oklch(0.956 0.0056 305);
39
+ --color-bruv-mauve-4: oklch(0.931 0.0084 305);
40
+ --color-bruv-mauve-5: oklch(0.91 0.0098 305);
41
+ --color-bruv-mauve-6: oklch(0.885 0.0112 305);
42
+ --color-bruv-mauve-7: oklch(0.851 0.0126 305);
43
+ --color-bruv-mauve-8: oklch(0.791 0.014 305);
44
+ --color-bruv-mauve-9: oklch(0.641 0.0154 305);
45
+ --color-bruv-mauve-10: oklch(0.605 0.0161 305);
46
+ --color-bruv-mauve-11: oklch(0.498 0.0154 305);
47
+ --color-bruv-mauve-12: oklch(0.243 0.0098 305);
48
+ }
49
+
50
+ [data-theme="dark"] {
51
+ --color-bruv-mauve-1: oklch(0.177 0.0084 305);
52
+ --color-bruv-mauve-2: oklch(0.213 0.0098 305);
53
+ --color-bruv-mauve-3: oklch(0.252 0.0112 305);
54
+ --color-bruv-mauve-4: oklch(0.284 0.0126 305);
55
+ --color-bruv-mauve-5: oklch(0.312 0.014 305);
56
+ --color-bruv-mauve-6: oklch(0.348 0.0154 305);
57
+ --color-bruv-mauve-7: oklch(0.401 0.0161 305);
58
+ --color-bruv-mauve-8: oklch(0.489 0.0168 305);
59
+ --color-bruv-mauve-9: oklch(0.534 0.0161 305);
60
+ --color-bruv-mauve-10: oklch(0.582 0.0154 305);
61
+ --color-bruv-mauve-11: oklch(0.767 0.0105 305);
62
+ --color-bruv-mauve-12: oklch(0.949 0.0035 305);
63
+ }
64
+
65
+ /* ── Accent ──
66
+ * Periwinkle brand scale anchored at step 9 = #838BFF.
67
+ * OKLCH-based for smooth perceptual interpolation.
68
+ * Hue 272, anchor lightness 0.638, chroma 0.177.
69
+ */
70
+ :root {
71
+ --color-bruv-accent-1: oklch(0.992 0.005 272);
72
+ --color-bruv-accent-2: oklch(0.978 0.015 272);
73
+ --color-bruv-accent-3: oklch(0.955 0.035 272);
74
+ --color-bruv-accent-4: oklch(0.93 0.055 272);
75
+ --color-bruv-accent-5: oklch(0.9 0.085 272);
76
+ --color-bruv-accent-6: oklch(0.86 0.115 272);
77
+ --color-bruv-accent-7: oklch(0.81 0.145 272);
78
+ --color-bruv-accent-8: oklch(0.74 0.17 272);
79
+ --color-bruv-accent-9: oklch(0.638 0.177 272);
80
+ --color-bruv-accent-10: oklch(0.6 0.18 272);
81
+ --color-bruv-accent-11: oklch(0.5 0.18 272);
82
+ --color-bruv-accent-12: oklch(0.26 0.08 272);
83
+ }
84
+
85
+ [data-theme="dark"] {
86
+ --color-bruv-accent-1: oklch(0.17 0.015 272);
87
+ --color-bruv-accent-2: oklch(0.2 0.025 272);
88
+ --color-bruv-accent-3: oklch(0.24 0.05 272);
89
+ --color-bruv-accent-4: oklch(0.28 0.075 272);
90
+ --color-bruv-accent-5: oklch(0.32 0.09 272);
91
+ --color-bruv-accent-6: oklch(0.37 0.11 272);
92
+ --color-bruv-accent-7: oklch(0.44 0.135 272);
93
+ --color-bruv-accent-8: oklch(0.53 0.16 272);
94
+ --color-bruv-accent-9: oklch(0.638 0.177 272);
95
+ --color-bruv-accent-10: oklch(0.685 0.175 272);
96
+ --color-bruv-accent-11: oklch(0.78 0.155 272);
97
+ --color-bruv-accent-12: oklch(0.93 0.045 272);
98
+ }
99
+
100
+ /* ── Red ──
101
+ * Based on Radix Colors tomato scale.
102
+ * Used for danger and error states.
103
+ */
104
+ :root {
105
+ --color-bruv-red-1: #fffcfc;
106
+ --color-bruv-red-2: #fff8f7;
107
+ --color-bruv-red-3: #feebe7;
108
+ --color-bruv-red-4: #ffdcd3;
109
+ --color-bruv-red-5: #ffcdc2;
110
+ --color-bruv-red-6: #fdbdaf;
111
+ --color-bruv-red-7: #f5a898;
112
+ --color-bruv-red-8: #ec8e7b;
113
+ --color-bruv-red-9: #e54d2e;
114
+ --color-bruv-red-10: #dd4425;
115
+ --color-bruv-red-11: #d13415;
116
+ --color-bruv-red-12: #5c271f;
117
+ }
118
+
119
+ [data-theme="dark"] {
120
+ --color-bruv-red-1: #181111;
121
+ --color-bruv-red-2: #1f1513;
122
+ --color-bruv-red-3: #391714;
123
+ --color-bruv-red-4: #4e1511;
124
+ --color-bruv-red-5: #5e1c16;
125
+ --color-bruv-red-6: #6e2920;
126
+ --color-bruv-red-7: #853a2d;
127
+ --color-bruv-red-8: #ac4d39;
128
+ --color-bruv-red-9: #e54d2e;
129
+ --color-bruv-red-10: #ec6142;
130
+ --color-bruv-red-11: #ff977d;
131
+ --color-bruv-red-12: #fbd3cb;
132
+ }
133
+
134
+ /* ── Amber ──
135
+ * Based on Radix Colors amber scale.
136
+ * Used for warning and caution states.
137
+ */
138
+ :root {
139
+ --color-bruv-amber-1: #fefdfb;
140
+ --color-bruv-amber-2: #fefbe9;
141
+ --color-bruv-amber-3: #fff7c2;
142
+ --color-bruv-amber-4: #ffee9c;
143
+ --color-bruv-amber-5: #fbe577;
144
+ --color-bruv-amber-6: #f3d673;
145
+ --color-bruv-amber-7: #e9c162;
146
+ --color-bruv-amber-8: #e2a336;
147
+ --color-bruv-amber-9: #ffc53d;
148
+ --color-bruv-amber-10: #ffba18;
149
+ --color-bruv-amber-11: #ab6400;
150
+ --color-bruv-amber-12: #4f3422;
151
+ }
152
+
153
+ [data-theme="dark"] {
154
+ --color-bruv-amber-1: #16120c;
155
+ --color-bruv-amber-2: #1d180f;
156
+ --color-bruv-amber-3: #302008;
157
+ --color-bruv-amber-4: #3f2700;
158
+ --color-bruv-amber-5: #4d3000;
159
+ --color-bruv-amber-6: #5c3d05;
160
+ --color-bruv-amber-7: #714f19;
161
+ --color-bruv-amber-8: #8f6424;
162
+ --color-bruv-amber-9: #ffc53d;
163
+ --color-bruv-amber-10: #ffd60a;
164
+ --color-bruv-amber-11: #ffca16;
165
+ --color-bruv-amber-12: #ffe7b3;
166
+ }
167
+
168
+ /* ── Secondary ──
169
+ * Mint / aquamarine scale anchored at step 9 = #25E2A8.
170
+ * OKLCH-based for smooth perceptual interpolation.
171
+ * Hue 163, anchor lightness 0.815, chroma 0.155.
172
+ */
173
+ :root {
174
+ --color-bruv-secondary-1: oklch(0.992 0.005 163);
175
+ --color-bruv-secondary-2: oklch(0.975 0.015 163);
176
+ --color-bruv-secondary-3: oklch(0.95 0.035 163);
177
+ --color-bruv-secondary-4: oklch(0.92 0.055 163);
178
+ --color-bruv-secondary-5: oklch(0.89 0.075 163);
179
+ --color-bruv-secondary-6: oklch(0.87 0.095 163);
180
+ --color-bruv-secondary-7: oklch(0.85 0.115 163);
181
+ --color-bruv-secondary-8: oklch(0.84 0.135 163);
182
+ --color-bruv-secondary-9: oklch(0.815 0.155 163); /* #25E2A8 */
183
+ --color-bruv-secondary-10: oklch(0.78 0.155 163);
184
+ --color-bruv-secondary-11: oklch(0.55 0.13 163);
185
+ --color-bruv-secondary-12: oklch(0.28 0.06 163);
186
+ }
187
+
188
+ [data-theme="dark"] {
189
+ --color-bruv-secondary-1: oklch(0.17 0.015 163);
190
+ --color-bruv-secondary-2: oklch(0.2 0.025 163);
191
+ --color-bruv-secondary-3: oklch(0.24 0.045 163);
192
+ --color-bruv-secondary-4: oklch(0.28 0.06 163);
193
+ --color-bruv-secondary-5: oklch(0.32 0.075 163);
194
+ --color-bruv-secondary-6: oklch(0.38 0.09 163);
195
+ --color-bruv-secondary-7: oklch(0.46 0.105 163);
196
+ --color-bruv-secondary-8: oklch(0.58 0.125 163);
197
+ --color-bruv-secondary-9: oklch(0.815 0.155 163); /* #25E2A8 */
198
+ --color-bruv-secondary-10: oklch(0.85 0.145 163);
199
+ --color-bruv-secondary-11: oklch(0.9 0.13 163);
200
+ --color-bruv-secondary-12: oklch(0.95 0.04 163);
201
+ }
202
+
203
+ /* ── Tertiary ──
204
+ * Sky blue supporting scale.
205
+ * OKLCH-based for smooth perceptual interpolation.
206
+ * Hue 218, anchor lightness 0.545, chroma 0.135.
207
+ */
208
+ :root {
209
+ --color-bruv-tertiary-1: oklch(0.992 0.005 218);
210
+ --color-bruv-tertiary-2: oklch(0.978 0.012 218);
211
+ --color-bruv-tertiary-3: oklch(0.955 0.028 218);
212
+ --color-bruv-tertiary-4: oklch(0.928 0.048 218);
213
+ --color-bruv-tertiary-5: oklch(0.898 0.068 218);
214
+ --color-bruv-tertiary-6: oklch(0.865 0.088 218);
215
+ --color-bruv-tertiary-7: oklch(0.82 0.105 218);
216
+ --color-bruv-tertiary-8: oklch(0.72 0.12 218);
217
+ --color-bruv-tertiary-9: oklch(0.545 0.135 218);
218
+ --color-bruv-tertiary-10: oklch(0.505 0.135 218);
219
+ --color-bruv-tertiary-11: oklch(0.42 0.12 218);
220
+ --color-bruv-tertiary-12: oklch(0.24 0.06 218);
221
+ }
222
+
223
+ [data-theme="dark"] {
224
+ --color-bruv-tertiary-1: oklch(0.17 0.012 218);
225
+ --color-bruv-tertiary-2: oklch(0.2 0.02 218);
226
+ --color-bruv-tertiary-3: oklch(0.24 0.04 218);
227
+ --color-bruv-tertiary-4: oklch(0.28 0.055 218);
228
+ --color-bruv-tertiary-5: oklch(0.32 0.07 218);
229
+ --color-bruv-tertiary-6: oklch(0.38 0.085 218);
230
+ --color-bruv-tertiary-7: oklch(0.46 0.1 218);
231
+ --color-bruv-tertiary-8: oklch(0.58 0.115 218);
232
+ --color-bruv-tertiary-9: oklch(0.695 0.115 218);
233
+ --color-bruv-tertiary-10: oklch(0.735 0.115 218);
234
+ --color-bruv-tertiary-11: oklch(0.82 0.1 218);
235
+ --color-bruv-tertiary-12: oklch(0.92 0.04 218);
236
+ }
237
+
238
+ /* ── Green ──
239
+ * Based on Radix Colors green scale.
240
+ * Used for success and positive states.
241
+ */
242
+ :root {
243
+ --color-bruv-green-1: #fbfefc;
244
+ --color-bruv-green-2: #f4fbf6;
245
+ --color-bruv-green-3: #e6f6eb;
246
+ --color-bruv-green-4: #d6f1df;
247
+ --color-bruv-green-5: #c4e8d1;
248
+ --color-bruv-green-6: #adddc0;
249
+ --color-bruv-green-7: #8eceaa;
250
+ --color-bruv-green-8: #5bb98b;
251
+ --color-bruv-green-9: #30a46c;
252
+ --color-bruv-green-10: #2b9a66;
253
+ --color-bruv-green-11: #218358;
254
+ --color-bruv-green-12: #193b2d;
255
+ }
256
+
257
+ [data-theme="dark"] {
258
+ --color-bruv-green-1: #0e1512;
259
+ --color-bruv-green-2: #121b17;
260
+ --color-bruv-green-3: #132d21;
261
+ --color-bruv-green-4: #113b29;
262
+ --color-bruv-green-5: #174933;
263
+ --color-bruv-green-6: #20573e;
264
+ --color-bruv-green-7: #28684a;
265
+ --color-bruv-green-8: #2f7c57;
266
+ --color-bruv-green-9: #30a46c;
267
+ --color-bruv-green-10: #33b074;
268
+ --color-bruv-green-11: #3dd68c;
269
+ --color-bruv-green-12: #b1f1cb;
270
+ }
271
+
272
+ :root {
273
+ --color-bruv-chart-1: oklch(0.638 0.177 272);
274
+ --color-bruv-chart-2: oklch(0.72 0.145 163);
275
+ --color-bruv-chart-3: oklch(0.545 0.135 218);
276
+ --color-bruv-chart-4: oklch(0.505 0.155 295);
277
+ --color-bruv-chart-5: oklch(0.525 0.105 185);
278
+ --color-bruv-chart-6: oklch(0.565 0.125 355);
279
+ }
280
+
281
+ [data-theme="dark"] {
282
+ --color-bruv-chart-1: oklch(0.74 0.165 272);
283
+ --color-bruv-chart-2: oklch(0.805 0.135 163);
284
+ --color-bruv-chart-3: oklch(0.695 0.115 218);
285
+ --color-bruv-chart-4: oklch(0.675 0.145 295);
286
+ --color-bruv-chart-5: oklch(0.715 0.095 185);
287
+ --color-bruv-chart-6: oklch(0.715 0.105 355);
288
+ }
package/src/shiki.css ADDED
@@ -0,0 +1,37 @@
1
+ /* Shiki dual-theme: light is default, dark activates via data-theme */
2
+ .shiki {
3
+ color: var(--shiki-light);
4
+ background-color: transparent;
5
+ }
6
+
7
+ .shiki span {
8
+ color: var(--shiki-light);
9
+ }
10
+
11
+ [data-theme="dark"] .shiki {
12
+ color: var(--shiki-dark);
13
+ }
14
+
15
+ [data-theme="dark"] .shiki span {
16
+ color: var(--shiki-dark);
17
+ }
18
+
19
+ /* CodeBlock line numbers — rendered via CSS counter on shiki's .line spans */
20
+ [data-bruv-code-block][data-line-numbers] .shiki code {
21
+ counter-reset: bruv-line;
22
+ }
23
+
24
+ [data-bruv-code-block][data-line-numbers] .shiki .line {
25
+ counter-increment: bruv-line;
26
+ }
27
+
28
+ [data-bruv-code-block][data-line-numbers] .shiki .line::before {
29
+ content: counter(bruv-line);
30
+ display: inline-block;
31
+ width: 3ch;
32
+ margin-right: 1.25rem;
33
+ color: var(--text-color-bruv-tertiary);
34
+ text-align: right;
35
+ font-variant-numeric: tabular-nums;
36
+ user-select: none;
37
+ }
package/src/styles.css ADDED
@@ -0,0 +1,23 @@
1
+ @import "./theme.css";
2
+ @import "./scales.css";
3
+ @import "./shiki.css";
4
+
5
+ @source "../dist/index.js";
6
+ @source "../dist/charts.js";
7
+ @source "../dist/area-chart.js";
8
+ @source "../dist/bar-chart.js";
9
+ @source "../dist/line-chart.js";
10
+ @source "../dist/composed-chart.js";
11
+ @source "../dist/pie-chart.js";
12
+ @source "../dist/radar-chart.js";
13
+ @source "../dist/radial-chart.js";
14
+ @source "../dist/sankey-chart.js";
15
+
16
+ * {
17
+ --tw-ring-offset-color: var(--background-color-bruv-base-1);
18
+ }
19
+
20
+ ::selection {
21
+ background-color: var(--background-color-bruv-inverse);
22
+ color: var(--text-color-bruv-inverse);
23
+ }