پرتوپرتو

کارت نظر (Comment Card)

کامپوننت نمایش نظرات کاربران با برچسب‌های تحلیلی و شاخص احساسات

معرفی

کامپوننت CommentCard برای نمایش نظرات و بازخوردهای کاربران به همراه تحلیل احساسات و برچسب‌های دسته‌بندی استفاده می‌شود. این کامپوننت شامل متن نظر، برچسب‌های تحلیلی با درصد احتمال و شاخص رنگی احساسات است.

استفاده پایه

اصلاً راضی نیستم. کالا معیوب بود و وقتی تماس گرفتم پشتیبانی جواب درستی نداد. پولم هدر رفت.
دریافت کالای معیوب (۹۱%)
نارضایتی از پشتیبانی (۸۷%)
import { CommentCard } from '@parto-system-design/ui';

export default function MyComponent() {
  return (
    <CommentCard
      text="اصلاً راضی نیستم. کالا معیوب بود و وقتی تماس گرفتم پشتیبانی جواب درستی نداد. پولم هدر رفت."
      tags={[
        { title: "دریافت کالای معیوب", probability: 91, color: "#dc2626" },
        { title: "نارضایتی از پشتیبانی", probability: 87, color: "#ef4444" }
      ]}
      sentiment="negative"
    />
  );
}

حالت‌های مختلف

نظر مثبت

عالی بود! کیفیت محصول خیلی خوبه و ارسال هم سریع انجام شد. پیشنهاد می‌کنم حتماً خرید کنید.
رضایت از کیفیت (۹۵%)
ارسال سریع (۸۹%)
<CommentCard
  text="عالی بود! کیفیت محصول خیلی خوبه و ارسال هم سریع انجام شد. پیشنهاد می‌کنم حتماً خرید کنید."
  tags={[
    { title: "رضایت از کیفیت", probability: 95, color: "#16a34a" },
    { title: "ارسال سریع", probability: 89, color: "#22c55e" }
  ]}
  sentiment="positive"
/>

نظر منفی

اصلاً راضی نیستم. کالا معیوب بود و وقتی تماس گرفتم پشتیبانی جواب درستی نداد. پولم هدر رفت.
دریافت کالای معیوب (۹۱%)
نارضایتی از پشتیبانی (۸۷%)
<CommentCard
  text="اصلاً راضی نیستم. کالا معیوب بود و وقتی تماس گرفتم پشتیبانی جواب درستی نداد. پولم هدر رفت."
  tags={[
    { title: "دریافت کالای معیوب", probability: 91, color: "#dc2626" },
    { title: "نارضایتی از پشتیبانی", probability: 87, color: "#ef4444" }
  ]}
  sentiment="negative"
/>

نظر خنثی

محصول خوبی بود، قیمت نسبتاً مناسب. چیز خاصی نداشت اما مشکلی هم نداشت.
رضایت متوسط (۷۸%)
قیمت مناسب (۷۲%)
<CommentCard
  text="محصول خوبی بود، قیمت نسبتاً مناسب. چیز خاصی نداشت اما مشکلی هم نداشت."
  tags={[
    { title: "رضایت متوسط", probability: 78, color: "#6b7280" },
    { title: "قیمت مناسب", probability: 72, color: "#9ca3af" }
  ]}
  sentiment="neutral"
/>

با چند برچسب

محصول عالی بود اما بسته‌بندی ضعیف. متأسفانه کارتن پاره شده بود و محتویات آسیب دیده. پشتیبانی خیلی کمک کرد و جایگزین ارسال کردن.
رضایت از محصول (۹۲%)
بسته‌بندی ضعیف (۸۸%)
پشتیبانی خوب (۸۵%)
تحویل جایگزین (۸۰%)
<CommentCard
  text="محصول عالی بود اما بسته‌بندی ضعیف. متأسفانه کارتن پاره شده بود و محتویات آسیب دیده. پشتیبانی خیلی کمک کرد و جایگزین ارسال کردن."
  tags={[
    { title: "رضایت از محصول", probability: 92, color: "#16a34a" },
    { title: "بسته‌بندی ضعیف", probability: 88, color: "#dc2626" },
    { title: "پشتیبانی خوب", probability: 85, color: "#22c55e" },
    { title: "تحویل جایگزین", probability: 80, color: "#16a34a" }
  ]}
  sentiment="positive"
/>

در Grid

عالی بود! کیفیت محصول خیلی خوبه و ارسال هم سریع انجام شد.
رضایت از کیفیت (۹۵%)
ارسال سریع (۸۹%)
اصلاً راضی نیستم. کالا معیوب بود و پشتیبانی جواب نداد.
دریافت کالای معیوب (۹۱%)
نارضایتی از پشتیبانی (۸۷%)
محصول خوبی بود، قیمت نسبتاً مناسب. چیز خاصی نداشت.
رضایت متوسط (۷۸%)
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" dir="rtl">
  <CommentCard
    text="عالی بود! کیفیت محصول خیلی خوبه و ارسال هم سریع انجام شد."
    tags={[
      { title: "رضایت از کیفیت", probability: 95, color: "#16a34a" },
      { title: "ارسال سریع", probability: 89, color: "#22c55e" }
    ]}
    sentiment="positive"
  />
  <CommentCard
    text="اصلاً راضی نیستم. کالا معیوب بود و پشتیبانی جواب نداد."
    tags={[
      { title: "دریافت کالای معیوب", probability: 91, color: "#dc2626" },
      { title: "نارضایتی از پشتیبانی", probability: 87, color: "#ef4444" }
    ]}
    sentiment="negative"
  />
  <CommentCard
    text="محصول خوبی بود، قیمت نسبتاً مناسب. چیز خاصی نداشت."
    tags={[
      { title: "رضایت متوسط", probability: 78, color: "#6b7280" }
    ]}
    sentiment="neutral"
  />
</div>

ساختار داده

interface CommentTag {
  title: string;        // عنوان برچسب
  probability: number;  // درصد احتمال (0-100)
  color: string;        // کد رنگ HEX
}

interface CommentCardProps {
  text: string;                        // متن نظر
  tags: CommentTag[];                  // برچسب‌های تحلیلی
  sentiment: 'positive' | 'negative' | 'neutral'; // احساس کلی
  id?: number | string;                // شناسه اختیاری
  usePersianDigits?: boolean;          // استفاده از اعداد فارسی (پیش‌فرض: true)
}

ویژگی‌های کامپوننت

۱. متن نظر

  • نمایش متن کامل نظر
  • پشتیبانی کامل از RTL
  • فونت و فاصله‌گذاری مناسب برای خوانایی

۲. برچسب‌های تحلیلی (Tags)

  • عنوان برچسب با درصد احتمال
  • رنگ دینامیک برای هر برچسب
  • استایل شفاف با حاشیه رنگی:
    • پس‌زمینه: رنگ با شفافیت 15%
    • حاشیه: رنگ با شفافیت 30%
    • متن: رنگ کامل
  • نمایش اعداد به صورت فارسی یا انگلیسی

۳. شاخص احساسات (Sentiment)

  • دایره رنگی در گوشه پایین چپ (RTL)
  • رنگ‌ها:
    • 🟢 سبز (#22c55e): مثبت
    • 🔴 قرمز (#ef4444): منفی
    • ⚫ خاکستری (#6b7280): خنثی
  • Tooltip با عنوان احساس

Props

Prop

Type

رنگ‌بندی برچسب‌ها

برای رنگ‌بندی برچسب‌ها می‌توانید از پالت رنگی متناسب با نوع احساس استفاده کنید:

رنگ‌های پیشنهادی مثبت

  • #16a34a - سبز تیره
  • #22c55e - سبز روشن
  • #4ade80 - سبز خیلی روشن

رنگ‌های پیشنهادی منفی

  • #dc2626 - قرمز تیره
  • #ef4444 - قرمز
  • #f87171 - قرمز روشن

رنگ‌های پیشنهادی خنثی

  • #6b7280 - خاکستری تیره
  • #9ca3af - خاکستری
  • #d1d5db - خاکستری روشن

کاربردها

این کامپوننت در موارد زیر کاربرد دارد:

  • تحلیل نظرات: نمایش نظرات کاربران با تحلیل احساسات
  • داشبورد بازخورد: نمایش بازخوردها در پنل مدیریت
  • سیستم بررسی محصول: نمایش نظرات خریداران
  • تحلیل رضایت مشتری: نمایش نظرات با دسته‌بندی موضوعی
  • مانیتورینگ شبکه‌های اجتماعی: نمایش نظرات و تحلیل آن‌ها

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

  • استفاده از تگ‌های معنادار
  • Tooltip برای شاخص احساسات
  • کنتراست رنگی مناسب برای خوانایی
  • پشتیبانی کامل از صفحه‌خوان‌ها

ملاحظات RTL

  • متن به‌صورت خودکار راست‌چین می‌شود
  • برچسب‌ها از راست به چپ چیده می‌شوند (flex-row-reverse)
  • شاخص احساسات در گوشه پایین چپ قرار می‌گیرد (end-3)
  • اعداد فارسی به‌صورت پیش‌فرض فعال است

نکات بهینه‌سازی

  • برای لیست‌های بزرگ از virtualization استفاده کنید
  • id را برای key در لیست‌ها استفاده کنید
  • برای بهبود عملکرد، از React.memo استفاده کنید
  • تگ‌ها را محدود کنید (حداکثر 4-5 تگ)