Files
reui-blocks/blocks/blog7.tsx
T

148 lines
5.4 KiB
TypeScript

import { ArrowRight } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import {
Card,
CardContent,
CardFooter,
CardHeader,
} from "@/components/ui/card";
import { cn } from "@/lib/utils";
interface Post {
id: string;
title: string;
summary: string;
label: string;
author: string;
published: string;
url: string;
image: string;
}
interface Blog7Props {
tagline: string;
heading: string;
description: string;
buttonText: string;
buttonUrl: string;
posts: Post[];
className?: string;
}
const Blog7 = ({
tagline = "آخرین به‌روزرسانی‌ها",
heading = "وبلاگ",
description = "جدیدترین روندها، نکات و بهترین روش‌ها در توسعه وب مدرن را کشف کنید. از کامپوننت‌های رابط کاربری تا سیستم‌های طراحی، با بینش‌های کارشناسان ما به‌روز بمانید.",
posts = [
{
id: "post-1",
title: "شروع کار با کامپوننت‌های ری یو آی",
summary:
"یاد بگیرید چطور کامپوننت‌های shadcn/ui را سریع در پروژه‌های Next.js یکپارچه و سفارشی کنید. نصب، تم‌سازی و بهترین روش‌ها برای ساخت رابط‌های مدرن را پوشش می‌دهیم.",
label: "آموزش",
author: "سارا احمدی",
published: "۱۱ دی ۱۴۲",
url: "https://www.ShadcnBlocks",
image:
"/block-media/shadcnblocks/block/placeholder-dark-1.svg",
},
{
id: "post-2",
title: "ساخت وب‌اپلیکیشن‌های دسترس‌پذیر",
summary:
"با کامپوننت‌های دسترس‌پذیر shadcn/ui تجربه‌های وب فراگیر بسازید. نکات عملی برای برچسب‌های ARIA، ناوبری با کیبورد و HTML معنایی را بیاموزید.",
label: "دسترس‌پذیری",
author: "محمد رضایی",
published: "۱۱ دی ۱۴۲",
url: "#",
image:
"/block-media/shadcnblocks/block/placeholder-dark-1.svg",
},
{
id: "post-3",
title: "سیستم‌های طراحی مدرن با استایل‌دهی مدرن",
summary:
"ساخت سیستم‌های طراحی مقیاس‌پذیر با Tailwind CSS و shadcn/ui را بررسی کنید. چگونه یکنواختی را حفظ کنید و در عین حال کتابخانه‌ای انعطاف‌پذیر و قابل نگهداری بسازید.",
label: "سیستم طراحی",
author: "اما حسینی",
published: "۱۱ دی ۱۴۲",
url: "#",
image:
"/block-media/shadcnblocks/block/placeholder-dark-1.svg",
},
],
className,
}: Blog7Props) => {
return (
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
<div className="container mx-auto flex flex-col items-center gap-8">
<div className="text-center">
<Badge variant="secondary" className="mb-6">
{tagline}
</Badge>
<h2 className="mb-3 text-2xll tracking-tighter text-pretty md:mb-4 lg:mb-6 lg:max-w-3xl lg:text-2xll">
{heading}
</h2>
<p className="mb-8 text-muted-foreground md:text-base lg:max-w-2xl lg:text-lg">
{description}
</p>
</div>
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3 lg:gap-8">
{posts.map((post) => (
<Card
key={post.id}
className="grid grid-rows-[auto_auto_1fr_auto] overflow-hidden pt-0"
>
<div className="aspect-video w-full">
<a
href={post.url}
target="_blank"
rel="noopener noreferrer"
className="transition-opacity duration-200 fade-in hover:opacity-70"
>
<img
src={post.image}
alt={post.title}
className="h-full w-full object-cover object-center"
/>
</a>
</div>
<CardHeader className="text-start">
<h3 className="text-xl hover:underline md:text-xl">
<a href={post.url} target="_blank" rel="noopener noreferrer">
{post.title}
</a>
</h3>
<p className="mt-2 text-sm font-semibold text-foreground/80">
{post.author}
<span aria-hidden="true"> · </span>
{post.published}
</p>
</CardHeader>
<CardContent className="text-start">
<p className="leading-relaxed text-muted-foreground">
{post.summary}
</p>
</CardContent>
<CardFooter className="text-start">
<a
href={post.url}
target="_blank"
rel="noopener noreferrer"
className="flex items-center text-muted-foreground hover:underline"
>
ادامه مطلب
<ArrowRight className="ms-1 size-4 rtl:rotate-180" />
</a>
</CardFooter>
</Card>
))}
</div>
</div>
</section>
);
};
export { Blog7 };