stats-split
fandhe-frontend-pre-styled-ui の badge / heading / text / stat / separator の 5 部品のみを合成した、見出しと数値指標の 2 列の合成例です。Blocks セクションは新規部品を追加するものではなく、既存の Themes/Primitives 部品を組み合わせた実例集であることに注意してください(主参照は対応表 ID R0337、集約元は対応表 ID R0339・R0708・R1306 の 3 件です。出典の固有名・ファイル名は記載しません)。
Demo は 2 インスタンスで構成しています。1 つ目(基準形)は md(768px)以上で左に badge(タグライン)+ heading + text の見出しブロック、右に stat を 2 列グリッドで 6 件並べ、各指標の下へ罫線を引きます。2 つ目(導入行 + 左罫線)は heading + text を横並びの導入行にし、separator(横罫線)を挟んでから stat を 4 件並べ、各指標の左側へ罫線を付けます。md 未満ではいずれも縦積みになります。
Demo
実績
数字で見る導入実績
架空のダミー指標です。導入企業数・稼働率・処理件数などの傾向をまとめて示す想定の Demo です。
- 導入企業数
- 1,240社
- 稼働率
- 99.9%
- 月間処理件数
- 3.6M件
- 平均応答時間
- 48ms
- 継続利用率
- 96%
- サポート満足度
- 4.8/5
プラットフォーム全体の状況
直近期間の架空サマリーです。
- アクティブ組織
- 820社
- 新規登録
- 154件/月
- 平均処理速度
- 1.2秒
- 障害件数
- 0件
使用部品
Rust コード
Rust
use fandhe_frontend_core::{div, text, Node};
use fandhe_frontend_pre_styled_ui::badge::{badge, BadgeProps};
use fandhe_frontend_pre_styled_ui::heading::{
heading, HeadingLevel, HeadingProps, HeadingSize, HeadingWeight,
};
use fandhe_frontend_pre_styled_ui::recipe::Size;
use fandhe_frontend_pre_styled_ui::separator::{self, SeparatorProps};
use fandhe_frontend_pre_styled_ui::stat;
use fandhe_frontend_pre_styled_ui::text::{self as styled_text, TextProps, TextVariant};
use fandhe_frontend_pre_styled_ui::Orientation;
/// 数値指標 1 件分(`stat::root` + `label`/`value_text`/`value_unit`)。
/// `bordered_attr` は罫線バリアント区別用の `data-*` 属性 1 件
/// (下罫線・左罫線のいずれかを [`LAYOUT_CSS`] のセレクタで切り替える)。
fn stat_item(label: &str, value: &str, unit: &str, bordered_attr: (&str, &str)) -> Node {
stat::root(
Size::Md,
vec![bordered_attr],
vec![
stat::label(vec![], vec![text(label)]),
stat::value_text(
vec![],
vec![text(value), stat::value_unit(vec![], vec![text(unit)])],
),
],
)
}
/// 基準形(R0337 主参照): 左に `badge`/`heading`/`text`、右に 2 列 6 指標
/// (下罫線)。
fn base_variant() -> Node {
let left = div(
vec![("class", "blocks-stats-split-left")],
vec![
badge(&BadgeProps::default(), vec![], vec![text("実績")]),
heading(
HeadingLevel::H3,
&HeadingProps {
size: HeadingSize::Xl2,
weight: HeadingWeight::Bold,
},
vec![],
vec![text("数字で見る導入実績")],
),
styled_text::text(
&TextProps {
variant: TextVariant::Muted,
..TextProps::default()
},
vec![],
vec![text(
"架空のダミー指標です。導入企業数・稼働率・処理件数などの傾向を\
まとめて示す想定の Demo です。",
)],
),
],
);
let items = [
("導入企業数", "1,240", "社"),
("稼働率", "99.9", "%"),
("月間処理件数", "3.6", "M件"),
("平均応答時間", "48", "ms"),
("継続利用率", "96", "%"),
("サポート満足度", "4.8", "/5"),
];
let grid = div(
vec![("class", "blocks-stats-split-grid")],
items
.iter()
.map(|(label, value, unit)| {
stat_item(
label,
value,
unit,
("data-blocks-stats-split-stat-bottom", ""),
)
})
.collect(),
);
div(
vec![
("data-blocks-stats-split-row", ""),
("data-blocks-stats-split-variant", "base"),
],
vec![left, grid],
)
}
/// 導入行 + 左罫線(R0339): `heading`/`text` の横並び導入行 + `separator`
/// + 4 指標(左罫線)。
fn intro_row_variant() -> Node {
let intro = div(
vec![("class", "blocks-stats-split-intro")],
vec![
heading(
HeadingLevel::H3,
&HeadingProps {
size: HeadingSize::Xl2,
weight: HeadingWeight::Bold,
},
vec![],
vec![text("プラットフォーム全体の状況")],
),
styled_text::text(
&TextProps {
variant: TextVariant::Muted,
..TextProps::default()
},
vec![],
vec![text("直近期間の架空サマリーです。")],
),
],
);
let items = [
("アクティブ組織", "820", "社"),
("新規登録", "154", "件/月"),
("平均処理速度", "1.2", "秒"),
("障害件数", "0", "件"),
];
let grid = div(
vec![("class", "blocks-stats-split-grid-intro")],
items
.iter()
.map(|(label, value, unit)| {
stat_item(
label,
value,
unit,
("data-blocks-stats-split-stat-left", ""),
)
})
.collect(),
);
div(
vec![
("class", "blocks-stats-split-intro-row"),
("data-blocks-stats-split-variant", "intro-row"),
],
vec![
intro,
separator::separator(
&SeparatorProps {
orientation: Orientation::Horizontal,
..SeparatorProps::default()
},
vec![],
),
grid,
],
)
}
/// `stats-split` の Demo 本体(基準形 + 導入行の 2 インスタンスを縦に
/// 並べる)。呼び出しごとに同一の `Node` を返す純関数。
pub fn demo() -> Node {
div(
vec![("class", "blocks-stats-split-layout")],
vec![base_variant(), intro_row_variant()],
)
}原案差分メモ
参照(主参照は対応表 ID R0337、集約元は対応表 ID R0339・R0708・R1306。出典の固有名・ファイル名は記載しません)から取り込んだのは構造(領域の配置と部品構成)のみであり、次の点を独自に設計・変更しています。
- 主参照(左見出し + 右に 2 列で 6 指標)を「基準形」として実装し、指標へ下罫線を添えました。これは集約元の 1 つ(2×2 の 4 指標へ罫線を添える構成)の考え方も併せて表現したものです(
sm未満では 1 列 6 段へ折り返るため、レイアウトは 2×2 と同一ではありませんが、罫線を添える見せ方は共有できます)。 - 集約元の 1 つ(横並びの導入行 + 左罫線 4 指標)は「導入行 + 左罫線」としてそのままインスタンス化しました。
- 集約元のもう 1 つ(左に本文 2 段落 + 右に 3 指標)は Demo にインスタンス化していません。基準形の左列(
badge/heading/text)をtext2 段落へ、右列のstat件数を 3 件へ差し替えるだけで同じ構造を再現できるため、Demo を 2 件に留める判断をしました。 - 数値・単位・見出し・説明文はすべて独自に書いた架空のものにしました(実企業名・実指標・PII は含みません)。
- レイアウトの切り替えを「1 列 →
md(768px)以上で左右 2 カラム / 横並び導入行」にし、導入行の指標グリッドのみsm(640px)以上で 2 列の中間段を挟むようにしました。 - 配色は
--fandhe-color-border等のトークンに従わせました。 <form>は出力せず、リンク・ボタンも持たない静的な表示にしました。