セグメントゲージカードSegmentedGaugeCardExperimental
支出、進捗、リスクなどを複数セグメントの半円ゲージで示すカードです。
プレビュー
状態とバリエーション
標準表示
標準のセグメントゲージカードです。
支出内訳
82%Total
選択セグメント
確認中の範囲セグメントを強調します。
支出内訳
82%Total
凡例なし
親ビュー側で詳細を持つ場合は凡例行を隠せます。
支出内訳
82%Total
コンパクト
小さなカード向けの密度です。
支出内訳
82%Total
プロパティ
表は横にスクロールできます
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| segments | SegmentedGaugeCardSegment[] | - | 半円アークに表示するゲージセグメントです。 |
| value / valueLabel | number / ReactNode | - | 現在値とゲージ中央に表示するラベルです。 |
| centerLabel | ReactNode | - | 中央値の下に表示するラベルです。 |
| delta / deltaDescription | ReactNode | - | カードヘッダーに表示する補助指標と説明です。 |
| targetValue / targetLabel | number / ReactNode | - | 任意の目標マーカーとツールチップ用ラベルです。 |
| selectedIndex | number | - | 確認中のセグメントを強調します。 |
| max | number | - | セグメントと目標値の正規化に使う最大値です。 |
| showLegend | boolean | true | ゲージ下にセグメント凡例を表示します。 |
| 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 { SegmentedGaugeCard } from "@gunjo/ui";
const segments = [
{ label: "基礎費", value: 35, rangeLabel: "固定費" },
{ label: "成長投資", value: 45, rangeLabel: "追加投資" },
{ label: "運用費", value: 20, rangeLabel: "運用余力" },
];
export function SpendBreakdownGaugeVariants() {
return (
<div className="grid gap-6">
<SegmentedGaugeCard
segments={segments}
value={82}
targetValue={90}
max={100}
/>
<SegmentedGaugeCard segments={segments} selectedIndex={1} />
<SegmentedGaugeCard
segments={segments}
variant="compact"
showLegend={false}
/>
</div>
);
}設計の判断
- 半円のメーターも
conic-gradientで描いた。SVG は使わず、from 270degの円錐グラデーションを「1%=1.8度」で回して半円を作ります。区分ごとに色を指定でき、太さはthicknessで変えられます。 - 目標値は針ではなく、独立した目印として置いた。
targetValueを渡すと、現在値とは別の印が同じ弧の上に出ます。針を1本にして「いまの値か目標値か」を色だけで分けると、色を見分けられない人に届かなくなるためです。 - 弧は1枚の絵で、選ぶのは凡例の行。弧には
role="img"と読み上げ用の名前が付き、押せるのは下の凡例(button)です。弧の一片は端に行くほど細くなり、タップの的として使えないためです。
一般のカードの設計は UIXHERO の「カード」にあります。
使用コンポーネント
関連コンポーネント
いつ・なぜ使うか(UIXHERO)
「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。