You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.4 KiB
36 lines
1.4 KiB
import React from "react";
|
|
import type { Product } from "../types";
|
|
|
|
function Tag({ tag }: { tag: Product["tag"] }) {
|
|
if (!tag || tag === "none") return null;
|
|
const map: Record<string, string> = {
|
|
new: "bg-emerald-500",
|
|
hot: "bg-rose-500",
|
|
sale: "bg-amber-500",
|
|
};
|
|
const cls = map[tag] ?? "bg-gray-500";
|
|
return <span className={`absolute left-2 top-2 text-xs text-white px-2 py-0.5 rounded ${cls}`}>{tag.toUpperCase()}</span>;
|
|
}
|
|
|
|
export function ProductCard({ item, basePath = "" }: { item: Product; basePath?: string }) {
|
|
return (
|
|
<a
|
|
href={item.href ? `${basePath}${item.href}` : "#"}
|
|
className="group relative block rounded-xl overflow-hidden bg-white border border-gray-100 shadow-sm hover:shadow-lg hover:-translate-y-0.5 transition duration-300"
|
|
>
|
|
<Tag tag={item.tag} />
|
|
<div className="aspect-square bg-gray-50 flex items-center justify-center p-6">
|
|
<img src={item.image} alt={item.name} className="max-h-full max-w-full object-contain" />
|
|
</div>
|
|
<div className="px-4 py-3 space-y-1">
|
|
<div className="text-gray-900 font-medium group-hover:text-black min-h-[1.5rem]">{item.name}</div>
|
|
{item.description && <div className="text-gray-500 text-sm line-clamp-2 min-h-[2.5rem]">{item.description}</div>}
|
|
{item.price != null && (
|
|
<div className="text-rose-600 font-semibold">¥{item.price}</div>
|
|
)}
|
|
</div>
|
|
</a>
|
|
);
|
|
}
|
|
|
|
|
|
|