Navbarブロック
Navbar は、MUI Stack(component="nav")をベースにした横型ナビゲーションバーで、左・中央・右の領域と、リンクおよびアクション用の基本要素を備えています。
インストール
- npm
- yarn
- pnpm
- bun
npm install @nodeblocks/frontend-navbar-block
yarn add @nodeblocks/frontend-navbar-block
pnpm add @nodeblocks/frontend-navbar-block
bun add @nodeblocks/frontend-navbar-block
必要なもの
| 項目 | 理由 |
|---|---|
leftContent (optional) | 左領域のコンテンツ。存在する場合はデフォルトレイアウトで使用されます |
centerContent (optional) | 主なナビゲーションリンク。中央が空の場合は省略するか null を渡します |
rightContent (optional) | ログイン、Navbar.Item のアイコン、プロフィール操作などのアクション |
| 領域サブコンポーネント | コンパウンドレイアウト用の Navbar.Left、Navbar.Center、Navbar.Right |
Navbar に leftContent、centerContent、rightContent を渡すと、デフォルトの領域(Navbar.Left、Navbar.Center、Navbar.Right)が埋まります(それぞれ自動で描画されます)。compound children を使うと、ルート props をコンテキスト経由で読み取りつつ、領域のマークアップを置き換えられます(children は対応する *Content prop より優先されます)。function child で blocks と blockOrder を使えば、ブロックの先頭追加や順序変更ができます。
コード例
- クイックスタート
- リンクとレイアウト
- コンパウンドコンポーネント
- ブロックのオーバーライド
function Example() { return ( <Navbar leftContent={ <Navbar.Logo src="https://docs.nodeblocks.dev/img/icon-small.png" alt="Company Logo" style={{height: 32}} /> } centerContent={ <> <Navbar.Link href="#home"> <span>Home</span> </Navbar.Link> <Navbar.Link href="#about"> <span>About</span> </Navbar.Link> <Navbar.Link href="#services"> <span>Services</span> </Navbar.Link> <Navbar.Link href="#contact"> <span>Contact</span> </Navbar.Link> </> } rightContent={<Navbar.ButtonLink href="#login">Login</Navbar.ButtonLink>} /> ); }
領域コンテンツ、Navbar.Item のアクション、ルートの余白(sx)をカスタマイズします。
function Example() { return ( <Navbar leftContent={ <Navbar.Logo src="https://docs.nodeblocks.dev/img/icon-small.png" alt="Acme" style={{height: 28}} /> } centerContent={ <> <Navbar.Link href="#dashboard"> <span>Dashboard</span> </Navbar.Link> <Navbar.Link href="#settings"> <span>Settings</span> </Navbar.Link> </> } rightContent={ <> <Navbar.Item icon={<SettingsOutlined />} label="Settings" /> <Navbar.ButtonLink href="#signup">Sign up</Navbar.ButtonLink> </> } sx={{px: 4}} /> ); }
Navbar.Item ラベルlabel は超小型ビューポートでは非表示になり、sm 以上で表示されます(display: { xs: 'none', sm: 'inline' })。モバイルではアイコンのみの項目を使うか、レスポンシブな Box ラッパーでデスクトップ/モバイルのグループを分けてください(Storybook の Default を参照)。
領域サブコンポーネントを使って、ナビゲーションバーを明示的に構成します。
function Example() { return ( <Navbar> <Navbar.Left> <Navbar.Logo src="https://docs.nodeblocks.dev/img/icon-small.png" alt="Company Logo" style={{height: 32}} /> </Navbar.Left> <Navbar.Center> <Navbar.Link href="#home"> <span>Home</span> </Navbar.Link> <Navbar.Link href="#about"> <span>About</span> </Navbar.Link> <Navbar.Link href="#services"> <span>Services</span> </Navbar.Link> <Navbar.Link href="#contact"> <span>Contact</span> </Navbar.Link> </Navbar.Center> <Navbar.Right> <Navbar.ButtonLink href="#login">Login</Navbar.ButtonLink> </Navbar.Right> </Navbar> ); }
function child を使ってブロックを先頭に追加したり、順序を変更したりします。
function Example() { return ( <Navbar leftContent={ <Navbar.Logo src="https://docs.nodeblocks.dev/img/icon-small.png" alt="Company Logo" style={{height: 32}} /> } centerContent={ <Navbar.Link href="#home"> <span>Home</span> </Navbar.Link> } rightContent={<Navbar.ButtonLink href="#login">Login</Navbar.ButtonLink>} > {({defaultBlocks, defaultBlockOrder}) => ({ blocks: { ...defaultBlocks, customNotice: ( <div style={{ background: '#eef4ff', border: '1px solid #cddcff', borderRadius: 8, padding: '8px 12px', fontSize: 14, }} > New features available </div> ), }, blockOrder: ['customNotice', ...defaultBlockOrder], })} </Navbar> ); }
ブロックのオーバーライドを使うタイミング
オーバーライドは、デフォルトの領域の前にバナーや追加ブロックが必要な場合、またはカスタムの blockOrder が必要な場合に、デフォルトの領域スタイルを維持しながら使います。defaultBlockOrder は left、center、right、logo、link、buttonLink、item です。デフォルトのレイアウトで描画されるのは left、center、right のみで、logo、link、buttonLink、item はカスタム構成用に defaultBlocks で利用できます。
重要なプロパティ
コアプロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
leftContent | ReactNode | いいえ | undefined | 左領域のコンテンツ(例: Navbar.Logo) |
centerContent | ReactNode | いいえ | undefined | 中央領域のコンテンツ(例: Navbar.Link の一覧) |
rightContent | ReactNode | いいえ | undefined | 右領域のコンテンツ(例: Navbar.Item、Navbar.ButtonLink) |
コンテンツプロパティ
デフォルト領域を使う場合は、ルートに leftContent、centerContent、rightContent を設定します。サブコンポーネントは、領域に children を渡さない限り、コンテキストからそれらを読み取ります(コンパウンドモード)。
| コンポーネント | プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|---|
Left | children | ReactNode | いいえ | ルートの leftContent | 左領域のマークアップ |
Left | leftContent | ReactNode | いいえ | ルートの leftContent | この領域のコンテキストを上書きします |
Center | children | ReactNode | いいえ | ルートの centerContent | 中央領域のマークアップ |
Center | centerContent | ReactNode | いいえ | ルートの centerContent | この領域のコンテキストを上書きします |
Right | children | ReactNode | いいえ | ルートの rightContent | 右領域のマークアップ |
Right | rightContent | ReactNode | いいえ | ルートの rightContent | この領域のコンテキストを上書きします |
Logo | — | BoxProps<'img'> | いいえ | - | 画像ロゴ(src、alt、style、className など) |
Link | — | StackProps<typeof Link> | いいえ | - | インラインのナビゲーションリンク。href とラベルの子要素を渡します |
ButtonLink | — | StackProps<typeof Button> | いいえ | - | コンテインドアクションリンク。variant="contained"、size="small" |
Item | icon | ReactNode | いいえ | undefined | ラベルの前のアイコン(アイコンに任意の badgeProps を指定可能) |
Item | label | ReactNode | いいえ | undefined | テキストラベル(sm+ のみ) |
Item | badgeProps | BadgeProps | いいえ | undefined | icon 上の MUI Badge |
Item | children | ReactNode | いいえ | undefined | コントロール内の追加コンテンツ |
Left、Center、Right、Logo、Link、ButtonLink、Item はそれぞれ Navbar.Left、Navbar.Center などです。Item は ButtonBase の props(例: onClick)を継承します。
レイアウトと構成のプロパティ
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
children | BlocksOverride | ReactNode | いいえ | undefined | コンパウンド領域コンポーネント、または blocks と blockOrder を返す関数オーバーライド |
component | React.ElementType | いいえ | 'nav' | ルート要素の型 |
className | string | いいえ | undefined | ルートコンテナのクラス名(デフォルトで nbb-navbar が適用されます) |
sx | SxProps | いいえ | undefined | ルートコンテナ用の MUI システムスタイル |
Navbar は StackProps<'nav'>(children を除く)を継承し、direction(デフォルト row)、spacing(ルートではデフォルト 3)、height(xs / sm で 56 / 64)、水平パディング、下枠線を含みます。ルートの描画順序は left、center、right で、defaultBlockOrder は left、center、right、logo、link、buttonLink、item です。
デフォルト UI ブロック
| ブロック | 基盤 | 備考 |
|---|---|---|
Navbar(ルート) | Stack(component="nav") | direction="row"、spacing={3}、height は 56px(xs)/ 64px(sm+) |
Navbar.Left | Stack | direction="row"、spacing={1} |
Navbar.Center | Stack | flexGrow: 1、spacing={2} |
Navbar.Right | Stack | justifyContent: flex-end |
Navbar.Logo | Box(component="img") | ロゴ画像 |
Navbar.Link | Stack + Link | インラインのナビゲーションリンク |
Navbar.ButtonLink | Stack + Button | コンテインドアクションリンク |
Navbar.Item | ButtonBase + Badge + Typography | アイコン/ラベルのアクション。アイコンに任意のバッジを付けられます |
TypeScript
import { Navbar } from '@nodeblocks/frontend-navbar-block';
import { SettingsOutlined } from '@mui/icons-material';
import type { ReactNode } from 'react';
type NavbarRegions = {
leftContent: ReactNode;
centerContent?: ReactNode;
rightContent?: ReactNode;
};
const config: NavbarRegions = {
leftContent: (
<Navbar.Logo src="/logo.svg" alt="Company" style={{ height: 32 }} />
),
centerContent: (
<Navbar.Link href="#home">
<span>Home</span>
</Navbar.Link>
),
rightContent: <Navbar.Item icon={<SettingsOutlined />} label="Settings" />,
};
<Navbar {...config} />;