@akhatmirzo/ui

Charts

Recharts asosidagi grafiklar: tayyor AreaChart, BarChart, LineChart, DonutChart, Sparkline va o'z grafigingiz uchun primitivlar.

  • Tushum
  • Xarajat

O'rnatish

Grafiklar alohida kirish nuqtasida — @akhatmirzo/ui/charts. Ular Recharts ustiga qurilgan, u esa ixtiyoriy peer bog'liqlik: grafik ishlatmasangiz, o'rnatish shart emas va asosiy @akhatmirzo/ui importi uni tortmaydi.

pnpm add recharts

Import

import { AreaChart, BarChart, LineChart, DonutChart, Sparkline } from '@akhatmirzo/ui/charts';

Qachon ishlatish

  • Vaqt bo'yicha o'zgarish — AreaChart yoki LineChart (oylik tushum, kunlik tashriflar).
  • Kategoriyalarni solishtirish — BarChart (viloyatlar, mahsulotlar). Nomlar uzun bo'lsa — orientation="horizontal".
  • Butunning qismlari — DonutChart, 5–6 bo'lakdan oshmasin; qolganini "Boshqalar"ga yig'ing.
  • Kichik trend — Sparkline KPI kartalar va jadval kataklarida.
  • Aniq qiymat muhim bo'lsa — grafik o'rniga yoki yonida jadval bering (pastda Accessibility).

Tayyor grafiklar

Hammasi bir xil props bilan ishlaydi: data — obyektlar ro'yxati, index — kategoriya maydoni (x o'qi), series — ko'rsatiladigan raqamli maydonlar. Ranglar faqat tokenlardan olinadi, shuning uchun dark rejimda o'zi moslashadi.

AreaChart

Yuqoridagi namuna. stacked — seriyalarni ustma-ust yig'adi, curve — monotone (standart), linear yoki step.

BarChart

stacked — bitta ustunga yig'ish, umumiy hajmni va tarkibni birga ko'rsatadi.

  • Onlayn
  • Do'kondan

orientation="horizontal" — yotiq chiziqlar: uzun nomlar va reytinglar uchun qulay. Prop nomi ko'rinishga qarab tanlangan (vertical — tik ustunlar) va ataylab Recharts'ning layout idan farqli: Recharts'da layout="vertical" aksincha yotiq chiziqlar chizadi.

LineChart

Bir nechta ko'rsatkichni solishtirish uchun. Bu yerda curve="linear".

  • Yangi
  • Qaytgan

DonutChart

index — bo'lak nomi, value — qiymat maydoni. Markazda centerLabel va jami (valueFormat bilan) ko'rinadi; centerValue bilan o'zgartiring yoki null bilan yashiring.

Jami, so'm7,2 mln
  • Oziq-ovqat
  • Transport
  • Kommunal
  • Ko'ngilochar
  • Boshqalar

Sparkline

O'qlar, to'r va tooltip'siz kichik chiziq. Qiymat yonida matn bilan berilgan bo'lsa — aria-hidden bilan bezak sifatida belgilang, aks holda aria-label bering.

Tushum

63 100 000 so'm

Qaytarishlar

38 ta

Formatlash

valueFormat — tooltip va qiymat o'qidagi ko'rinish (standart — formatNumber: 1 250 000), indexFormat — kategoriya o'qi va tooltip sarlavhasi. Pul uchun formatMoney ni ishlating; o'qda uzun qiymatlar joy egallasa, qisqa ko'rinish bering (42,5 mln so'm).

import { formatMoney } from '@akhatmirzo/core';

<BarChart valueFormat={(v) => formatMoney(v)} indexFormat={(d) => d.slice(0, 3)} … />

Holatlar

loading — grafik o'rnida Skeleton (aria-busy), ma'lumot bo'sh bo'lsa — EmptyState ("Ma'lumot yo'q"). O'z bo'sh holatingizni emptyState bilan bering, matnlarni — labels bilan.

Primitivlar: o'z grafigingiz

Tayyor grafik yetmasa (ikki o'qli, aralash, maxsus shakllar), Recharts'ning o'zi bilan yig'ing — kutubxona uslubini primitivlar beradi:

  • ChartContainer — responsiv o'rovchi: role="figure" + aria-label (majburiy), description, config → CSS o'zgaruvchilar (tushum → var(--chart-tushum)). Balandlik — height yoki className="h-72" (standart 280px).
  • ChartTooltip — <Tooltip content={<ChartTooltip format={formatMoney} />} />; nomlarni config dagi label dan oladi.
  • ChartLegend — <Legend content={<ChartLegend />} /> yoki grafikdan tashqarida payload bilan.
  • chartColors (5 ta seriya rangi), axisProps, gridProps, cursorProps, resolveChartColor.

Props

Tayyor grafiklar qolgan <div> atributlarini ildizga o'tkazadi (className, ref, id ...). aria-label yoki title dan biri majburiy — TypeScript talab qiladi.

Umumiy (AreaChart, BarChart, LineChart)

PropTipStandartTavsif
datamajburiyreadonly T[]—Ma'lumotlar
indexmajburiykeyof T—Kategoriya (x o'qi) maydoni
seriesmajburiy{ key: keyof T; label?: string; color?: ChartColor }[]—Seriyalar. Rang berilmasa — chartColors palitrasidan ketma-ket
aria-label / titlemajburiystring—Ekran o'quvchi uchun nom (biri yetarli)
descriptionReactNode—Qisqa xulosa (aria-describedby)
valueFormat(value: number) => stringformatNumberTooltip va qiymat o'qi
indexFormat(value: T[K]) => string—Kategoriya o'qi va tooltip sarlavhasi
heightnumber280Balandlik, px
legendbooleantrue
gridbooleantruePunktir to'r chiziqlari
tooltipbooleantrue
loadingbooleanfalseSkeleton ko'rsatadi
emptyStateReactNode—Bo'sh holat. Standart — EmptyState ("Ma'lumot yo'q")
labels{ empty?: string; loading?: string }{ empty: "Ma'lumot yo'q", loading: 'Yuklanmoqda' }

Qo'shimcha

PropTipStandartTavsif
stackedbooleanfalseAreaChart, BarChart — seriyalarni yig'ish
curve'monotone' | 'linear' | 'step''monotone'AreaChart, LineChart
orientation'vertical' | 'horizontal''vertical'BarChart: vertical — tik ustunlar, horizontal — yotiq chiziqlar

DonutChart

data, aria-label/title, description, valueFormat, indexFormat, height, legend, tooltip, loading, emptyState, labels — yuqoridagidek (series va grid yo'q).

PropTipStandartTavsif
indexmajburiykeyof T—Bo'lak nomi maydoni
valuemajburiykeyof T—Bo'lak qiymati maydoni
colorsChartColor[]—Ranglar ketma-ketligi. Standart — chartColors
centerLabelReactNode—Markazdagi izoh ("Jami")
centerValueReactNodevalueFormat(jami)Markazdagi qiymat; null — ko'rsatilmaydi

Sparkline

PropTipStandartTavsif
datamajburiyreadonly number[]—
aria-label / title / aria-hiddenmajburiystring | true—Nom yoki bezak belgisi
colorChartColor'primary'
variant'area' | 'line''area'
curve'monotone' | 'linear' | 'step''monotone'
heightnumber36Balandlik, px

ChartContainer

PropTipStandartTavsif
childrenmajburiyReactNode—Recharts grafigi
aria-label / titlemajburiystring—Ekran o'quvchi uchun nom
configRecord<string, { label?: ReactNode; color?: ChartColor }>—Kalit → var(--chart-<kalit>), label — tooltip va legend uchun
heightnumber | string—Standart — 280px (h-70)
descriptionReactNode—Qisqa xulosa (aria-describedby)

ChartColor — token nomi (primary, success, warning, danger, info, neutral, sky, emerald, amber, rose) yoki istalgan CSS qiymat (var(--ak-indigo-400)). Hex dark rejimga moslashmaydi — tokenlarni afzal ko'ring.

Data atributlari

Tayyor grafik ildizida: data-state (ready · loading · empty), data-loading.

Accessibility

  • Nom majburiy — har grafik role="figure" va aria-label (yoki title) oladi (img emas: ichidagi klaviatura qatlami interaktiv, img esa bolalarini yashiradi; Sparkline — img). Nomda nima ko'rsatilganini va davrni yozing: "Oylik tushum, yanvar–iyun".
  • Xulosa — asosiy xulosani description ga yozing ("Iyunda tushum 63 mln so'mga yetdi"), u aria-describedby orqali o'qiladi.
  • Klaviatura — Recharts accessibilityLayer yoqilgan: grafikka Tab bilan o'tib, ← → strelkalari bilan nuqtalar orasida yurasiz, tooltip ochiladi. Sparkline da tooltip yo'q, shuning uchun u fokus olmaydi.
  • Jadval ko'rinishini ham bering — grafik aniq qiymatni o'qishga mos emas. Muhim hisobotlarda "Grafik / Jadval" almashtirgichi yoki grafik ostida jadval qo'ying:
  • Rang yagona signal emas — legend va tooltip seriya nomini matn bilan ko'rsatadi.
  • Harakat — prefers-reduced-motion yoqilgan bo'lsa, Recharts kirish animatsiyasini o'chiradi.

Sahifada