relay Design System
Tailwind v4
イントロダクション
  • MCP サーバー
  • 取り組み
  • 品質評価
  • リリースログ
Foundations
  • 色
  • タイポグラフィ
  • レイアウト
  • エフェクト
  • アイコン
  • アセット
Components
  • ボタン
  • アイコンボタン
  • ラベルコントロール
  • インプット
  • サーチインプット
  • セレクター
  • テキストエリア
  • チェックボックス
  • ラジオ
  • フィルターチップ
  • タブ
  • テーブル
  • シンプルテーブル
  • カード
  • バッジ
  • アラート
  • リンクテキスト
  • パンくずリスト
  • メニュー
  • ページネーション
  • ステッパー
  • モーダル
  • ツールチップ
  • トグルスイッチ
  • ページシェル
  1. ホーム
  2. Components
  3. メニュー

メニュー

component

縦に項目を並べる汎用メニューです。いま開いているページを示しながら移動できるナビゲーション(サイドナビ)にも、設定・ログアウトなどの操作を並べるアクションメニューにも使えます。幅は親要素で決めます(サイドナビ用途は w-70 = 280px が目安)。

項目の状態

default / hover / focus / current。hover はニュートラル(背景 neutral/100)、current は primary(背景 primary/50 + 太字)— primary は「現在地」の意味に予約

default
  • メニュー項目
hover
  • メニュー項目
focus
  • メニュー項目
current
  • メニュー項目

サイズ

md(既定、padding 12)/ sm(.menu-item-sm、padding 8)。sm は項目数が多く密度を上げたいナビ(ドキュメントのサイドナビ等)専用

md(既定)
  • メニュー項目
  • メニュー項目
sm
  • メニュー項目
  • メニュー項目

使用例: ナビゲーション(サイドナビ)

nav 要素で包み、現在地に aria-current="page"。グループは .menu-divider で区切る。外部リンク等の末尾装飾アイコンは .menu-item-trailing(16px・右端寄せ)

  • マイページTOP
  • 財務情報購入履歴
  • プレミアム会員登録
  • おすすめ案件設定

  • 基本情報(本人確認)
  • アカウント設定
  • ヘルプセンター

使用例: アクションメニュー

操作の項目は button 要素で書く(遷移は a)。ナビゲーションではないので nav では包まない。左アイコンは任意(付けるなら同じグループ内で有無を揃える)



機能

このコンポーネントの用途

縦に項目を並べる汎用メニュー。現在地を示しながら階層を移動するナビゲーション
(マイページのサイドナビ等)と、操作を並べるアクションメニューの両方に使う。
サイト階層のパス表示は breadcrumb、横並びのコンテンツ切替は tab。

使用法

推奨される使い方と、やりがちな NG パターン

OK

  • ✓ナビ用途は nav 要素で包んで aria-label を付け、現在地に aria-current="page" を付ける。
  • ✓項目は遷移なら a、操作(ログアウト等)なら button を使う。どちらも下線なし(項目形状のため「常に下線」原則の例外)。
  • ✓左アイコンは任意。付けるなら同じグループ内では有無を揃える(テキストの頭が揃わなくなるため)。
  • ✓外部リンク等の末尾装飾アイコンは menu-item-trailing(16px・右端寄せ)。左アイコンの 24px と混同しない。
  • ✓グループは menu-group、区切りは menu-divider。幅は親要素で決める(サイドナビは w-70 = 280px 目安)。
  • ✓項目数が多く密度を上げたいナビ(ドキュメントのサイドナビ等)は menu-item-sm。通常は md(既定)のまま。

NG

  • ✕現在地をクラスだけで示さない → aria-current="page" を付ける。
  • ✕横並びのコンテンツ切替に流用しない → tab。
  • ✕操作項目に a を使わない → 遷移は a / 実行は button。

遷移は a・操作は button

要素の役割を分ける
Good
  • 案件一覧(ページ遷移)

ページ遷移は <a href>、その場の操作は <button>。SR に役割が正しく伝わり、遷移は新規タブ・右クリックも効く。

<a class="menu-item" href="…">案件一覧</a>
<button type="button" class="menu-item">ログアウト</button>
Don't

遷移を button にしない。役割が「ボタン」になり、遷移手段(新規タブ等)が失われる。

<button type="button" class="menu-item">案件一覧</button>

アイコンの有無はグループ内で揃える

視線と整列
Good
  • マイページ
  • アカウント設定

同じグループは全項目にアイコンを付ける(または全て無し)。ラベル開始位置が揃い、走査しやすい。

<a class="menu-item"><svg class="icon">…</svg>マイページ</a>
<a class="menu-item"><svg class="icon">…</svg>アカウント設定</a>
Don't
  • マイページ
  • アカウント設定

一部だけアイコンを付けると、ラベル開始位置がずれて視線が乱れる。

<a class="menu-item"><svg class="icon">…</svg>マイページ</a>
<a class="menu-item">アカウント設定</a>

メニューのアクセシビリティ

relay のメニューは ネイティブ nav + a / button ベースで、ARIA メニューウィジェット(role=menu・矢印キー)ではありません。キーボードは Tab / Enter で操作します。WCAG 2.2 全基準は アクセシビリティ ページを参照。

期待される配慮

Presentation / Adaptability / Interaction / Assistive Technology

提示

現在地は aria-current="page" による背景+太字で示し、色だけに頼らない。左アイコンは装飾、区切りは menu-divider でグループ化。

適応

幅は親要素で決まり、リフローで縦積みに崩れても機能を失わない。文字は rem / トークンで拡大に追従。

操作

Tab で各項目へ、Enter で遷移/実行。ネイティブ nav のため矢印キーは不要。フォーカスリングで位置が分かる。

支援技術

nav は aria-label でランドマーク名を持ち、各項目は role=link / button として、現在地は「現在のページ」として読まれる。

DS が担保する機能

追加実装なしで満たされる

  • ✓ネイティブ nav + a / button ベース — 役割・名前・状態が標準で確立
  • ✓aria-current="page" のスタイル(背景+太字)で現在地を色以外でも表現
  • ✓フォーカスリング --shadow-focus-ring(:focus-visible)
  • ✓末尾装飾アイコン menu-item-trailing は aria-hidden 前提の設計
  • ✓テキスト色は fg-* ロールでコントラストを確保

実装時の必須対応

プロダクト側で担保する

  • !ナビは <nav aria-label="…"> で包む。複数ある場合は固有のラベルを付ける
  • !現在地に aria-current="page"(色・太字だけに頼らない)
  • !遷移は <a>、操作は <button> と要素で役割を分ける
  • !装飾アイコンは aria-hidden="true"、別タブで開くリンクは手がかりと説明を添える

テスト方法

キーボード / スクリーンリーダー / 自動チェック

キー 動作
Tab / Shift+Tab各項目へ移動する
Enterリンクを遷移 / ボタンを実行する
  • SRランドマーク「ナビゲーション: <ラベル>」、現在地は「現在のページ」、各項目のラベルが読まれる
  • 操作矢印キーは不要(ネイティブ nav のため Tab 移動)
  • 自動axe / Lighthouse で nav ラベル・aria-current・リンク名・コントラストを確認

現在地は aria-current="page"

達成基準:WCAG 4.1.2 名前・役割・値 / 1.4.1 色の使用
Good
  • マイページ
  • アカウント設定

aria-current="page" を付けると、背景+太字に加え SR が「現在のページ」と読む。

<a class="menu-item" aria-current="page">マイページ</a>
Don't
  • マイページ
  • アカウント設定

aria-current が無いと DS の現在地スタイルも当たらず、視覚的にも SR 的にも現在地が示されない。

<a class="menu-item" href="…">マイページ</a>  <!-- aria-current なし -->

関連する達成基準(WCAG 2.2)

1.3.1 情報及び関係性 ・ 1.4.1 色の使用 ・ 2.1.1 キーボード ・ 2.4.4 リンクの目的 ・ 2.4.7 フォーカスの可視化 ・ 4.1.2 名前・役割・値