Skip to content
fandhe-frontendcore v0.4.3
GitHub

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+TabLinkネイティブ a[href] へのフォーカス移動です(ブラウザ既定、headless-ui 側の配線なし)。矢印キーでの項目間移動(roving)は WAI-ARIA の文書ナビパターンに存在しないため提供しません。
EnterLinkネイティブ 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"] 擬似クラス/属性セレクタでスタイルを当てます。

CSS
[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
      link

API Reference

Arguments

NameTypeDefaultDescription
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

PartAttributeObserved Values
linkdata-current(値なし)

Examples

heading を省いたフラットなリンクリスト

heading パーツを使わず、見出しなしのリンクリストのみで構成した例です。

自前 CSS の最小例

data-scope / data-part / aria-current 属性セレクタで見た目を組み立てる最小例です。headless-ui 自体はスタイルを持ちません。

CSS
[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

KeyDescription
Tab / Shift+Tabネイティブ a[href] のフォーカス移動(無配線、ブラウザ既定に委ねる)。矢印キーでの項目間移動は WAI-ARIA の文書ナビパターンに存在しないため提供しない(module doc「スコープ外」節)。
Enterフォーカス中の a[href] を起動する(ネイティブ挙動。Space は a を起動しない)。

WAI-ARIA

AttributeDescription
aria-labelroot(nav)に必須付与。role は一切付与しない(module doc「role を一切付与しない」節)。
aria-current="page"link に付与(current が true のときのみ)。role は付与しない。
(role 非付与)全パーツで role を一切付与しない。危険 URL 拒否で href を失った a は暗黙 link ロールも同時に失う。