پرتوپرتو

کارت پروفایل (Profile Card)

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

معرفی

کامپوننت Profile Card برای نمایش کارت پروفایل کاربر به صورت عمودی استفاده می‌شود. این کامپوننت شامل آواتار با حاشیه سفارشی، نام کاربر، نام کاربری (username) و تعداد فالوورها با فرمت کوتاه شده است.

استفاده پایه

م

محسن یگانه

mohsene

125K
import { ProfileCard } from '@parto-system-design/ui';
import { Users } from 'lucide-react';

export default function MyComponent() {
  return (
    <ProfileCard
      name="محسن یگانه"
      username="mohsene"
      avatarSrc="https://example.com/avatar.jpg"
      followers={125000}
      followersIcon={<Users className="h-3.5 w-3.5" />}
      onCardClick={() => console.log('Card clicked')}
    />
  );
}

مثال‌ها

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

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

ا

احمد رضایی

ahmad.rezaei

5.4K
ف

فاطمه کریمی

fateme_karimi

82K
ع

علی محمدی

ali.m

1.2M
<ProfileCard
  size="sm"
  name="احمد رضایی"
  username="ahmad.rezaei"
  avatarSrc="/avatar.jpg"
  followers={5400}
  followersIcon={<Users className="h-3 w-3" />}
/>

<ProfileCard
  size="md"
  name="فاطمه کریمی"
  username="fateme_karimi"
  avatarSrc="/avatar.jpg"
  followers={82000}
  followersIcon={<Users className="h-3.5 w-3.5" />}
/>

<ProfileCard
  size="lg"
  name="علی محمدی"
  username="ali.m"
  avatarSrc="/avatar.jpg"
  followers={1200000}
  followersIcon={<Users className="h-4 w-4" />}
/>

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

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

س

سارا احمدی

sara_ahmadi

45K
ح

حسین رضایی

hosein.r

98K
م

مریم جعفری

maryam_jafari

23.5K
<ProfileCard
  variant="default"
  name="سارا احمدی"
  username="sara_ahmadi"
  followers={45000}
  followersIcon={<Users className="h-3.5 w-3.5" />}
/>

<ProfileCard
  variant="dark"
  name="حسین رضایی"
  username="hosein.r"
  followers={98000}
  followersIcon={<Users className="h-3.5 w-3.5" />}
/>

<ProfileCard
  variant="transparent"
  name="مریم جعفری"
  username="maryam_jafari"
  followers={23500}
  followersIcon={<Users className="h-3.5 w-3.5" />}
/>

گرید کارت‌ها

نمایش چند کارت در کنار هم به صورت گرید.

م

محسن یگانه

mohsene

125K
س

سارا احمدی

sara_ahmadi

45K
ع

علی محمدی

ali.m

1.2M
ف

فاطمه کریمی

fateme_karimi

82K
const users = [
  {
    name: 'محسن یگانه',
    username: 'mohsene',
    avatarSrc: '/avatar1.jpg',
    followers: 125000,
  },
  // ...
];

<div className="grid grid-cols-2 md:grid-cols-4 gap-4" dir="rtl">
  {users.map((user) => (
    <ProfileCard
      key={user.username}
      name={user.name}
      username={user.username}
      avatarSrc={user.avatarSrc}
      followers={user.followers}
      followersIcon={<Users className="h-3.5 w-3.5" />}
      onCardClick={() => console.log(`${user.name} clicked`)}
    />
  ))}
</div>

بدون تعداد فالوور

می‌توانید کارت را بدون نمایش تعداد فالوور نیز استفاده کنید.

ک ج

کاربر جدید

new_user

<ProfileCard
  name="کاربر جدید"
  username="new_user"
  initials="ک ج"
  avatarBorderVariant="primary"
/>

Props

ProfileCard

Prop

Type

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

لیست پیشنهادی کاربران

import { ProfileCard } from '@parto-system-design/ui';
import { Users } from 'lucide-react';

const suggestedUsers = [
  {
    id: '1',
    name: 'محسن یگانه',
    username: 'mohsene',
    avatarSrc: '/avatars/mohsen.jpg',
    followers: 125000,
  },
  {
    id: '2',
    name: 'علی احمدی',
    username: 'ali.a',
    avatarSrc: '/avatars/ali.jpg',
    followers: 82000,
  },
  // ...
];

export default function SuggestedUsers() {
  return (
    <div className="space-y-4" dir="rtl">
      <h2 className="text-lg font-semibold">پیشنهاد دنبال کردن</h2>
      <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-4">
        {suggestedUsers.map((user) => (
          <ProfileCard
            key={user.id}
            name={user.name}
            username={user.username}
            avatarSrc={user.avatarSrc}
            followers={user.followers}
            followersIcon={<Users className="h-3.5 w-3.5" />}
            avatarBorderVariant="gold"
            onCardClick={() => navigateToProfile(user.username)}
          />
        ))}
      </div>
    </div>
  );
}

جستجوی کاربران

import { ProfileCard } from '@parto-system-design/ui';
import { Users } from 'lucide-react';
import { useState } from 'react';

export default function UserSearch() {
  const [searchResults, setSearchResults] = useState([]);

  return (
    <div className="space-y-4" dir="rtl">
      <Input
        placeholder="جستجوی کاربران..."
        onChange={(e) => handleSearch(e.target.value)}
      />
      <div className="grid grid-cols-3 gap-4">
        {searchResults.map((user) => (
          <ProfileCard
            key={user.id}
            name={user.name}
            username={user.username}
            avatarSrc={user.avatarSrc}
            followers={user.followers}
            followersIcon={<Users className="h-3.5 w-3.5" />}
            onCardClick={() => viewProfile(user)}
          />
        ))}
      </div>
    </div>
  );
}

با دکمه دنبال کردن

import { ProfileCard, Button } from '@parto-system-design/ui';
import { Users, UserPlus } from 'lucide-react';

export default function ProfileWithFollow() {
  const [isFollowing, setIsFollowing] = useState(false);

  return (
    <div className="relative" dir="rtl">
      <ProfileCard
        name="محسن یگانه"
        username="mohsene"
        avatarSrc="/avatar.jpg"
        followers={125000}
        followersIcon={<Users className="h-3.5 w-3.5" />}
      />
      <div className="absolute top-2 left-2">
        <Button
          size="sm"
          variant={isFollowing ? "outline" : "primary"}
          onClick={() => setIsFollowing(!isFollowing)}
        >
          {isFollowing ? 'دنبال‌شده' : 'دنبال کردن'}
        </Button>
      </div>
    </div>
  );
}
import { ProfileCard, Carousel, CarouselContent, CarouselItem } from '@parto-system-design/ui';
import { Users } from 'lucide-react';

export default function ProfileCarousel() {
  const users = [...]; // لیست کاربران

  return (
    <Carousel dir="rtl" className="w-full">
      <CarouselContent>
        {users.map((user) => (
          <CarouselItem key={user.id} className="basis-1/2 md:basis-1/3 lg:basis-1/4">
            <ProfileCard
              name={user.name}
              username={user.username}
              avatarSrc={user.avatarSrc}
              followers={user.followers}
              followersIcon={<Users className="h-3.5 w-3.5" />}
              avatarBorderVariant="gold"
            />
          </CarouselItem>
        ))}
      </CarouselContent>
    </Carousel>
  );
}

نکات مهم

فرمت تعداد فالوور

تعداد فالوورها به صورت خودکار فرمت می‌شود:

  • کمتر از 1,000: عدد کامل نمایش داده می‌شود (مثلاً 856)
  • 1,000 تا 999,999: با K نمایش داده می‌شود (مثلاً 5.4K)
  • 1,000,000 و بیشتر: با M نمایش داده می‌شود (مثلاً 1.2M)

حاشیه آواتار

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

اندازه‌ها

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

RTL Support

کامپوننت به طور کامل از RTL پشتیبانی می‌کند. برای استفاده در محیط انگلیسی:

<div dir="ltr">
  <ProfileCard
    name="Mohsen Yeganeh"
    username="mohsene"
    avatarSrc="/avatar.jpg"
    followers={125000}
    followersIcon={<Users className="h-3.5 w-3.5" />}
  />
</div>

Accessibility

  • کامپوننت از semantic HTML استفاده می‌کند
  • تمام تصاویر دارای alt text مناسب هستند
  • قابلیت ناوبری با کیبورد
  • می‌توانید aria-label سفارشی اضافه کنید:
<ProfileCard
  name="محسن یگانه"
  username="mohsene"
  aria-label="کارت پروفایل محسن یگانه با ۱۲۵ هزار فالوور"
  // ...
/>

تفاوت با Profile Info

ProfileCard برای نمایش عمودی و متمرکز طراحی شده و مناسب گرید‌ها و carousel‌ها است.

ProfileInfo برای نمایش افقی طراحی شده و مناسب لیست‌ها، منوها و sidebar است.

// استفاده از ProfileCard - عمودی
<div className="grid grid-cols-4 gap-4">
  <ProfileCard name="..." username="..." />
</div>

// استفاده از ProfileInfo - افقی
<div className="space-y-2">
  <ProfileInfo name="..." username="..." />
</div>

الهام‌گیری

این کامپوننت از رابط کاربری شبکه‌های اجتماعی مانند Instagram، Twitter و TikTok الهام گرفته شده است.