woedii/components/Recent_Card.tsx

64 lines
1.8 KiB
TypeScript
Raw Normal View History

import React, { forwardRef } from "react";
2025-04-28 00:47:36 +00:00
import Image from "next/image";
export interface Recent_CardProps {
2025-04-28 00:47:36 +00:00
image: string;
title: string;
tag: string;
description: string;
// Add additional props for event handlers
onClick?: React.MouseEventHandler<HTMLDivElement>;
onTouchStart?: React.TouchEventHandler<HTMLDivElement>;
onTouchEnd?: React.TouchEventHandler<HTMLDivElement>;
onTouchMove?: React.TouchEventHandler<HTMLDivElement>;
2025-04-28 00:47:36 +00:00
}
const Recent_Card = forwardRef<HTMLDivElement, Recent_CardProps>(({
image,
title,
tag,
description,
onClick,
onTouchStart,
onTouchEnd,
onTouchMove,
...props
}, ref) => {
2025-04-28 00:47:36 +00:00
return (
<div
ref={ref}
className="w-full h-full flex flex-col bg-white rounded-lg overflow-hidden shadow-sm hover:shadow-md transition-shadow cursor-pointer"
onClick={onClick}
onTouchStart={onTouchStart}
onTouchEnd={onTouchEnd}
onTouchMove={onTouchMove}
{...props}
>
{/* Image container with consistent aspect ratio */}
<div className="relative w-full pt-[75%]">
2025-04-28 00:47:36 +00:00
<Image
src={image}
alt={title}
fill
className="object-cover"
sizes="(max-width: 640px) 100vw, (max-width: 768px) 50vw, (max-width: 1024px) 33vw, 20vw"
2025-04-28 00:47:36 +00:00
/>
<div className="absolute top-2 left-2">
<span className="bg-black text-white text-xs px-2 py-1 rounded">
{tag}
</span>
</div>
</div>
{/* Content section */}
<div className="p-3 flex flex-col flex-grow">
<h4 className="font-medium text-sm mb-1 line-clamp-1">{title}</h4>
<p className="text-xs text-gray-500">{description}</p>
2025-04-28 00:47:36 +00:00
</div>
</div>
);
});
Recent_Card.displayName = "Recent_Card";
2025-04-28 00:47:36 +00:00
export default Recent_Card;