نقشهحرارتی استانها (IranProvinceHeat)
لیست افقی ۳۱ استان ایران با heat-bar متناسب با مقدار — توزیع جغرافیایی نظرات، شکایات، احساسات و معیارهای دیگر
معرفی
IranProvinceHeat یک لیست عمودی است که هر سطر آن یک استان ایران را با heat-bar افقی نشان میدهد؛ شدت رنگ پسزمینه با نسبت value / max رشد میکند. این الگو جایگزین سبک، قابل دسترس و تماماً RTL برای SVG-map نقشه ایران است — برای ۹۰٪ موارد توزیع per-province در dashboardهای افکارسنجی کافی است و بدون نیاز به topojson یا نقشه برداری دستی روی هر اندازهی صفحه واکنش میدهد.
چه زمانی استفاده کنیم:
- توزیع جغرافیایی نظرات، شکایات، اخبار منتشره، یا هر متریک شمارشی per-province
- مقایسهی سطح رضایت یا سطح ریسک بین استانها (با scale معنادار: sentiment / severity / flow)
- صفحهی مقایسهی استانها با قابلیت کلیک برای drill-down
- بخشهای report و bulletin که SVG-map سنگین نیست
چه زمانی استفاده نکنیم:
- وقتی معنای geometry مهم است (همسایگی استانها، فاصله، مرزها) — به نقشهی واقعی نیاز دارید
- وقتی دادهای per-province نیست (مثلاً city-level یا national aggregate) —
PartoBarChartافقی یاMetricCardبهتر است - بیش از یک متریک همزمان روی یک ردیف —
DataTableبا ستونهای sparkline و progress استفاده کنید
زمین بازی
استفاده
import { IranProvinceHeat } from '@parto-system-design/ui'
export function ProvinceCommentsCard() {
return (
<IranProvinceHeat
data={{
tehran: 4820,
isfahan: 2140,
'razavi-khorasan': 1965,
}}
valueSuffix=" نظر"
topN={8}
hideMissing
showRank
/>
)
}میتوانید data را به دو شکل پاس بدهید: یک Record<string, number> یا آرایهی { code, value }[]. کد میتواند slug انگلیسی باشد (مثل tehran) یا کد ISO 3166-2:IR (مثل IR-07). استانهای ناشناس بهسادگی نادیده گرفته میشوند (و در صورت وجود onUnknownCode گزارش میشوند).
scale — انتخاب توکن رنگ معنادار
scale پیشفرض brand است؛ ولی بسته به نوع داده، یک scale معنایی انتخاب کنید:
sentiment-positive — رضایت / امتیاز خوب
برای دادهای که «بزرگتر = مثبتتر» است: نرخ رضایت، نمره NPS، درصد رشد مثبت.
severity-urgent — هشدار / گزارش بحرانی
برای دادهای که «بزرگتر = خطرناکتر» است: تعداد گزارشهای فوری، حوادث، پیک شکایات. scale قرمز/نارنجی به سرعت توجه ایجاد میکند.
scaleهای موجود:
brand(پیشفرض)sentiment-positive/sentiment-negativedestructive/warningseverity-urgent/severity-highflow-pro-gov/flow-internal-critic(برای دادهی کلاسترینگ افکارسنجی)
قابلیت کلیک برای drill-down
انتخاب: —
با تنظیم onProvinceClick، هر سطر به <button> تبدیل میشود (با focus ring + keyboard activation). callback یک object { slug, iso, value } دریافت میکند که برای navigation یا filter setup ایدهآل است.
حالت بارگذاری
با isLoading لیست skeleton نمایش داده میشود (با role="status" برای screen readerها). الگوی Suspense-friendly — اول این، سپس داده.
راهنمای استفاده
بکنید
- برای dashboardهای reporting افکارسنجی،
topN={10}باhideMissingبگذارید تا فهرست از ۳۱ ردیف به ۱۰ سطر کلیدی + سطر «+N استان دیگر» جمع شود - scale معنایی انتخاب کنید: shrinking از مقادیر «خنثی» به sentiment-positive یا severity-urgent، signal سریعتری به کاربر میدهد - برای استفاده در print / bulletin،density="compact"بگذارید — ارتفاع ۲۸px روی صفحه A4 جا میشود - باvalueSuffixمعنای واحد را در ردیف پیدا کنید (" نظر"," %"," گزارش") به جای نوشتن caption مجزا
نکنید
- این کامپوننت را بهعنوان فیلتر سراسری استفاده نکنید — برای آن از
RegionPicker(در حال توسعه) استفاده کنید؛ این صرفاً یک نمایشگر است - مقادیر منفی پاس ندهید — heat scale با نسبت value/max کار میکند و مقدار منفی شکستن انتظارات بصری است - بیش از یک متریک per-row نگذارید (مثلاً مقدار + درصد + delta) — به جای آن ازDataTableبا ستونهای جداگانه استفاده کنید - رنگ scale را با style override نکنید — token-driven است، با تم Light/Dark خود تطبیق مییابد
جدول ویژگیها
توابع کمکی
علاوه بر کامپوننت، lib این utilityها را هم export میکند:
IRAN_PROVINCES— آرایهی readonly از ۳۱ استان با labels (fa/ar/en) و کد ISOfindProvince(codeOrSlug)— جستجو بر اساس slug یا ISO،undefinedبرای ناشناسgetProvinceLabel(codeOrSlug, locale)— برچسب locale-appropriate یا fallback به slug
import { IRAN_PROVINCES, findProvince, getProvinceLabel } from '@parto-system-design/ui'
// ساختن لیست استانها برای یک <Select>
const options = IRAN_PROVINCES.map((p) => ({
value: p.slug,
label: p.labels.fa,
}))دسترسیپذیری
- ریشه
role="list"و هر سطرrole="listitem"— screen reader آن را بهعنوان لیست میخواند - در حالت تعاملی، هر سطر
<button type="button">باaria-label="نام استان: مقدار"است focus-visible:ring-2 ring-brandبرای navigation کلیدی Tab/Enter/Spacedata-rankروی هر سطر برای CSS hooks یا تلهمتری- skeleton حالت
role="status" aria-label="در حال بارگذاری"میگیرد - بدون hardcoded color — تطبیق با Light/Dark theme خودکار
کامپوننتهای مرتبط
- برای انتخاب استان بهعنوان فیلتر →
RegionPicker(هنوز پیاده نشده — در roadmap است). این کامپوننت صرفاً نمایشگر است. - اگر دادهی شما per-city یا per-county است →
PartoBarChartافقی یاDataTableبا ستون مقدار - اگر میخواهید بهعنوان heat-bar تکسطری در یک card نمایش دهید →
Sparklineبا variantbarsکوچکتر است - اگر میخواهید توزیع چند-دستهای روی provinces نشان دهید (مثلاً flow distribution per-province) →
DataTableبا ستونFlowCellبسازید