How To Useブロック
HowToUse は、MUI 上に構築されたマーケティング用ステップセクションで、中央揃えのヘッダー、矢印でつながれたステップカードの行、フッターのコールトゥアクションリンクボタンを備えています。
インストール
- npm
- yarn
- pnpm
- bun
npm install @nodeblocks/frontend-how-to-use-block
yarn add @nodeblocks/frontend-how-to-use-block
pnpm add @nodeblocks/frontend-how-to-use-block
bun add @nodeblocks/frontend-how-to-use-block
必要なもの
| 項目 | 用途 |
|---|---|
subtitle | 大きな見出し |
headerContent | 見出し上の補助ラベル |
cardList | ステップカードのコンテンツ |
message | CTA 上の任意のフッター行 |
linkHref | フッターの contained ボタンの href |
linkContent | フッターボタンのラベル |
ヘッダーのコピー、ステップカード、CTA テキストをページまたは CMS から渡してください。各カードには MUI の icon、headerContent、本文(children)が必要です。カードはルートの cardList で渡すか、HowToUse.CardList の子として直接構成できます。
コード例
- クイックスタート
- 複合コンポーネント
- ブロックのオーバーライド
function Example() { const cardList = [ <HowToUse.Card key="apply" icon={EditOutlined} headerContent="申し込み"> アカウントを作成し、スキルと経験を入力してください。 </HowToUse.Card>, <HowToUse.Card key="account" icon={AccountBoxOutlined} headerContent="プロフィールを設定"> 職歴、ポートフォリオリンク、希望条件を追加してください。 </HowToUse.Card>, <HowToUse.Card key="post" icon={AddToQueue} headerContent="マッチングを開始"> 求人を閲覧し、目標に合うポジションに応募してください。 </HowToUse.Card>, ]; return ( <HowToUse subtitle="仕組み" headerContent="ステップ" message="数分で始められます" linkHref="#sign-up" linkContent="無料アカウントを作成" cardList={cardList} /> ); }
HowToUse.Header、HowToUse.CardList、HowToUse.Card、HowToUse.Footer を直接構成し、各ブロックを sx でスタイルします。
function Example() { return ( <HowToUse subtitle="仕組み" headerContent="ステップ" message="数分で始められます" linkHref="#sign-up" linkContent="無料アカウントを作成" sx={{ maxWidth: 960, mx: 'auto', px: 2 }} > <HowToUse.Header sx={{ px: 2, py: 2, borderRadius: 2, bgcolor: 'grey.50', }} /> <HowToUse.CardList sx={{ '& .nbb-how-to-use-card': { border: '1px solid', borderColor: 'divider', bgcolor: 'background.paper', }, }} > <HowToUse.Card icon={EditOutlined} headerContent="申し込み"> アカウントを作成し、スキルと経験を入力してください。 </HowToUse.Card> <HowToUse.Card icon={AccountBoxOutlined} headerContent="プロフィールを設定"> 職歴、ポートフォリオリンク、希望条件を追加してください。 </HowToUse.Card> <HowToUse.Card icon={AddToQueue} headerContent="マッチングを開始"> 求人を閲覧し、目標に合うポジションに応募してください。 </HowToUse.Card> </HowToUse.CardList> <HowToUse.Footer sx={{ '& .MuiButton-root': { borderRadius: 99, px: 5 }, }} /> </HowToUse> ); }
defaultBlocks と defaultBlockOrder を使う関数の children で、ブロックの注入、デフォルトの差し替え、順序の制御を行います。
function Example() { const cardList = [ <HowToUse.Card key="apply" icon={EditOutlined} headerContent="申し込み"> アカウントを作成し、スキルと経験を入力してください。 </HowToUse.Card>, <HowToUse.Card key="account" icon={AccountBoxOutlined} headerContent="プロフィールを設定"> 職歴、ポートフォリオリンク、希望条件を追加してください。 </HowToUse.Card>, <HowToUse.Card key="post" icon={AddToQueue} headerContent="マッチングを開始"> 求人を閲覧し、目標に合うポジションに応募してください。 </HowToUse.Card>, ]; return ( <HowToUse subtitle="仕組み" headerContent="ステップ" message="数分で始められます" linkHref="#sign-up" linkContent="無料アカウントを作成" cardList={cardList} sx={{ maxWidth: 960, mx: 'auto', px: 2 }} > {({ defaultBlocks, defaultBlockOrder }) => ({ blocks: { ...defaultBlocks, promo: ( <Alert severity="info" sx={{ textAlign: 'center' }}> 新規チームは追加費用なしでガイド付きオンボーディングを利用できます。 </Alert> ), cardList: ( <HowToUse.CardList sx={{ p: 2, borderRadius: 2, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider', }} /> ), }, blockOrder: ['header', 'promo', 'cardList', 'footer'], })} </HowToUse> ); }
ブロックのオーバーライドを使うタイミング
デフォルトの defaultBlockOrder は header、cardList、card、footer です。ルートのレンダリングでは header、cardList、footer をこの順でマッピングします(card は型のデフォルトに使われますが、ルートではレンダリングされません)。バナー(例: promo)の前置や、ルートに cardList を保持したままカスタムステップレイアウトが必要な場合は cardList を差し替えてください。
主要プロパティ
コアプロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
subtitle | ReactNode | はい | — | HowToUse.Header の大きな見出し(h1、レスポンシブで最大 45px) |
headerContent | ReactNode | はい | — | HowToUse.Header の補助ラベル(primary.main、レスポンシブ h6/h4) |
message | ReactNode | はい | — | HowToUse.Footer の CTA 上のフッター行( falsy のときは非表示) |
linkHref | string | はい | — | フッターの contained ボタンの href |
linkContent | ReactNode | はい | — | フッターボタンのラベル |
cardList | ReactNode[] | いいえ | undefined | CardList に子がない場合、HowToUse.CardList でレンダリングされるステップカード |
レイアウトと構成プロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
children | ReactNode | function | いいえ | undefined | 複合サブコンポーネント(HowToUse.Header、HowToUse.CardList、HowToUse.Card、HowToUse.Footer)、またはレイアウトブロックの注入・並べ替え用の関数 ({ defaultBlocks, defaultBlockOrder }) => ({ blocks, blockOrder }) |
className | string | いいえ | undefined | ルートスタックのクラス名(nbb-how-to-use) |
sx | SxProps | いいえ | undefined | ルートスタック用の MUI システムスタイル |
spacing | StackProps['spacing'] | いいえ | { xs: 5, sm: 6 } | ルートスタックの垂直方向の間隔 |
HowToUse は StackProps(children を除く)を継承します。デフォルトの defaultBlockOrder: header、cardList、card、footer。
サブコンポーネントのプロパティ
サブコンポーネントはコンテキストから読み取り、同じコンテンツキーをプロパティとして渡すとローカルで上書きできます。
| サブコンポーネント | 主要プロパティ | 継承 | ベース |
|---|---|---|---|
HowToUse.Header | subtitle、headerContent、children、className、sx | StackProps | Stack + Typography |
HowToUse.CardList | cardList、children、className、sx | StackProps | Stack + カード間の ArrowRight / ArrowDropDown |
HowToUse.Card | icon、headerContent、children、className、sx | CardProps | Card + Typography |
HowToUse.Footer | message、linkHref、linkContent、children、className、sx | StackProps | Stack + Button(variant="contained"、size="large") |
デフォルト UI ブロック
| ブロック | ベース | 備考 |
|---|---|---|
HowToUse(ルート) | Stack | 縦レイアウト(nbb-how-to-use) |
header(HowToUse.Header) | Stack + Typography | 中央揃えの headerContent と subtitle 見出し |
cardList(HowToUse.CardList) | Stack + 矢印アイコン | xs では縦、sm+ では横。小画面ではカード間に ArrowDropDown、大画面では ArrowRight |
card(HowToUse.Card) | Card + Typography | article カード。アイコン、headerContent、本文(nbb-how-to-use-card) |
footer(HowToUse.Footer) | Stack + Button | 任意の message 行と linkHref / linkContent 付き contained CTA(nbb-how-to-use-footer) |
デフォルトのルートレンダリング順序: header → cardList → footer。
TypeScript
import * as React from 'react';
import type { SvgIconComponent } from '@mui/icons-material';
import { HowToUse } from '@nodeblocks/frontend-how-to-use-block';
import type { ReactNode } from 'react';
type HowToUseStep = {
key: string;
icon: SvgIconComponent;
headerContent: ReactNode;
body: ReactNode;
};
type HowToUseSectionProps = {
subtitle: ReactNode;
headerContent: ReactNode;
message: ReactNode;
linkHref: string;
linkContent: ReactNode;
steps: HowToUseStep[];
};
export function HowToUseSection({
subtitle,
headerContent,
message,
linkHref,
linkContent,
steps,
}: HowToUseSectionProps) {
const cardList = steps.map(({ key, icon, headerContent: title, body }) => (
<HowToUse.Card key={key} icon={icon} headerContent={title}>
{body}
</HowToUse.Card>
));
return (
<HowToUse
subtitle={subtitle}
headerContent={headerContent}
message={message}
linkHref={linkHref}
linkContent={linkContent}
cardList={cardList}
/>
);
}