کارت سلامت موجودیت (EntityHealthCard)
کارت canonical برای نمایش سلامت موجودیتهای long-lived — ورکرها، پیجهای رصدی، منابع داده — با روایت شدتبندی ۶سطحی، نمره، اعتماد، فاز، متریک و CTA.
معرفی
EntityHealthCard کارت canonical برای نمایش وضعیت سلامت موجودیتهای long-lived است — ورکرهای افکارسنجی/بوستر، پیجهای تحت رصد، منابع فید، حسابهای دادهگیری. برخلاف JobCard که lifecycle کار async (queued→completed) را نشان میدهد، این کارت «چقدر سالم است؟»، «چرا؟»، و «الان چه کار کنیم؟» را پاسخ میدهد.
شش سطح شدت (ordered worst → best):
banned— موجودیت مسدود شده (مثلاً پیج از سمت پلتفرم)at-risk— نیاز به مداخله فوری (شکست بررسی، نقض قوانین)warning— متریکها در حال افتpending— هنوز ارزیابی نشده (جدید، setup، در حال warmup)growing— در حال بهبود ولی هنوز به ثبات نرسیدهhealthy— پایدار و سالم
چه زمانی استفاده کنیم:
- لیست ورکرهای بوستر با وضعیت ban/warmup/operational
- گرید پیجهای تحت رصد با score و trend
- dashboard منابع فید با trust score و last-check
- هر entity که «سلامت» در domainش concept اصلی است
چه زمانی استفاده نکنیم:
- نمایش lifecycle کار async (queued/running/completed) — از
JobCardاستفاده کنید - متریک تکعدد با trend — از
MetricCardاستفاده کنید - کارت پروفایل کاربر/پیج بدون بار سلامت — از
ProfileCardاستفاده کنید - وضعیت operational کوتاهمدت (critical/warning/middle/low) — از
StatusBadgeاستفاده کنید
@parto_worker_17
ورکر اینستاگرام — فاز warmup
نرخ موفقیت ۳ روز اخیر ۱۲٪ کاهش یافته و یک علامتگذاری challenge دریافت شد.
آخرین بررسی ۵ دقیقه پیش
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
سلامت برند الف
امتیاز فعلی و روند هفته اخیر
استفاده
'use client'
import {
EntityHealthCard,
EntityHealthCardHeader,
EntityHealthCardHeaderText,
EntityHealthCardHeaderEnd,
EntityHealthCardTitle,
EntityHealthCardSubtitle,
EntityHealthCardSeverityBadge,
EntityHealthCardScore,
EntityHealthCardNarrative,
EntityHealthCardTrust,
EntityHealthCardPhase,
EntityHealthCardMetrics,
EntityHealthCardMetric,
EntityHealthCardFooter,
EntityHealthCardActions,
EntityHealthCardMeta,
Button,
} from '@parto-system-design/ui'
export function WorkerHealth({ worker }) {
return (
<EntityHealthCard severity={worker.severity} interactive onClick={() => openWorker(worker.id)}>
<EntityHealthCardHeader>
<EntityHealthCardHeaderText>
<EntityHealthCardTitle>@{worker.username}</EntityHealthCardTitle>
<EntityHealthCardSubtitle>ورکر اینستاگرام</EntityHealthCardSubtitle>
</EntityHealthCardHeaderText>
<EntityHealthCardHeaderEnd>
<EntityHealthCardSeverityBadge />
</EntityHealthCardHeaderEnd>
</EntityHealthCardHeader>
<EntityHealthCardScore value={worker.score} label="نمره سلامت" delta={worker.delta} />
<EntityHealthCardNarrative>{worker.narrative}</EntityHealthCardNarrative>
<EntityHealthCardTrust value={worker.trustScore} />
<EntityHealthCardPhase phase="warmup" day={worker.day} total={worker.totalDays} />
<EntityHealthCardMetrics>
<EntityHealthCardMetric label="عملیات امروز" value={worker.actionsToday} />
<EntityHealthCardMetric label="موفقیت" value={`${worker.successRate}٪`} trend="down" />
</EntityHealthCardMetrics>
<EntityHealthCardFooter>
<EntityHealthCardMeta>آخرین بررسی ۵ دقیقه پیش</EntityHealthCardMeta>
<EntityHealthCardActions>
<Button size="sm">بررسی</Button>
</EntityHealthCardActions>
</EntityHealthCardFooter>
</EntityHealthCard>
)
}Sub-componentها از context برای severity / size / locale استفاده میکنند — رنگ، آیکون، label، و قالب عدد خودکار هماهنگ میشوند.
شش سطح شدت
@banned_page
این پیج از طرف پلتفرم مسدود شده و عملیات متوقف است.
@new_entity
موجودیت تازه اضافه شده و در حال ارزیابی اولیه است.
@login_failed
سه خطای login متوالی در ۲۴ ساعت اخیر رخ داده — نیاز به بررسی فوری.
@trend_down
نرخ تعامل ۷ روز اخیر ۱۵٪ کاهش یافته.
@improving
نمره نسبت به هفته قبل ۱۲ واحد افزایش یافته.
@stable_01
همه شاخصها در محدوده مطلوب. عملیات نرمال.
همه شش سطح از طریق prop severity روی root تعریف میشوند. رنگ border-accent (سمت start منطقی)، رنگ badge و آیکون progress خودکار از طریق token ها نگاشته میشود.
- banned / at-risk — مپ میشوند به
--destructive-default. آیکون متمایز (Ban vs AlertTriangle) و pulse روی badge برای جلب توجه. - warning —
--warning-default(کهربایی). - pending —
--sentiment-neutral(خاکستری — «هنوز ارزیابی نشده»). - growing —
--brand-default(آبی — «در حال بهبود»). - healthy —
--sentiment-positive(سبز — «سالم»).
کمکتابع isCriticalEntityHealth(severity) برای flag کردن مواردی که نیاز به مداخله فوری دارند (banned + at-risk)، و entityHealthPriority برای sort «worst first» صادر میشوند.
حالت برای صفحه رصد (Page Evaluation)
@parto_magazine
پیج تحت رصد — ۱۸۰ هزار فالوور
پیج در حال بهبود مداوم ۴ هفته اخیر. نرخ تعامل از میانگین صنعت بالاتر رفته.
آخرین snapshot ۲ ساعت پیش
کارت با score۰-۱۰۰ (formula: ۰٫۶ × engagement + ۰٫۴ × growth) و metric grid برای نمایش breakdown — همان الگوی پنل ارزیابی اما با قدرت DS.
حالت compact برای گرید/لیست
@worker_01
ورکر
@worker_02
ورکر
@worker_03
ورکر
@worker_04
ورکر
@worker_05
ورکر
@worker_06
ورکر
با size="sm" و حذف بخشهای اختیاری (narrative / trust / phase)، کارت به یک ردیف فشرده تبدیل میشود که در گرید ۳ یا ۴ ستونه کاربرد دارد.
ترکیب با badge-only برای inbox
@page_ministry_01
مسدود شده ۲ روز پیش
@page_feed_22
۳ خطا در ۲۴ ساعت اخیر
@page_news_05
افت تعامل ۱۵٪
@page_culture_09
آخرین بررسی ۳ دقیقه پیش
در حالتهای بسیار فشرده (نوتیفیکیشن inbox، سلسله ردیفها)، میتوان فقط title + severity badge را نشان داد. iconOnly روی badge + حذف همه بخشهای محتوایی.
حالت interactive
@worker_17
کلیک برای انتخاب
@worker_42
کلیک برای انتخاب
@page_alpha
کلیک برای انتخاب
با interactive یا onClick، کل کارت کلیکپذیر میشود، role="button" + tabIndex=0 میگیرد، و keyboard (Enter/Space) پشتیبانی میشود. کلیکهای داخل EntityHealthCardActions به root bubble نمیکنند تا دکمههای عمل جداگانه کار کنند.
راهنمای استفاده
بکنید
- شش سطح canonical را به domain خود map کنید: Booster
ready_for_ops→healthy،hase_pending→pending،flagged→at-risk،bannedهمانbanned- همیشهEntityHealthCardNarrativeرا پر کنید — کاربر باید «چرا» را بدون کلیک بداند، نه فقط «چه وضعیتی» - درbanned/at-riskیک CTA واضح در footer بگذارید (بررسی، لاگ، درخواست unban) - برای لیست «بدترین اول» ازentityHealthPriorityبرای sort استفاده کنید -EntityHealthCardPhaseرا فقط زمانی نمایش دهید که فاز معنادار است (warmup، cooldown)؛ در حالت پایدار حذف کنید
نکنید
- شدتهای سفارشی به
EntityHealthKeyاضافه نکنید — این مجموعه canonical است. از label روی narrative استفاده کنید -EntityHealthCardScoreرا بدون label رها نکنید — ۶۷/۱۰۰ بهتنهایی معنا ندارد - از این کارت برای نمایش وضعیت کار async (تحلیل، کمپین) استفاده نکنید —JobCardرا بکار ببرید - همه sub-componentها باید داخل<EntityHealthCard>باشند — بیرون از root خطای «must be rendered inside» میدهند - وقتی domain اصلیتان «متریک تکعدد» است،MetricCardکوچکتر و مناسبتر است
Props
EntityHealthCard
EntityHealthCardSeverityBadge
EntityHealthCardScore
EntityHealthCardTrust
EntityHealthCardPhase
EntityHealthCardMetric
EntityHealthCardMetrics
دسترسیپذیری
EntityHealthCardبهصورت پیشفرضrole="region"میگیرد تا screen reader آن را یک landmark بشناسد. باinteractiveبهrole="button"+tabIndex=0+ keyboard handler تبدیل میشود.EntityHealthCardSeverityBadgeدر حالتiconOnlyهنوزaria-labellocalized دارد.EntityHealthCardTrustوEntityHealthCardPhaseازrole="progressbar"باaria-valuenow/min/maxاستفاده میکنند.EntityHealthCardScore.deltaبا arrow بصری،aria-labelمتنی (مثل «تغییر منفی») برای screen reader اضافه میکند.- pulse روی badge برای
bannedوat-riskباmotion-safe:animate-pulseست شده — درprefers-reduced-motion: reduceساکن میماند. - همه تونهای متنی formal Farsi هستند؛ trilingual (fa/ar/en) پشتیبانی میشود.
کامپوننتهای مرتبط
- JobCard — برای async work با lifecycle تعریفشده (queued→completed). اگر entity شما «task» است نه «entity سلامتدار»، JobCard را انتخاب کنید
- MetricCard — برای متریک تکعدد؛ وقتی «سلامت» concept اصلی نیست
- ProfileCard — کارت پروفایل بدون بار سلامت؛ برای influencer/author
- StatusBadge — badge وضعیت operational (critical/warning/middle/low) کوتاهمدت؛ این کارت روایت طولانیتر میدهد
- SeverityBadge — badge اولویت (urgent/high/medium/low)؛ مستقل از سلامت entity
- StatusFlow — وقتی نیاز به نمایش pipeline چندمرحلهای lifecycle دارید