پست اینستاگرام
کامپوننت نمایش پست اینستاگرام با دو حالت عمودی و افقی
معرفی
کامپوننت InstagramPost برای نمایش پستهای اینستاگرام با دو حالت مختلف استفاده میشود:
- حالت عمودی (Vertical): طراحی کاملاً مشابه اپ اینستاگرام که همیشه در حالت LTR نمایش داده میشود
- حالت افقی (Horizontal): یک کارت افقی که برای نمایش در لیستها و صفحات مناسب است
چه زمانی استفاده کنیم:
- برای نمایش پیشنمایش پست اینستاگرام در داشبورد social listening
- برای لیست پستهای اینستاگرامی یک اینفلوئنسر
- وقتی نیاز به نمایش آمار پست (لایک، کامنت، بازدید) در کنار محتوا دارید
چه زمانی استفاده نکنیم:
- برای نمایش پستهای پلتفرمهای دیگر — InstagramPost مخصوص اینستاگرام است
- برای embed واقعی — این کامپوننت یک replica UI است، نه embed
استفاده
حالت عمودی (Vertical)

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 2200 کاراکتر باشد و شامل هشتگها و منشنهای مختلف است. در این پست میتوانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین میتوانید ببینید که چگونه هشتگها و منشنها به صورت خودکار استایل میشوند و قابل کلیک هستند. این ویژگی باعث میشود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند.
حالت افقی (Horizontal)

این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 2200 کاراکتر باشد و شامل هشتگها و منشنهای مختلف است. در این پست میتوانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین میتوانید ببینید که چگونه هشتگها و منشنها به صورت خودکار استایل میشوند و قابل کلیک هستند. این ویژگی باعث میشود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند.
import { InstagramPost } from '@parto-system-design/ui';
// حالت عمودی
<InstagramPost
variant="vertical"
media={[
{
type: 'image',
url: '/path/to/image.jpg',
aspectRatio: '1:1',
},
]}
postType="image"
caption="این یک پست نمونه است با #هشتگ و @منشن"
profile={{
username: 'partodata',
fullName: 'Parto Data',
avatarUrl: 'https://example.com/profile-picture.jpg', // لینک عکس پروفایل
}}
stats={{
likes: 123456,
comments: 1234,
views: 56789,
shares: 890,
}}
publishTime={new Date()}
/>
// حالت افقی
<InstagramPost
variant="horizontal"
media={[
{
type: 'image',
url: '/path/to/image.jpg',
aspectRatio: '1:1',
},
]}
postType="image"
caption="این یک پست نمونه است با #هشتگ و @منشن"
profile={{
username: 'partodata',
fullName: 'Parto Data',
}}
stats={{
likes: 123456,
comments: 1234,
views: 56789,
shares: 890,
}}
publishTime={new Date()}
/>Playground
در playground زیر میتوانید هر دو حالت را مشاهده کرده و تنظیمات مختلف را تست کنید:
حالت عمودی (Vertical)
رسانهای موجود نیست
این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 2200 کاراکتر باشد و شامل هشتگها و منشنهای مختلف است. در این پست میتوانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین میتوانید ببینید که چگونه هشتگها و منشنها به صورت خودکار استایل میشوند و قابل کلیک هستند. این ویژگی باعث میشود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند. میتوانید از این کامپوننت برای نمایش پستهای اینستاگرام در اپلیکیشن خود استفاده کنید.
حالت افقی (Horizontal)
رسانهای موجود نیست
این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت. این متن میتواند تا 2200 کاراکتر باشد و شامل هشتگها و منشنهای مختلف است. در این پست میتوانید انواع مختلف محتوا را مشاهده کنید. این یک متن طولانی است تا بتوانید حالت «بیشتر» را ببینید و نحوه نمایش کپشن کامل را مشاهده کنید. همچنین میتوانید ببینید که چگونه هشتگها و منشنها به صورت خودکار استایل میشوند و قابل کلیک هستند. این ویژگی باعث میشود که کاربران بتوانند به راحتی با محتوا تعامل داشته باشند. میتوانید از این کامپوننت برای نمایش پستهای اینستاگرام در اپلیکیشن خود استفاده کنید.
تنظیمات اصلی
تنظیمات آمار، زمان و اکشن
غیرفعال کردن دکمهها به صورت جداگانه (hover روی کارت برای مشاهده)
ابعاد استاندارد تصویر اینستاگرام
کامپوننت از استانداردهای ابعادی اینستاگرام پیروی میکند:
| نوع | نسبت ابعاد | توضیح |
|---|---|---|
| عمودی (Portrait) | 4:5 | استاندارد اصلی اینستاگرام (1080×1350px) |
| مربعی (Square) | 1:1 | (1080×1080px) |
| افقی (Landscape) | 1.91:1 ≈ 16:9 | (1080×566px) |
نکته: اگر aspectRatio برابر 9:16 یا 4:5 باشد، کامپوننت به صورت خودکار از نسبت 4:5 (استاندارد پرتریت اینستاگرام) استفاده میکند و تصویر با object-contain نمایش داده میشود تا کراپ نشود.
انواع مدیا
تصویر عمودی (Portrait) - استاندارد اینستاگرام
<InstagramPost
variant="vertical"
media={[
{
type: 'image',
url: '/instagram-posts/images/portrait.jpg',
aspectRatio: '4:5', // استاندارد اینستاگرام برای پست عمودی
},
]}
postType="image"
caption="پست با تصویر عمودی (4:5) - مشابه اینستاگرام"
/>تصویر مربعی
<InstagramPost
variant="vertical"
media={[
{
type: 'image',
url: '/instagram-posts/images/image 1x1.png',
aspectRatio: '1:1',
},
]}
postType="image"
caption="پست با تصویر مربعی"
/>ویدیو
<InstagramPost
variant="vertical"
media={[
{
type: 'video',
url: '/instagram-posts/images/image 16x9.png',
aspectRatio: '16:9',
},
]}
postType="video"
caption="پست با ویدیو"
/>کاروسل
<InstagramPost
variant="vertical"
media={[
{
type: 'image',
url: '/instagram-posts/images/image 1x1.png',
aspectRatio: '1:1',
},
{
type: 'image',
url: '/instagram-posts/images/image 9x16.png',
aspectRatio: '9:16',
},
{
type: 'video',
url: '/instagram-posts/images/image 16x9.png',
aspectRatio: '16:9',
},
]}
mediaType="carousel"
postType="carousel"
caption="پست با کاروسل"
/>بدون مدیا (Placeholder)
<InstagramPost variant="vertical" caption="پست بدون مدیا" placeholderText="No media available" />پروفایل
برای نمایش عکس پروفایل کاربر، میتوانید از avatarUrl یا profilePicture استفاده کنید:
<InstagramPost
variant="vertical"
profile={{
username: 'partodata',
fullName: 'Parto Data',
avatarUrl: '/path/to/profile-picture.jpg', // روش اول: استفاده از avatarUrl
// یا
profilePicture: '/path/to/profile-picture.jpg', // روش دوم: استفاده از profilePicture
}}
media={[...]}
/>نکات مهم:
- اگر
avatarUrlیاprofilePictureمشخص نشود، از حرف اول username به عنوان fallback استفاده میشود - میتوانید از prop
avatarUrlدر سطح کامپوننت هم استفاده کنید که اولویت بالاتری دارد - عکس پروفایل به صورت دایرهای نمایش داده میشود
مثال با عکس پروفایل
<InstagramPost
variant="vertical"
profile={{
username: 'partodata',
fullName: 'Parto Data',
avatarUrl: 'https://example.com/avatar.jpg',
}}
media={[...]}
/>مثال بدون عکس پروفایل
<InstagramPost
variant="vertical"
profile={{
username: 'partodata',
fullName: 'Parto Data',
// بدون avatarUrl یا profilePicture
}}
media={[...]}
/>کپشن
کپشن میتواند شامل هشتگها و منشنها باشد که به صورت خودکار پارس و استایل میشوند:
<InstagramPost
variant="vertical"
caption="این یک پست نمونه است با #هشتگ و @منشن برای تست کامپوننت"
media={[...]}
/>- در حالت عمودی: کپشن به صورت پیشفرض کوتاه میشود و با کلیک روی "more" میتوان آن را کامل مشاهده کرد
- در حالت افقی: کپشن به صورت خودکار به 4 خط محدود میشود
آمار پست
<InstagramPost
variant="vertical"
stats={{
likes: 123456,
comments: 1234,
views: 56789,
shares: 890,
}}
numberFormat="short" // یا 'exact'
showLikes={true}
showComments={true}
showViews={true}
showShares={true}
/>فرمت عدد
- exact: نمایش دقیق با جداکننده (مثل
123,456) - short: نمایش کوتاه اینستاگرامی (مثل
123K,2.4M)
نوع پست
با استفاده از prop postType میتوانید نوع پست را مشخص کنید. نوع پست با آیکون مرتبط بعد از تعداد اشتراک نمایش داده میشود:
<InstagramPost
variant="vertical"
media={[...]}
postType="image"
stats={{
likes: 123456,
comments: 1234,
views: 56789,
shares: 890,
}}
/>مقادیر postType
"image": عکس (Photo) - با آیکونImage"video": ویدیو (Video) - با آیکونVideo"carousel": اسلاید (Carousel/Slide) - با آیکونImages
مثالهای استفاده
// پست عکس
<InstagramPost
postType="image"
media={[{ type: 'image', url: '...' }]}
stats={{ shares: 890 }}
/>
// پست ویدیو
<InstagramPost
postType="video"
media={[{ type: 'video', url: '...' }]}
stats={{ shares: 890 }}
/>
// پست اسلاید
<InstagramPost
postType="carousel"
media={[...]} // چندین تصویر
mediaType="carousel"
stats={{ shares: 890 }}
/>نکته: اگر postType مشخص نشود، نوع پست نمایش داده نمیشود.
زمان انتشار
<InstagramPost
variant="vertical"
publishTime={new Date(Date.now() - 2 * 60 * 60 * 1000)} // 2 hours ago
timeFormat="relative" // یا 'absolute'
/>- relative: نمایش نسبی (مثل "2 hours ago") با نمایش دقیق در hover
- absolute: نمایش تاریخ کامل (مثل "Jan 15, 2024 at 3:30 PM")
دکمههای اکشن
دکمههای اکشن فقط هنگام hover روی کارت نمایش داده میشوند و هر کدام tooltip فارسی دارند:
<InstagramPost
variant="vertical"
showActions={true}
onCommentAnalyzer={() => console.log('Comment Analyzer')}
onBooster={() => console.log('Booster')}
onAIAnalysis={() => console.log('AI Analysis')}
onOpenInstagram={() => window.open('https://instagram.com/...')}
instagramUrl="https://instagram.com/p/..."
/>غیرفعال کردن دکمهها به صورت جداگانه
هر دکمه اکشن به صورت مستقل قابل disable کردن است. دکمههای disable شده با opacity پایینتر نمایش داده میشوند و tooltip آنها وضعیت غیرفعال را نشان میدهد:
<InstagramPost
variant="vertical"
showActions={true}
// غیرفعال کردن دکمه تحلیل کامنت (مثلاً در صورت نداشتن دسترسی)
disableCommentAnalyzer={true}
// غیرفعال کردن بوستر (مثلاً در صورت اتمام اشتراک)
disableBooster={true}
// سایر دکمهها فعال میمانند
disableAIAnalysis={false}
disableOpenInstagram={false}
onCommentAnalyzer={() => console.log('Comment Analyzer')}
onBooster={() => console.log('Booster')}
onAIAnalysis={() => console.log('AI Analysis')}
onOpenInstagram={() => window.open('https://instagram.com/...')}
/>| Prop | دکمه مربوطه | پیشفرض |
|---|---|---|
disableCommentAnalyzer | 💬 تحلیل کامنتها | false |
disableBooster | 🚀 بوستر | false |
disableAIAnalysis | ✨ تحلیل هوش مصنوعی | false |
disableOpenInstagram | 📸 باز کردن در اینستاگرام | false |
تفاوتهای حالت عمودی و افقی
حالت عمودی (Vertical)
- طراحی مشابه اپ اینستاگرام
- همیشه LTR (حتی در محیط RTL)
- عرض محدود (max-w-sm)
- کپشن با قابلیت expand/collapse
- مناسب برای نمایش جزئیات کامل پست
حالت افقی (Horizontal)
- کارت افقی با عرض کامل
- ارتفاع محدود (حدود 4 خط کپشن)
- عکس در سمت راست (حدود 20% عرض)
- محتوای دیگر در سمت چپ
- کپشن به 4 خط محدود میشود
- مناسب برای نمایش در لیستها
Props
Types
interface MediaItem {
type: 'image' | 'video'
url: string
aspectRatio?: '16:9' | '9:16' | '1:1' | '4:5' | '5:4'
}
interface PostStats {
likes?: number
comments?: number
views?: number
shares?: number
}
interface ProfileInfo {
username: string
fullName?: string
profilePicture?: string
}راهنمای استفاده
بکنید
- از
variant="vertical"برای نمایش جزئیات کامل و ازvariant="horizontal"برای لیستها استفاده کنید - همیشهprofileباusernameمشخص کنید تا هویت پست واضح باشد - ازnumberFormat="short"برای فضاهای محدود استفاده کنید
نکنید
- حالت عمودی را در فضای کمتر از ۳۰۰px عرض قرار ندهید — محتوا فشرده میشود -
showActionsرا بدون تعریف callbackها فعال نکنید — دکمه بدون عملکرد گمراهکننده است - از این کامپوننت برای پلتفرمهای غیر اینستاگرام استفاده نکنید — طراحی مخصوص اینستاگرام است
دسترسیپذیری
- ARIA labels برای دکمههای اکشن (تحلیل کامنت، بوستر، AI، اینستاگرام)
aria-expandedروی دکمه expand کپشنaria-controlsبرای پانل کپشن- ناوبری کامل با کیبورد
- کنتراست رنگی مناسب برای خوانایی
راستچین و چپچین (RTL/LTR)
با استفاده از prop dir میتوانید جهت نمایش کامپوننت را تغییر دهید.
راستچین (RTL)
در حالت راستچین، کپشن و چیدمان عناصر به صورت راست به چپ نمایش داده میشوند.
<InstagramPost
variant="vertical"
dir="rtl"
caption="این یک متن راستچین است."
// ... سایر پراپها
/>چپچین (LTR)
در حالت چپچین، کپشن و چیدمان عناصر به صورت چپ به راست نمایش داده میشوند (مناسب برای متون انگلیسی).
<InstagramPost
variant="vertical"
dir="ltr"
caption="This is a left-to-right text."
// ... سایر پراپها
/>کامپوننتهای مرتبط
- CommentCard — اگر نیاز به نمایش کامنتهای اینستاگرام با تحلیل احساسات دارید، از CommentCard استفاده کنید
- SocialPlatformBadge — اگر فقط نمایش آیکون پلتفرم نیاز دارید بدون محتوای پست، از SocialPlatformBadge استفاده کنید