Really-amin's picture
Upload 577 files
b190b45 verified
import React, { HTMLAttributes, ReactNode } from 'react';
interface CardProps extends HTMLAttributes<HTMLDivElement> {
children: ReactNode;
hover?: boolean;
}
interface CardHeaderProps {
children: ReactNode;
className?: string;
}
interface CardBodyProps {
children: ReactNode;
className?: string;
}
interface CardFooterProps {
children: ReactNode;
className?: string;
}
export const Card: React.FC<CardProps> = ({
children,
hover = true,
className = '',
...props
}) => {
const classes = ['card', hover ? '' : 'no-hover', className].filter(Boolean).join(' ');
return (
<div className={classes} {...props}>
{children}
</div>
);
};
export const CardHeader: React.FC<CardHeaderProps> = ({ children, className = '' }) => {
return <div className={`card-header ${className}`}>{children}</div>;
};
export const CardBody: React.FC<CardBodyProps> = ({ children, className = '' }) => {
return <div className={`card-body ${className}`}>{children}</div>;
};
export const CardFooter: React.FC<CardFooterProps> = ({ children, className = '' }) => {
return <div className={`card-footer ${className}`}>{children}</div>;
};
// Stat Card Component
interface StatCardProps {
icon?: ReactNode;
value: string | number;
label: string;
change?: {
value: string;
positive: boolean;
};
className?: string;
}
export const StatCard: React.FC<StatCardProps> = ({
icon,
value,
label,
change,
className = ''
}) => {
return (
<div className={`stat-card ${className}`}>
{icon && <div className="stat-icon">{icon}</div>}
<div className="stat-value">{value}</div>
<div className="stat-label">{label}</div>
{change && (
<div className={`stat-change ${change.positive ? 'positive' : 'negative'}`}>
{change.value}
</div>
)}
</div>
);
};
export default Card;