Foundation
PackagesUIComponents

Tabs

同一ページ内で関連するコンテンツパネルを切り替えるコンポーネント。

いつ使うか

  • 同一ページ内で関連するコンテンツを切り替えて表示するときに使用する
  • 設定画面のカテゴリ別パネル(「一般」「通知」「セキュリティ」等)に使用する
  • 詳細画面で複数の関連情報(「概要」「履歴」「コメント」等)を整理するときに使用する

いつ使わないか

  • ページ遷移を伴うナビゲーションには使わない。Nav を使用する
  • ウィザードのようなステップ進行には使わない。Stepper コンポーネントを使用する
  • 1つしかパネルがない場合は使わない。不要なUIの複雑さが増す
  • 8つ以上のタブがある場合は、情報設計を見直すか、他のナビゲーションパターンを検討する

Usage

import { Tabs } from '@bi-shop-it/ui/tabs';

<Tabs
  items={[
    { value: 'overview', label: '概要', content: <OverviewPanel /> },
    { value: 'history', label: '履歴', content: <HistoryPanel /> },
    { value: 'comments', label: 'コメント', content: <CommentsPanel /> },
  ]}
/>;

Props

Tabs

Propデフォルト説明
itemsTabItem[]タブ定義の配列
defaultValuestring最初の項目初期選択タブの value(非制御モード)
valuestring選択中タブの value(制御モード。onValueChange と併用する)
onValueChange(value: string) => voidタブ切り替え時のコールバック
variant'default' | 'line''default'見た目のバリアント。default はピル型、line はアンダーライン型

TabItem

Propデフォルト説明
valuestringタブを識別する一意の値
labelstringタブに表示するラベルテキスト
contentReactNodeタブ選択時に表示するコンテンツ
iconIconNameラベルの前に表示するアイコン
disabledbooleanfalse無効状態

バリエーション

Default(ピル型)

背景色でタブリストを囲み、選択中のタブが浮き上がるスタイル。設定画面やダイアログ内など、コンパクトな切り替えに適している。

概要テキスト。短いコンテンツ。

<Tabs
  items={[
    { value: 'general', label: '一般', content: <GeneralSettings /> },
    { value: 'notification', label: '通知', content: <NotificationSettings /> },
    { value: 'security', label: 'セキュリティ', content: <SecuritySettings /> },
  ]}
/>

Line(アンダーライン型)

ボーダーラインで区切り、選択中のタブにアンダーラインを表示するスタイル。詳細画面やページの主要なコンテンツ切り替えに適している。

概要のコンテンツがここに表示される。

<Tabs
  variant="line"
  items={[
    { value: 'overview', label: '概要', content: <OverviewPanel /> },
    { value: 'history', label: '履歴', content: <HistoryPanel /> },
    { value: 'comments', label: 'コメント', content: <CommentsPanel /> },
  ]}
/>

状態

Disabled

個別のタブを無効化できる。無効化されたタブはクリック・キーボード操作ともに反応しない。

概要のコンテンツがここに表示される。

<Tabs
  items={[
    { value: 'overview', label: '概要', content: <OverviewPanel /> },
    {
      value: 'draft',
      label: '下書き',
      content: <DraftPanel />,
      disabled: true,
    },
    { value: 'history', label: '履歴', content: <HistoryPanel /> },
  ]}
/>

アイコン付き

icon を指定すると、ラベルの前にアイコンが表示される。

概要のコンテンツがここに表示される。

<Tabs
  items={[
    {
      value: 'overview',
      label: '概要',
      icon: 'File',
      content: <OverviewPanel />,
    },
    {
      value: 'history',
      label: '履歴',
      icon: 'Calendar',
      content: <HistoryPanel />,
    },
    {
      value: 'comments',
      label: 'コメント',
      icon: 'Mail',
      content: <CommentsPanel />,
    },
  ]}
/>

Card で囲む

Tabs はコンテンツパネルにボーダーや背景色を持たない。パネルの境界を明示したい場合は、contentCard で囲む。

一般のコンテンツがここに表示される。

import { Card } from '@bi-shop-it/ui/card';
import { Tabs } from '@bi-shop-it/ui/tabs';

<Tabs
  items={[
    {
      value: 'general',
      label: '一般',
      content: (
        <Card>
          <GeneralSettings />
        </Card>
      ),
    },
    {
      value: 'notification',
      label: '通知',
      content: (
        <Card>
          <NotificationSettings />
        </Card>
      ),
    },
  ]}
/>;

制御モード

valueonValueChange で外部から選択状態を制御できる。

const [activeTab, setActiveTab] = useState('overview');

<Tabs
  value={activeTab}
  onValueChange={setActiveTab}
  items={[
    { value: 'overview', label: '概要', content: <OverviewPanel /> },
    { value: 'history', label: '履歴', content: <HistoryPanel /> },
  ]}
/>;

アクセシビリティ

コンポーネントが内部で処理すること

  • Radix UI の Tabs プリミティブに基づき、role="tablist"role="tab"role="tabpanel" を自動的に設定する
  • aria-selected で選択状態をスクリーンリーダーに伝達する
  • aria-controls / aria-labelledby でタブとパネルを紐付ける
  • 矢印キー(Left / Right)でタブ間を移動できる
  • Home / End キーで最初 / 最後のタブに移動できる
  • disabled 時に disabled 属性を自動付与し、フォーカスとクリックを無効化する
  • 装飾アイコンに aria-hidden="true" を自動付与する

利用者が対応すること

  • label はタブの内容が明確に伝わるテキストにすること(「タブ1」のような番号だけは避ける)
  • タブパネルのコンテンツが非同期で読み込まれる場合は、ローディング状態を適切に表示すること

関連コンポーネント

  • Nav — ページ遷移を伴うナビゲーションに使用する。Tabs は同一ページ内のコンテンツ切り替え

On this page