@karakuri-ui/react 0.2.4 → 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.
Files changed (140) hide show
  1. package/README.md +5 -5
  2. package/dist/components/ui/accordion.d.mts +1 -10
  3. package/dist/components/ui/accordion.d.ts +1 -10
  4. package/dist/components/ui/accordion.js +2 -7
  5. package/dist/components/ui/accordion.js.map +1 -1
  6. package/dist/components/ui/accordion.mjs +2 -7
  7. package/dist/components/ui/accordion.mjs.map +1 -1
  8. package/dist/components/ui/alert.d.mts +3 -12
  9. package/dist/components/ui/alert.d.ts +3 -12
  10. package/dist/components/ui/alert.js +2 -8
  11. package/dist/components/ui/alert.js.map +1 -1
  12. package/dist/components/ui/alert.mjs +2 -7
  13. package/dist/components/ui/alert.mjs.map +1 -1
  14. package/dist/components/ui/avatar.d.mts +1 -10
  15. package/dist/components/ui/avatar.d.ts +1 -10
  16. package/dist/components/ui/avatar.js +3 -8
  17. package/dist/components/ui/avatar.js.map +1 -1
  18. package/dist/components/ui/avatar.mjs +3 -8
  19. package/dist/components/ui/avatar.mjs.map +1 -1
  20. package/dist/components/ui/breadcrumb.d.mts +1 -12
  21. package/dist/components/ui/breadcrumb.d.ts +1 -12
  22. package/dist/components/ui/breadcrumb.js +2 -10
  23. package/dist/components/ui/breadcrumb.js.map +1 -1
  24. package/dist/components/ui/breadcrumb.mjs +2 -10
  25. package/dist/components/ui/breadcrumb.mjs.map +1 -1
  26. package/dist/components/ui/card.d.mts +1 -18
  27. package/dist/components/ui/card.d.ts +1 -18
  28. package/dist/components/ui/card.js +2 -11
  29. package/dist/components/ui/card.js.map +1 -1
  30. package/dist/components/ui/card.mjs +2 -11
  31. package/dist/components/ui/card.mjs.map +1 -1
  32. package/dist/components/ui/chart.d.mts +2 -18
  33. package/dist/components/ui/chart.d.ts +2 -18
  34. package/dist/components/ui/chart.js +2 -17
  35. package/dist/components/ui/chart.js.map +1 -1
  36. package/dist/components/ui/chart.mjs +2 -16
  37. package/dist/components/ui/chart.mjs.map +1 -1
  38. package/dist/components/ui/drawer.d.mts +2 -17
  39. package/dist/components/ui/drawer.d.ts +2 -17
  40. package/dist/components/ui/drawer.js +1 -15
  41. package/dist/components/ui/drawer.js.map +1 -1
  42. package/dist/components/ui/drawer.mjs +1 -14
  43. package/dist/components/ui/drawer.mjs.map +1 -1
  44. package/dist/components/ui/dropdown.d.mts +1 -26
  45. package/dist/components/ui/dropdown.d.ts +1 -26
  46. package/dist/components/ui/dropdown.js +1 -16
  47. package/dist/components/ui/dropdown.js.map +1 -1
  48. package/dist/components/ui/dropdown.mjs +1 -16
  49. package/dist/components/ui/dropdown.mjs.map +1 -1
  50. package/dist/components/ui/field.d.mts +1 -8
  51. package/dist/components/ui/field.d.ts +1 -8
  52. package/dist/components/ui/field.js +2 -7
  53. package/dist/components/ui/field.js.map +1 -1
  54. package/dist/components/ui/field.mjs +2 -7
  55. package/dist/components/ui/field.mjs.map +1 -1
  56. package/dist/components/ui/index.d.mts +4 -4
  57. package/dist/components/ui/index.d.ts +4 -4
  58. package/dist/components/ui/index.js +0 -8
  59. package/dist/components/ui/index.js.map +1 -1
  60. package/dist/components/ui/index.mjs +4 -8
  61. package/dist/components/ui/index.mjs.map +1 -1
  62. package/dist/components/ui/metric-card.d.mts +1 -16
  63. package/dist/components/ui/metric-card.d.ts +1 -16
  64. package/dist/components/ui/metric-card.js +2 -10
  65. package/dist/components/ui/metric-card.js.map +1 -1
  66. package/dist/components/ui/metric-card.mjs +2 -10
  67. package/dist/components/ui/metric-card.mjs.map +1 -1
  68. package/dist/components/ui/modal.d.mts +2 -32
  69. package/dist/components/ui/modal.d.ts +2 -32
  70. package/dist/components/ui/modal.js +2 -27
  71. package/dist/components/ui/modal.js.map +1 -1
  72. package/dist/components/ui/modal.mjs +2 -27
  73. package/dist/components/ui/modal.mjs.map +1 -1
  74. package/dist/components/ui/navigation-menu.d.mts +1 -20
  75. package/dist/components/ui/navigation-menu.d.ts +1 -20
  76. package/dist/components/ui/navigation-menu.js +2 -12
  77. package/dist/components/ui/navigation-menu.js.map +1 -1
  78. package/dist/components/ui/navigation-menu.mjs +2 -12
  79. package/dist/components/ui/navigation-menu.mjs.map +1 -1
  80. package/dist/components/ui/pagination.d.mts +1 -18
  81. package/dist/components/ui/pagination.d.ts +1 -18
  82. package/dist/components/ui/pagination.js +2 -13
  83. package/dist/components/ui/pagination.js.map +1 -1
  84. package/dist/components/ui/pagination.mjs +2 -13
  85. package/dist/components/ui/pagination.mjs.map +1 -1
  86. package/dist/components/ui/popover.d.mts +3 -15
  87. package/dist/components/ui/popover.d.ts +3 -15
  88. package/dist/components/ui/popover.js +1 -11
  89. package/dist/components/ui/popover.js.map +1 -1
  90. package/dist/components/ui/popover.mjs +1 -10
  91. package/dist/components/ui/popover.mjs.map +1 -1
  92. package/dist/components/ui/radio-group.d.mts +1 -6
  93. package/dist/components/ui/radio-group.d.ts +1 -6
  94. package/dist/components/ui/radio-group.js +2 -5
  95. package/dist/components/ui/radio-group.js.map +1 -1
  96. package/dist/components/ui/radio-group.mjs +2 -5
  97. package/dist/components/ui/radio-group.mjs.map +1 -1
  98. package/dist/components/ui/segmented.d.mts +1 -6
  99. package/dist/components/ui/segmented.d.ts +1 -6
  100. package/dist/components/ui/segmented.js +2 -5
  101. package/dist/components/ui/segmented.js.map +1 -1
  102. package/dist/components/ui/segmented.mjs +2 -5
  103. package/dist/components/ui/segmented.mjs.map +1 -1
  104. package/dist/components/ui/select.d.mts +4 -15
  105. package/dist/components/ui/select.d.ts +4 -15
  106. package/dist/components/ui/select.js +5 -14
  107. package/dist/components/ui/select.js.map +1 -1
  108. package/dist/components/ui/select.mjs +5 -14
  109. package/dist/components/ui/select.mjs.map +1 -1
  110. package/dist/components/ui/table.d.mts +1 -15
  111. package/dist/components/ui/table.d.ts +1 -15
  112. package/dist/components/ui/table.js +2 -11
  113. package/dist/components/ui/table.js.map +1 -1
  114. package/dist/components/ui/table.mjs +2 -11
  115. package/dist/components/ui/table.mjs.map +1 -1
  116. package/dist/components/ui/tabs.d.mts +1 -10
  117. package/dist/components/ui/tabs.d.ts +1 -10
  118. package/dist/components/ui/tabs.js +1 -6
  119. package/dist/components/ui/tabs.js.map +1 -1
  120. package/dist/components/ui/tabs.mjs +1 -6
  121. package/dist/components/ui/tabs.mjs.map +1 -1
  122. package/dist/components/ui/toggle-group.d.mts +1 -6
  123. package/dist/components/ui/toggle-group.d.ts +1 -6
  124. package/dist/components/ui/toggle-group.js +2 -5
  125. package/dist/components/ui/toggle-group.js.map +1 -1
  126. package/dist/components/ui/toggle-group.mjs +2 -5
  127. package/dist/components/ui/toggle-group.mjs.map +1 -1
  128. package/dist/components/ui/tooltip.d.mts +3 -14
  129. package/dist/components/ui/tooltip.d.ts +3 -14
  130. package/dist/components/ui/tooltip.js +1 -10
  131. package/dist/components/ui/tooltip.js.map +1 -1
  132. package/dist/components/ui/tooltip.mjs +1 -9
  133. package/dist/components/ui/tooltip.mjs.map +1 -1
  134. package/dist/lib/code-generator.d.mts +60 -0
  135. package/dist/lib/code-generator.d.ts +60 -0
  136. package/dist/lib/code-generator.js +224 -0
  137. package/dist/lib/code-generator.js.map +1 -0
  138. package/dist/lib/code-generator.mjs +159 -0
  139. package/dist/lib/code-generator.mjs.map +1 -0
  140. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/card.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ── Context for size propagation ──\ntype CardSize = 'sm' | 'default' | 'lg'\ntype CardDirection = 'vertical' | 'horizontal'\n\nconst CardContext = React.createContext<{ size: CardSize; direction: CardDirection }>({\n size: 'default',\n direction: 'vertical',\n})\n\nfunction useCard() {\n return React.useContext(CardContext)\n}\n\n// ── Card (Root) ──\nconst cardVariants = cva(\n 'flex overflow-hidden transition-all duration-normal',\n {\n variants: {\n variant: {\n default: 'bg-background-paper border border-border-subtle shadow-sm',\n outline: 'bg-background-paper border border-border',\n ghost: 'bg-transparent',\n },\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n radius: {\n sm: 'rounded-sm', // 2px\n base: 'rounded', // 4px\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n xl: 'rounded-xl', // 12px\n '2xl': 'rounded-2xl', // 16px\n },\n direction: {\n vertical: 'flex-col',\n horizontal: 'flex-row',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'xl',\n direction: 'vertical',\n },\n }\n)\n\nexport type CardVariant = 'default' | 'outline' | 'ghost'\nexport type CardRadius = 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Visual style */\n variant?: CardVariant\n /** Content padding scale */\n size?: CardSize\n /** Border radius */\n radius?: CardRadius\n /** Layout direction */\n direction?: CardDirection\n /** Enable hover effect for interactive cards */\n interactive?: boolean\n /** Render as child element (Slot pattern) */\n asChild?: boolean\n}\n\nconst CardRoot = React.forwardRef<HTMLDivElement, CardProps>(\n ({\n className,\n variant = 'default',\n size = 'default',\n radius = 'xl',\n direction = 'vertical',\n interactive = false,\n asChild = false,\n children,\n ...props\n }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n // Horizontal: separate CardImage from rest, wrap rest in flex-col\n let content = children\n if (direction === 'horizontal') {\n const childArray = React.Children.toArray(children)\n const imageChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardImage) {\n imageChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n content = (\n <>\n {imageChildren}\n <div className=\"flex-1 flex flex-col min-w-0\">\n {otherChildren}\n </div>\n </>\n )\n }\n\n return (\n <CardContext.Provider value={{ size, direction }}>\n <Comp\n ref={ref}\n className={cn(\n cardVariants({ variant, size, radius, direction }),\n interactive && 'cursor-pointer hover:shadow-md hover:-translate-y-0.5',\n className\n )}\n {...props}\n >\n {content}\n </Comp>\n </CardContext.Provider>\n )\n }\n)\nCardRoot.displayName = 'Card'\n\n// ── Size-based padding map (responsive: mobile → desktop) ──\nconst sizePaddingMap = {\n sm: 'p-4', // 16px\n default: 'p-4 sm:p-6', // 16px → 24px\n lg: 'p-6 sm:p-8', // 24px → 32px\n} as const\n\nconst sizePaddingXMap = {\n sm: 'px-4', // 16px\n default: 'px-4 sm:px-6', // 16px → 24px\n lg: 'px-6 sm:px-8', // 24px → 32px\n} as const\n\nconst sizePaddingYMap = {\n sm: 'py-3', // 12px\n default: 'py-3 sm:py-4', // 12px → 16px\n lg: 'py-4 sm:py-5', // 16px → 20px\n} as const\n\n// Top padding for CardHeader — optical balance (top >= sides)\nconst sizePaddingTMap = {\n sm: 'pt-5', // 20px\n default: 'pt-5 sm:pt-6', // 20px → 24px\n lg: 'pt-6 sm:pt-8', // 24px → 32px\n} as const\n\n// Inner bottom padding (between sections) — tighter than outer\nconst sizeInnerPbMap = {\n sm: 'pb-3', // 12px\n default: 'pb-3 sm:pb-4', // 12px → 16px\n lg: 'pb-3 sm:pb-4', // 12px → 16px (default와 동일)\n} as const\n\n// Last-child bottom padding for CardContent (when no footer) — match pt\nconst sizeLastPbMap = {\n sm: 'last:pb-5', // 20px\n default: 'last:pb-5 sm:last:pb-6', // 20px → 24px\n lg: 'last:pb-6 sm:last:pb-8', // 24px → 32px\n} as const\n\n// ── CardImage ──\n// Overlay opacity to Tailwind class mapping\nconst overlayOpacityMap: Record<number, string> = {\n 10: 'from-black/10',\n 20: 'from-black/20',\n 30: 'from-black/30',\n 40: 'from-black/40',\n 50: 'from-black/50',\n 60: 'from-black/60',\n 70: 'from-black/70',\n 80: 'from-black/80',\n 90: 'from-black/90',\n}\n\nexport interface CardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Gradient overlay on image */\n overlay?: boolean\n /** Overlay opacity (10–90). Default: 60 */\n overlayOpacity?: number\n /** Custom class for overlay gradient (overrides overlayOpacity) */\n overlayClassName?: string\n}\n\nconst CardImage = React.forwardRef<HTMLImageElement, CardImageProps>(\n ({ className, overlay = false, overlayOpacity = 60, overlayClassName, alt = '', ...props }, ref) => {\n const { direction } = useCard()\n const isHorizontal = direction === 'horizontal'\n\n // Horizontal: use absolute positioning so the image fills the\n // wrapper height which is determined by the content side via\n // flexbox align-items:stretch (default).\n if (isHorizontal) {\n const opacityClass = overlay\n ? (overlayOpacityMap[overlayOpacity] || 'from-black/60')\n : null\n\n return (\n <div className={cn('relative shrink-0 w-48 overflow-hidden', className)}>\n <img\n ref={ref}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n {...props}\n />\n {overlay && (\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n )}\n </div>\n )\n }\n\n // Vertical\n if (overlay) {\n const opacityClass = overlayOpacityMap[overlayOpacity] || 'from-black/60'\n\n return (\n <div className=\"relative w-full shrink-0 overflow-hidden\">\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover', className)}\n {...props}\n />\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n </div>\n )\n }\n\n return (\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover shrink-0', className)}\n {...props}\n />\n )\n }\n)\nCardImage.displayName = 'CardImage'\n\n// ── CardHeader ──\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, children, ...props }, ref) => {\n const { size } = useCard()\n\n // Separate CardAction from other children for proper flex layout\n const childArray = React.Children.toArray(children)\n const actionChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardAction) {\n actionChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-start gap-3',\n sizePaddingXMap[size],\n sizePaddingTMap[size],\n sizeInnerPbMap[size],\n sizeLastPbMap[size],\n className\n )}\n {...props}\n >\n <div className=\"flex-1 min-w-0 space-y-3\">\n {otherChildren}\n </div>\n {actionChildren}\n </div>\n )\n }\n)\nCardHeader.displayName = 'CardHeader'\n\n// ── CardTitle ──\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /** Leading icon */\n icon?: React.ReactNode\n}\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, icon, children, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n className={cn(\n 'font-semibold text-foreground leading-none tracking-tight',\n icon && 'flex items-center gap-2',\n className\n )}\n {...props}\n >\n {icon && (\n <span className=\"shrink-0 icon-sm [&>svg]:w-full [&>svg]:h-full\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children}\n </h3>\n )\n }\n)\nCardTitle.displayName = 'CardTitle'\n\n// ── CardDescription ──\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('text-sm text-text-muted', className)}\n {...props}\n />\n )\n }\n)\nCardDescription.displayName = 'CardDescription'\n\n// ── CardAction ──\nexport interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardAction = React.forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('shrink-0 ml-auto -mr-2 -mt-2', className)}\n {...props}\n />\n )\n }\n)\nCardAction.displayName = 'CardAction'\n\n// ── CardContent ──\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(sizePaddingXMap[size], 'pb-0', sizeLastPbMap[size], className)}\n {...props}\n />\n )\n }\n)\nCardContent.displayName = 'CardContent'\n\n// ── CardFooter ──\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-2',\n sizePaddingXMap[size],\n sizePaddingYMap[size],\n 'mt-auto',\n className\n )}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = 'CardFooter'\n\n// ─── Namespace ──────────────────────────────────────────\nconst Card = Object.assign(CardRoot, {\n Image: CardImage,\n Header: CardHeader,\n Title: CardTitle,\n Description: CardDescription,\n Action: CardAction,\n Content: CardContent,\n Footer: CardFooter,\n})\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Card {\n export type ImageProps = CardImageProps\n export type HeaderProps = CardHeaderProps\n export type TitleProps = CardTitleProps\n export type DescriptionProps = CardDescriptionProps\n export type ActionProps = CardActionProps\n export type ContentProps = CardContentProps\n export type FooterProps = CardFooterProps\n}\n\nexport {\n Card,\n CardImage,\n CardHeader,\n CardTitle,\n CardDescription,\n CardAction,\n CardContent,\n CardFooter,\n cardVariants,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/card.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ── Context for size propagation ──\ntype CardSize = 'sm' | 'default' | 'lg'\ntype CardDirection = 'vertical' | 'horizontal'\n\nconst CardContext = React.createContext<{ size: CardSize; direction: CardDirection }>({\n size: 'default',\n direction: 'vertical',\n})\n\nfunction useCard() {\n return React.useContext(CardContext)\n}\n\n// ── Card (Root) ──\nconst cardVariants = cva(\n 'flex overflow-hidden transition-all duration-normal',\n {\n variants: {\n variant: {\n default: 'bg-background-paper border border-border-subtle shadow-sm',\n outline: 'bg-background-paper border border-border',\n ghost: 'bg-transparent',\n },\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n radius: {\n sm: 'rounded-sm', // 2px\n base: 'rounded', // 4px\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n xl: 'rounded-xl', // 12px\n '2xl': 'rounded-2xl', // 16px\n },\n direction: {\n vertical: 'flex-col',\n horizontal: 'flex-row',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'xl',\n direction: 'vertical',\n },\n }\n)\n\nexport type CardVariant = 'default' | 'outline' | 'ghost'\nexport type CardRadius = 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Visual style */\n variant?: CardVariant\n /** Content padding scale */\n size?: CardSize\n /** Border radius */\n radius?: CardRadius\n /** Layout direction */\n direction?: CardDirection\n /** Enable hover effect for interactive cards */\n interactive?: boolean\n /** Render as child element (Slot pattern) */\n asChild?: boolean\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({\n className,\n variant = 'default',\n size = 'default',\n radius = 'xl',\n direction = 'vertical',\n interactive = false,\n asChild = false,\n children,\n ...props\n }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n // Horizontal: separate CardImage from rest, wrap rest in flex-col\n let content = children\n if (direction === 'horizontal') {\n const childArray = React.Children.toArray(children)\n const imageChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardImage) {\n imageChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n content = (\n <>\n {imageChildren}\n <div className=\"flex-1 flex flex-col min-w-0\">\n {otherChildren}\n </div>\n </>\n )\n }\n\n return (\n <CardContext.Provider value={{ size, direction }}>\n <Comp\n ref={ref}\n className={cn(\n cardVariants({ variant, size, radius, direction }),\n interactive && 'cursor-pointer hover:shadow-md hover:-translate-y-0.5',\n className\n )}\n {...props}\n >\n {content}\n </Comp>\n </CardContext.Provider>\n )\n }\n)\nCard.displayName = 'Card'\n\n// ── Size-based padding map (responsive: mobile → desktop) ──\nconst sizePaddingMap = {\n sm: 'p-4', // 16px\n default: 'p-4 sm:p-6', // 16px → 24px\n lg: 'p-6 sm:p-8', // 24px → 32px\n} as const\n\nconst sizePaddingXMap = {\n sm: 'px-4', // 16px\n default: 'px-4 sm:px-6', // 16px → 24px\n lg: 'px-6 sm:px-8', // 24px → 32px\n} as const\n\nconst sizePaddingYMap = {\n sm: 'py-3', // 12px\n default: 'py-3 sm:py-4', // 12px → 16px\n lg: 'py-4 sm:py-5', // 16px → 20px\n} as const\n\n// Top padding for CardHeader — optical balance (top >= sides)\nconst sizePaddingTMap = {\n sm: 'pt-5', // 20px\n default: 'pt-5 sm:pt-6', // 20px → 24px\n lg: 'pt-6 sm:pt-8', // 24px → 32px\n} as const\n\n// Inner bottom padding (between sections) — tighter than outer\nconst sizeInnerPbMap = {\n sm: 'pb-3', // 12px\n default: 'pb-3 sm:pb-4', // 12px → 16px\n lg: 'pb-3 sm:pb-4', // 12px → 16px (default와 동일)\n} as const\n\n// Last-child bottom padding for CardContent (when no footer) — match pt\nconst sizeLastPbMap = {\n sm: 'last:pb-5', // 20px\n default: 'last:pb-5 sm:last:pb-6', // 20px → 24px\n lg: 'last:pb-6 sm:last:pb-8', // 24px → 32px\n} as const\n\n// ── CardImage ──\n// Overlay opacity to Tailwind class mapping\nconst overlayOpacityMap: Record<number, string> = {\n 10: 'from-black/10',\n 20: 'from-black/20',\n 30: 'from-black/30',\n 40: 'from-black/40',\n 50: 'from-black/50',\n 60: 'from-black/60',\n 70: 'from-black/70',\n 80: 'from-black/80',\n 90: 'from-black/90',\n}\n\nexport interface CardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Gradient overlay on image */\n overlay?: boolean\n /** Overlay opacity (10–90). Default: 60 */\n overlayOpacity?: number\n /** Custom class for overlay gradient (overrides overlayOpacity) */\n overlayClassName?: string\n}\n\nconst CardImage = React.forwardRef<HTMLImageElement, CardImageProps>(\n ({ className, overlay = false, overlayOpacity = 60, overlayClassName, alt = '', ...props }, ref) => {\n const { direction } = useCard()\n const isHorizontal = direction === 'horizontal'\n\n // Horizontal: use absolute positioning so the image fills the\n // wrapper height which is determined by the content side via\n // flexbox align-items:stretch (default).\n if (isHorizontal) {\n const opacityClass = overlay\n ? (overlayOpacityMap[overlayOpacity] || 'from-black/60')\n : null\n\n return (\n <div className={cn('relative shrink-0 w-48 overflow-hidden', className)}>\n <img\n ref={ref}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n {...props}\n />\n {overlay && (\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n )}\n </div>\n )\n }\n\n // Vertical\n if (overlay) {\n const opacityClass = overlayOpacityMap[overlayOpacity] || 'from-black/60'\n\n return (\n <div className=\"relative w-full shrink-0 overflow-hidden\">\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover', className)}\n {...props}\n />\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n </div>\n )\n }\n\n return (\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover shrink-0', className)}\n {...props}\n />\n )\n }\n)\nCardImage.displayName = 'CardImage'\n\n// ── CardHeader ──\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, children, ...props }, ref) => {\n const { size } = useCard()\n\n // Separate CardAction from other children for proper flex layout\n const childArray = React.Children.toArray(children)\n const actionChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardAction) {\n actionChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-start gap-3',\n sizePaddingXMap[size],\n sizePaddingTMap[size],\n sizeInnerPbMap[size],\n sizeLastPbMap[size],\n className\n )}\n {...props}\n >\n <div className=\"flex-1 min-w-0 space-y-3\">\n {otherChildren}\n </div>\n {actionChildren}\n </div>\n )\n }\n)\nCardHeader.displayName = 'CardHeader'\n\n// ── CardTitle ──\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /** Leading icon */\n icon?: React.ReactNode\n}\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, icon, children, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n className={cn(\n 'font-semibold text-foreground leading-none tracking-tight',\n icon && 'flex items-center gap-2',\n className\n )}\n {...props}\n >\n {icon && (\n <span className=\"shrink-0 icon-sm [&>svg]:w-full [&>svg]:h-full\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children}\n </h3>\n )\n }\n)\nCardTitle.displayName = 'CardTitle'\n\n// ── CardDescription ──\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('text-sm text-text-muted', className)}\n {...props}\n />\n )\n }\n)\nCardDescription.displayName = 'CardDescription'\n\n// ── CardAction ──\nexport interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardAction = React.forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('shrink-0 ml-auto -mr-2 -mt-2', className)}\n {...props}\n />\n )\n }\n)\nCardAction.displayName = 'CardAction'\n\n// ── CardContent ──\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(sizePaddingXMap[size], 'pb-0', sizeLastPbMap[size], className)}\n {...props}\n />\n )\n }\n)\nCardContent.displayName = 'CardContent'\n\n// ── CardFooter ──\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-2',\n sizePaddingXMap[size],\n sizePaddingYMap[size],\n 'mt-auto',\n className\n )}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = 'CardFooter'\n\nexport {\n Card,\n CardImage,\n CardHeader,\n CardTitle,\n CardDescription,\n CardAction,\n CardContent,\n CardFooter,\n cardVariants,\n}\n"],"mappings":"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","names":[]}
@@ -51,7 +51,7 @@ const cardVariants = cva(
51
51
  }
52
52
  }
53
53
  );
54
- const CardRoot = React.forwardRef(
54
+ const Card = React.forwardRef(
55
55
  ({
56
56
  className,
57
57
  variant = "default",
@@ -93,7 +93,7 @@ const CardRoot = React.forwardRef(
93
93
  ));
94
94
  }
95
95
  );
96
- CardRoot.displayName = "Card";
96
+ Card.displayName = "Card";
97
97
  const sizePaddingMap = {
98
98
  sm: "p-4",
99
99
  // 16px
@@ -305,15 +305,6 @@ const CardFooter = React.forwardRef(
305
305
  }
306
306
  );
307
307
  CardFooter.displayName = "CardFooter";
308
- const Card = Object.assign(CardRoot, {
309
- Image: CardImage,
310
- Header: CardHeader,
311
- Title: CardTitle,
312
- Description: CardDescription,
313
- Action: CardAction,
314
- Content: CardContent,
315
- Footer: CardFooter
316
- });
317
308
  export {
318
309
  Card,
319
310
  CardAction,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/card.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ── Context for size propagation ──\ntype CardSize = 'sm' | 'default' | 'lg'\ntype CardDirection = 'vertical' | 'horizontal'\n\nconst CardContext = React.createContext<{ size: CardSize; direction: CardDirection }>({\n size: 'default',\n direction: 'vertical',\n})\n\nfunction useCard() {\n return React.useContext(CardContext)\n}\n\n// ── Card (Root) ──\nconst cardVariants = cva(\n 'flex overflow-hidden transition-all duration-normal',\n {\n variants: {\n variant: {\n default: 'bg-background-paper border border-border-subtle shadow-sm',\n outline: 'bg-background-paper border border-border',\n ghost: 'bg-transparent',\n },\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n radius: {\n sm: 'rounded-sm', // 2px\n base: 'rounded', // 4px\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n xl: 'rounded-xl', // 12px\n '2xl': 'rounded-2xl', // 16px\n },\n direction: {\n vertical: 'flex-col',\n horizontal: 'flex-row',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'xl',\n direction: 'vertical',\n },\n }\n)\n\nexport type CardVariant = 'default' | 'outline' | 'ghost'\nexport type CardRadius = 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Visual style */\n variant?: CardVariant\n /** Content padding scale */\n size?: CardSize\n /** Border radius */\n radius?: CardRadius\n /** Layout direction */\n direction?: CardDirection\n /** Enable hover effect for interactive cards */\n interactive?: boolean\n /** Render as child element (Slot pattern) */\n asChild?: boolean\n}\n\nconst CardRoot = React.forwardRef<HTMLDivElement, CardProps>(\n ({\n className,\n variant = 'default',\n size = 'default',\n radius = 'xl',\n direction = 'vertical',\n interactive = false,\n asChild = false,\n children,\n ...props\n }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n // Horizontal: separate CardImage from rest, wrap rest in flex-col\n let content = children\n if (direction === 'horizontal') {\n const childArray = React.Children.toArray(children)\n const imageChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardImage) {\n imageChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n content = (\n <>\n {imageChildren}\n <div className=\"flex-1 flex flex-col min-w-0\">\n {otherChildren}\n </div>\n </>\n )\n }\n\n return (\n <CardContext.Provider value={{ size, direction }}>\n <Comp\n ref={ref}\n className={cn(\n cardVariants({ variant, size, radius, direction }),\n interactive && 'cursor-pointer hover:shadow-md hover:-translate-y-0.5',\n className\n )}\n {...props}\n >\n {content}\n </Comp>\n </CardContext.Provider>\n )\n }\n)\nCardRoot.displayName = 'Card'\n\n// ── Size-based padding map (responsive: mobile → desktop) ──\nconst sizePaddingMap = {\n sm: 'p-4', // 16px\n default: 'p-4 sm:p-6', // 16px → 24px\n lg: 'p-6 sm:p-8', // 24px → 32px\n} as const\n\nconst sizePaddingXMap = {\n sm: 'px-4', // 16px\n default: 'px-4 sm:px-6', // 16px → 24px\n lg: 'px-6 sm:px-8', // 24px → 32px\n} as const\n\nconst sizePaddingYMap = {\n sm: 'py-3', // 12px\n default: 'py-3 sm:py-4', // 12px → 16px\n lg: 'py-4 sm:py-5', // 16px → 20px\n} as const\n\n// Top padding for CardHeader — optical balance (top >= sides)\nconst sizePaddingTMap = {\n sm: 'pt-5', // 20px\n default: 'pt-5 sm:pt-6', // 20px → 24px\n lg: 'pt-6 sm:pt-8', // 24px → 32px\n} as const\n\n// Inner bottom padding (between sections) — tighter than outer\nconst sizeInnerPbMap = {\n sm: 'pb-3', // 12px\n default: 'pb-3 sm:pb-4', // 12px → 16px\n lg: 'pb-3 sm:pb-4', // 12px → 16px (default와 동일)\n} as const\n\n// Last-child bottom padding for CardContent (when no footer) — match pt\nconst sizeLastPbMap = {\n sm: 'last:pb-5', // 20px\n default: 'last:pb-5 sm:last:pb-6', // 20px → 24px\n lg: 'last:pb-6 sm:last:pb-8', // 24px → 32px\n} as const\n\n// ── CardImage ──\n// Overlay opacity to Tailwind class mapping\nconst overlayOpacityMap: Record<number, string> = {\n 10: 'from-black/10',\n 20: 'from-black/20',\n 30: 'from-black/30',\n 40: 'from-black/40',\n 50: 'from-black/50',\n 60: 'from-black/60',\n 70: 'from-black/70',\n 80: 'from-black/80',\n 90: 'from-black/90',\n}\n\nexport interface CardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Gradient overlay on image */\n overlay?: boolean\n /** Overlay opacity (10–90). Default: 60 */\n overlayOpacity?: number\n /** Custom class for overlay gradient (overrides overlayOpacity) */\n overlayClassName?: string\n}\n\nconst CardImage = React.forwardRef<HTMLImageElement, CardImageProps>(\n ({ className, overlay = false, overlayOpacity = 60, overlayClassName, alt = '', ...props }, ref) => {\n const { direction } = useCard()\n const isHorizontal = direction === 'horizontal'\n\n // Horizontal: use absolute positioning so the image fills the\n // wrapper height which is determined by the content side via\n // flexbox align-items:stretch (default).\n if (isHorizontal) {\n const opacityClass = overlay\n ? (overlayOpacityMap[overlayOpacity] || 'from-black/60')\n : null\n\n return (\n <div className={cn('relative shrink-0 w-48 overflow-hidden', className)}>\n <img\n ref={ref}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n {...props}\n />\n {overlay && (\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n )}\n </div>\n )\n }\n\n // Vertical\n if (overlay) {\n const opacityClass = overlayOpacityMap[overlayOpacity] || 'from-black/60'\n\n return (\n <div className=\"relative w-full shrink-0 overflow-hidden\">\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover', className)}\n {...props}\n />\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n </div>\n )\n }\n\n return (\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover shrink-0', className)}\n {...props}\n />\n )\n }\n)\nCardImage.displayName = 'CardImage'\n\n// ── CardHeader ──\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, children, ...props }, ref) => {\n const { size } = useCard()\n\n // Separate CardAction from other children for proper flex layout\n const childArray = React.Children.toArray(children)\n const actionChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardAction) {\n actionChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-start gap-3',\n sizePaddingXMap[size],\n sizePaddingTMap[size],\n sizeInnerPbMap[size],\n sizeLastPbMap[size],\n className\n )}\n {...props}\n >\n <div className=\"flex-1 min-w-0 space-y-3\">\n {otherChildren}\n </div>\n {actionChildren}\n </div>\n )\n }\n)\nCardHeader.displayName = 'CardHeader'\n\n// ── CardTitle ──\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /** Leading icon */\n icon?: React.ReactNode\n}\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, icon, children, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n className={cn(\n 'font-semibold text-foreground leading-none tracking-tight',\n icon && 'flex items-center gap-2',\n className\n )}\n {...props}\n >\n {icon && (\n <span className=\"shrink-0 icon-sm [&>svg]:w-full [&>svg]:h-full\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children}\n </h3>\n )\n }\n)\nCardTitle.displayName = 'CardTitle'\n\n// ── CardDescription ──\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('text-sm text-text-muted', className)}\n {...props}\n />\n )\n }\n)\nCardDescription.displayName = 'CardDescription'\n\n// ── CardAction ──\nexport interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardAction = React.forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('shrink-0 ml-auto -mr-2 -mt-2', className)}\n {...props}\n />\n )\n }\n)\nCardAction.displayName = 'CardAction'\n\n// ── CardContent ──\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(sizePaddingXMap[size], 'pb-0', sizeLastPbMap[size], className)}\n {...props}\n />\n )\n }\n)\nCardContent.displayName = 'CardContent'\n\n// ── CardFooter ──\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-2',\n sizePaddingXMap[size],\n sizePaddingYMap[size],\n 'mt-auto',\n className\n )}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = 'CardFooter'\n\n// ─── Namespace ──────────────────────────────────────────\nconst Card = Object.assign(CardRoot, {\n Image: CardImage,\n Header: CardHeader,\n Title: CardTitle,\n Description: CardDescription,\n Action: CardAction,\n Content: CardContent,\n Footer: CardFooter,\n})\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Card {\n export type ImageProps = CardImageProps\n export type HeaderProps = CardHeaderProps\n export type TitleProps = CardTitleProps\n export type DescriptionProps = CardDescriptionProps\n export type ActionProps = CardActionProps\n export type ContentProps = CardContentProps\n export type FooterProps = CardFooterProps\n}\n\nexport {\n Card,\n CardImage,\n CardHeader,\n CardTitle,\n CardDescription,\n CardAction,\n CardContent,\n CardFooter,\n cardVariants,\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/ui/card.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../../lib/utils'\n\n// ── Context for size propagation ──\ntype CardSize = 'sm' | 'default' | 'lg'\ntype CardDirection = 'vertical' | 'horizontal'\n\nconst CardContext = React.createContext<{ size: CardSize; direction: CardDirection }>({\n size: 'default',\n direction: 'vertical',\n})\n\nfunction useCard() {\n return React.useContext(CardContext)\n}\n\n// ── Card (Root) ──\nconst cardVariants = cva(\n 'flex overflow-hidden transition-all duration-normal',\n {\n variants: {\n variant: {\n default: 'bg-background-paper border border-border-subtle shadow-sm',\n outline: 'bg-background-paper border border-border',\n ghost: 'bg-transparent',\n },\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n radius: {\n sm: 'rounded-sm', // 2px\n base: 'rounded', // 4px\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n xl: 'rounded-xl', // 12px\n '2xl': 'rounded-2xl', // 16px\n },\n direction: {\n vertical: 'flex-col',\n horizontal: 'flex-row',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'xl',\n direction: 'vertical',\n },\n }\n)\n\nexport type CardVariant = 'default' | 'outline' | 'ghost'\nexport type CardRadius = 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl'\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {\n /** Visual style */\n variant?: CardVariant\n /** Content padding scale */\n size?: CardSize\n /** Border radius */\n radius?: CardRadius\n /** Layout direction */\n direction?: CardDirection\n /** Enable hover effect for interactive cards */\n interactive?: boolean\n /** Render as child element (Slot pattern) */\n asChild?: boolean\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({\n className,\n variant = 'default',\n size = 'default',\n radius = 'xl',\n direction = 'vertical',\n interactive = false,\n asChild = false,\n children,\n ...props\n }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n // Horizontal: separate CardImage from rest, wrap rest in flex-col\n let content = children\n if (direction === 'horizontal') {\n const childArray = React.Children.toArray(children)\n const imageChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardImage) {\n imageChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n content = (\n <>\n {imageChildren}\n <div className=\"flex-1 flex flex-col min-w-0\">\n {otherChildren}\n </div>\n </>\n )\n }\n\n return (\n <CardContext.Provider value={{ size, direction }}>\n <Comp\n ref={ref}\n className={cn(\n cardVariants({ variant, size, radius, direction }),\n interactive && 'cursor-pointer hover:shadow-md hover:-translate-y-0.5',\n className\n )}\n {...props}\n >\n {content}\n </Comp>\n </CardContext.Provider>\n )\n }\n)\nCard.displayName = 'Card'\n\n// ── Size-based padding map (responsive: mobile → desktop) ──\nconst sizePaddingMap = {\n sm: 'p-4', // 16px\n default: 'p-4 sm:p-6', // 16px → 24px\n lg: 'p-6 sm:p-8', // 24px → 32px\n} as const\n\nconst sizePaddingXMap = {\n sm: 'px-4', // 16px\n default: 'px-4 sm:px-6', // 16px → 24px\n lg: 'px-6 sm:px-8', // 24px → 32px\n} as const\n\nconst sizePaddingYMap = {\n sm: 'py-3', // 12px\n default: 'py-3 sm:py-4', // 12px → 16px\n lg: 'py-4 sm:py-5', // 16px → 20px\n} as const\n\n// Top padding for CardHeader — optical balance (top >= sides)\nconst sizePaddingTMap = {\n sm: 'pt-5', // 20px\n default: 'pt-5 sm:pt-6', // 20px → 24px\n lg: 'pt-6 sm:pt-8', // 24px → 32px\n} as const\n\n// Inner bottom padding (between sections) — tighter than outer\nconst sizeInnerPbMap = {\n sm: 'pb-3', // 12px\n default: 'pb-3 sm:pb-4', // 12px → 16px\n lg: 'pb-3 sm:pb-4', // 12px → 16px (default와 동일)\n} as const\n\n// Last-child bottom padding for CardContent (when no footer) — match pt\nconst sizeLastPbMap = {\n sm: 'last:pb-5', // 20px\n default: 'last:pb-5 sm:last:pb-6', // 20px → 24px\n lg: 'last:pb-6 sm:last:pb-8', // 24px → 32px\n} as const\n\n// ── CardImage ──\n// Overlay opacity to Tailwind class mapping\nconst overlayOpacityMap: Record<number, string> = {\n 10: 'from-black/10',\n 20: 'from-black/20',\n 30: 'from-black/30',\n 40: 'from-black/40',\n 50: 'from-black/50',\n 60: 'from-black/60',\n 70: 'from-black/70',\n 80: 'from-black/80',\n 90: 'from-black/90',\n}\n\nexport interface CardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n /** Gradient overlay on image */\n overlay?: boolean\n /** Overlay opacity (10–90). Default: 60 */\n overlayOpacity?: number\n /** Custom class for overlay gradient (overrides overlayOpacity) */\n overlayClassName?: string\n}\n\nconst CardImage = React.forwardRef<HTMLImageElement, CardImageProps>(\n ({ className, overlay = false, overlayOpacity = 60, overlayClassName, alt = '', ...props }, ref) => {\n const { direction } = useCard()\n const isHorizontal = direction === 'horizontal'\n\n // Horizontal: use absolute positioning so the image fills the\n // wrapper height which is determined by the content side via\n // flexbox align-items:stretch (default).\n if (isHorizontal) {\n const opacityClass = overlay\n ? (overlayOpacityMap[overlayOpacity] || 'from-black/60')\n : null\n\n return (\n <div className={cn('relative shrink-0 w-48 overflow-hidden', className)}>\n <img\n ref={ref}\n alt={alt}\n className=\"absolute inset-0 w-full h-full object-cover\"\n {...props}\n />\n {overlay && (\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n )}\n </div>\n )\n }\n\n // Vertical\n if (overlay) {\n const opacityClass = overlayOpacityMap[overlayOpacity] || 'from-black/60'\n\n return (\n <div className=\"relative w-full shrink-0 overflow-hidden\">\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover', className)}\n {...props}\n />\n <div className={cn('absolute inset-0 bg-gradient-to-t to-transparent', overlayClassName || opacityClass)} />\n </div>\n )\n }\n\n return (\n <img\n ref={ref}\n alt={alt}\n className={cn('w-full object-cover shrink-0', className)}\n {...props}\n />\n )\n }\n)\nCardImage.displayName = 'CardImage'\n\n// ── CardHeader ──\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, children, ...props }, ref) => {\n const { size } = useCard()\n\n // Separate CardAction from other children for proper flex layout\n const childArray = React.Children.toArray(children)\n const actionChildren: React.ReactNode[] = []\n const otherChildren: React.ReactNode[] = []\n\n childArray.forEach((child) => {\n if (React.isValidElement(child) && child.type === CardAction) {\n actionChildren.push(child)\n } else {\n otherChildren.push(child)\n }\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-start gap-3',\n sizePaddingXMap[size],\n sizePaddingTMap[size],\n sizeInnerPbMap[size],\n sizeLastPbMap[size],\n className\n )}\n {...props}\n >\n <div className=\"flex-1 min-w-0 space-y-3\">\n {otherChildren}\n </div>\n {actionChildren}\n </div>\n )\n }\n)\nCardHeader.displayName = 'CardHeader'\n\n// ── CardTitle ──\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /** Leading icon */\n icon?: React.ReactNode\n}\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, icon, children, ...props }, ref) => {\n return (\n <h3\n ref={ref}\n className={cn(\n 'font-semibold text-foreground leading-none tracking-tight',\n icon && 'flex items-center gap-2',\n className\n )}\n {...props}\n >\n {icon && (\n <span className=\"shrink-0 icon-sm [&>svg]:w-full [&>svg]:h-full\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children}\n </h3>\n )\n }\n)\nCardTitle.displayName = 'CardTitle'\n\n// ── CardDescription ──\nexport interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('text-sm text-text-muted', className)}\n {...props}\n />\n )\n }\n)\nCardDescription.displayName = 'CardDescription'\n\n// ── CardAction ──\nexport interface CardActionProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardAction = React.forwardRef<HTMLDivElement, CardActionProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('shrink-0 ml-auto -mr-2 -mt-2', className)}\n {...props}\n />\n )\n }\n)\nCardAction.displayName = 'CardAction'\n\n// ── CardContent ──\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(sizePaddingXMap[size], 'pb-0', sizeLastPbMap[size], className)}\n {...props}\n />\n )\n }\n)\nCardContent.displayName = 'CardContent'\n\n// ── CardFooter ──\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => {\n const { size } = useCard()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center gap-2',\n sizePaddingXMap[size],\n sizePaddingYMap[size],\n 'mt-auto',\n className\n )}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = 'CardFooter'\n\nexport {\n Card,\n CardImage,\n CardHeader,\n CardTitle,\n CardDescription,\n CardAction,\n CardContent,\n CardFooter,\n cardVariants,\n}\n"],"mappings":"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","names":[]}
@@ -26,7 +26,7 @@ type ChartContextProps = {
26
26
  setActiveDataKey: (key: string | null) => void;
27
27
  };
28
28
  declare function useChart(): ChartContextProps;
29
- declare function ChartContainer({ id, className, children, config, hoverFade, ...props }: React.ComponentProps<'div'> & {
29
+ declare function Chart({ id, className, children, config, hoverFade, ...props }: React.ComponentProps<'div'> & {
30
30
  config: ChartConfig;
31
31
  /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */
32
32
  hoverFade?: boolean;
@@ -143,21 +143,5 @@ type ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'l
143
143
  cornerRadius?: number;
144
144
  };
145
145
  declare function ChartPie({ variant, label: labelMode, labelContent, activeShape: showActiveShape, innerRadius, paddingAngle, cornerRadius, startAngle, endAngle, ...props }: ChartPieProps): React.JSX.Element;
146
- declare const Chart: typeof ChartContainer & {
147
- Bar: typeof ChartBar;
148
- Line: typeof ChartLine;
149
- Area: typeof ChartArea;
150
- Pie: typeof ChartPie;
151
- Tooltip: typeof ChartTooltip;
152
- TooltipContent: typeof ChartTooltipContent;
153
- Legend: React.MemoExoticComponent<(outsideProps: RechartsPrimitive.LegendProps) => React.ReactPortal | null>;
154
- LegendContent: typeof ChartLegendContent;
155
- XAxis: typeof ChartXAxis;
156
- YAxis: typeof ChartYAxis;
157
- Style: ({ id, config }: {
158
- id: string;
159
- config: ChartConfig;
160
- }) => React.JSX.Element;
161
- };
162
146
 
163
- export { Chart, ChartArea, type ChartAreaType, type ChartAreaVariant, ChartBar, type ChartBarRadius, type ChartBarVariant, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartLine, type ChartLineType, type ChartLineVariant, ChartPie, type ChartPieLabel, type ChartPieLabelContent, type ChartPieVariant, ChartStyle, ChartTooltip, ChartTooltipContent, ChartXAxis, ChartYAxis, useChart };
147
+ export { Chart, ChartArea, type ChartAreaType, type ChartAreaVariant, ChartBar, type ChartBarRadius, type ChartBarVariant, type ChartConfig, ChartLegend, ChartLegendContent, ChartLine, type ChartLineType, type ChartLineVariant, ChartPie, type ChartPieLabel, type ChartPieLabelContent, type ChartPieVariant, ChartStyle, ChartTooltip, ChartTooltipContent, ChartXAxis, ChartYAxis, useChart };
@@ -26,7 +26,7 @@ type ChartContextProps = {
26
26
  setActiveDataKey: (key: string | null) => void;
27
27
  };
28
28
  declare function useChart(): ChartContextProps;
29
- declare function ChartContainer({ id, className, children, config, hoverFade, ...props }: React.ComponentProps<'div'> & {
29
+ declare function Chart({ id, className, children, config, hoverFade, ...props }: React.ComponentProps<'div'> & {
30
30
  config: ChartConfig;
31
31
  /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */
32
32
  hoverFade?: boolean;
@@ -143,21 +143,5 @@ type ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'l
143
143
  cornerRadius?: number;
144
144
  };
145
145
  declare function ChartPie({ variant, label: labelMode, labelContent, activeShape: showActiveShape, innerRadius, paddingAngle, cornerRadius, startAngle, endAngle, ...props }: ChartPieProps): React.JSX.Element;
146
- declare const Chart: typeof ChartContainer & {
147
- Bar: typeof ChartBar;
148
- Line: typeof ChartLine;
149
- Area: typeof ChartArea;
150
- Pie: typeof ChartPie;
151
- Tooltip: typeof ChartTooltip;
152
- TooltipContent: typeof ChartTooltipContent;
153
- Legend: React.MemoExoticComponent<(outsideProps: RechartsPrimitive.LegendProps) => React.ReactPortal | null>;
154
- LegendContent: typeof ChartLegendContent;
155
- XAxis: typeof ChartXAxis;
156
- YAxis: typeof ChartYAxis;
157
- Style: ({ id, config }: {
158
- id: string;
159
- config: ChartConfig;
160
- }) => React.JSX.Element;
161
- };
162
146
 
163
- export { Chart, ChartArea, type ChartAreaType, type ChartAreaVariant, ChartBar, type ChartBarRadius, type ChartBarVariant, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartLine, type ChartLineType, type ChartLineVariant, ChartPie, type ChartPieLabel, type ChartPieLabelContent, type ChartPieVariant, ChartStyle, ChartTooltip, ChartTooltipContent, ChartXAxis, ChartYAxis, useChart };
147
+ export { Chart, ChartArea, type ChartAreaType, type ChartAreaVariant, ChartBar, type ChartBarRadius, type ChartBarVariant, type ChartConfig, ChartLegend, ChartLegendContent, ChartLine, type ChartLineType, type ChartLineVariant, ChartPie, type ChartPieLabel, type ChartPieLabelContent, type ChartPieVariant, ChartStyle, ChartTooltip, ChartTooltipContent, ChartXAxis, ChartYAxis, useChart };
@@ -32,7 +32,6 @@ __export(chart_exports, {
32
32
  Chart: () => Chart,
33
33
  ChartArea: () => ChartArea,
34
34
  ChartBar: () => ChartBar,
35
- ChartContainer: () => ChartContainer,
36
35
  ChartLegend: () => ChartLegend,
37
36
  ChartLegendContent: () => ChartLegendContent,
38
37
  ChartLine: () => ChartLine,
@@ -53,11 +52,11 @@ const ChartContext = React.createContext(null);
53
52
  function useChart() {
54
53
  const context = React.useContext(ChartContext);
55
54
  if (!context) {
56
- throw new Error("useChart must be used within a <ChartContainer />");
55
+ throw new Error("useChart must be used within a <Chart />");
57
56
  }
58
57
  return context;
59
58
  }
60
- function ChartContainer({
59
+ function Chart({
61
60
  id,
62
61
  className,
63
62
  children,
@@ -540,25 +539,11 @@ function ChartPie({
540
539
  }
541
540
  );
542
541
  }
543
- const Chart = Object.assign(ChartContainer, {
544
- Bar: ChartBar,
545
- Line: ChartLine,
546
- Area: ChartArea,
547
- Pie: ChartPie,
548
- Tooltip: ChartTooltip,
549
- TooltipContent: ChartTooltipContent,
550
- Legend: ChartLegend,
551
- LegendContent: ChartLegendContent,
552
- XAxis: ChartXAxis,
553
- YAxis: ChartYAxis,
554
- Style: ChartStyle
555
- });
556
542
  // Annotate the CommonJS export names for ESM import in node:
557
543
  0 && (module.exports = {
558
544
  Chart,
559
545
  ChartArea,
560
546
  ChartBar,
561
- ChartContainer,
562
547
  ChartLegend,
563
548
  ChartLegendContent,
564
549
  ChartLine,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\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 // Hover fade state\n hoverFade: boolean\n activeIndex: number | null\n setActiveIndex: (index: number | null) => void\n // Series-level hover fade (used by ChartLine)\n activeDataKey: string | null\n setActiveDataKey: (key: string | null) => void\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />')\n }\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n hoverFade = false,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */\n hoverFade?: boolean\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children']\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n const [activeDataKey, setActiveDataKey] = React.useState<string | null>(null)\n\n return (\n <ChartContext.Provider value={{ config, hoverFade, activeIndex, setActiveIndex, activeDataKey, setActiveDataKey }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n onMouseLeave={hoverFade ? () => { setActiveIndex(null); setActiveDataKey(null) } : undefined}\n className={cn(\n 'flex aspect-video w-full justify-center text-xs outline-none [&_*]:outline-none',\n // Responsive axis tick font-size — consumed by ChartXAxis / ChartYAxis via var()\n '[--chart-axis-fs:var(--font-size-2xs)] sm:[--chart-axis-fs:var(--font-size-xs)]',\n // Recharts element overrides — use arbitrary properties for v3/v4 compat\n '[&_.recharts-cartesian-axis-tick_text]:[fill:var(--color-text-muted)]',\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-cartesian-grid_line]:[stroke-dasharray:3_3]',\n '[&_.recharts-curve.recharts-tooltip-cursor]:[stroke:var(--color-border)]',\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-layer]:outline-none',\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-radial-bar-background-sector]:[fill:var(--color-background-muted)]',\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:[fill:transparent]',\n \"[&_.recharts-reference-line_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-sector]:outline-none',\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n '[&_.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}\n\n// Tooltip fade-in keyframe — injected once per chart via ChartStyle\nconst CHART_TOOLTIP_KEYFRAME = '@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}'\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 const colorCss = colorConfig.length\n ? 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 return (\n <style\n dangerouslySetInnerHTML={{\n __html: CHART_TOOLTIP_KEYFRAME + colorCss,\n }}\n />\n )\n}\n\n// ─── ChartBar ─────────────────────────────────────────────────────────────────\n\nexport type ChartBarRadius = 'none' | 'sm' | 'base' | 'md' | 'lg'\nexport type ChartBarVariant = 'solid' | 'outline'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\n// Matches --opacity-35 token (0.35).\nconst CHART_HOVER_FADE_OPACITY = 0.35\n\n// Fade transition for hover effect — uses --duration-fast token via CSS variable\nconst CHART_FADE_TRANSITION = { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } as const\n\n// TOKEN-EXCEPTION: Recharts Bar radius is an SVG attribute — CSS variables not supported.\n// Values mirror --radius-* tokens from variables.css.\nconst CHART_BAR_RADIUS_MAP: Record<ChartBarRadius, number> = {\n none: 0, // --radius-none: 0px\n sm: 2, // --radius-sm: 2px\n base: 4, // --radius-base: 4px\n md: 6, // --radius-md: 6px\n lg: 8, // --radius-lg: 8px\n}\n\ntype ChartBarProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Bar>, 'radius'> & {\n /** Named radius token. Auto-adapts corners based on layout and stack position. */\n radius?: ChartBarRadius\n /** 'horizontal' rounds the right side (away from Y-axis). Default: 'vertical' */\n layout?: 'vertical' | 'horizontal'\n /** 'bottom' rounds the bottom corners (base of a stack). Default: 'top' */\n stackPosition?: 'top' | 'bottom'\n /** 'outline' renders a thick border with a semi-transparent fill. Default: 'solid' */\n variant?: ChartBarVariant\n}\n\nfunction ChartBar({\n radius = 'none',\n layout = 'vertical',\n stackPosition = 'top',\n variant = 'solid',\n fill,\n stackId,\n ...props\n}: ChartBarProps) {\n const { hoverFade, activeIndex, setActiveIndex } = useChart()\n const r = CHART_BAR_RADIUS_MAP[radius]\n const isStacked = !!stackId || stackPosition === 'bottom'\n const appliedRadius: number | [number, number, number, number] =\n r === 0 ? 0\n : variant === 'outline' && !isStacked ? r // outline standalone: all 4 corners (works for negative bars too)\n : layout === 'horizontal' && stackPosition === 'bottom' ? 0 // stacked horiz inner: all flat (connects to next bar)\n : layout === 'horizontal' ? [0, r, r, 0] // horiz tip: right corners\n : stackPosition === 'bottom' ? 0 // vertical stacked base: all flat (sits on axis, top connects to next bar)\n : [r, r, 0, 0] // default vertical: top corners only\n\n // TOKEN-EXCEPTION: SVG stroke is centered by default (half inside, half outside).\n // Custom shape renders an inset rect so the stroke stays fully inside the bar bounds.\n const outlineShape = React.useCallback((shapeProps: RechartsPrimitive.BarShapeProps & { x?: number; y?: number; width?: number; height?: number; index?: number }) => {\n const x = shapeProps.x ?? 0\n const y = shapeProps.y ?? 0\n const width = shapeProps.width ?? 0\n const height = shapeProps.height ?? 0\n if (!width || !height || width <= 0 || height <= 0) return <g />\n const sw = 2\n const inset = sw / 2\n const rx = typeof appliedRadius === 'number' ? Math.max(0, appliedRadius - inset) : 0\n // Hover fade: modulate base outline opacity (fill: 0.4, stroke: 1.0)\n const fadeMultiplier = hoverFade && activeIndex !== null && shapeProps.index !== activeIndex ? CHART_HOVER_FADE_OPACITY : 1\n return (\n <rect\n x={x + inset}\n y={y + inset}\n width={Math.max(0, width - sw)}\n height={Math.max(0, height - sw)}\n rx={rx}\n fill={fill}\n fillOpacity={0.4 * fadeMultiplier}\n stroke={fill}\n strokeOpacity={fadeMultiplier}\n strokeWidth={sw}\n style={hoverFade ? CHART_FADE_TRANSITION : undefined}\n />\n )\n }, [appliedRadius, fill, hoverFade, activeIndex])\n\n // Solid variant hover-fade shape: renders Rectangle with per-bar opacity\n const solidHoverShape = React.useCallback((shapeProps: any) => {\n const opacity = activeIndex === null ? 1 : shapeProps.index === activeIndex ? 1 : CHART_HOVER_FADE_OPACITY\n return (\n <RechartsPrimitive.Rectangle\n {...shapeProps}\n fillOpacity={opacity}\n style={CHART_FADE_TRANSITION}\n />\n )\n }, [activeIndex])\n\n // Determine which shape function to use\n const useOutline = variant === 'outline' && !isStacked\n const needsHoverShape = hoverFade && variant === 'solid' && !useOutline\n\n return (\n <RechartsPrimitive.Bar\n radius={appliedRadius}\n fill={fill}\n stackId={stackId}\n // Disable Recharts animation to prevent label/total flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(useOutline && { shape: outlineShape as any })}\n {...(needsHoverShape && { shape: solidHoverShape as any })}\n {...(hoverFade && { onMouseEnter: (_: unknown, index: number) => setActiveIndex(index) })}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Wrapper: kill position-slide so tooltip appears at the hovered bar instantly.\n// Smooth appearance is handled by CSS fade on ChartTooltipContent instead.\nfunction ChartTooltip(props: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) {\n return <RechartsPrimitive.Tooltip animationDuration={0} {...props} />\n}\n\n// Recharts 3.x injects these props at runtime via content render prop.\n// We define explicit types instead of deriving from RechartsPrimitive.Tooltip.\ntype TooltipPayloadItem = {\n dataKey?: string | number\n name?: string\n value?: number | string\n type?: string\n color?: string\n payload?: Record<string, unknown>\n fill?: string\n}\n\ntype ChartTooltipContentProps = React.ComponentProps<'div'> & {\n active?: boolean\n payload?: TooltipPayloadItem[]\n label?: string\n labelFormatter?: (value: unknown, payload: TooltipPayloadItem[]) => React.ReactNode\n labelClassName?: string\n formatter?: (value: unknown, name: string, item: TooltipPayloadItem, index: number, payload: Record<string, unknown>) => React.ReactNode\n color?: string\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n}\n\nfunction ChartTooltipContent({\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}: ChartTooltipContentProps) {\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-semibold', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-semibold', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\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 className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n style={{ animation: 'chart-tooltip-in var(--duration-slow) ease-out' }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item: TooltipPayloadItem) => item.type !== 'none')\n .map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || (item.payload as Record<string, unknown>)?.fill as string || 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-text-muted',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload as Record<string, unknown>)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-sm',\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 backgroundColor: indicator === 'dashed' ? 'transparent' : indicatorColor,\n borderColor: indicatorColor,\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-text-muted\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-semibold text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\n// Recharts 3.x legend payload type\ntype LegendPayloadItem = {\n value?: string\n type?: string\n color?: string\n dataKey?: string\n}\n\ntype ChartLegendContentProps = React.ComponentProps<'div'> & {\n payload?: LegendPayloadItem[]\n verticalAlign?: 'top' | 'middle' | 'bottom'\n align?: 'left' | 'center' | 'right'\n /** Recharts passes layout when Legend uses layout prop */\n layout?: 'horizontal' | 'vertical'\n hideIcon?: boolean\n nameKey?: string\n}\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n layout = 'horizontal',\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n const isVertical = layout === 'vertical'\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isVertical\n ? 'flex-col items-start gap-1.5'\n : [\n 'items-center',\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n ],\n className\n )}\n >\n {payload\n .filter((item: LegendPayloadItem) => item.type !== 'none')\n .map((item: LegendPayloadItem) => {\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=\"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-text-muted\"\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-sm\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n <span className=\"text-foreground\">{itemConfig?.label}</span>\n </div>\n )\n })}\n </div>\n )\n}\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\n// ─── ChartXAxis / ChartYAxis ──────────────────────────────────────────────────\n\n// TOKEN-EXCEPTION: Recharts ignores CSS overrides on axis tick text.\n// Wrapper components apply design-token styles via inline style to ensure override.\nconst CHART_AXIS_TICK_STYLE = { style: { fontSize: 'var(--chart-axis-fs)', fill: 'var(--color-text-subtle)' } } as const\n\ntype ChartXAxisProps = React.ComponentProps<typeof RechartsPrimitive.XAxis>\ntype ChartYAxisProps = React.ComponentProps<typeof RechartsPrimitive.YAxis>\n\nconst CHART_XAXIS_PADDING = { left: 16, right: 16 } as const\n\nfunction ChartXAxis({ tick, padding, ...props }: ChartXAxisProps) {\n return <RechartsPrimitive.XAxis tick={tick ?? CHART_AXIS_TICK_STYLE} padding={padding ?? CHART_XAXIS_PADDING} {...props} />\n}\n\nfunction ChartYAxis({ tick, width = 'auto', ...props }: ChartYAxisProps) {\n return <RechartsPrimitive.YAxis tick={tick ?? CHART_AXIS_TICK_STYLE} width={width} {...props} />\n}\n\n// ─── ChartLine ───────────────────────────────────────────────────────────────\n\nexport type ChartLineType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartLineVariant = 'solid' | 'dashed'\n\n// TOKEN-EXCEPTION: SVG strokeDasharray requires numeric values — CSS variables not supported.\nconst CHART_LINE_DASH = '5 5' as const\n\n// TOKEN-EXCEPTION: SVG r / strokeWidth are geometric attributes — CSS variables not supported.\n// Dot: r=3 strokeWidth=2, ActiveDot: r=5 strokeWidth=2\nconst CHART_DOT_PROPS = { r: 3, strokeWidth: 2 } as const\nconst CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 } as const\n\ntype ChartLineProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Line>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartLineType\n /** Line style. 'dashed' applies stroke-dasharray. Default: 'solid' */\n variant?: ChartLineVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n}\n\nfunction ChartLine({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n stroke,\n dataKey,\n ...props\n}: ChartLineProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n // When dashed, override strokeDasharray on dots so they remain solid circles.\n const dotProps = showDot\n ? variant === 'dashed' ? { ...CHART_DOT_PROPS, strokeDasharray: '0' } : CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? variant === 'dashed' ? { ...CHART_ACTIVE_DOT_PROPS, strokeDasharray: '0' } : CHART_ACTIVE_DOT_PROPS\n : false\n\n return (\n <RechartsPrimitive.Line\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray={variant === 'dashed' ? CHART_LINE_DASH : undefined}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n )\n}\n\n// ─── ChartArea ───────────────────────────────────────────────────────────────\n\nexport type ChartAreaType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartAreaVariant = 'solid' | 'gradient'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\nconst CHART_AREA_DEFAULT_OPACITY = 0.4\n\ntype ChartAreaProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Area>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartAreaType\n /** Fill style. 'gradient' auto-generates an SVG linearGradient. Default: 'solid' */\n variant?: ChartAreaVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n /** Fill opacity for this area (0–1). Default: 0.4 */\n fillOpacity?: number\n}\n\nfunction ChartArea({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n fillOpacity = CHART_AREA_DEFAULT_OPACITY,\n stroke,\n fill,\n dataKey,\n ...props\n}: ChartAreaProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n const dotProps = showDot\n ? CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? CHART_ACTIVE_DOT_PROPS\n : false\n\n // Gradient variant: use unique ID referencing dataKey\n const gradientId = `area-gradient-${String(dataKey)}`\n const effectiveFill = variant === 'gradient' ? `url(#${gradientId})` : (fill || stroke)\n const effectiveFillOpacity = variant === 'gradient' ? 1 : fillOpacity\n\n return (\n <>\n {variant === 'gradient' && (\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {/* TOKEN-EXCEPTION: SVG stop attributes require inline values */}\n <stop offset=\"5%\" stopColor={fill || stroke} stopOpacity={0.8} />\n <stop offset=\"95%\" stopColor={fill || stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n )}\n <RechartsPrimitive.Area\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n fill={effectiveFill}\n fillOpacity={effectiveFillOpacity * opacity}\n strokeWidth={2}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n </>\n )\n}\n\n// ─── ChartPie ────────────────────────────────────────────────────────────────\n\nexport type ChartPieVariant = 'pie' | 'donut'\nexport type ChartPieLabel = 'none' | 'outside' | 'inside'\nexport type ChartPieLabelContent = 'value' | 'percent'\n\n// TOKEN-EXCEPTION: SVG outerRadius expansion on hover — numeric constant.\nconst CHART_PIE_ACTIVE_OFFSET = 8\n\n// TOKEN-EXCEPTION: SVG innerRadius for donut variant — numeric constant.\nconst CHART_PIE_DONUT_INNER_RADIUS = 60\n\n// TOKEN-EXCEPTION: SVG outside label line — numeric constants.\nconst CHART_PIE_LABEL_RADIAL = 16 // radial segment length from slice edge\nconst CHART_PIE_LABEL_HORIZ = 20 // horizontal segment length\n\n// TOKEN-EXCEPTION: SVG inside label skip angle — numeric constant.\nconst CHART_PIE_SKIP_ANGLE = 15 // hide label for slices smaller than this (degrees)\n\ntype ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'label' | 'labelLine' | 'activeShape'> & {\n /** 'donut' applies innerRadius automatically. Default: 'pie' */\n variant?: ChartPieVariant\n /** Label position. Default: 'none' */\n label?: ChartPieLabel\n /** Label display content. Default: 'value' */\n labelContent?: ChartPieLabelContent\n /** Hover expand effect. Default: true */\n activeShape?: boolean\n /** Override inner radius (default: 0 for pie, 60 for donut) */\n innerRadius?: number\n /** Padding angle between slices (degrees). Default: 0 */\n paddingAngle?: number\n /** Corner radius for slices. Default: 0 */\n cornerRadius?: number\n}\n\nfunction ChartPie({\n variant = 'pie',\n label: labelMode = 'none',\n labelContent = 'value',\n activeShape: showActiveShape = true,\n innerRadius,\n paddingAngle = 0,\n cornerRadius = 0,\n startAngle = 90,\n endAngle = -270,\n ...props\n}: ChartPieProps) {\n // Resolve inner radius: explicit prop > variant default\n const resolvedInnerRadius = innerRadius ?? (variant === 'donut' ? CHART_PIE_DONUT_INNER_RADIUS : 0)\n\n // Active shape: render Sector with expanded outer radius on hover\n const activeShapeConfig = showActiveShape\n ? (props: any) => (\n <RechartsPrimitive.Sector\n {...props}\n outerRadius={props.outerRadius + CHART_PIE_ACTIVE_OFFSET}\n />\n )\n : undefined\n\n // Resolve display text from labelContent\n const getDisplayText = (entry: any) =>\n labelContent === 'percent'\n ? `${(entry.percent * 100).toFixed(0)}%`\n : entry.value\n\n // Label rendering\n const labelConfig = labelMode === 'outside'\n ? (entry: any) => {\n const RADIAN = Math.PI / 180\n const { cx, cy, midAngle, outerRadius, fill } = entry\n\n // Point on slice edge\n const sx = cx + outerRadius * Math.cos(-midAngle * RADIAN)\n const sy = cy + outerRadius * Math.sin(-midAngle * RADIAN)\n\n // End of radial segment\n const mx = cx + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.cos(-midAngle * RADIAN)\n const my = cy + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.sin(-midAngle * RADIAN)\n\n // Horizontal elbow direction\n const isRight = mx > cx\n const ex = mx + (isRight ? CHART_PIE_LABEL_HORIZ : -CHART_PIE_LABEL_HORIZ)\n\n return (\n <g>\n <polyline\n points={`${sx},${sy} ${mx},${my} ${ex},${my}`}\n fill=\"none\"\n stroke={fill}\n strokeWidth={1}\n strokeOpacity={0.5}\n />\n <text\n x={ex + (isRight ? 4 : -4)}\n y={my}\n textAnchor={isRight ? 'start' : 'end'}\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'var(--color-text-muted)' }}\n >\n {getDisplayText(entry)}\n </text>\n </g>\n )\n }\n : labelMode === 'inside'\n ? (entry: any) => {\n // Skip label for small slices\n const angle = Math.abs(entry.endAngle - entry.startAngle)\n if (angle < CHART_PIE_SKIP_ANGLE) return null\n\n const RADIAN = Math.PI / 180\n const { cx, cy, innerRadius: ir, outerRadius: or, midAngle } = entry\n // Pie: push toward outer edge (0.65). Donut ring: use midpoint (0.5)\n const ratio = ir > 0 ? 0.5 : 0.65\n const radius = ir + (or - ir) * ratio\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n\n return (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'white', fontWeight: 600 }}\n >\n {getDisplayText(entry)}\n </text>\n )\n }\n : false\n\n return (\n <RechartsPrimitive.Pie\n innerRadius={resolvedInnerRadius}\n paddingAngle={paddingAngle}\n cornerRadius={cornerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n label={labelConfig as any}\n labelLine={false}\n activeShape={activeShapeConfig as any}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Namespace ──────────────────────────────────────────\nconst Chart = Object.assign(ChartContainer, {\n Bar: ChartBar,\n Line: ChartLine,\n Area: ChartArea,\n Pie: ChartPie,\n Tooltip: ChartTooltip,\n TooltipContent: ChartTooltipContent,\n Legend: ChartLegend,\n LegendContent: ChartLegendContent,\n XAxis: ChartXAxis,\n YAxis: ChartYAxis,\n Style: ChartStyle,\n})\n\nexport {\n Chart,\n ChartContainer,\n ChartBar,\n ChartLine,\n ChartArea,\n ChartPie,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartXAxis,\n ChartYAxis,\n ChartStyle,\n useChart,\n}\n"],"mappings":"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","names":["config","props"]}
1
+ {"version":3,"sources":["../../../src/components/ui/chart.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as RechartsPrimitive from 'recharts'\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 // Hover fade state\n hoverFade: boolean\n activeIndex: number | null\n setActiveIndex: (index: number | null) => void\n // Series-level hover fade (used by ChartLine)\n activeDataKey: string | null\n setActiveDataKey: (key: string | null) => void\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n if (!context) {\n throw new Error('useChart must be used within a <Chart />')\n }\n return context\n}\n\nfunction Chart({\n id,\n className,\n children,\n config,\n hoverFade = false,\n ...props\n}: React.ComponentProps<'div'> & {\n config: ChartConfig\n /** Enable hover-to-highlight: hovered bar group stays full opacity, others fade. */\n hoverFade?: boolean\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >['children']\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n const [activeDataKey, setActiveDataKey] = React.useState<string | null>(null)\n\n return (\n <ChartContext.Provider value={{ config, hoverFade, activeIndex, setActiveIndex, activeDataKey, setActiveDataKey }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n onMouseLeave={hoverFade ? () => { setActiveIndex(null); setActiveDataKey(null) } : undefined}\n className={cn(\n 'flex aspect-video w-full justify-center text-xs outline-none [&_*]:outline-none',\n // Responsive axis tick font-size — consumed by ChartXAxis / ChartYAxis via var()\n '[--chart-axis-fs:var(--font-size-2xs)] sm:[--chart-axis-fs:var(--font-size-xs)]',\n // Recharts element overrides — use arbitrary properties for v3/v4 compat\n '[&_.recharts-cartesian-axis-tick_text]:[fill:var(--color-text-muted)]',\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-cartesian-grid_line]:[stroke-dasharray:3_3]',\n '[&_.recharts-curve.recharts-tooltip-cursor]:[stroke:var(--color-border)]',\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n '[&_.recharts-layer]:outline-none',\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-radial-bar-background-sector]:[fill:var(--color-background-muted)]',\n '[&_.recharts-rectangle.recharts-tooltip-cursor]:[fill:transparent]',\n \"[&_.recharts-reference-line_[stroke='#ccc']]:[stroke:var(--color-border)]\",\n '[&_.recharts-sector]:outline-none',\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n '[&_.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}\n\n// Tooltip fade-in keyframe — injected once per chart via ChartStyle\nconst CHART_TOOLTIP_KEYFRAME = '@keyframes chart-tooltip-in{from{opacity:0}to{opacity:1}}'\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 const colorCss = colorConfig.length\n ? 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 return (\n <style\n dangerouslySetInnerHTML={{\n __html: CHART_TOOLTIP_KEYFRAME + colorCss,\n }}\n />\n )\n}\n\n// ─── ChartBar ─────────────────────────────────────────────────────────────────\n\nexport type ChartBarRadius = 'none' | 'sm' | 'base' | 'md' | 'lg'\nexport type ChartBarVariant = 'solid' | 'outline'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\n// Matches --opacity-35 token (0.35).\nconst CHART_HOVER_FADE_OPACITY = 0.35\n\n// Fade transition for hover effect — uses --duration-fast token via CSS variable\nconst CHART_FADE_TRANSITION = { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } as const\n\n// TOKEN-EXCEPTION: Recharts Bar radius is an SVG attribute — CSS variables not supported.\n// Values mirror --radius-* tokens from variables.css.\nconst CHART_BAR_RADIUS_MAP: Record<ChartBarRadius, number> = {\n none: 0, // --radius-none: 0px\n sm: 2, // --radius-sm: 2px\n base: 4, // --radius-base: 4px\n md: 6, // --radius-md: 6px\n lg: 8, // --radius-lg: 8px\n}\n\ntype ChartBarProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Bar>, 'radius'> & {\n /** Named radius token. Auto-adapts corners based on layout and stack position. */\n radius?: ChartBarRadius\n /** 'horizontal' rounds the right side (away from Y-axis). Default: 'vertical' */\n layout?: 'vertical' | 'horizontal'\n /** 'bottom' rounds the bottom corners (base of a stack). Default: 'top' */\n stackPosition?: 'top' | 'bottom'\n /** 'outline' renders a thick border with a semi-transparent fill. Default: 'solid' */\n variant?: ChartBarVariant\n}\n\nfunction ChartBar({\n radius = 'none',\n layout = 'vertical',\n stackPosition = 'top',\n variant = 'solid',\n fill,\n stackId,\n ...props\n}: ChartBarProps) {\n const { hoverFade, activeIndex, setActiveIndex } = useChart()\n const r = CHART_BAR_RADIUS_MAP[radius]\n const isStacked = !!stackId || stackPosition === 'bottom'\n const appliedRadius: number | [number, number, number, number] =\n r === 0 ? 0\n : variant === 'outline' && !isStacked ? r // outline standalone: all 4 corners (works for negative bars too)\n : layout === 'horizontal' && stackPosition === 'bottom' ? 0 // stacked horiz inner: all flat (connects to next bar)\n : layout === 'horizontal' ? [0, r, r, 0] // horiz tip: right corners\n : stackPosition === 'bottom' ? 0 // vertical stacked base: all flat (sits on axis, top connects to next bar)\n : [r, r, 0, 0] // default vertical: top corners only\n\n // TOKEN-EXCEPTION: SVG stroke is centered by default (half inside, half outside).\n // Custom shape renders an inset rect so the stroke stays fully inside the bar bounds.\n const outlineShape = React.useCallback((shapeProps: RechartsPrimitive.BarShapeProps & { x?: number; y?: number; width?: number; height?: number; index?: number }) => {\n const x = shapeProps.x ?? 0\n const y = shapeProps.y ?? 0\n const width = shapeProps.width ?? 0\n const height = shapeProps.height ?? 0\n if (!width || !height || width <= 0 || height <= 0) return <g />\n const sw = 2\n const inset = sw / 2\n const rx = typeof appliedRadius === 'number' ? Math.max(0, appliedRadius - inset) : 0\n // Hover fade: modulate base outline opacity (fill: 0.4, stroke: 1.0)\n const fadeMultiplier = hoverFade && activeIndex !== null && shapeProps.index !== activeIndex ? CHART_HOVER_FADE_OPACITY : 1\n return (\n <rect\n x={x + inset}\n y={y + inset}\n width={Math.max(0, width - sw)}\n height={Math.max(0, height - sw)}\n rx={rx}\n fill={fill}\n fillOpacity={0.4 * fadeMultiplier}\n stroke={fill}\n strokeOpacity={fadeMultiplier}\n strokeWidth={sw}\n style={hoverFade ? CHART_FADE_TRANSITION : undefined}\n />\n )\n }, [appliedRadius, fill, hoverFade, activeIndex])\n\n // Solid variant hover-fade shape: renders Rectangle with per-bar opacity\n const solidHoverShape = React.useCallback((shapeProps: any) => {\n const opacity = activeIndex === null ? 1 : shapeProps.index === activeIndex ? 1 : CHART_HOVER_FADE_OPACITY\n return (\n <RechartsPrimitive.Rectangle\n {...shapeProps}\n fillOpacity={opacity}\n style={CHART_FADE_TRANSITION}\n />\n )\n }, [activeIndex])\n\n // Determine which shape function to use\n const useOutline = variant === 'outline' && !isStacked\n const needsHoverShape = hoverFade && variant === 'solid' && !useOutline\n\n return (\n <RechartsPrimitive.Bar\n radius={appliedRadius}\n fill={fill}\n stackId={stackId}\n // Disable Recharts animation to prevent label/total flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(useOutline && { shape: outlineShape as any })}\n {...(needsHoverShape && { shape: solidHoverShape as any })}\n {...(hoverFade && { onMouseEnter: (_: unknown, index: number) => setActiveIndex(index) })}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Wrapper: kill position-slide so tooltip appears at the hovered bar instantly.\n// Smooth appearance is handled by CSS fade on ChartTooltipContent instead.\nfunction ChartTooltip(props: React.ComponentProps<typeof RechartsPrimitive.Tooltip>) {\n return <RechartsPrimitive.Tooltip animationDuration={0} {...props} />\n}\n\n// Recharts 3.x injects these props at runtime via content render prop.\n// We define explicit types instead of deriving from RechartsPrimitive.Tooltip.\ntype TooltipPayloadItem = {\n dataKey?: string | number\n name?: string\n value?: number | string\n type?: string\n color?: string\n payload?: Record<string, unknown>\n fill?: string\n}\n\ntype ChartTooltipContentProps = React.ComponentProps<'div'> & {\n active?: boolean\n payload?: TooltipPayloadItem[]\n label?: string\n labelFormatter?: (value: unknown, payload: TooltipPayloadItem[]) => React.ReactNode\n labelClassName?: string\n formatter?: (value: unknown, name: string, item: TooltipPayloadItem, index: number, payload: Record<string, unknown>) => React.ReactNode\n color?: string\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: 'line' | 'dot' | 'dashed'\n nameKey?: string\n labelKey?: string\n}\n\nfunction ChartTooltipContent({\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}: ChartTooltipContentProps) {\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-semibold', labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn('font-semibold', labelClassName)}>{value}</div>\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey])\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 className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-xs shadow-xl',\n className\n )}\n style={{ animation: 'chart-tooltip-in var(--duration-slow) ease-out' }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item: TooltipPayloadItem) => item.type !== 'none')\n .map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || (item.payload as Record<string, unknown>)?.fill as string || 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-text-muted',\n indicator === 'dot' && 'items-center'\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload as Record<string, unknown>)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-sm',\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 backgroundColor: indicator === 'dashed' ? 'transparent' : indicatorColor,\n borderColor: indicatorColor,\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-text-muted\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-semibold text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\n// Recharts 3.x legend payload type\ntype LegendPayloadItem = {\n value?: string\n type?: string\n color?: string\n dataKey?: string\n}\n\ntype ChartLegendContentProps = React.ComponentProps<'div'> & {\n payload?: LegendPayloadItem[]\n verticalAlign?: 'top' | 'middle' | 'bottom'\n align?: 'left' | 'center' | 'right'\n /** Recharts passes layout when Legend uses layout prop */\n layout?: 'horizontal' | 'vertical'\n hideIcon?: boolean\n nameKey?: string\n}\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = 'bottom',\n align = 'center',\n layout = 'horizontal',\n nameKey,\n}: ChartLegendContentProps) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n const isVertical = layout === 'vertical'\n\n return (\n <div\n className={cn(\n 'flex gap-4',\n isVertical\n ? 'flex-col items-start gap-1.5'\n : [\n 'items-center',\n align === 'left' ? 'justify-start' : align === 'right' ? 'justify-end' : 'justify-center',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n ],\n className\n )}\n >\n {payload\n .filter((item: LegendPayloadItem) => item.type !== 'none')\n .map((item: LegendPayloadItem) => {\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=\"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-text-muted\"\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-sm\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n <span className=\"text-foreground\">{itemConfig?.label}</span>\n </div>\n )\n })}\n </div>\n )\n}\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\n// ─── ChartXAxis / ChartYAxis ──────────────────────────────────────────────────\n\n// TOKEN-EXCEPTION: Recharts ignores CSS overrides on axis tick text.\n// Wrapper components apply design-token styles via inline style to ensure override.\nconst CHART_AXIS_TICK_STYLE = { style: { fontSize: 'var(--chart-axis-fs)', fill: 'var(--color-text-subtle)' } } as const\n\ntype ChartXAxisProps = React.ComponentProps<typeof RechartsPrimitive.XAxis>\ntype ChartYAxisProps = React.ComponentProps<typeof RechartsPrimitive.YAxis>\n\nconst CHART_XAXIS_PADDING = { left: 16, right: 16 } as const\n\nfunction ChartXAxis({ tick, padding, ...props }: ChartXAxisProps) {\n return <RechartsPrimitive.XAxis tick={tick ?? CHART_AXIS_TICK_STYLE} padding={padding ?? CHART_XAXIS_PADDING} {...props} />\n}\n\nfunction ChartYAxis({ tick, width = 'auto', ...props }: ChartYAxisProps) {\n return <RechartsPrimitive.YAxis tick={tick ?? CHART_AXIS_TICK_STYLE} width={width} {...props} />\n}\n\n// ─── ChartLine ───────────────────────────────────────────────────────────────\n\nexport type ChartLineType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartLineVariant = 'solid' | 'dashed'\n\n// TOKEN-EXCEPTION: SVG strokeDasharray requires numeric values — CSS variables not supported.\nconst CHART_LINE_DASH = '5 5' as const\n\n// TOKEN-EXCEPTION: SVG r / strokeWidth are geometric attributes — CSS variables not supported.\n// Dot: r=3 strokeWidth=2, ActiveDot: r=5 strokeWidth=2\nconst CHART_DOT_PROPS = { r: 3, strokeWidth: 2 } as const\nconst CHART_ACTIVE_DOT_PROPS = { r: 5, strokeWidth: 2 } as const\n\ntype ChartLineProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Line>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartLineType\n /** Line style. 'dashed' applies stroke-dasharray. Default: 'solid' */\n variant?: ChartLineVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n}\n\nfunction ChartLine({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n stroke,\n dataKey,\n ...props\n}: ChartLineProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n // When dashed, override strokeDasharray on dots so they remain solid circles.\n const dotProps = showDot\n ? variant === 'dashed' ? { ...CHART_DOT_PROPS, strokeDasharray: '0' } : CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? variant === 'dashed' ? { ...CHART_ACTIVE_DOT_PROPS, strokeDasharray: '0' } : CHART_ACTIVE_DOT_PROPS\n : false\n\n return (\n <RechartsPrimitive.Line\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray={variant === 'dashed' ? CHART_LINE_DASH : undefined}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n )\n}\n\n// ─── ChartArea ───────────────────────────────────────────────────────────────\n\nexport type ChartAreaType = 'linear' | 'monotone' | 'step' | 'natural'\nexport type ChartAreaVariant = 'solid' | 'gradient'\n\n// TOKEN-EXCEPTION: SVG fillOpacity requires numeric value.\nconst CHART_AREA_DEFAULT_OPACITY = 0.4\n\ntype ChartAreaProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Area>, 'type' | 'dot' | 'activeDot'> & {\n /** Curve interpolation type. Default: 'monotone' */\n type?: ChartAreaType\n /** Fill style. 'gradient' auto-generates an SVG linearGradient. Default: 'solid' */\n variant?: ChartAreaVariant\n /** Show data point dots. Default: true */\n dot?: boolean\n /** Show highlighted dot on hover. Default: true */\n activeDot?: boolean\n /** Fill opacity for this area (0–1). Default: 0.4 */\n fillOpacity?: number\n}\n\nfunction ChartArea({\n type = 'monotone',\n variant = 'solid',\n dot: showDot = true,\n activeDot: showActiveDot = true,\n fillOpacity = CHART_AREA_DEFAULT_OPACITY,\n stroke,\n fill,\n dataKey,\n ...props\n}: ChartAreaProps) {\n const { hoverFade, activeDataKey, setActiveDataKey } = useChart()\n\n const isFaded = hoverFade && activeDataKey !== null && activeDataKey !== dataKey\n const opacity = isFaded ? CHART_HOVER_FADE_OPACITY : 1\n\n const dotProps = showDot\n ? CHART_DOT_PROPS\n : false\n const activeDotProps = showActiveDot\n ? CHART_ACTIVE_DOT_PROPS\n : false\n\n // Gradient variant: use unique ID referencing dataKey\n const gradientId = `area-gradient-${String(dataKey)}`\n const effectiveFill = variant === 'gradient' ? `url(#${gradientId})` : (fill || stroke)\n const effectiveFillOpacity = variant === 'gradient' ? 1 : fillOpacity\n\n return (\n <>\n {variant === 'gradient' && (\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {/* TOKEN-EXCEPTION: SVG stop attributes require inline values */}\n <stop offset=\"5%\" stopColor={fill || stroke} stopOpacity={0.8} />\n <stop offset=\"95%\" stopColor={fill || stroke} stopOpacity={0} />\n </linearGradient>\n </defs>\n )}\n <RechartsPrimitive.Area\n type={type}\n dataKey={dataKey}\n stroke={stroke}\n fill={effectiveFill}\n fillOpacity={effectiveFillOpacity * opacity}\n strokeWidth={2}\n dot={dotProps}\n activeDot={activeDotProps}\n strokeOpacity={opacity}\n // Disable Recharts animation to prevent flicker on hover\n {...(hoverFade && { isAnimationActive: false })}\n {...(hoverFade && { onMouseEnter: () => setActiveDataKey(dataKey as string) })}\n style={hoverFade ? { transition: 'fill-opacity var(--duration-fast) ease-out, stroke-opacity var(--duration-fast) ease-out' } : undefined}\n {...props}\n />\n </>\n )\n}\n\n// ─── ChartPie ────────────────────────────────────────────────────────────────\n\nexport type ChartPieVariant = 'pie' | 'donut'\nexport type ChartPieLabel = 'none' | 'outside' | 'inside'\nexport type ChartPieLabelContent = 'value' | 'percent'\n\n// TOKEN-EXCEPTION: SVG outerRadius expansion on hover — numeric constant.\nconst CHART_PIE_ACTIVE_OFFSET = 8\n\n// TOKEN-EXCEPTION: SVG innerRadius for donut variant — numeric constant.\nconst CHART_PIE_DONUT_INNER_RADIUS = 60\n\n// TOKEN-EXCEPTION: SVG outside label line — numeric constants.\nconst CHART_PIE_LABEL_RADIAL = 16 // radial segment length from slice edge\nconst CHART_PIE_LABEL_HORIZ = 20 // horizontal segment length\n\n// TOKEN-EXCEPTION: SVG inside label skip angle — numeric constant.\nconst CHART_PIE_SKIP_ANGLE = 15 // hide label for slices smaller than this (degrees)\n\ntype ChartPieProps = Omit<React.ComponentProps<typeof RechartsPrimitive.Pie>, 'label' | 'labelLine' | 'activeShape'> & {\n /** 'donut' applies innerRadius automatically. Default: 'pie' */\n variant?: ChartPieVariant\n /** Label position. Default: 'none' */\n label?: ChartPieLabel\n /** Label display content. Default: 'value' */\n labelContent?: ChartPieLabelContent\n /** Hover expand effect. Default: true */\n activeShape?: boolean\n /** Override inner radius (default: 0 for pie, 60 for donut) */\n innerRadius?: number\n /** Padding angle between slices (degrees). Default: 0 */\n paddingAngle?: number\n /** Corner radius for slices. Default: 0 */\n cornerRadius?: number\n}\n\nfunction ChartPie({\n variant = 'pie',\n label: labelMode = 'none',\n labelContent = 'value',\n activeShape: showActiveShape = true,\n innerRadius,\n paddingAngle = 0,\n cornerRadius = 0,\n startAngle = 90,\n endAngle = -270,\n ...props\n}: ChartPieProps) {\n // Resolve inner radius: explicit prop > variant default\n const resolvedInnerRadius = innerRadius ?? (variant === 'donut' ? CHART_PIE_DONUT_INNER_RADIUS : 0)\n\n // Active shape: render Sector with expanded outer radius on hover\n const activeShapeConfig = showActiveShape\n ? (props: any) => (\n <RechartsPrimitive.Sector\n {...props}\n outerRadius={props.outerRadius + CHART_PIE_ACTIVE_OFFSET}\n />\n )\n : undefined\n\n // Resolve display text from labelContent\n const getDisplayText = (entry: any) =>\n labelContent === 'percent'\n ? `${(entry.percent * 100).toFixed(0)}%`\n : entry.value\n\n // Label rendering\n const labelConfig = labelMode === 'outside'\n ? (entry: any) => {\n const RADIAN = Math.PI / 180\n const { cx, cy, midAngle, outerRadius, fill } = entry\n\n // Point on slice edge\n const sx = cx + outerRadius * Math.cos(-midAngle * RADIAN)\n const sy = cy + outerRadius * Math.sin(-midAngle * RADIAN)\n\n // End of radial segment\n const mx = cx + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.cos(-midAngle * RADIAN)\n const my = cy + (outerRadius + CHART_PIE_LABEL_RADIAL) * Math.sin(-midAngle * RADIAN)\n\n // Horizontal elbow direction\n const isRight = mx > cx\n const ex = mx + (isRight ? CHART_PIE_LABEL_HORIZ : -CHART_PIE_LABEL_HORIZ)\n\n return (\n <g>\n <polyline\n points={`${sx},${sy} ${mx},${my} ${ex},${my}`}\n fill=\"none\"\n stroke={fill}\n strokeWidth={1}\n strokeOpacity={0.5}\n />\n <text\n x={ex + (isRight ? 4 : -4)}\n y={my}\n textAnchor={isRight ? 'start' : 'end'}\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'var(--color-text-muted)' }}\n >\n {getDisplayText(entry)}\n </text>\n </g>\n )\n }\n : labelMode === 'inside'\n ? (entry: any) => {\n // Skip label for small slices\n const angle = Math.abs(entry.endAngle - entry.startAngle)\n if (angle < CHART_PIE_SKIP_ANGLE) return null\n\n const RADIAN = Math.PI / 180\n const { cx, cy, innerRadius: ir, outerRadius: or, midAngle } = entry\n // Pie: push toward outer edge (0.65). Donut ring: use midpoint (0.5)\n const ratio = ir > 0 ? 0.5 : 0.65\n const radius = ir + (or - ir) * ratio\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n\n return (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{ fontSize: 'var(--font-size-xs)', fill: 'white', fontWeight: 600 }}\n >\n {getDisplayText(entry)}\n </text>\n )\n }\n : false\n\n return (\n <RechartsPrimitive.Pie\n innerRadius={resolvedInnerRadius}\n paddingAngle={paddingAngle}\n cornerRadius={cornerRadius}\n startAngle={startAngle}\n endAngle={endAngle}\n label={labelConfig as any}\n labelLine={false}\n activeShape={activeShapeConfig as any}\n {...props}\n />\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n Chart,\n ChartBar,\n ChartLine,\n ChartArea,\n ChartPie,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartXAxis,\n ChartYAxis,\n ChartStyle,\n useChart,\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AACvB,wBAAmC;AACnC,mBAAmB;AAGnB,MAAM,SAAS,EAAE,OAAO,IAAI,MAAM,QAAQ;AAuB1C,MAAM,eAAe,MAAM,cAAwC,IAAI;AAEvE,SAAS,WAAW;AAClB,QAAM,UAAU,MAAM,WAAW,YAAY;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,MAAM;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAOG;AACD,QAAM,WAAW,MAAM,MAAM;AAC7B,QAAM,UAAU,SAAS,MAAM,SAAS,QAAQ,MAAM,EAAE,CAAC;AACzD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAwB,IAAI;AACxE,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAwB,IAAI;AAE5E,SACE,oCAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,QAAQ,WAAW,aAAa,gBAAgB,eAAe,iBAAiB,KAC9G;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,cAAc,YAAY,MAAM;AAAE,uBAAe,IAAI;AAAG,yBAAiB,IAAI;AAAA,MAAE,IAAI;AAAA,MACnF,eAAW;AAAA,QACT;AAAA;AAAA,QAEA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,oCAAC,cAAW,IAAI,SAAS,QAAgB;AAAA,IACzC,oCAAC,kBAAkB,qBAAlB,MACE,QACH;AAAA,EACF,CACF;AAEJ;AAGA,MAAM,yBAAyB;AAE/B,MAAM,aAAa,CAAC,EAAE,IAAI,OAAO,MAA2C;AAC1E,QAAM,cAAc,OAAO,QAAQ,MAAM,EAAE;AAAA,IACzC,CAAC,CAAC,EAAEA,OAAM,MAAMA,QAAO,SAASA,QAAO;AAAA,EACzC;AAEA,QAAM,WAAW,YAAY,SACzB,OAAO,QAAQ,MAAM,EAClB;AAAA,IACC,CAAC,CAAC,OAAO,MAAM,MAAM;AAAA,EAC7B,MAAM,gBAAgB,EAAE;AAAA,EACxB,YACC,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AAC1B,YAAM,QACJ,WAAW,QAAQ,KAAsC,KACzD,WAAW;AACb,aAAO,QAAQ,aAAa,GAAG,KAAK,KAAK,MAAM;AAAA,IACjD,CAAC,EACA,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGL,EACC,KAAK,IAAI,IACZ;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,yBAAyB;AAAA,QACvB,QAAQ,yBAAyB;AAAA,MACnC;AAAA;AAAA,EACF;AAEJ;AASA,MAAM,2BAA2B;AAGjC,MAAM,wBAAwB,EAAE,YAAY,2FAA2F;AAIvI,MAAM,uBAAuD;AAAA,EAC3D,MAAM;AAAA;AAAA,EACN,IAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,IAAM;AAAA;AAAA,EACN,IAAM;AAAA;AACR;AAaA,SAAS,SAAS;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,EAAE,WAAW,aAAa,eAAe,IAAI,SAAS;AAC5D,QAAM,IAAI,qBAAqB,MAAM;AACrC,QAAM,YAAY,CAAC,CAAC,WAAW,kBAAkB;AACjD,QAAM,gBACJ,MAAM,IAA8C,IAClD,YAAY,aAAa,CAAC,YAAwB,IAClD,WAAW,gBAAgB,kBAAkB,WAAW,IACxD,WAAW,eAAuC,CAAC,GAAG,GAAG,GAAG,CAAC,IAC7D,kBAAkB,WAAgC,IACA,CAAC,GAAG,GAAG,GAAG,CAAC;AAIjE,QAAM,eAAe,MAAM,YAAY,CAAC,eAA8H;AACpK,UAAM,IAAI,WAAW,KAAK;AAC1B,UAAM,IAAI,WAAW,KAAK;AAC1B,UAAM,QAAQ,WAAW,SAAS;AAClC,UAAM,SAAS,WAAW,UAAU;AACpC,QAAI,CAAC,SAAS,CAAC,UAAU,SAAS,KAAK,UAAU,EAAG,QAAO,oCAAC,SAAE;AAC9D,UAAM,KAAK;AACX,UAAM,QAAQ,KAAK;AACnB,UAAM,KAAK,OAAO,kBAAkB,WAAW,KAAK,IAAI,GAAG,gBAAgB,KAAK,IAAI;AAEpF,UAAM,iBAAiB,aAAa,gBAAgB,QAAQ,WAAW,UAAU,cAAc,2BAA2B;AAC1H,WACE;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,QACP,OAAO,KAAK,IAAI,GAAG,QAAQ,EAAE;AAAA,QAC7B,QAAQ,KAAK,IAAI,GAAG,SAAS,EAAE;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,aAAa,MAAM;AAAA,QACnB,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,aAAa;AAAA,QACb,OAAO,YAAY,wBAAwB;AAAA;AAAA,IAC7C;AAAA,EAEJ,GAAG,CAAC,eAAe,MAAM,WAAW,WAAW,CAAC;AAGhD,QAAM,kBAAkB,MAAM,YAAY,CAAC,eAAoB;AAC7D,UAAM,UAAU,gBAAgB,OAAO,IAAI,WAAW,UAAU,cAAc,IAAI;AAClF,WACE;AAAA,MAAC,kBAAkB;AAAA,MAAlB;AAAA,QACE,GAAG;AAAA,QACJ,aAAa;AAAA,QACb,OAAO;AAAA;AAAA,IACT;AAAA,EAEJ,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,aAAa,YAAY,aAAa,CAAC;AAC7C,QAAM,kBAAkB,aAAa,YAAY,WAAW,CAAC;AAE7D,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MAEC,GAAI,aAAa,EAAE,mBAAmB,MAAM;AAAA,MAC5C,GAAI,cAAc,EAAE,OAAO,aAAoB;AAAA,MAC/C,GAAI,mBAAmB,EAAE,OAAO,gBAAuB;AAAA,MACvD,GAAI,aAAa,EAAE,cAAc,CAAC,GAAY,UAAkB,eAAe,KAAK,EAAE;AAAA,MACtF,GAAG;AAAA;AAAA,EACN;AAEJ;AAMA,SAAS,aAAa,OAA+D;AACnF,SAAO,oCAAC,kBAAkB,SAAlB,EAA0B,mBAAmB,GAAI,GAAG,OAAO;AACrE;AA6BA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,EAAE,OAAO,IAAI,SAAS;AAE5B,QAAM,eAAe,MAAM,QAAQ,MAAM;AACvC,QAAI,aAAa,CAAC,SAAS,QAAQ;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,CAAC,IAAI,IAAI;AACf,UAAM,MAAM,GAAG,YAAY,MAAM,WAAW,MAAM,QAAQ,OAAO;AACjE,UAAM,aAAa,4BAA4B,QAAQ,MAAM,GAAG;AAChE,UAAM,QACJ,CAAC,YAAY,OAAO,UAAU,WAC1B,OAAO,KAA4B,GAAG,SAAS,QAC/C,YAAY;AAElB,QAAI,gBAAgB;AAClB,aACE,oCAAC,SAAI,eAAW,iBAAG,iBAAiB,cAAc,KAC/C,eAAe,OAAO,OAAO,CAChC;AAAA,IAEJ;AAEA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,WAAO,oCAAC,SAAI,eAAW,iBAAG,iBAAiB,cAAc,KAAI,KAAM;AAAA,EACrE,GAAG,CAAC,OAAO,gBAAgB,SAAS,WAAW,gBAAgB,QAAQ,QAAQ,CAAC;AAEhF,MAAI,CAAC,UAAU,CAAC,SAAS,QAAQ;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,WAAW,KAAK,cAAc;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,WAAW,iDAAiD;AAAA;AAAA,IAEpE,CAAC,YAAY,eAAe;AAAA,IAC7B,oCAAC,SAAI,WAAU,kBACZ,QACE,OAAO,CAAC,SAA6B,KAAK,SAAS,MAAM,EACzD,IAAI,CAAC,MAA0B,UAAkB;AAChD,YAAM,MAAM,GAAG,WAAW,KAAK,QAAQ,KAAK,WAAW,OAAO;AAC9D,YAAM,aAAa,4BAA4B,QAAQ,MAAM,GAAG;AAChE,YAAM,iBAAiB,SAAU,KAAK,SAAqC,QAAkB,KAAK;AAElG,aACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV,eAAW;AAAA,YACT;AAAA,YACA,cAAc,SAAS;AAAA,UACzB;AAAA;AAAA,QAEC,aAAa,MAAM,UAAU,UAAa,KAAK,OAC9C,UAAU,KAAK,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,OAAkC,IAErF,0DACG,YAAY,OACX,oCAAC,WAAW,MAAX,IAAgB,IAEjB,CAAC,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA;AAAA,gBACE,eAAe,cAAc;AAAA,gBAC7B,OAAO,cAAc;AAAA,gBACrB,mDACE,cAAc;AAAA,gBAChB,UAAU,aAAa,cAAc;AAAA,cACvC;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,iBAAiB,cAAc,WAAW,gBAAgB;AAAA,cAC1D,aAAa;AAAA,YACf;AAAA;AAAA,QACF,GAGJ;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,cACT;AAAA,cACA,YAAY,cAAc;AAAA,YAC5B;AAAA;AAAA,UAEA,oCAAC,SAAI,WAAU,kBACZ,YAAY,eAAe,MAC5B,oCAAC,UAAK,WAAU,qBACb,YAAY,SAAS,KAAK,IAC7B,CACF;AAAA,UACC,KAAK,SACJ,oCAAC,UAAK,WAAU,0DACb,KAAK,MAAM,eAAe,CAC7B;AAAA,QAEJ,CACF;AAAA,MAEJ;AAAA,IAEJ,CAAC,CACL;AAAA,EACF;AAEJ;AAEA,MAAM,cAAc,kBAAkB;AAoBtC,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AACF,GAA4B;AAC1B,QAAM,EAAE,OAAO,IAAI,SAAS;AAE5B,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,WAAW;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA,QACA,aACI,iCACA;AAAA,UACE;AAAA,UACA,UAAU,SAAS,kBAAkB,UAAU,UAAU,gBAAgB;AAAA,UACzE,kBAAkB,QAAQ,SAAS;AAAA,QACrC;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,IAEC,QACE,OAAO,CAAC,SAA4B,KAAK,SAAS,MAAM,EACxD,IAAI,CAAC,SAA4B;AAChC,YAAM,MAAM,GAAG,WAAW,KAAK,WAAW,OAAO;AACjD,YAAM,aAAa,4BAA4B,QAAQ,MAAM,GAAG;AAEhE,aACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV,WAAU;AAAA;AAAA,QAET,YAAY,QAAQ,CAAC,WACpB,oCAAC,WAAW,MAAX,IAAgB,IAEjB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB,KAAK;AAAA,YACxB;AAAA;AAAA,QACF;AAAA,QAEF,oCAAC,UAAK,WAAU,qBAAmB,YAAY,KAAM;AAAA,MACvD;AAAA,IAEJ,CAAC;AAAA,EACL;AAEJ;AAGA,SAAS,4BACP,QACA,SACA,KACA;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,iBACJ,aAAa,WACb,OAAO,QAAQ,YAAY,YAC3B,QAAQ,YAAY,OAChB,QAAQ,UACR;AAEN,MAAI,iBAAyB;AAE7B,MACE,OAAO,WACP,OAAO,QAAQ,GAA2B,MAAM,UAChD;AACA,qBAAiB,QAAQ,GAA2B;AAAA,EACtD,WACE,kBACA,OAAO,kBACP,OAAO,eAAe,GAAkC,MAAM,UAC9D;AACA,qBAAiB,eACf,GACF;AAAA,EACF;AAEA,SAAO,kBAAkB,SACrB,OAAO,cAAc,IACrB,OAAO,GAA0B;AACvC;AAMA,MAAM,wBAAwB,EAAE,OAAO,EAAE,UAAU,wBAAwB,MAAM,2BAA2B,EAAE;AAK9G,MAAM,sBAAsB,EAAE,MAAM,IAAI,OAAO,GAAG;AAElD,SAAS,WAAW,EAAE,MAAM,SAAS,GAAG,MAAM,GAAoB;AAChE,SAAO,oCAAC,kBAAkB,OAAlB,EAAwB,MAAM,QAAQ,uBAAuB,SAAS,WAAW,qBAAsB,GAAG,OAAO;AAC3H;AAEA,SAAS,WAAW,EAAE,MAAM,QAAQ,QAAQ,GAAG,MAAM,GAAoB;AACvE,SAAO,oCAAC,kBAAkB,OAAlB,EAAwB,MAAM,QAAQ,uBAAuB,OAAe,GAAG,OAAO;AAChG;AAQA,MAAM,kBAAkB;AAIxB,MAAM,kBAAkB,EAAE,GAAG,GAAG,aAAa,EAAE;AAC/C,MAAM,yBAAyB,EAAE,GAAG,GAAG,aAAa,EAAE;AAatD,SAAS,UAAU;AAAA,EACjB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK,UAAU;AAAA,EACf,WAAW,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,EAAE,WAAW,eAAe,iBAAiB,IAAI,SAAS;AAEhE,QAAM,UAAU,aAAa,kBAAkB,QAAQ,kBAAkB;AACzE,QAAM,UAAU,UAAU,2BAA2B;AAGrD,QAAM,WAAW,UACb,YAAY,WAAW,EAAE,GAAG,iBAAiB,iBAAiB,IAAI,IAAI,kBACtE;AACJ,QAAM,iBAAiB,gBACnB,YAAY,WAAW,EAAE,GAAG,wBAAwB,iBAAiB,IAAI,IAAI,yBAC7E;AAEJ,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,iBAAiB,YAAY,WAAW,kBAAkB;AAAA,MAC1D,KAAK;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MAEd,GAAI,aAAa,EAAE,mBAAmB,MAAM;AAAA,MAC5C,GAAI,aAAa,EAAE,cAAc,MAAM,iBAAiB,OAAiB,EAAE;AAAA,MAC5E,OAAO,YAAY,EAAE,YAAY,+CAA+C,IAAI;AAAA,MACnF,GAAG;AAAA;AAAA,EACN;AAEJ;AAQA,MAAM,6BAA6B;AAenC,SAAS,UAAU;AAAA,EACjB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK,UAAU;AAAA,EACf,WAAW,gBAAgB;AAAA,EAC3B,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAmB;AACjB,QAAM,EAAE,WAAW,eAAe,iBAAiB,IAAI,SAAS;AAEhE,QAAM,UAAU,aAAa,kBAAkB,QAAQ,kBAAkB;AACzE,QAAM,UAAU,UAAU,2BAA2B;AAErD,QAAM,WAAW,UACb,kBACA;AACJ,QAAM,iBAAiB,gBACnB,yBACA;AAGJ,QAAM,aAAa,iBAAiB,OAAO,OAAO,CAAC;AACnD,QAAM,gBAAgB,YAAY,aAAa,QAAQ,UAAU,MAAO,QAAQ;AAChF,QAAM,uBAAuB,YAAY,aAAa,IAAI;AAE1D,SACE,0DACG,YAAY,cACX,oCAAC,cACC,oCAAC,oBAAe,IAAI,YAAY,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,OAEtD,oCAAC,UAAK,QAAO,MAAK,WAAW,QAAQ,QAAQ,aAAa,KAAK,GAC/D,oCAAC,UAAK,QAAO,OAAM,WAAW,QAAQ,QAAQ,aAAa,GAAG,CAChE,CACF,GAEF;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,aAAa,uBAAuB;AAAA,MACpC,aAAa;AAAA,MACb,KAAK;AAAA,MACL,WAAW;AAAA,MACX,eAAe;AAAA,MAEd,GAAI,aAAa,EAAE,mBAAmB,MAAM;AAAA,MAC5C,GAAI,aAAa,EAAE,cAAc,MAAM,iBAAiB,OAAiB,EAAE;AAAA,MAC5E,OAAO,YAAY,EAAE,YAAY,2FAA2F,IAAI;AAAA,MAC/H,GAAG;AAAA;AAAA,EACN,CACF;AAEJ;AASA,MAAM,0BAA0B;AAGhC,MAAM,+BAA+B;AAGrC,MAAM,yBAAyB;AAC/B,MAAM,wBAAwB;AAG9B,MAAM,uBAAuB;AAmB7B,SAAS,SAAS;AAAA,EAChB,UAAU;AAAA,EACV,OAAO,YAAY;AAAA,EACnB,eAAe;AAAA,EACf,aAAa,kBAAkB;AAAA,EAC/B;AAAA,EACA,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,GAAG;AACL,GAAkB;AAEhB,QAAM,sBAAsB,gBAAgB,YAAY,UAAU,+BAA+B;AAGjG,QAAM,oBAAoB,kBACtB,CAACC,WACC;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACE,GAAGA;AAAA,MACJ,aAAaA,OAAM,cAAc;AAAA;AAAA,EACnC,IAEF;AAGJ,QAAM,iBAAiB,CAAC,UACtB,iBAAiB,YACb,IAAI,MAAM,UAAU,KAAK,QAAQ,CAAC,CAAC,MACnC,MAAM;AAGZ,QAAM,cAAc,cAAc,YAC9B,CAAC,UAAe;AACd,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,EAAE,IAAI,IAAI,UAAU,aAAa,KAAK,IAAI;AAGhD,UAAM,KAAK,KAAK,cAAc,KAAK,IAAI,CAAC,WAAW,MAAM;AACzD,UAAM,KAAK,KAAK,cAAc,KAAK,IAAI,CAAC,WAAW,MAAM;AAGzD,UAAM,KAAK,MAAM,cAAc,0BAA0B,KAAK,IAAI,CAAC,WAAW,MAAM;AACpF,UAAM,KAAK,MAAM,cAAc,0BAA0B,KAAK,IAAI,CAAC,WAAW,MAAM;AAGpF,UAAM,UAAU,KAAK;AACrB,UAAM,KAAK,MAAM,UAAU,wBAAwB,CAAC;AAEpD,WACE,oCAAC,WACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,QAC3C,MAAK;AAAA,QACL,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,eAAe;AAAA;AAAA,IACjB,GACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,MAAM,UAAU,IAAI;AAAA,QACvB,GAAG;AAAA,QACH,YAAY,UAAU,UAAU;AAAA,QAChC,kBAAiB;AAAA,QACjB,OAAO,EAAE,UAAU,uBAAuB,MAAM,0BAA0B;AAAA;AAAA,MAEzE,eAAe,KAAK;AAAA,IACvB,CACF;AAAA,EAEJ,IACA,cAAc,WACZ,CAAC,UAAe;AAEd,UAAM,QAAQ,KAAK,IAAI,MAAM,WAAW,MAAM,UAAU;AACxD,QAAI,QAAQ,qBAAsB,QAAO;AAEzC,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,EAAE,IAAI,IAAI,aAAa,IAAI,aAAa,IAAI,SAAS,IAAI;AAE/D,UAAM,QAAQ,KAAK,IAAI,MAAM;AAC7B,UAAM,SAAS,MAAM,KAAK,MAAM;AAChC,UAAM,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,WAAW,MAAM;AACnD,UAAM,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,WAAW,MAAM;AAEnD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAW;AAAA,QACX,kBAAiB;AAAA,QACjB,OAAO,EAAE,UAAU,uBAAuB,MAAM,SAAS,YAAY,IAAI;AAAA;AAAA,MAExE,eAAe,KAAK;AAAA,IACvB;AAAA,EAEJ,IACA;AAEN,SACE;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,MACZ,GAAG;AAAA;AAAA,EACN;AAEJ;","names":["config","props"]}
@@ -7,11 +7,11 @@ const ChartContext = React.createContext(null);
7
7
  function useChart() {
8
8
  const context = React.useContext(ChartContext);
9
9
  if (!context) {
10
- throw new Error("useChart must be used within a <ChartContainer />");
10
+ throw new Error("useChart must be used within a <Chart />");
11
11
  }
12
12
  return context;
13
13
  }
14
- function ChartContainer({
14
+ function Chart({
15
15
  id,
16
16
  className,
17
17
  children,
@@ -494,24 +494,10 @@ function ChartPie({
494
494
  }
495
495
  );
496
496
  }
497
- const Chart = Object.assign(ChartContainer, {
498
- Bar: ChartBar,
499
- Line: ChartLine,
500
- Area: ChartArea,
501
- Pie: ChartPie,
502
- Tooltip: ChartTooltip,
503
- TooltipContent: ChartTooltipContent,
504
- Legend: ChartLegend,
505
- LegendContent: ChartLegendContent,
506
- XAxis: ChartXAxis,
507
- YAxis: ChartYAxis,
508
- Style: ChartStyle
509
- });
510
497
  export {
511
498
  Chart,
512
499
  ChartArea,
513
500
  ChartBar,
514
- ChartContainer,
515
501
  ChartLegend,
516
502
  ChartLegendContent,
517
503
  ChartLine,