Nav List
見出し + リンクリストのみで構成する文書ナビ向けの静的なリンク集です。fandhe-frontend-headless-ui の nav_list mod が構造・アクセシビリティ(WAI-ARIA・キーボード操作)・表示状態(data-*)のみを提供する unstyled 部品であり、Themes 版と異なりスタイル(CSS)は一切持ちません。menu ロールへの誤読を避けるため role 属性を一切付与せず、素の nav/h2/ul/li/a の暗黙 ARIA ロールに依拠します。
スタイル済みの表示例は Nav List を参照してください。
キーボード操作
| キー | 対象 | 効果 |
|---|---|---|
| Tab / Shift+Tab | Link | ネイティブ a[href] へのフォーカス移動です(ブラウザ既定、headless-ui 側の配線なし)。矢印キーでの項目間移動(roving)は WAI-ARIA の文書ナビパターンに存在しないため提供しません。 |
| Enter | Link | ネイティブ a[href] の起動(遷移)です。Space はリンクを起動しません(<a> 要素は Space キーでは発火しないブラウザ標準挙動です)。 |
参考サイトとの差分
本部品は ark-ui / Radix Primitives / Radix Themes に 1:1 対応物を持たない fandhe 独自部品です(docs/design/component-coverage-map.md)。イシューが指す chakra-ui の List(variant/align/colorPalette/unstyled/as/asChild/List.Indicator のみを持つ汎用の marker 付きリスト)は Anatomy 節・Keyboard Interactions 節・data-* 語彙・独自 ARIA のいずれも持ちません。chakra List の本リポジトリでの真の対応物は Themes 層 fandhe-frontend-pre-styled-ui::list であり、本部品は「nav ランドマーク + 見出し + リンクリスト」という文書ナビの意味論を持つ別部品として区別しています。以下は突合の結論です。
- anatomy: 参照側に 1:1 の Anatomy 図はありません。chakra
List.Root/List.Itemは本部品のlist/itemに相当し、root(nav)/heading(h2)/link(a、aria-current/data-current語彙)は文書ナビ固有の superset です。増減はありません。 data-*: 参照側は状態data-*を一切持ちません。data-currentはlink/breadcrumbと共有する本リポジトリ独自語彙であり、削除は Themes 側の CSS セレクタへ波及する破壊的変更のため意図的に維持しています。- 非対応の prop:
List.Indicator(装飾マーカー)・as="ol"(本部品は文書ナビとして常にul固定)・variant/align/colorPalette/unstyled(装飾軸、Themes 層の責務)・asChild(headless-ui 全体での再導入検討事項、保留)はいずれも非対応です。 headingの見出しレベル固定:h2固定であり可変化には対応していません(API 拡張のため今回はスコープ外)。
一方で「role/aria-* を独自付与しない(暗黙の navigation/heading/list/listitem/link ロールに委ねる)」点は参考サイトと一致しています。危険な URL スキーム(javascript: 等)は href 属性ごと拒否され、href を失った a は暗黙の link ロールも失います(fail-closed の意味論的帰結)。呼び出し側 attrs による aria-label/href/aria-current/data-current のなりすましは除去されます(予約キーなりすまし除去)。
関連 API: fandhe-frontend-headless-ui API
自前 CSS の最小例
Themes 版を使わず本部品を直接使う場合、[data-scope="nav-list"][data-part="..."] セレクタと :hover・:focus-visible・[aria-current="page"] 擬似クラス/属性セレクタでスタイルを当てます。
[data-scope="nav-list"][data-part="list"] {
list-style: none;
margin: 0;
padding: 0;
}
[data-scope="nav-list"][data-part="link"] {
color: #2563eb;
text-decoration: none;
}
[data-scope="nav-list"][data-part="link"]:hover {
text-decoration: underline;
}
[data-scope="nav-list"][data-part="link"]:focus-visible {
outline: 2px solid #2563eb;
outline-offset: 2px;
}
[data-scope="nav-list"][data-part="link"][aria-current="page"] {
font-weight: 700;
}Demo
枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。
Features
- 文書ナビ向け Link リスト。root(nav)/ heading(h2)/ list(ul)/ item(li)/ link(a)の 5 anatomy パーツを持つ(nav_list.rs モジュール doc)。
- 5 パーツいずれも role 属性を一切付与しない。素の nav/h2/ul/li/a の暗黙 ARIA ロールをそのまま使うことが、menu ロールへの誤読を避ける本部品の存在理由そのものである(module doc「role を一切付与しない」節)。
- root の aria-label(label 引数)は必須引数であり、複数 nav ランドマークが存在する文書でスクリーンリーダー利用者がランドマーク間を区別できるようにする。
- navigation_menu との使い分けの軸は role の有無ではなくディスクロージャの有無(本部品は状態機械を持たない静的なリンク集、navigation_menu は Trigger/Content で開閉するパネル)。
- 参考サイト突合(イシュー #1653): ark-ui / Radix Primitives / Radix Themes に 1:1 対応物なし。chakra-ui List(汎用 marker リスト、真の対応物は Themes 層 list #771)とは意味論が異なる別部品と判断し、anatomy / data-* / ARIA の増減は行っていない(module doc「参考サイト突合」節)。
- List.Indicator(装飾マーカー)・as="ol"・variant/align/colorPalette 等の装飾軸・asChild は意図的に非採用(装飾・レイアウト計測は headless へ持ち込まず Themes 層の責務とする、intentional-non-adoption.md §3.25 規則 2)。
- 予約キーなりすまし除去(drop_reserved): 呼び出し側 attrs による root の aria-label、link の href/aria-current/data-current のなりすましを除去する(イシュー #1653、breadcrumb/link-overlay と同型)。
Anatomy
root
heading
list
item
linkAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
root(label) | &str | — | root(nav)へ付与する aria-label(必須引数)。attrs 経由の aria-label なりすましは除去される。 |
link(href) | &str | — | href 属性。attrs 経由の href/aria-current/data-current なりすましは除去される。危険な URL スキームは属性ごと拒否される。 |
link(current) | bool | — | true のとき aria-current="page"+data-current を付与する(role は付与しない)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
link | data-current | (値なし) |
Examples
heading を省いたフラットなリンクリスト
heading パーツを使わず、見出しなしのリンクリストのみで構成した例です。
自前 CSS の最小例
data-scope / data-part / aria-current 属性セレクタで見た目を組み立てる最小例です。headless-ui 自体はスタイルを持ちません。
[data-scope="nav-list"][data-part="list"] {
list-style: none;
margin: 0;
padding: 0;
}
[data-scope="nav-list"][data-part="link"] {
color: #2563eb;
text-decoration: none;
}
[data-scope="nav-list"][data-part="link"]:hover {
text-decoration: underline;
}
[data-scope="nav-list"][data-part="link"]:focus-visible {
outline: 2px solid #2563eb;
outline-offset: 2px;
}
[data-scope="nav-list"][data-part="link"][aria-current="page"] {
font-weight: 700;
}
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Tab / Shift+Tab | ネイティブ a[href] のフォーカス移動(無配線、ブラウザ既定に委ねる)。矢印キーでの項目間移動は WAI-ARIA の文書ナビパターンに存在しないため提供しない(module doc「スコープ外」節)。 |
| Enter | フォーカス中の a[href] を起動する(ネイティブ挙動。Space は a を起動しない)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| aria-label | root(nav)に必須付与。role は一切付与しない(module doc「role を一切付与しない」節)。 |
| aria-current="page" | link に付与(current が true のときのみ)。role は付与しない。 |
| (role 非付与) | 全パーツで role を一切付与しない。危険 URL 拒否で href を失った a は暗黙 link ロールも同時に失う。 |