- Add stunning landing page with hero, features, and CTA sections - Update login/signup pages with dark theme and brand gradients - Enhance Sidebar with improved navigation and brand colors - Update AppHeader with search bar, notifications, and user menu - Add reusable UI components (Button, Card, Input, Badge) - Add API health and status endpoints - Apply official BlackRoad brand colors (#FF1D6C hot pink, #F5A623 amber, #2979FF electric blue, #9C27B0 violet) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
2.1 KiB
TypeScript
104 lines
2.1 KiB
TypeScript
import { ReactNode } from 'react';
|
|
import { cn } from '@/lib/cn';
|
|
|
|
interface CardProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
variant?: 'default' | 'gradient' | 'highlight';
|
|
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
}
|
|
|
|
export default function Card({
|
|
children,
|
|
className,
|
|
variant = 'default',
|
|
padding = 'md',
|
|
}: CardProps) {
|
|
const variants = {
|
|
default: 'bg-white/5 border border-white/10',
|
|
gradient: 'bg-gradient-to-br from-white/10 to-white/5 border border-white/10',
|
|
highlight: 'bg-white/5 border border-[#FF1D6C]/30 shadow-lg shadow-[#FF1D6C]/10',
|
|
};
|
|
|
|
const paddings = {
|
|
none: '',
|
|
sm: 'p-4',
|
|
md: 'p-6',
|
|
lg: 'p-8',
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
'rounded-2xl transition-all',
|
|
variants[variant],
|
|
paddings[padding],
|
|
className
|
|
)}
|
|
>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
interface CardHeaderProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
export function CardHeader({ children, className }: CardHeaderProps) {
|
|
return (
|
|
<div className={cn('mb-4', className)}>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
interface CardTitleProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
export function CardTitle({ children, className }: CardTitleProps) {
|
|
return (
|
|
<h3 className={cn('text-lg font-semibold text-white', className)}>
|
|
{children}
|
|
</h3>
|
|
);
|
|
}
|
|
|
|
interface CardDescriptionProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
export function CardDescription({ children, className }: CardDescriptionProps) {
|
|
return (
|
|
<p className={cn('text-sm text-gray-400 mt-1', className)}>
|
|
{children}
|
|
</p>
|
|
);
|
|
}
|
|
|
|
interface CardContentProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
export function CardContent({ children, className }: CardContentProps) {
|
|
return <div className={cn('', className)}>{children}</div>;
|
|
}
|
|
|
|
interface CardFooterProps {
|
|
children: ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
export function CardFooter({ children, className }: CardFooterProps) {
|
|
return (
|
|
<div className={cn('mt-4 pt-4 border-t border-white/10', className)}>
|
|
{children}
|
|
</div>
|
|
);
|
|
}
|