Yugen UI

Sparkline & StatTile

Đôi khi câu trả lời không phải biểu đồ: StatTile đưa con số lên trước, kèm delta và một sparkline xu hướng nhỏ.

Sparkline là đường xu hướng inline không trục — xám làm nền, điểm hiện tại tô màu nhấn. StatTile: nhãn, giá trị (chữ sans semibold, số tỉ lệ — không tabular), delta có dấu với icon + chữ (màu success/danger theo goodDirection) và sparkline tuỳ chọn. Mỗi màn hình chỉ một con số hero.
Yugen Labs · thử nghiệmComponent này nằm ngoài SemVer: API có thể đổi ở một bản minor, và thay đổi sẽ được ghi trong Có gì mới. Chính sách phiên bản
Doanh thu tháng
1,28 Tr US$
Tăng+12,4%so với tháng trước

Import

Cài từ npm, chép mã nguồn vào dự án bằng @yugen-ui/cli hoặc shadcn CLI, hoặc import thẳng khi làm việc trong repo này.

TSX
// npm install yugen-uiimport { Sparkline, StatTile } from "yugen-ui";

Biến thể

Mỗi ô là một mẫu độc lập: hover để Copy, hoặc bấm Code để xem mã nguồn.

Doanh thu tăng đều trong 12 tháng.

Sparkline trong câu

Inline, cao bằng dòng chữ; aria-label tự tóm tắt đầu, cuối, thấp nhất, cao nhất.

Biến thể

variant area; color chọn ô màu phân loại thay cho xám làm nền.

Tỉ lệ rời bỏ
3,1%
Giảm-0,8%so với tháng trước

Giảm là tốt

goodDirection="down": tỉ lệ rời bỏ giảm → màu success, luôn kèm icon và chữ.

Khách hàng đang hoạt động
128,5 N
Tăng+5,2%so với quý trước

Con số hero

size="extra-large" (68px, cùng font sans) cho con số duy nhất mà màn hình dẫn dắt.

Cách dùng

Nên
  • Dùng StatTile khi dữ liệu là một con số hiện tại (+ xu hướng) — thay cho biểu đồ một cột.
  • Ghi rõ kỳ so sánh của delta (“so với tháng trước”) và chọn goodDirection đúng ý nghĩa.
  • Giữ sparkline ~12 điểm, xám làm nền, chỉ điểm hiện tại tô màu nhấn.
Không nên
  • Không dùng màu làm tín hiệu duy nhất cho delta — luôn có icon và số có dấu.
  • Không đặt nhiều con số hero trên cùng một màn hình.
  • Không dùng tabular-nums cho con số lớn đứng riêng.

Props

Prop · KiểuMặc địnhMô tả
Sparkline.data(number | null)[]Mặc định: —null tạo khoảng trống.
Sparkline.width / heightnumber | "auto" / numberMặc định: 120 / 32"auto" = theo phần tử cha (đo bằng ResizeObserver); một số thì không đo gì.
Sparkline.variant"line" | "area"Mặc định: "line"Đường hoặc đường + vùng nhạt.
Sparkline.color"neutral" | 1–8Mặc định: "neutral"Xám làm nền hoặc ô màu phân loại.
Sparkline.highlightLast / labelsboolean / string[]Mặc định: trueChấm điểm cuối; nhãn cho tooltip.
StatTile.label / valueReactNode / number | stringMặc định: —Giá trị số tự rút gọn từ 10.000.
StatTile.delta / deltaFormat / deltaLabelnumber / format / ReactNodeMặc định: —Thay đổi có dấu (mặc định phần trăm).
StatTile.goodDirection"up" | "down" | "neutral"Mặc định: "up"Chiều nào là tốt.
StatTile.trend / trendLabels(number | null)[] / string[]Mặc định: —Sparkline bên cạnh giá trị.
StatTile.size"medium" | "large" | "extra-large"Mặc định: "medium"28 / 40 / 68px.

Messages

Chữ có sẵn của component: nhãn, aria-label, thông báo cho trình đọc màn hình.

Mặc định là tiếng Anh. Đổi qua prop messages của YugenProvider, theo namespace bên dưới; messagesVi chứa bản tiếng Việt. Xem Ngôn ngữ giao diện.

messages.chart

Khoá · KiểuMặc định (tiếng Anh)messagesVi
roleDescriptionstring

aria-roledescription của vùng vẽ.

Mặc định (tiếng Anh)"chart"messagesVi"biểu đồ"
heatmapRoleDescriptionstringMặc định (tiếng Anh)"heat map"messagesVi"bản đồ nhiệt"
dataTablestring

Nút bật chế độ bảng của ChartContainer.

Mặc định (tiếng Anh)"Data table"messagesVi"Bảng dữ liệu"
totalstring

Dòng tổng (tooltip, bảng) và nhãn giữa vòng DonutChart.

Mặc định (tiếng Anh)"Total"messagesVi"Tổng"
valuestringMặc định (tiếng Anh)"Value"messagesVi"Giá trị"
sharestringMặc định (tiếng Anh)"Share"messagesVi"Tỉ lệ"
noDatastringMặc định (tiếng Anh)"No data"messagesVi"Không có dữ liệu"
timestring

Tiêu đề cột đầu của bảng (khi không truyền indexLabel).

Mặc định (tiếng Anh)"Time"messagesVi"Thời gian"
categorystringMặc định (tiếng Anh)"Category"messagesVi"Danh mục"
groupstringMặc định (tiếng Anh)"Group"messagesVi"Nhóm"
namestringMặc định (tiếng Anh)"Name"messagesVi"Tên"
otherstring

Nhóm gộp (DonutChart vượt maxSlices, ScatterChart nhóm thứ 9+).

Mặc định (tiếng Anh)"Other"messagesVi"Khác"
trendstring

Nút bật đường xu hướng của ScatterChart.

Mặc định (tiếng Anh)"Trend"messagesVi"Xu hướng"
increasestringMặc định (tiếng Anh)"Increase"messagesVi"Tăng"
decreasestringMặc định (tiếng Anh)"Decrease"messagesVi"Giảm"
noChangestringMặc định (tiếng Anh)"No change"messagesVi"Không đổi"
brushstring

ChartBrush: tên cửa sổ thu phóng, dòng "Đang xem … · n/N mốc", nút đặt lại.

Mặc định (tiếng Anh)"Visible range"messagesVi"Vùng xem"
brushRoleDescriptionstringMặc định (tiếng Anh)"zoom window"messagesVi"cửa sổ thu phóng"
brushViewingstringMặc định (tiếng Anh)"Showing"messagesVi"Đang xem"
brushPoints(shown: number, total: number) => stringMặc định (tiếng Anh)(shown, total) => `${shown}/${total} ${total === 1 ? "point" : "points"}`messagesVi(shown, total) => `${shown}/${total} mốc`
brushResetstringMặc định (tiếng Anh)"Reset"messagesVi"Đặt lại"
lineSummary(info: { kind: "line" | "area" | "stacked" | "expand"; points: number; /** Mốc đầu / cuối (chỉ có khi points > 0). */ from?: string; to?: string; series: string[]; }) => string

Mô tả truy cập tự sinh (khi không truyền ariaLabel).

Mặc định (tiếng Anh)Hàm, xem messages.tsmessagesViHàm, xem messages.ts
barSummary(info: { horizontal: boolean; stacked: boolean; categories: number; series: string[] }) => stringMặc định (tiếng Anh)Hàm, xem messages.tsmessagesViHàm, xem messages.ts
donutSummary(info: { groups: number; total: string; largest?: { label: string; share: string } }) => stringMặc định (tiếng Anh)Hàm, xem messages.tsmessagesViHàm, xem messages.ts
scatterSummary(info: { points: number; x: string; y: string; /** Tên đại lượng kích thước (biểu đồ bong bóng). */ size?: string; /** Tên các nhóm (khi có nhiều nhóm). */ groups?: string[]; trends: { group?: string; slope: string; r2: string }[]; }) => stringMặc định (tiếng Anh)Hàm, xem messages.tsmessagesViHàm, xem messages.ts
heatmapSummary(info: { rows: number; columns: number; min?: string; max?: string; hasEmpty: boolean }) => stringMặc định (tiếng Anh)Hàm, xem messages.tsmessagesViHàm, xem messages.ts
sparklineSummary(info: { points: number; first: string; last: string; min: string; max: string }) => stringMặc định (tiếng Anh)Hàm, xem messages.tsmessagesVi({ points, first, last, min, max }) => `Xu hướng ${points} điểm: từ ${first} đến ${last}, thấp nhất ${min}, cao nhất ${max}`