'use client'; import SanityImage from 'components/ui/sanity-image'; import { cn } from 'lib/utils'; import Link from 'next/link'; import { FC } from 'react'; interface CardProps { className?: string; title: string; image: object | any; link: object | any; text?: string; imageFormat?: 'square' | 'portrait' | 'landscape'; } const Card: FC<CardProps> = ({ className, title, image, link, text, imageFormat = 'square' }) => { const rootClassName = cn('relative', className); const { linkType } = link; const imageWrapperClasses = cn('w-full h-full overflow-hidden relative', { ['aspect-square']: imageFormat === 'square', ['aspect-[3/4]']: imageFormat === 'portrait', ['aspect-[4/3]']: imageFormat === 'landscape' }); const imageClasses = cn('object-cover w-full h-full'); function Card() { if (linkType === 'internal') { const type = link.internalLink.reference._type; let href = ''; if (type === 'product') { href = `/product/${link.internalLink.reference.slug.current}`; } else if (type === 'category') { href = `/category/${link.internalLink.reference.slug.current}`; } else { href = `${link.internalLink.reference.slug.current}`; } return ( <Link href={href} className={rootClassName} aria-label={title}> <div className="flex flex-col"> {image && ( <div className={imageWrapperClasses}> <SanityImage className={imageClasses} image={image} alt={image.alt || ''} sizes="(max-width: 1024px) 50vw, 20vw" /> </div> )} <h3 className="mt-2 text-sm font-medium text-high-contrast underline underline-offset-2 lg:mt-3 lg:text-lg lg:underline-offset-4 2xl:text-xl"> {title} </h3> {text && <p className="mt-1 text-sm text-low-contrast lg:mt-2 lg:text-base">{text}</p>} </div> </Link> ); } return ( <a href={link.externalLink.url} className={rootClassName} aria-label={title}> <div className="flex flex-col"> {image && ( <div className={imageWrapperClasses}> <SanityImage className={imageClasses} image={image} alt={image.alt || ''} sizes="(max-width: 1024px) 50vw, 20vw" /> </div> )} <h3 className="mt-2 text-sm font-medium text-high-contrast underline underline-offset-2 lg:mt-3 lg:text-lg lg:underline-offset-4 2xl:text-xl"> {title} </h3> {text && <p className="mt-1 text-sm text-low-contrast lg:mt-2 lg:text-base">{text}</p>} </div> </a> ); } return <Card />; }; export default Card;