From 703c608ac9b2748f6ba0baf03de8c5e67eb69aa3 Mon Sep 17 00:00:00 2001 From: Miguel Ortega Date: Fri, 11 Sep 2026 20:42:51 -0500 Subject: [PATCH] refactor(ui): migrar componente Card a HeroUI --- src/components/ui/Card.tsx | 88 ++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/src/components/ui/Card.tsx b/src/components/ui/Card.tsx index 11139f8..d55f58b 100644 --- a/src/components/ui/Card.tsx +++ b/src/components/ui/Card.tsx @@ -1,31 +1,45 @@ "use client"; import React from 'react'; +import { + Card as HeroUICard, + CardHeader as HeroUICardHeader, + CardFooter as HeroUICardFooter, + CardProps as HeroUICardProps, +} from '@heroui/react'; +import { tv } from '@heroui/styles'; -export interface CardProps extends React.HTMLAttributes { +const cardStyles = tv({ + // Desactivamos los estilos de sombra/borde base de HeroUI para tener control total + base: 'rounded-2xl overflow-hidden transition-colors border-none shadow-none', + variants: { + customVariant: { + default: 'bg-white dark:bg-slate-900/90 border border-slate-200 dark:border-slate-800/80 shadow-sm', + elevated: 'bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 shadow-xl shadow-slate-200/50 dark:shadow-black/40', + glass: 'bg-white/80 dark:bg-slate-900/60 backdrop-blur-xl border border-slate-200/70 dark:border-slate-800/70 shadow-lg', + outline: 'bg-transparent border border-slate-300 dark:border-slate-800 shadow-none', + interactive: 'bg-white dark:bg-slate-900/90 border border-slate-200 dark:border-slate-800 shadow-sm hover:shadow-xl hover:shadow-cyan-500/10 hover:border-cyan-500/50 dark:hover:border-cyan-500/40 cursor-pointer transform hover:-translate-y-1 transition-all duration-300 ease-out', + }, + customPadding: { + none: 'p-0', + sm: 'p-4', + md: 'p-6', + lg: 'p-8', + } + }, + defaultVariants: { + customVariant: 'default', + customPadding: 'none', + } +}); + +// 1. Omitimos las props conflictivas y declaramos tu API +export interface CardProps extends Omit { variant?: 'default' | 'elevated' | 'glass' | 'outline' | 'interactive'; padding?: 'none' | 'sm' | 'md' | 'lg'; + className?: string; + children?: React.ReactNode; } -const variantStyles: Record, string> = { - default: - 'bg-white dark:bg-slate-900/90 border border-slate-200 dark:border-slate-800/80 shadow-sm', - elevated: - 'bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 shadow-xl shadow-slate-200/50 dark:shadow-black/40', - glass: - 'bg-white/80 dark:bg-slate-900/60 backdrop-blur-xl border border-slate-200/70 dark:border-slate-800/70 shadow-lg', - outline: - 'bg-transparent border border-slate-300 dark:border-slate-800 shadow-none', - interactive: - 'bg-white dark:bg-slate-900/90 border border-slate-200 dark:border-slate-800 shadow-sm hover:shadow-xl hover:shadow-cyan-500/10 hover:border-cyan-500/50 dark:hover:border-cyan-500/40 cursor-pointer transform hover:-translate-y-1 transition-all duration-300 ease-out', -}; - -const paddingStyles: Record, string> = { - none: 'p-0', - sm: 'p-4', - md: 'p-6', - lg: 'p-8', -}; - export const Card = React.forwardRef( ( { @@ -38,24 +52,24 @@ export const Card = React.forwardRef( ref ) => { return ( -
{children} -
+ ); } ); - Card.displayName = 'Card'; +// 2. Subcomponentes: Mapeados a HeroUI export interface CardHeaderProps extends React.HTMLAttributes { bordered?: boolean; } @@ -67,7 +81,7 @@ export const CardHeader: React.FC = ({ ...props }) => { return ( -
= ({ {...props} > {children} -
+ ); }; +// 3. CardTitle y CardDescription: Se mantienen como HTML estándar export const CardTitle: React.FC> = ({ className = '', children, @@ -110,13 +125,14 @@ export const CardDescription: React.FC> = ({ className = '', children, ...props }) => { return ( -
+
{children}
); @@ -133,7 +149,7 @@ export const CardFooter: React.FC = ({ ...props }) => { return ( -
= ({ {...props} > {children} -
+ ); -}; +}; \ No newline at end of file