{"version":3,"sources":["../../registry/default/ui/chart.tsx","../../lib/utils.ts"],"names":["chart_exports","__export","ChartContainer","ChartLegend","ChartLegendContent","ChartStyle","ChartTooltip","ChartTooltipContent","__toCommonJS","React","RechartsPrimitive","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","THEMES","ChartContext","useChart","context","id","className","children","config","props","ref","uniqueId","chartId","colorConfig","_","theme","prefix","key","itemConfig","color","active","payload","indicator","hideLabel","hideIndicator","label","labelFormatter","labelClassName","formatter","nameKey","labelKey","tooltipLabel","item","getPayloadConfigFromPayload","value","nestLabel","index","indicatorColor","hideIcon","verticalAlign","payloadPayload","configLabelKey"],"mappings":"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","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"@/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n  [k in string]: {\n    label?: React.ReactNode\n    icon?: React.ComponentType\n  } & (\n    | { color?: string; theme?: never }\n    | { color?: never; theme: Record<keyof typeof THEMES, string> }\n  )\n}\n\ntype ChartContextProps = {\n  config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n  const context = React.useContext(ChartContext)\n\n  if (!context) {\n    throw new Error(\"useChart must be used within a <ChartContainer />\")\n  }\n\n  return context\n}\n\nconst ChartContainer = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    config: ChartConfig\n    children: React.ComponentProps<\n      typeof RechartsPrimitive.ResponsiveContainer\n    >[\"children\"]\n  }\n>(({ id, className, children, config, ...props }, ref) => {\n  const uniqueId = React.useId()\n  const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n\n  return (\n    <ChartContext.Provider value={{ config }}>\n      <div\n        data-chart={chartId}\n        ref={ref}\n        className={cn(\n          \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n          className\n        )}\n        {...props}\n      >\n        <ChartStyle id={chartId} config={config} />\n        <RechartsPrimitive.ResponsiveContainer>\n          {children}\n        </RechartsPrimitive.ResponsiveContainer>\n      </div>\n    </ChartContext.Provider>\n  )\n})\nChartContainer.displayName = \"Chart\"\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n  const colorConfig = Object.entries(config).filter(\n    ([_, config]) => config.theme || config.color\n  )\n\n  if (!colorConfig.length) {\n    return null\n  }\n\n  return (\n    <style\n      dangerouslySetInnerHTML={{\n        __html: Object.entries(THEMES)\n          .map(\n            ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n  .map(([key, itemConfig]) => {\n    const color =\n      itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n      itemConfig.color\n    return color ? `  --color-${key}: ${color};` : null\n  })\n  .join(\"\\n\")}\n}\n`\n          )\n          .join(\"\\n\"),\n      }}\n    />\n  )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n    React.ComponentProps<\"div\"> & {\n      hideLabel?: boolean\n      hideIndicator?: boolean\n      indicator?: \"line\" | \"dot\" | \"dashed\"\n      nameKey?: string\n      labelKey?: string\n    }\n>(\n  (\n    {\n      active,\n      payload,\n      className,\n      indicator = \"dot\",\n      hideLabel = false,\n      hideIndicator = false,\n      label,\n      labelFormatter,\n      labelClassName,\n      formatter,\n      color,\n      nameKey,\n      labelKey,\n    },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    const tooltipLabel = React.useMemo(() => {\n      if (hideLabel || !payload?.length) {\n        return null\n      }\n\n      const [item] = payload\n      const key = `${labelKey || item.dataKey || item.name || \"value\"}`\n      const itemConfig = getPayloadConfigFromPayload(config, item, key)\n      const value =\n        !labelKey && typeof label === \"string\"\n          ? config[label as keyof typeof config]?.label || label\n          : itemConfig?.label\n\n      if (labelFormatter) {\n        return (\n          <div className={cn(\"font-medium\", labelClassName)}>\n            {labelFormatter(value, payload)}\n          </div>\n        )\n      }\n\n      if (!value) {\n        return null\n      }\n\n      return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n    }, [\n      label,\n      labelFormatter,\n      payload,\n      hideLabel,\n      labelClassName,\n      config,\n      labelKey,\n    ])\n\n    if (!active || !payload?.length) {\n      return null\n    }\n\n    const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n          className\n        )}\n      >\n        {!nestLabel ? tooltipLabel : null}\n        <div className=\"grid gap-1.5\">\n          {payload.map((item, index) => {\n            const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n            const itemConfig = getPayloadConfigFromPayload(config, item, key)\n            const indicatorColor = color || item.payload.fill || item.color\n\n            return (\n              <div\n                key={item.dataKey}\n                className={cn(\n                  \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n                  indicator === \"dot\" && \"items-center\"\n                )}\n              >\n                {formatter && item?.value !== undefined && item.name ? (\n                  formatter(item.value, item.name, item, index, item.payload)\n                ) : (\n                  <>\n                    {itemConfig?.icon ? (\n                      <itemConfig.icon />\n                    ) : (\n                      !hideIndicator && (\n                        <div\n                          className={cn(\n                            \"shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]\",\n                            {\n                              \"h-2.5 w-2.5\": indicator === \"dot\",\n                              \"w-1\": indicator === \"line\",\n                              \"w-0 border-[1.5px] border-dashed bg-transparent\":\n                                indicator === \"dashed\",\n                              \"my-0.5\": nestLabel && indicator === \"dashed\",\n                            }\n                          )}\n                          style={\n                            {\n                              \"--color-bg\": indicatorColor,\n                              \"--color-border\": indicatorColor,\n                            } as React.CSSProperties\n                          }\n                        />\n                      )\n                    )}\n                    <div\n                      className={cn(\n                        \"flex flex-1 justify-between leading-none\",\n                        nestLabel ? \"items-end\" : \"items-center\"\n                      )}\n                    >\n                      <div className=\"grid gap-1.5\">\n                        {nestLabel ? tooltipLabel : null}\n                        <span className=\"text-muted-foreground\">\n                          {itemConfig?.label || item.name}\n                        </span>\n                      </div>\n                      {item.value && (\n                        <span className=\"font-mono font-medium tabular-nums text-foreground\">\n                          {item.value.toLocaleString()}\n                        </span>\n                      )}\n                    </div>\n                  </>\n                )}\n              </div>\n            )\n          })}\n        </div>\n      </div>\n    )\n  }\n)\nChartTooltipContent.displayName = \"ChartTooltip\"\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> &\n    Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n      hideIcon?: boolean\n      nameKey?: string\n    }\n>(\n  (\n    { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    if (!payload?.length) {\n      return null\n    }\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-center justify-center gap-4\",\n          verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n          className\n        )}\n      >\n        {payload.map((item) => {\n          const key = `${nameKey || item.dataKey || \"value\"}`\n          const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n          return (\n            <div\n              key={item.value}\n              className={cn(\n                \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n              )}\n            >\n              {itemConfig?.icon && !hideIcon ? (\n                <itemConfig.icon />\n              ) : (\n                <div\n                  className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n                  style={{\n                    backgroundColor: item.color,\n                  }}\n                />\n              )}\n              {itemConfig?.label}\n            </div>\n          )\n        })}\n      </div>\n    )\n  }\n)\nChartLegendContent.displayName = \"ChartLegend\"\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n  config: ChartConfig,\n  payload: unknown,\n  key: string\n) {\n  if (typeof payload !== \"object\" || payload === null) {\n    return undefined\n  }\n\n  const payloadPayload =\n    \"payload\" in payload &&\n    typeof payload.payload === \"object\" &&\n    payload.payload !== null\n      ? payload.payload\n      : undefined\n\n  let configLabelKey: string = key\n\n  if (\n    key in payload &&\n    typeof payload[key as keyof typeof payload] === \"string\"\n  ) {\n    configLabelKey = payload[key as keyof typeof payload] as string\n  } else if (\n    payloadPayload &&\n    key in payloadPayload &&\n    typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n  ) {\n    configLabelKey = payloadPayload[\n      key as keyof typeof payloadPayload\n    ] as string\n  }\n\n  return configLabelKey in config\n    ? config[configLabelKey]\n    : config[key as keyof typeof config]\n}\n\nexport {\n  ChartContainer,\n  ChartTooltip,\n  ChartTooltipContent,\n  ChartLegend,\n  ChartLegendContent,\n  ChartStyle,\n}\n","import * as React from \"react\"\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n\nexport function formatDate(input: string | number): string {\n  const date = new Date(input)\n  return date.toLocaleDateString(\"en-US\", {\n    month: \"long\",\n    day: \"numeric\",\n    year: \"numeric\",\n  })\n}\n\nexport function absoluteUrl(path: string) {\n  return `${process.env.NEXT_PUBLIC_APP_URL}${path}`\n}\n"]}