ミニ分布バーカードMiniDistributionBarCardExperimental
カテゴリ構成や利用率を、密集したティックバーでコンパクトに示すカードです。
プレビュー
状態とバリエーション
標準表示
商品カテゴリの分布を標準カードで示します。
商品カテゴリ
ミニ分布
+3.2%
58%
アクセサリ · 58%
選択中セグメント
確認中のセグメントを強調します。
商品カテゴリ
26%
デバイス · 26%
コンパクト
密度の高いダッシュボード向けの登録済みバリエーションです。
商品カテゴリ
ティック多め
より細かいティック分割を確認します。
商品カテゴリ
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| segments | MiniDistributionBarCardSegment[] | - | ティックと概要行で表示する分布セグメントです。 |
| variant | "default" | "compact" | "default" | カード密度を切り替える SSOT 登録済みバリエーションです。 |
| tickCount | number | 32 | 分布を表現するコンパクトなティック数です。 |
| formatValue | (value: number) => ReactNode | - | ツールチップと凡例行に表示するセグメント値を整形します。 関数propのため Client Component からのみ渡すこと(Server Component から渡すと next build が落ちる)。RSC 安全な整形には valueFormat を使う。 |
| valueFormat | "number" | "compact" | "integer" | Intl.NumberFormatOptions | - | シリアライズ可能な数値フォーマット=formatValue の RSC 安全な代替。formatValue 指定時は無視。en-US ロケール固定。(#338) |
使い方
import { MiniDistributionBarCard } from "@gunjo/ui";
const segments = [
{ label: "アクセサリ", value: 58, detail: "45 件" },
{ label: "デバイス", value: 26, detail: "53 件" },
{ label: "サービス", value: 16, detail: "61 件" },
];
export function ProductCategoryDistributionVariants() {
return (
<div className="grid gap-6">
<MiniDistributionBarCard segments={segments} value="58%" />
<MiniDistributionBarCard segments={segments} selectedIndex={1} />
<MiniDistributionBarCard segments={segments} variant="compact" />
</div>
);
}設計の判断
- 帯を32個の目盛りに割った。1本の連続した帯ではなく、既定で32個(
tickCount)の四角に分け、各区分の取り分だけ色を塗ります。割り当ては端数の大きい区分から1つずつ足す形なので、塗った数の合計は必ずtickCountに一致します。1%未満の区分が消えてしまわないための形です。 - 目盛りの1つずつが押せるボタンになっている。それぞれに「区分名: NN%」という読み上げ名を付け、下の一覧の行と同じ
onSegmentSelectを呼びます。資料の「カードのアクションは最大2つ」に対して、GUNJO はここを「複数のアクション」ではなく「同じ1つの選択に対する複数の入口」と見なしました。カードの外枠は押せません。 - 分母はデータから作り、
maxで上書きできる。既定の分母は区分の合計です。分母を固定したい(未回答のぶんを空けておきたい)ときだけmaxを渡します。負の値と数値でない値は0として扱い、帯が壊れないようにしています。
一般のカードの設計は UIXHERO の「カード」にあります。
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。