پرتوپرتو

اطلاعات پروفایل (Profile Info)

نمایش اطلاعات پروفایل کاربر با آواتار، نام، یوزرنیم و اطلاعات اضافی

معرفی

کامپوننت Profile Info برای نمایش اطلاعات خلاصه پروفایل کاربر استفاده می‌شود. این کامپوننت شامل آواتار با حاشیه سفارشی، نام کاربر، نام کاربری (username)، اطلاعات اضافی (مثل زمان یا وضعیت) و دکمه اکشن است.

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

  • برای نمایش پروفایل کاربر در لیست‌ها، منوها و sidebar
  • برای ردیف‌های کاربر در جدول یا نتایج جستجو
  • وقتی فضای محدود است و نمایش افقی مناسب‌تر است

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

  • وقتی اطلاعات کامل پروفایل نیاز دارید — از ProfileCard استفاده کنید

استفاده پایه

م

محسن یگانه

mohsene

۴:۲۱ ص
import { ProfileInfo } from '@parto-system-design/ui'

export default function MyComponent() {
  return (
    <ProfileInfo
      name="محسن یگانه"
      username="mohsene"
      avatarSrc="https://example.com/avatar.jpg"
      infoText="۴:۲۱ ص"
      infoIcon={<ClockIcon />}
      onActionClick={() => console.log('Action clicked')}
      onProfileClick={() => console.log('Profile clicked')}
    />
  )
}

مثال‌ها

اندازه‌های مختلف

کامپوننت در سه اندازه sm، md و lg موجود است.

ا

احمد رضایی

ahmad.rezaei

آنلاین
ف

فاطمه کریمی

fateme_karimi

۲ ساعت پیش
ع

علی محمدی

ali.m

دیروز
<ProfileInfo
  size="sm"
  name="احمد رضایی"
  username="ahmad.rezaei"
  avatarSrc="/avatar.jpg"
  infoText="آنلاین"
/>

<ProfileInfo
  size="md"
  name="فاطمه کریمی"
  username="fateme_karimi"
  avatarSrc="/avatar.jpg"
  infoText="۲ ساعت پیش"
/>

<ProfileInfo
  size="lg"
  name="علی محمدی"
  username="ali.m"
  avatarSrc="/avatar.jpg"
  infoText="دیروز"
/>

حالت‌های مختلف (Variants)

کامپوننت در سه variant موجود است: default، dark و transparent.

س

سارا احمدی

sara_ahmadi

آنلاین
ح

حسین رضایی

hosein.r

۱۰ دقیقه پیش
م

مریم جعفری

maryam_jafari

غیرفعال
<ProfileInfo
  variant="default"
  name="سارا احمدی"
  username="sara_ahmadi"
  infoText="آنلاین"
/>

<ProfileInfo
  variant="dark"
  name="حسین رضایی"
  username="hosein.r"
  infoText="۱۰ دقیقه پیش"
/>

<ProfileInfo
  variant="transparent"
  name="مریم جعفری"
  username="maryam_jafari"
  infoText="غیرفعال"
/>

تعاملی (Interactive)

می‌توانید با استفاده از onProfileClick و onActionClick رفتارهای سفارشی اضافه کنید.

ر

رضا کریمی

reza.karimi

آنلاین
ن

نیلوفر صالحی

niloofar_s

۵ دقیقه پیش
ا

امین احمدی

amin_a

۱ ساعت پیش
const [selected, setSelected] = React.useState<string | null>(null)

;<ProfileInfo
  name="رضا کریمی"
  username="reza.karimi"
  avatarSrc="/avatar.jpg"
  infoText="آنلاین"
  onProfileClick={() => setSelected('reza')}
  onActionClick={() => console.log('Menu opened')}
  className={selected === 'reza' ? 'ring-2 ring-primary' : ''}
/>

بدون تصویر پروفایل

اگر تصویر پروفایل موجود نباشد، می‌توانید از initials استفاده کنید.

ک ج

کاربر جدید

new_user

تازه عضو شده
<ProfileInfo name="کاربر جدید" username="new_user" initials="ک ج" infoText="تازه عضو شده" />

Props

ProfileInfo

Prop

Type

مثال‌های کاربردی

لیست کاربران

const users = [
  {
    name: 'محسن یگانه',
    username: 'mohsene',
    avatarSrc: '/avatars/mohsen.jpg',
    status: 'آنلاین',
  },
  {
    name: 'علی احمدی',
    username: 'ali.a',
    avatarSrc: '/avatars/ali.jpg',
    status: '۲ ساعت پیش',
  },
  // ...
]

;<div className="space-y-2" dir="rtl">
  {users.map((user) => (
    <ProfileInfo
      key={user.username}
      name={user.name}
      username={user.username}
      avatarSrc={user.avatarSrc}
      infoText={user.status}
      avatarBorderVariant="gold"
      onProfileClick={() => navigate(`/profile/${user.username}`)}
      onActionClick={() => openUserMenu(user)}
    />
  ))}
</div>

با منوی Dropdown

import { ProfileInfo } from '@parto-system-design/ui'
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@parto-system-design/ui'

;<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <div>
      <ProfileInfo
        name="محسن یگانه"
        username="mohsene"
        avatarSrc="/avatar.jpg"
        infoText="۴:۲۱ ص"
        infoIcon={<ClockIcon />}
      />
    </div>
  </DropdownMenuTrigger>
  <DropdownMenuContent align="end">
    <div dir="rtl">
      <DropdownMenuItem>مشاهده پروفایل</DropdownMenuItem>
      <DropdownMenuItem>ارسال پیام</DropdownMenuItem>
      <DropdownMenuItem>بلاک کردن</DropdownMenuItem>
    </div>
  </DropdownMenuContent>
</DropdownMenu>

در Sidebar

<Sidebar>
  <SidebarHeader>
    <ProfileInfo
      size="sm"
      variant="transparent"
      name="محسن یگانه"
      username="mohsene"
      avatarSrc="/avatar.jpg"
      infoText="آنلاین"
      avatarBorderVariant="primary"
      onProfileClick={() => navigate('/profile')}
      onActionClick={() => openSettings()}
    />
  </SidebarHeader>
  {/* ... */}
</Sidebar>

در Dialog یا Modal

<Dialog>
  <DialogContent>
    <div dir="rtl">
      <ProfileInfo
        size="lg"
        variant="transparent"
        name="محسن یگانه"
        username="mohsene"
        avatarSrc="/avatar.jpg"
        infoText="عضو از ۱۴۰۲"
        avatarBorderVariant="gold"
      />
      <div className="mt-4 space-y-2">
        <p>ایمیل: mohsen@example.com</p>
        <p>شماره تلفن: ۰۹۱۲۳۴۵۶۷۸۹</p>
      </div>
    </div>
  </DialogContent>
</Dialog>

نکات مهم

حاشیه آواتار

  • gold: حاشیه طلایی با گرادیانت (مشابه عکس نمونه) - مناسب برای نمایش پروفایل‌های ویژه یا برجسته
  • primary: حاشیه با رنگ اصلی برند - مناسب برای حالت انتخاب شده یا فعال
  • none: بدون حاشیه - حالت ساده و مینیمال

اندازه‌ها

  • sm: مناسب برای Sidebar، منوها و لیست‌های فشرده
  • md: اندازه پیش‌فرض، مناسب برای اکثر موارد استفاده
  • lg: مناسب برای صفحات پروفایل، Modal‌ها و نمایش جزئیات

RTL Support

کامپوننت به طور کامل از RTL پشتیبانی می‌کند. برای استفاده در محیط انگلیسی، dir="ltr" را به container اضافه کنید.

<div dir="ltr">
  <ProfileInfo name="Mohsen Yeganeh" username="mohsene" avatarSrc="/avatar.jpg" infoText="4:21 AM" />
</div>

Accessibility

  • کامپوننت از semantic HTML استفاده می‌کند
  • دکمه اکشن دارای aria-label است
  • برای بهبود دسترسی، می‌توانید aria-label سفارشی اضافه کنید
<ProfileInfo
  name="محسن یگانه"
  username="mohsene"
  aria-label="پروفایل محسن یگانه"
  // ...
/>

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

بکنید

  • از size="sm" برای sidebar و لیست‌های فشرده استفاده کنید - infoText را برای نمایش وضعیت آنلاین یا زمان آخرین فعالیت استفاده کنید - onProfileClick را برای ناوبری به صفحه پروفایل تعریف کنید

نکنید

  • از ProfileInfo برای نمایش عمودی در grid استفاده نکنید — از ProfileCard استفاده کنید - بدون name و username از کامپوننت استفاده نکنید — هر دو الزامی هستند - actionIcon را بدون onActionClick قرار ندهید — دکمه بدون عملکرد گمراه‌کننده است

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

  • کامپوننت از semantic HTML استفاده می‌کند
  • دکمه اکشن دارای aria-label است
  • قابلیت ناوبری با کیبورد پشتیبانی می‌شود
  • برای بهبود دسترسی، aria-label سفارشی اضافه کنید

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

  • ProfileCard — اگر نمایش عمودی و کامل‌تر پروفایل در grid یا carousel نیاز دارید، از ProfileCard استفاده کنید
  • Avatar — اگر فقط تصویر پروفایل بدون اطلاعات متنی نیاز دارید، از Avatar استفاده کنید