forked from carrydela/Rs_blog_front
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import Link from "next/link";
|
|
import Image from "next/image";
|
|
import { PostMeta } from "./PostMeta";
|
|
import type { Post } from "@/types/api";
|
|
|
|
interface PostCardProps {
|
|
post: Post;
|
|
}
|
|
|
|
export function PostCard({ post }: PostCardProps) {
|
|
return (
|
|
<article className="grid grid-cols-12 gap-6 md:gap-12 mb-24">
|
|
{post.cover_image && (
|
|
<div className="col-span-12 md:col-span-5">
|
|
<Link href={`/posts/${post.id}`}>
|
|
<div className="aspect-[3/2] overflow-hidden bg-neutral-100">
|
|
<Image
|
|
src={post.cover_image}
|
|
alt={post.title}
|
|
width={600}
|
|
height={400}
|
|
className="w-full h-full object-cover hover:scale-105 transition-transform duration-500"
|
|
/>
|
|
</div>
|
|
</Link>
|
|
</div>
|
|
)}
|
|
|
|
<div
|
|
className={
|
|
post.cover_image
|
|
? "col-span-12 md:col-span-7 flex flex-col justify-center"
|
|
: "col-span-12 flex flex-col justify-center"
|
|
}
|
|
>
|
|
<PostMeta date={post.created_at} />
|
|
|
|
<Link href={`/posts/${post.id}`}>
|
|
<h2 className="text-3xl md:text-5xl font-bold tracking-tighter mt-4 hover:opacity-70 transition-opacity leading-tight">
|
|
{post.title}
|
|
</h2>
|
|
</Link>
|
|
|
|
<p className="text-neutral-600 mt-6 leading-relaxed line-clamp-3">
|
|
{post.content.slice(0, 200).replace(/[#*`]/g, "")}
|
|
{post.content.length > 200 ? "..." : ""}
|
|
</p>
|
|
|
|
<Link
|
|
href={`/posts/${post.id}`}
|
|
className="mt-6 text-sm font-bold tracking-widest uppercase border-b border-black pb-0.5 hover:border-transparent transition-colors self-start"
|
|
>
|
|
Read More
|
|
</Link>
|
|
</div>
|
|
</article>
|
|
);
|
|
}
|