フッターブロック
Footer は、MUI Stack をベースにしたサイトフッターで、デフォルトでは <footer> としてレンダリングされ、ロゴ、コンテンツ、著作権の各領域をプライマリーカラーのバー上に表示します。
インストール
- npm
- yarn
- pnpm
- bun
npm install @nodeblocks/frontend-footer-block
yarn add @nodeblocks/frontend-footer-block
pnpm add @nodeblocks/frontend-footer-block
bun add @nodeblocks/frontend-footer-block
必要なもの
| 項目 | 理由 |
|---|---|
logoSrc | Footer.Logo 用の画像 URL |
content | フッターのメイン本文(リンク、テキスト、カスタム JSX など) |
copyright | 著作権表示または法的表記(ReactNode。例: <>© 2024 …</>) |
Footer に logoSrc、content、copyright を渡すと、デフォルトのブロック(Footer.Logo、Footer.Content、Footer.Copyright)を描画します。compound children を使うとブロックのマークアップを置き換えられます(Footer.Content と Footer.Copyright の children は対応するルート props より優先されます)。function child で blocks と blockOrder を使えば、セクションの追加や順序変更ができます。
コード例
- クイックスタート
- リンクとレイアウト
- コンパウンドコンポーネント
- ブロックのオーバーライド
function Example() { const footerLinks = ( <div style={{display: 'flex', flexDirection: 'column', gap: 8}}> <a href="#about" style={{color: 'inherit'}}> About Us </a> <a href="#contact" style={{color: 'inherit'}}> Contact Us </a> </div> ); return ( <Footer logoSrc="https://docs.nodeblocks.dev/img/icon-small.png" content={footerLinks} copyright={<>© 2024 Nodeblocks.</>} /> ); }
リンクグループ、著作権表記、ルートの余白(sx)をカスタマイズします。アプリがすでに MUI の Stack / Link を読み込んでいる場合は、content 内でそれらを使ってください(Storybook の Default を参照)。
function Example() { return ( <Footer logoSrc="https://docs.nodeblocks.dev/img/icon-small.png" content={ <div style={{display: 'flex', flexWrap: 'wrap', gap: 16}}> <a href="#about" style={{color: 'inherit'}}> About </a> <a href="#privacy" style={{color: 'inherit'}}> Privacy </a> <a href="#terms" style={{color: 'inherit'}}> Terms </a> </div> } copyright={<>© 2025 Example Corp. All rights reserved.</>} sx={{py: 4}} /> ); }
ルートのフッターは backgroundColor: primary.main と color: primary.contrastText を使います。content 内の MUI Link には sx={{ color: 'common.white' }}(または inherit)を設定して、リンクが見えるようにしてください。Storybook を参照してください。
children にサブコンポーネントを使います。各ブロックは、children が指定されている場合はそれを使い、そうでない場合はコンテキスト内の対応するルート prop を使います。
function Example() { return ( <Footer logoSrc="https://docs.nodeblocks.dev/img/icon-small.png" content={null} copyright={<>© 2024 Nodeblocks.</>} > <Footer.Logo src="https://docs.nodeblocks.dev/img/icon-small.png" sx={{width: {xs: 30, sm: 50}}} /> <Footer.Content> <div style={{display: 'flex', flexDirection: 'column', gap: 8}}> <a href="#services" style={{color: 'inherit'}}> Services </a> <a href="#pricing" style={{color: 'inherit'}}> Pricing </a> </div> </Footer.Content> <Footer.Copyright>© 2024 Nodeblocks. All rights reserved.</Footer.Copyright> </Footer> ); }
function child を使ってブロックを追加したり、順序を変更したりします。
function Example() { return ( <Footer logoSrc="https://docs.nodeblocks.dev/img/icon-small.png" content={ <a href="#about" style={{color: 'inherit'}}> About </a> } copyright={<>© 2024 Nodeblocks.</>} > {({defaultBlocks, defaultBlockOrder}) => ({ blocks: { ...defaultBlocks, logo: <Footer.Logo />, content: <Footer.Content />, social: ( <div style={{display: 'flex', gap: 12, fontSize: 14}}> <a href="#twitter" style={{color: 'inherit'}}> Twitter </a> <a href="#linkedin" style={{color: 'inherit'}}> LinkedIn </a> </div> ), copyright: <Footer.Copyright />, }, blockOrder: ['logo', 'content', 'social', 'copyright'], })} </Footer> ); }
ブロックのオーバーライドを使うタイミング
オーバーライドは、追加セクション(たとえばソーシャルリンク)、カスタムの blockOrder、またはブロックの入れ替えが必要で、かつデフォルトのフッタースタイルを維持したいときに使います。defaultBlockOrder は logo、content、copyright です。
重要なプロパティ
コアプロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
logoSrc | string | はい | - | フッターロゴの URL (Footer.Logo は src またはこの値を使います) |
content | ReactNode | はい | - | フッターのメイン本文(リンク、テキスト、カスタム JSX など) |
copyright | ReactNode | はい | - | 著作権表示または法的通知 |
コンテンツプロパティ
logoSrc、content、copyright をルートに設定します。サブコンポーネントは、ローカル props または children(コンパウンドモード)を渡さない限り、コンテキストからこれらを読み取ります。
| コンポーネント | プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|---|
Logo | src | string | いいえ | ルートの logoSrc | ロゴ画像の URL。src が設定されている場合はそれを使い、そうでなければ logoSrc を使います |
Logo | alt | string | いいえ | Footer logo | 画像の alt テキスト |
Logo | logoSrc | string | いいえ | ルートの logoSrc | このブロックのコンテキスト URL を上書きします |
Logo | — | BoxProps<'img'> | いいえ | - | その他の img props(className、sx など) |
Content | children | ReactNode | いいえ | ルートの content | コンテンツのマークアップ(children ?? content) |
Content | content | ReactNode | いいえ | ルートの content | このブロックのコンテキストを上書きします |
Copyright | children | ReactNode | いいえ | ルートの copyright | 著作権のマークアップ(children ?? copyright) |
Copyright | copyright | ReactNode | いいえ | ルートの copyright | このブロックのコンテキストを上書きします |
Logo、Content、Copyright はそれぞれ Footer.Logo、Footer.Content、Footer.Copyright です。
レイアウトと構成のプロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
children | BlocksOverride | ReactNode | いいえ | undefined | コンパウンドサブコンポーネント、または blocks と blockOrder を返す関数オーバーライド |
className | string | いいえ | undefined | ルートコンテナのクラス名(デフォルトで nbb-footer が適用されます) |
sx | SxProps | いいえ | undefined | ルートコンテナ用の MUI システムスタイル |
Footer は MUI の StackProps(children と content を除く)を継承し、spacing(デフォルトは { xs: 2, sm: 4 })、direction(デフォルトは { xs: 'column', sm: 'row' })、id を含みます。ルートは component="footer"、backgroundColor: primary.main、color: primary.contrastText、レスポンシブなパディングを使用します。レンダリング順序は logo、content、copyright で、defaultBlockOrder も logo、content、copyright です。
デフォルト UI ブロック
| ブロック | 基盤 | 備考 |
|---|---|---|
Footer(ルート) | Stack(component="footer") | プライマリーバー。direction は column(xs)/ row(sm+) |
Footer.Logo | Box(component="img") | alt のデフォルトは Footer logo。src は logoSrc がない場合にフォールバックします |
Footer.Content | Box | flex: 1、typography: body2 |
Footer.Copyright | Box | typography: body2 |
TypeScript
import { Footer } from '@nodeblocks/frontend-footer-block';
import type { ReactNode } from 'react';
type FooterConfig = {
logoSrc: string;
content: ReactNode;
copyright: ReactNode;
};
const config: FooterConfig = {
logoSrc: 'https://docs.nodeblocks.dev/img/icon-small.png',
content: (
<a href="#about" style={{ color: 'inherit' }}>
About Us
</a>
),
copyright: <>© 2024 Nodeblocks.</>,
};
<Footer {...config} />;