Chart
نمودار روی Apache ECharts ساخته شده، نه Recharts؛ چون Bar/Line/Pie ساده کافی نبود و candlestick، gauge، heatmap و دیتای بزرگ (که در داشبورد بانکی/عملیاتی معمولاند) به موتور canvas قدرتمندتری نیاز داشت. ChartContainer یک آبجکت option استاندارد ECharts میگیرد و رنگهای config را (که var(--chart-N) هستند) در زمان اجرا به مقدار واقعی تبدیل میکند، چون رندر روی canvas است و var() آنجا خوانده نمیشود.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/chart.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/chart.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/chart.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/chart.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import {
ChartContainer,
ChartLegendContent,
useChartTooltipFormatter,
type ChartConfig,
} from "@/components/ui/chart"
const chartConfig: ChartConfig = {
transactions: { label: "تراکنش", color: "var(--chart-1)" },
}
<ChartContainer config={chartConfig} option={option} className="h-72" />این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
دسترسپذیری
- خودِ canvas نمودار برای صفحهخوان قابل تفسیر نیست؛ اگر داده برای کاربر صفحهخوان مهم است، همان داده را در یک جدول یا خلاصهٔ متنی کنار نمودار هم بگذارید.
- رنگ بهتنهایی حامل معنا نباشد؛ ChartLegendContent برچسب متنی کنار هر رنگ میگذارد تا کاربر کمبینای رنگ هم بتواند سریها را تشخیص بدهد.
- برای کنتراست کافی بین سریها، از همان توکنهای --chart-1 تا --chart-5 استفاده کنید؛ اینها در هر دو تم روشن و تاریک تست شدهاند.
- بومِ نمودار (محورها، اعداد) عمداً LTR میماند چون خواندن نمودار در بازارهای فارسیزبان هم قرارداد جهانی چپبهراست را دنبال میکند؛ فقط برچسبها، تولتیپ و لجند RTL و فارسیاند.
مرجع API
ChartContainer
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| config | ChartConfig | — | نگاشت کلید سری به label و color؛ color میتواند var(--token) یا هر رنگ CSS معتبر باشد. |
| option | EChartsOption | — | آبجکت استاندارد ECharts (همانطور که در مستندات خودش مینویسید). |
| className | string | "h-64 w-full" | اندازهٔ ظرف نمودار؛ ارتفاع را همیشه صریح بدهید. |
useChartTooltipFormatter(formatValue?)
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| formatValue | (value: string | number) => ReactNode | toFaDigits | قالببندی مقدار عددی هر ردیف تولتیپ؛ پیشفرض ارقام فارسی میدهد. |
ChartLegendContent
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| className | string | — | برای چیدمان لجند (مثلاً ستون بهجای ردیف). |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
Line
روند یک سری زمانی با ناحیهٔ رنگی زیر خط.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Donut
توزیع پرتفوی؛ لجند React جدا از نمودار رندر میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Candlestick
نمودار شمعی برای قیمت سهم؛ همان چیزی که در Recharts بومی وجود ندارد ولی دلیل اصلی انتخاب ECharts برای دیگ بود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
خالی (Empty)
نمودار با محورهای خالی گیجکننده است. نمودارِ کمرنگِ نمونه را زیرِ پیام نگه دارید تا کاربر شکل نهایی را حدس بزند و بداند اینجا چه چیزی قرار است بیاید.
هنوز دادهای برای این بازه نیست
با ثبت اولین رویداد، نمودار همینجا ساخته میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت (Loading)
جای خالیِ هماندازه با نمودار نهایی بگذارید، نه اسپینر وسط صفحه؛ با رسیدن داده، ارتفاع بخش نباید بپرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| Line | روند یک سری زمانی با ناحیهٔ رنگی زیر خط. |
| Donut | توزیع پرتفوی؛ لجند React جدا از نمودار رندر میشود. |
| Candlestick | نمودار شمعی برای قیمت سهم؛ همان چیزی که در Recharts بومی وجود ندارد ولی دلیل اصلی انتخاب ECharts برای دیگ بود. |
| خالی (Empty) | بازهای که هنوز دادهای در آن ثبت نشده |
| در حال دریافت (Loading) | نموداری که دادهاش با تاخیر از سرور میآید |
دستورالعمل استفاده
رنگ سری را از config بگیر، نه هاردکد
انجام بده
با گذاشتن color روی config و اسم سری برابر همان کلید، رنگ خودکار تزریق میشود و با تغییر تم (روشن/تاریک) خودش را وفق میدهد.
انجام نده
itemStyle.color هاردکد (مثل یک کد هگز ثابت) در تم تاریک همانقدر تیره میماند و ممکن است روی پسزمینهٔ تیره کنتراست کافی نداشته باشد.