Skip to content
fandhe-frontendcore v0.4.3
GitHub

pricing-upgrade-card

fandhe-frontend-pre-styled-ui の card / heading / text / list / icon / button / link の 7 部品を合成した、上位プランへのアップグレードを促す単一カードです。Blocks セクションは新規部品を追加するものではなく、既存の Themes/Primitives 部品を組み合わせた実例集であることに注意してください(主参照は対応表 ID R0199、集約元はありません。出典の固有名・ファイル名は記載しません)。

カードは中央に 1 枚だけ配置し、上部の帯に円形の装飾アイコンを下端へ半分重ね、その下へ見出し・リード文・機能リスト・価格・CTA ボタン・サポートへのリンクを縦に積みます。狭い幅ではカード幅が画面に合わせて縮むだけで、構成(縦積みの順序)は変わりません。

本 Demo は静的な表示例であり、<form> 要素は一切持たず、データの取得・送信・状態管理を行いません。CTA ボタンは type="button" のまま送信先を持ちません。文言はすべて独自に書いた架空のものであり、実企業名・実クレデンシャル・PII を含みません。

Demo

プロプランにアップグレード

チームの成長に合わせて、より多くの機能とサポートを利用できます。

  • 無制限のプロジェクト

  • 優先サポート対応

  • 高度な権限管理

  • 利用状況の詳細分析

  • カスタムドメイン接続

¥2,400 / 月

税込・いつでも解約できます。

サポートに相談する

使用部品

Rust コード

Rust
use fandhe_frontend_core::{div, el, text, Node};
use fandhe_frontend_pre_styled_ui::button::{self, ButtonProps};
use fandhe_frontend_pre_styled_ui::card::{self, CardProps, CardVariant};
use fandhe_frontend_pre_styled_ui::heading::{heading, HeadingLevel, HeadingProps, HeadingSize};
use fandhe_frontend_pre_styled_ui::icon::{icon, IconProps};
use fandhe_frontend_pre_styled_ui::link::{self, LinkProps, LinkVariant};
use fandhe_frontend_pre_styled_ui::list::{self, ListType, ListVariant};
use fandhe_frontend_pre_styled_ui::text::{self as styled_text, TextProps, TextSize, TextVariant};
use fandhe_frontend_pre_styled_ui::Size;

/// サポートへのリンク先(サイト内実在ページへの相対パス。`linkcheck` の
/// 検証対象になる、モジュール doc「サポートリンク」節)。
const SUPPORT_HREF: &str = "../../guides/";

/// 含まれる機能の一覧(架空の文言、実在の企業名・個人情報は含まない)。
const FEATURES: [&str; 5] = [
    "無制限のプロジェクト",
    "優先サポート対応",
    "高度な権限管理",
    "利用状況の詳細分析",
    "カスタムドメイン接続",
];

/// 帯下端の円形バッジ内に置く装飾用の上向き矢印(自作の単純な幾何パス。
/// 意味を持たないため `label` は `None`〔既定〕のまま。参照元のアイコン
/// 形状・内部識別子は持ち込まない)。
fn upgrade_icon() -> Node {
    icon(
        &IconProps {
            size: Size::Md,
            ..IconProps::default()
        },
        vec![],
        vec![el(
            "path",
            vec![
                ("d", "M12 19V5M12 5l-6 6M12 5l6 6"),
                ("fill", "none"),
                ("stroke", "currentColor"),
                ("stroke-width", "2"),
                ("stroke-linecap", "round"),
                ("stroke-linejoin", "round"),
            ],
            vec![],
        )],
    )
}

/// 含まれる機能の装飾用チェック図形(意味を持たないため `label` は
/// `None`〔既定〕のまま)。
fn check_icon() -> Node {
    icon(
        &IconProps {
            size: Size::Sm,
            ..IconProps::default()
        },
        vec![],
        vec![el(
            "path",
            vec![
                ("d", "M5 12.5l4 4L19 7"),
                ("fill", "none"),
                ("stroke", "currentColor"),
                ("stroke-width", "2"),
                ("stroke-linecap", "round"),
                ("stroke-linejoin", "round"),
            ],
            vec![],
        )],
    )
}

/// 機能一覧 1 行分(`list::item`)。
fn feature_item(label: &'static str) -> Node {
    list::item(
        vec![],
        vec![
            list::indicator(vec![], vec![check_icon()]),
            styled_text::text(&TextProps::default(), vec![], vec![text(label)]),
        ],
    )
}

/// 上部の帯。下端へ円形の装飾バッジ([`upgrade_icon`])を半分重ねる
/// (配置は [`LAYOUT_CSS`] 側、モジュール doc「レイアウト」節)。
fn band() -> Node {
    div(
        vec![("class", "blocks-pricing-upgrade-card-band")],
        vec![div(
            vec![("class", "blocks-pricing-upgrade-card-badge")],
            vec![upgrade_icon()],
        )],
    )
}

/// カード本体(タイトル・リード文・機能リスト・価格・CTA・サポートリンク
/// を縦に積む、モジュール doc「レイアウト」節)。
fn body() -> Node {
    card::body(
        vec![],
        vec![
            heading(
                HeadingLevel::H3,
                &HeadingProps {
                    size: HeadingSize::Xl2,
                    ..HeadingProps::default()
                },
                vec![],
                vec![text("プロプランにアップグレード")],
            ),
            styled_text::text(
                &TextProps {
                    variant: TextVariant::Muted,
                    ..TextProps::default()
                },
                vec![],
                vec![text(
                    "チームの成長に合わせて、より多くの機能とサポートを利用できます。",
                )],
            ),
            list::root(
                ListType::Unordered,
                ListVariant::Plain,
                vec![("data-blocks-pricing-upgrade-card-features", "")],
                FEATURES.iter().copied().map(feature_item).collect(),
            ),
            div(
                vec![("class", "blocks-pricing-upgrade-card-price")],
                vec![
                    styled_text::text(
                        &TextProps {
                            size: TextSize::Xl2,
                            ..TextProps::default()
                        },
                        vec![],
                        vec![text("¥2,400 / 月")],
                    ),
                    styled_text::text(
                        &TextProps {
                            size: TextSize::Sm,
                            variant: TextVariant::Muted,
                            ..TextProps::default()
                        },
                        vec![],
                        vec![text("税込・いつでも解約できます。")],
                    ),
                ],
            ),
            button::button(
                &ButtonProps::default(),
                vec![("data-blocks-pricing-upgrade-card-cta", "")],
                vec![text("アップグレードする")],
            ),
            link::root(
                SUPPORT_HREF,
                &LinkProps {
                    variant: LinkVariant::Underline,
                    ..LinkProps::default()
                },
                vec![("data-blocks-pricing-upgrade-card-support", "")],
                vec![text("サポートに相談する")],
            ),
        ],
    )
}

/// `pricing-upgrade-card` の Demo 本体。呼び出しごとに同一の `Node` を
/// 返す純関数。中央に 1 枚だけカードを置く。
pub fn demo() -> Node {
    div(
        vec![("class", "blocks-pricing-upgrade-card-layout")],
        vec![card::root(
            CardProps {
                variant: CardVariant::Elevated,
                ..CardProps::default()
            },
            vec![("data-blocks-pricing-upgrade-card-card", "")],
            vec![band(), body()],
        )],
    )
}

原案差分メモ

  • 主参照(対応表 ID R0199)は円形の装飾アイコンを帯に重ねた単一カード構成で、集約元はありません。
  • 帯(円形バッジ)・文言・アイコン形状はすべて独自に書き直しました。文言は実在の企業名・個人情報を含まない架空のものです。
  • 装飾用の上向き矢印アイコンは自作の単純な幾何パスで、参照元のアイコン形状・内部識別子は持ち込んでいません。
  • 狭い幅ではカード幅(max-inline-size)を画面幅に合わせるだけで、構成自体は変えません(ブレークポイントを持ちません)。
  • サポートへのリンクはサイト内の実在ページ(Guides セクション)を指します。
  • 配色・角丸・余白は既存のテーマトークンに従っています。

関連情報: Card / Heading / Text / List / Icon / Button / Link