import { X } from 'lucide-react';
import type { ButtonHTMLAttributes, ReactNode } from 'react';
import { cn } from '../lib/utils';
export function Card({
children,
className
}: {
children: ReactNode;
className?: string;
}) {
return ;
}
export function CardHeader({
title,
description,
action,
className
}: {
title: string;
description?: string;
action?: ReactNode;
className?: string;
}) {
return (
{title}
{description ?
{description}
: null}
{action ?
{action}
: null}
);
}
export function Button({
children,
variant = 'default',
className,
...props
}: {
children: ReactNode;
variant?: 'default' | 'secondary' | 'ghost' | 'outline';
className?: string;
} & ButtonHTMLAttributes) {
const variants = {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground',
outline: 'border border-border bg-background hover:bg-accent hover:text-accent-foreground'
};
return (
);
}
export function Badge({
children,
tone = 'neutral'
}: {
children: ReactNode;
tone?: 'neutral' | 'green' | 'amber' | 'red' | 'blue' | 'violet';
}) {
const tones = {
neutral: 'border-border bg-muted text-muted-foreground',
green: 'border-emerald-500/30 bg-emerald-500/10 text-emerald-300',
amber: 'border-amber-500/30 bg-amber-500/10 text-amber-300',
red: 'border-rose-500/30 bg-rose-500/10 text-rose-300',
blue: 'border-sky-500/30 bg-sky-500/10 text-sky-300',
violet: 'border-violet-500/30 bg-violet-500/10 text-violet-300'
};
return (
{children}
);
}
export function Progress({ value, tone = 'primary' }: { value: number; tone?: 'primary' | 'green' | 'amber' | 'red' }) {
const tones = {
primary: 'bg-primary',
green: 'bg-emerald-400',
amber: 'bg-amber-400',
red: 'bg-rose-400'
};
return (
);
}
export function Modal({
open,
title,
children,
footer,
onClose,
className
}: {
open: boolean;
title: ReactNode;
children: ReactNode;
footer?: ReactNode;
onClose: () => void;
className?: string;
}) {
if (!open) return null;
return (
{title}
{children}
{footer ?
{footer}
: null}
);
}