پرتوپرتو

کارت پست (PostCard)

نمایش یکپارچه پست از تمام پلتفرم‌های سوشال‌لیسنینگ — اینستاگرام، توییتر، تلگرام، یوتیوب، تیک‌تاک، لینکدین، ترِدز — با دو چگالی فشرده و راحت، handling خودکار نسبت‌های ابعادی، و اکشن‌های آیکنی روی هاور.

معرفی

PostCard اصلی‌ترین کامپوننت نمایش پست در دیزاین‌سیستم پارتو است. به جای تقلید از UI هر پلتفرم، ساختار یکسانی ارائه می‌دهد و بدنه‌ی پست را بر اساس نوع محتوا (متن، تصویر تکی، کاروسل، ویدیو، مدیای دانلودنشده) رندر می‌کند. تصاویر با هر نسبت ابعادی (1:1، 4:5، 9:16، 16:9) به‌صورت یکنواخت با بک‌دراپ بلور نمایش داده می‌شن — بدون کراپ، بدون فضای خالی زشت.

چه زمانی استفاده کنیم:

  • فید نتایج جستجو / پایش در محصولات سوشال‌لیسنینگ و افکارسنجی
  • triage روزانه تحلیل‌گر (حالت فشرده) و مرور عمیق (حالت راحت)
  • لیست چندمنبعی پست‌ها با نیاز به اسکن‌پذیری بالا یا بررسی دقیق
  • داشبورد تحلیل برند، ردیابی هشتگ، یا بولتن تحلیلی

چه زمانی استفاده نکنیم:

  • نمایش یک کامنت مجزا → از CommentCard استفاده کنید
  • نمایش کارت اطلاعاتی بدون ساختار پست (محصول، پروفایل، کار) → از Card، ProfileCard، یا JobCard استفاده کنید
  • فقط نشان پلتفرم بدون ساختار پست → از SocialPlatformBadge استفاده کنید
@farsnews
·تحلیل۲۱۸ کامنت
گزارشی درباره‌ی وضعیت اکوسیستم استارتاپی کشور و شاخص‌های کلیدی فصل اخیر؛ بررسی روند رشد سرمایه‌گذاری و چالش‌های پیش روی شرکت‌های نوپا در حوزه فناوری.
۴.۱K۲۱۸۶۷۸۴.۵K۳.۴٪
مثبتفارسی

زمین بازی

با تغییر تنظیمات زیر، پیش‌نمایش زنده را مشاهده کنید.

زمین بازی
@ali_r
Micro
تصویر نمونه
این یک متن نمونه برای کارت پست است که حس و حال محتوای واقعی را منتقل می‌کند. #پارتو #افکارسنجی
۱.۲K۸۹۲۲۱۲.۵K۴.۲٪
مثبت
تنظیمات
ظاهر
داده
حالت
محتوا
کد این نمونه به‌صورت خودکار قابل تولید نیست — برای کد آماده‌ی copy/paste به بخش «استفاده» در بالای صفحه مراجعه کنید.

استفاده

import { PostCard, type PostData } from '@parto-system-design/ui'

const post: PostData = {
  id: 'p1',
  source: 'instagram',
  author: { name: 'سارا احمدی', handle: 'sara.ahmadi', verified: true },
  timestamp: Date.now() - 60_000 * 23,
  body: { type: 'text', text: 'تجربه خریدم از #دیجی‌کالا عالی بود!' },
  sentiment: 'positive',
  metrics: { views: 12400, likes: 876, comments: 124 },
}

export default function Example() {
  return (
    <PostCard
      post={post}
      view="comfortable"
      onOpen={(p) => console.log('open', p.id)}
      onOpenDetails={(p) => console.log('details', p.id)}
    />
  )
}

حالت‌ها و انواع

چگالی فشرده (Triage)

برای فیدهایی که کاربر باید سریع اسکن کند. ارتفاع ردیف ثابت، متن تا دو خط، thumbnail کوچک. اکشن‌های آیکنی فقط در زمان هاور یا فوکوس ظاهر می‌شن.

خبرگزاری رسمی

آخرین گزارش از وضعیت بازار سرمایه طی هفته جاری منتشر شد؛ شاخص کل با رشد ۲.۳ درصدی به رکورد تاریخی رسید و حجم معاملات به طور چشمگیری افزایش یافت.

کانال اقتصاد

تحلیل کارشناسان درباره تأثیر تصمیم جدید بانک مرکزی بر نرخ ارز و شاخص تورم در ماه‌های آینده.

سارا احمدی

نمودار تغییرات شاخص بورس طی هفته گذشته — رشد قابل توجه در سه روز پایانی.

چگالی راحت (Reading)

کارت کامل با padding، مدیای inline با نسبت ابعادی حفظ‌شده، متریک‌های کامل، چیپ‌های تگ و وضعیت enrichment. اکشن‌های آیکنی فقط روی هاور نمایش داده می‌شن — کارت مینیمال باقی می‌مونه.

@farsnews
·تحلیل۲۱۸ کامنت
گزارشی درباره‌ی وضعیت اکوسیستم استارتاپی کشور و شاخص‌های کلیدی فصل اخیر؛ بررسی روند رشد سرمایه‌گذاری و چالش‌های پیش روی شرکت‌های نوپا در حوزه فناوری.
۴.۱K۲۱۸۶۷۸۴.۵K۳.۴٪
مثبتفارسی

همه نسبت‌های ابعادی (بک‌دراپ بلور)

هر نسبت ابعادی به‌صورت یکنواخت رندر می‌شه. تصویر کامل (object-contain) در مرکز نمایش داده می‌شه و فضای خالی اطراف با همان تصویر بلورشده + scale-110 پر می‌شه. بدون کراپ = بدون از دست رفتن اطلاعات. 9:16 ریل/استوری، 4:5 فید پرتره، 1:1 مربع، 16:9 یوتیوب — همگی در یک کانتینر سازگار.

۱:۱ مربع (فید اینستاگرام)
@sara.ahmadi
·تحلیل۱۲۴ کامنت
کار استودیویی
روزی از جلسه طراحی تیم دیجی‌کالا. از تجربه کاربری تا تست نهایی، همه‌چی با هم. #طراحی #تیم_محصول
۸۷۶۱۲۴۱۲.۴K
مثبت
۴:۵ عمودی (فید پرتره)
@sara.ahmadi
پرتره
عکس جدیدم با یک برنامه عکاسی حرفه‌ای فرمت پرتره 4:5 که به‌صورت خودکار در کارت پست با بک‌دراپ بلور نمایش داده می‌شه بدون کراپ. #عکاسی
۸۷۶۱۲۴۱۲.۴K
مثبت
۹:۱۶ ریل/استوری
@sara.ahmadi
·تحلیلرونوشت
ریل
ریلی که هفته گذشته ضبط کردم و هنوز هم بازخوردها ادامه داره. وقتی کانتینر به پهنا تغییر می‌کنه، ریل مرکزی می‌مونه و فضای اطراف با بلور پر می‌شه. #ریل #سوشال‌مدیا
۱۲.۴K۸۷۶۱۲۴
مثبت
۱۶:۹ یوتیوب
@sara.ahmadi
·رونوشت
لَندسکیپ
پشت‌صحنه آخرین ویدیوی بررسی گوشی چرا اینقدر تأکید روی جزئیات داریم؟ توضیح در ویدیو کامل.
۱۲.۴K۸۷۶۱۲۴
مثبت

انواع بدنه

فقط متن

اگر body.type === 'text'، کارت بدون کانتینر مدیا رندر می‌شه. هشتگ‌ها، منشن‌ها و URL ها خودکار با رنگ برند هایلایت می‌شن.

ویدیو

پوستر ویدیو با overlay دایره‌ای Play + مدت زمان، حتی برای 9:16 و 16:9 به‌صورت letterbox با بک‌دراپ بلور.

@TechPlusIR
·تحلیلرونوشت
بررسی لپ‌تاپ
۲۰:۳۸
آنباکسینگ و بررسی کامل لپ‌تاپ خریداری‌شده از #دیجی‌کالا آیا ارزش قیمت را دارد؟
۱۵۶K۸.۹K۱.۲K
مثبت

کاروسل (گالری چندتایی)

چند اسلاید با navigator RTL-آگاه. نسبت ابعادی container بر اساس اسلاید غالب محاسبه می‌شه و همه اسلایدها در همون container ثابت با بک‌دراپ بلور رندر می‌شن.

@lifestyle.modern
·OCR
اسلاید ۱
اسلاید ۲
اسلاید ۳
۱ از ۳
محصولاتی که این فصل از #دیجی‌کالا گرفتم 🛍️
۱.۲K۱۸۹۱۸.۹K
مثبت

مدیای دانلودنشده

اگر مدیا موجود بود ولی نتونستیم دانلود/ذخیره کنیم، از body: { type: 'missing-media' } استفاده کنید تا به جای img شکسته، placeholder واضح نمایش داده بشه.

@digital_news
حذف از مبدأ
ویدیویی که نتوانستیم دانلود کنیم.
۱.۲K
خنثی

چهار حالت احساس (Sentiment)

positive / negative / neutral / mixed — هرکدام chip خاص خودش رو داره. در حالت راحت کنار نام نویسنده، در حالت فشرده قبل از اکشن‌ها.

@reza.s
تجربه خریدم از #دیجی‌کالا فوق‌العاده بود! سرعت ارسال و کیفیت محصول واقعاً قابل تمجید است 👏
۴.۲K۱۲۰۳۴
مثبت
@reza.s
چند بار با پشتیبانی تماس گرفتم و هنوز مشکل بازگشت کالا حل نشده. کیفیت خدمات افت کرده.
۴.۲K۱۲۰۳۴
منفی
@reza.s
گزارش سه‌ماهه منتشر شد: رشد ۳۴٪ در تراکنش‌های موبایل و افزایش ۱۸٪ در میانگین سبد خرید.
۴.۲K۱۲۰۳۴
خنثی
@reza.s
محصول خوب بود ولی تأخیر یک‌هفته‌ای در ارسال ناراحت‌کننده بود. کیفیت: خوب. لجستیک: ضعیف.
۴.۲K۱۲۰۳۴
ترکیبی

وضعیت enrichment + تگ‌های دامنه

پرچم‌های ocr / transcript / aiAnalysis / commentCount در header نمایش داده می‌شن. تگ‌های دامنه (رضایت مشتری، شکایت، …) در فوتر. authorityScore هم در header قابل نمایش است.

@maryam.h
·تحلیلOCR۳۸ کامنت
محصول
ساعتی که هفته پیش از #دیجی‌کالا گرفتم. کیفیت بسته‌بندی ممتاز و محصول اصل
۴۱۲۳۸۶.۲K
مثبت

۷ پلتفرم پشتیبانی‌شده

نشان پلتفرم (اینستاگرام، توییتر، تلگرام، یوتیوب، تیک‌تاک، لینکدین، ترِدز) به‌صورت نقطه رنگی کوچک روی avatar نویسنده رندر می‌شه.

سارا احمدی

پست جدیدم با هایلایت محصولات تازه‌رسیده — هفته‌ی بعد لایو می‌ذارم. #خرید_آنلاین

علی رضایی

پشتیبانی باید سریع‌تر پاسخ بده — سه روز منتظر جواب تیکت بودم @DigiKala

کانال دیجی‌مگ

گزارش سه‌ماهه: رشد ۳۴٪ در تراکنش‌های موبایل و افزایش ۱۸٪ در میانگین سبد خرید.

تک‌پلاس

آنباکسینگ و بررسی کامل لپ‌تاپ جدید — آیا ارزش خرید دارد؟ لینک در توضیحات.

لایف‌استایل مدرن

تِرِند جدید: چالش هفته با فیلترهای تازه. چه کسی جرأت می‌کنه؟ #چالش_هفته

مهدی کاظمی

پنل امروز: سه درس کلیدی از ۵ سال تجربه در صنعت تجارت الکترونیک ایران.

دیجیتال‌مارکتینگ

کمپین تابستانه ۳۴٪ درآمد بیشتر — استراتژی قیمت‌گذاری پویا نقش کلیدی داشت.

علی محمدی

تجربه خرید آنلاین در سال جدید — مقایسه‌ی پلتفرم‌های مختلف.

حالت‌های انتخاب و خوانده‌شده

  • read={true} → opacity کاهش یافته (پست قبلاً باز شده)
  • selected={true} → پس‌زمینه برند ملایم
  • selectable={true} → checkbox برای انتخاب چندتایی
علی رضایی

این کارت هنوز خوانده‌نشده است — نقطه برند در ابتدای ردیف نشانگر آن است.

علی رضایی

این کارت قبلاً باز شده — opacity کم‌تر شده تا توجه به پست‌های جدید جلب شود.

علی رضایی

این کارت انتخاب‌شده است — پس‌زمینه برند ملایم نشانگر selection در حالت چندگزینه‌ای.

اکشن‌های آیکنی (Icon-only با Tooltip)

اکشن‌های پیش‌فرض همگی به‌صورت آیکن (بدون متن) با Tooltip نمایش داده می‌شن و فقط روی هاور یا فوکوس کارت ظاهر می‌شن:

آیکناکشنTooltip
Maximize2باز کردن مدال جزئیات«مشاهده جزئیات کامل پست»
Flagارجاع به تحلیل‌گر«ارجاع به تحلیل‌گر»
Bookmarkافزودن به بولتن«افزودن به بولتن»
FileSearchارسال به کامنت‌سنج«ارسال به کامنت‌سنج»
Sparklesتحلیل هوشمند«تحلیل هوشمند»
ExternalLinkمشاهده در مبدأ«مشاهده در مبدأ»

برای کاستومایز کردن یا حذف/افزودن اکشن، prop actions رو پاس بدید:

import { Bookmark, Flag, Maximize2 } from 'lucide-react'
;<PostCard
  post={post}
  actions={[
    { id: 'details', label: 'باز کردن', icon: Maximize2, onClick: (p) => openModal(p) },
    { id: 'bookmark', label: 'ذخیره', icon: Bookmark, onClick: (p) => saveToBulletin(p) },
    { id: 'flag', label: 'گزارش', icon: Flag, onClick: (p) => report(p), variant: 'danger' },
  ]}
/>

ترکیب با PostList

برای نمایش لیست چندپست با toggle چگالی، keyboard nav (Arrow/j/k)، و انتخاب چندتایی، از PostList استفاده کنید:

@sara.ahmadi
تجربه خریدم از #دیجی‌کالا واقعاً عالی بود! محصول دقیقاً همان‌طور که توضیح داده شده بود و ظرف ۲۴ ساعت به دستم رسید. #رضایت_مشتری
۸۷۶۱۲۴۴۳۱۲.۴K
مثبت
@ali_r
·۸۹ کامنت
سه بار با پشتیبانی تماس گرفتم ولی هنوز مشکل بازگشت کالا حل نشده. خدمات پس از فروش واقعاً افت کرده @DigiKala
۸.۹K۲۳۴۸۹
منفی
@digimag_ir
گزارش سه‌ماهه دیجی‌کالا: رشد ۳۴٪ در تراکنش‌های موبایل، افزایش ۱۸٪ در میانگین سبد خرید. مدیرعامل: «هدف تا پایان سال ۵ میلیون کاربر فعال روزانه است.»
۴۵.۲K
خنثی
@TechPlusIR
·تحلیلرونوشت
۲۰:۳۸
آنباکسینگ و بررسی کامل لپ‌تاپ خریداری‌شده از #دیجی‌کالا آیا ارزش قیمت را دارد؟
۱۵۶K۸.۹K۱.۲K
مثبت
import { PostList, type PostData } from '@parto-system-design/ui'

const [readIds, setReadIds] = React.useState<Set<string>>(new Set())

<PostList
  posts={posts}
  readIds={readIds}
  onOpen={(p) => { setReadIds((s) => new Set([...s, p.id])); open(p) }}
  onOpenDetails={(p) => openDetailsModal(p)}
/>

ترکیب با PostDetailsDrawer

با کلیک روی آیکن Maximize2 (یا هرچیز که به onOpenDetails وصل کردید)، پنل کناری جزئیات باز می‌شه. drawer تب‌های پست، کامنت‌ها، تحلیل هوشمند و متن استخراج‌شده رو نشون می‌ده، و با j/k بین پست‌های فید جابه‌جا می‌شه.

برای API کامل drawer، صفحه PostDetailsDrawer رو ببینید.

راهنمای استفاده

بکنید

  • برای لیست‌های طولانی، از PostList استفاده کنید تا toggle چگالی، keyboard nav و bulk selection خودکار داشته باشید.
  • پرچم‌های enrichments را فقط وقتی ست کنید که داده واقعاً موجود است — chip بی‌پشتوانه کاربر را گمراه می‌کند.
  • برای پست‌های بدون مدیای قابل‌دانلود از body: { type: 'missing-media' } استفاده کنید، نه img شکسته.
  • sourceUrl را ست کنید تا اکشن «مشاهده در مبدأ» کار کند.
  • برای انتخاب چندتایی، selectable و onSelect را از بالا کنترل کنید.

نکنید

  • رنگ پلتفرم را به پس‌زمینه‌ی کارت نزنید — فقط نقطه رنگی کوچک روی avatar. - sentiment را روی کل کارت رنگ نکنید — فقط chip سنجاقی در header. - چگالی پیش‌فرض را از compact تغییر ندهید؛ کاربر فشرده را برای triage انتخاب کرده است. - عکس‌ها را خودتان crop نکنید؛ aspectRatio طبیعی را پاس بدید تا کامپوننت letterbox + بک‌دراپ بلور بزنه. - actions را با کامپوننت Button خارجی جایگزین نکنید — از PostAction[] استفاده کنید تا ساختار یکپارچه بمونه.

جدول ویژگی‌ها

PostCard

Prop

Type

PostData

Prop

Type

PostAuthor

Prop

Type

PostBodyData (Discriminated Union)

Prop

Type

PostMediaItem

Prop

Type

PostEnrichmentFlags

Prop

Type

PostAction

Prop

Type

دسترسی‌پذیری

  • کارت role="button" و tabIndex=0 دارد — با Tab قابل focus است.
  • Enter پست را باز می‌کند (onOpen).
  • Space وضعیت انتخاب را toggle می‌کند (onSelect وقتی selectable).
  • Escape روی کارت اثری ندارد — در PostDetailsDrawer برای بستن drawer استفاده می‌شود.
  • Checkbox و اکشن‌های آیکنی همگی aria-label دارند.
  • Tooltip زمان مطلق روی timestamp با keyboard focus ظاهر می‌شود.
  • اکشن‌های آیکنی فقط روی hover/focus ظاهر می‌شوند اما همیشه در DOM هستند (screen-reader دسترسی دارد).
  • در PostList با Arrow Up/Down یا j/k بین کارت‌ها حرکت می‌کنید.

کامپوننت‌های مرتبط

  • PostList — اگر نیاز به toggle چگالی + keyboard nav + bulk selection دارید.
  • PostDetailsDrawer — برای نمایش کامل پست همراه کامنت، تحلیل هوشمند، OCR و متادیتای پلتفرم.
  • CommentCard — برای نمایش تحلیل‌شده یک کامنت مستقل با تگ‌های موضوعی.
  • SocialPlatformBadge — اگر فقط نشان پلتفرم می‌خواهید بدون ساختار پست.
  • EmotionDistribution — توزیع احساسات ۹-کلاسه (داخل PostDetailsDrawer استفاده می‌شود).