Skip to content
fandhe-frontendcore v0.4.3
GitHub

error-page-centered

empty-state / heading / text / link の 4 部品を合成した、中央寄せの 404 ページです。上から順に「エラーコードの小ラベル → 大見出し → 説明文」を縦に積み、その下に「ホームへ戻るリンク」と「サポートへのテキストリンク」を横に並べます。狭い幅でも中央寄せを保ち、アクション列は折り返します。

文言はすべて架空のダミーです。<form> は使わず、ホームへ戻る導線はサイトホームへの相対パス("../../")、サポートへの導線は固定 URL(GitHub の Issues ページ)へ遷移する link::root(送信・状態変更は一切行わない静的な表示例)です。当初はホームへ戻る導線を button::button(href を持たない <button type="button">)としていましたが、押しても何も起きない dead control になっていたため、実際に遷移する link::root へ置き換えました(イシュー #2837 PR #3212 codex レビュー是正)。その遷移先も当初はリポジトリのトップページ(GitHub URL)のままで、表示文言「Back to home」に反してサイトを離れて GitHub へ遷移してしまう食い違いがあったため、error-page-background-image と同じ方式(サイトホームへの相対パス)へ是正しました(同 PR codex 再レビュー是正)。サポートへの導線も、表示文言「Contact support」に対し遷移先がリポジトリのトップページのままだった食い違いを、GitHub の Issues ページへ遷移先を変えることで是正しています。

主参照は対応表 ID R1103、集約元は R1103 と R0581 です。

Demo

404

We couldn't find that page

The page you're looking for may have been moved or no longer exists.

使用部品

Rust コード

Rust
const ISSUES: &str = "https://github.com/Fandhe-AI/fandhe-frontend/issues";

use fandhe_frontend_core::{div, span, text, Node};
use fandhe_frontend_pre_styled_ui::empty_state::{self, EmptyStateProps};
use fandhe_frontend_pre_styled_ui::heading::{heading, HeadingLevel, HeadingProps, HeadingSize};
use fandhe_frontend_pre_styled_ui::link::{self, LinkProps, LinkVariant};
use fandhe_frontend_pre_styled_ui::text::{
    self as styled_text, TextProps, TextVariant, TextWeight,
};

/// `error-page-centered` の Demo 本体(エラーコードの小ラベル → 大見出し →
/// 説明文 → ホームへ戻るリンク + サポートへのリンクの 2 アクション)。
/// 呼び出しごとに同一の `Node` を返す純関数。
pub fn demo() -> Node {
    let actions = empty_state::actions(
        vec![("class", "blocks-error-page-centered-actions")],
        vec![
            link::root(
                "../../",
                &LinkProps::default(),
                vec![("data-blocks-error-page-centered-home", "")],
                vec![text("Back to home")],
            ),
            link::root(
                ISSUES,
                &LinkProps {
                    variant: LinkVariant::Underline,
                    ..LinkProps::default()
                },
                vec![("data-blocks-error-page-centered-support", "")],
                vec![
                    text("Contact support"),
                    span(vec![("aria-hidden", "true")], vec![text(" →")]),
                ],
            ),
        ],
    );

    let content = empty_state::content(
        vec![("class", "blocks-error-page-centered-content")],
        vec![
            styled_text::text(
                &TextProps {
                    weight: TextWeight::Semibold,
                    ..TextProps::default()
                },
                vec![("data-blocks-error-page-centered-code", "")],
                vec![text("404")],
            ),
            empty_state::title(
                vec![],
                vec![heading(
                    HeadingLevel::H3,
                    &HeadingProps {
                        size: HeadingSize::Xl3,
                        ..HeadingProps::default()
                    },
                    vec![("data-blocks-error-page-centered-title", "")],
                    vec![text("We couldn't find that page")],
                )],
            ),
            empty_state::description(
                vec![],
                vec![styled_text::text(
                    &TextProps {
                        variant: TextVariant::Muted,
                        ..TextProps::default()
                    },
                    vec![("data-blocks-error-page-centered-description", "")],
                    vec![text(
                        "The page you're looking for may have been moved or no longer exists.",
                    )],
                )],
            ),
            actions,
        ],
    );

    div(
        vec![("class", "blocks-error-page-centered-root")],
        vec![empty_state::root(
            &EmptyStateProps::default(),
            vec![("data-blocks-error-page-centered-message", "")],
            vec![content],
        )],
    )
}

原案差分メモ

主参照(対応表 ID R1103)は、小ラベル・見出し・説明の各パートに、主アクション(ボタン)+ 矢印付きのサポートリンクの 2 アクションを並べる構成です。集約元 R0581 は同じ小ラベル・見出し・説明の構成に CTA ボタン 1 個だけを置く最小形(actions からリンクを外せば同じ形になる、R1103 の部分集合)です。

  • 参照元の全画面高さの表示は、Demo 枠内の min-height(22rem)へ変えました。
  • 参照元の主アクションはリンクであり、ホームへ戻る主アクション・サポートへの導線ともに link::root にしました(当初は部品指定〔button / link〕に従いホームへ戻る主アクションを button::button にしていましたが、遷移しない dead control になるため codex レビュー是正〔イシュー #2837 PR #3212〕で link::root へ変更しました)。
  • インジケータ(大型装飾グリフ)に相当するスロットは持たせず、「小ラベル → 見出し → 説明文」のみで構成しました(要件に無いため)。
  • 文言はすべて独自の英語ダミーへ書き直しました。
  • 配色・余白は本リポジトリの既存トークン(--fandhe-*)に従わせました。