import * as React from 'react' import { Paper, Text, Group, Stack, Box } from '@mantine/core' type KPICardSize = 'sm' | 'default' | 'lg' interface Delta { value: number isPositive: boolean label?: string suffix?: string } interface KPICardProps extends React.HTMLAttributes { label: string value: string | number unit?: string delta?: Delta icon?: React.ReactNode action?: React.ReactNode chart?: React.ReactNode subtitle?: string size?: KPICardSize } const valueSizes: Record = { sm: '1.5rem', default: '1.875rem', lg: '2.25rem', } const unitSizes: Record = { sm: 'md', default: 'lg', lg: 'xl', } const labelSizes: Record = { sm: 'xs', default: 'sm', lg: 'md', } const KPICard = React.forwardRef( ({ label, value, unit, delta, icon, action, chart, subtitle, size = 'default', className, ...props }, ref) => { const deltaColor = delta ? delta.value === 0 ? 'dimmed' : delta.isPositive ? 'teal' : 'red' : undefined return ( {icon && {icon}} {label} {subtitle && {subtitle}} {action && {action}} {value} {unit && {unit}} {delta && ( {delta.label && {delta.label}} {delta.isPositive ? '\u25B2' : '\u25BC'} {delta.value > 0 ? '+' : ''}{delta.value}{delta.label ? '' : '%'} {delta.suffix && {delta.suffix}} )} {chart && {chart}} ) } ) KPICard.displayName = 'KPICard' export { KPICard } export type { KPICardProps, Delta, KPICardSize }