パンくずリスト
stimeo--breadcrumb
幅が足りないとき中間項目を開示ボタンへ折りたたむパンくずリスト。
stimeo--breadcrumb コントローラは、WAI-ARIA の Breadcrumb パターンを実装する。基本構造(nav + ol + aria-current="page")はマークアップが持ち、コントローラはレスポンシブ挙動を担う。パンくずがコンテナ幅に収まらないときは、マークアップで指定した中間項目(collapsible)を隠して省略(…)の開示ボタンを表示し、押すと全項目を展開して aria-expanded を切り替える。収まるときは全項目を表示して省略ボタンを隠す。溢れ検知は ResizeObserver で行い、disconnect(Turbo 遷移含む)で切断する。区切り文字や見た目は利用側の責務で、ライブラリは振る舞いのみを提供する。
キーボード操作
| キー | 動作 |
|---|---|
| Enter / Space | 省略ボタンで全項目を展開/再折りたたみする。 |
<%# Markup for the breadcrumb demo.
The APG structure (nav + ol + aria-current="page") lives in the markup; the
library only handles the responsive behavior of collapsing middle items into a
"…" disclosure button when width runs short. Separators are drawn by demo.css's
::after. %>
<nav
class="breadcrumb"
data-controller="stimeo--breadcrumb"
aria-label="<%= t("components.breadcrumb.demo.label") %>">
<ol class="breadcrumb__list" data-stimeo--breadcrumb-target="list">
<li class="breadcrumb__item">
<a href="#"><%= t("components.breadcrumb.demo.home") %></a>
</li>
<li class="breadcrumb__item" data-stimeo--breadcrumb-target="ellipsis" hidden>
<button
type="button"
class="breadcrumb__ellipsis"
aria-expanded="false"
aria-controls="breadcrumb-collapsed"
aria-label="<%= t("components.breadcrumb.demo.expand") %>"
data-stimeo--breadcrumb-target="trigger"
data-action="click->stimeo--breadcrumb#toggle">…</button>
</li>
<li
class="breadcrumb__item"
id="breadcrumb-collapsed"
data-stimeo--breadcrumb-target="collapsible">
<a href="#"><%= t("components.breadcrumb.demo.section") %></a>
</li>
<li class="breadcrumb__item" data-stimeo--breadcrumb-target="collapsible">
<a href="#"><%= t("components.breadcrumb.demo.subsection") %></a>
</li>
<li class="breadcrumb__item" data-stimeo--breadcrumb-target="collapsible">
<a href="#"><%= t("components.breadcrumb.demo.category") %></a>
</li>
<li class="breadcrumb__item">
<a href="#" aria-current="page"><%= t("components.breadcrumb.demo.current") %></a>
</li>
</ol>
</nav>
/*
* Presentation-only styles for the breadcrumb demo.
* Collapse/expand is the library toggling the hidden attribute of collapsible items
* and the ellipsis, plus the trigger's aria-expanded. Here we narrow the container
* to force overflow and draw the "/" separator with ::after.
*/
.breadcrumb {
max-width: 22rem;
overflow: hidden;
}
.breadcrumb__list {
display: flex;
flex-wrap: nowrap;
align-items: center;
gap: 0.25rem;
margin: 0;
padding: 0;
list-style: none;
white-space: nowrap;
}
.breadcrumb__item {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: 0.875rem;
}
.breadcrumb__item:not(:last-child)::after {
content: "/";
color: var(--color-text-subtle);
}
.breadcrumb__item a {
color: var(--accent, var(--color-primary));
text-decoration: none;
}
.breadcrumb__item a[aria-current="page"] {
color: var(--fg, var(--color-text));
font-weight: 600;
pointer-events: none;
}
.breadcrumb__ellipsis {
padding: 0 0.25rem;
border: 0;
background: none;
color: var(--color-text-muted);
font: inherit;
line-height: 1;
cursor: pointer;
}
.breadcrumb__ellipsis:hover {
color: var(--fg, var(--color-text));
}
このデモに固有の消費側 JS はありません(挙動はコントローラが担います)。
これらのスタイルは共通のデザイントークン(ライト/ダーク両対応)を使います。 共通スタイルも一緒にコピーし、ルート要素の data-theme を切り替えればダークになります。
このコンポーネントを動かすために HTML へ記述する data-* 属性です。ルート要素に下の data-controller を付け、その内側に各 target / value / action を配置します。
ルート要素に付与
data-controller="stimeo--breadcrumb"
ターゲット
| 名前 | 説明 | 属性 |
|---|---|---|
list
必須
|
<ol> のパンくず列コンテナ。その幅を測ってオーバーフローを検知する。 |
data-stimeo--breadcrumb-target="list" |
collapsible
|
著者が印付けした中間項目。列が折りたたまれると非表示になる。 | data-stimeo--breadcrumb-target="collapsible" |
ellipsis
|
オーバーフロー時に折りたたんだ項目の代わりに表示される省略記号 (…) 項目。 | data-stimeo--breadcrumb-target="ellipsis" |
trigger
|
列を展開・再折りたたみするディスクロージャーボタン。aria-expanded が同期される。 |
data-stimeo--breadcrumb-target="trigger" |
アクション
| 名前 | 説明 | アクション |
|---|---|---|
toggle
|
列を展開または再折りたたみし、toggle イベントを発火する。 | stimeo--breadcrumb#toggle |
イベント
| 名前 | 説明 | イベント |
|---|---|---|
toggle
|
ユーザーが列を展開・再折りたたみすると発火する。detail に { expanded } を含む。 |
stimeo--breadcrumb:toggle |
状態フック
ライブラリが操作するのはこれらの ARIA / data 属性、カスタムプロパティだけです。見た目は利用側 CSS がこれらに反応して作ります([aria-selected] / [aria-expanded] / var(--stimeo--…) などのセレクタでフックします)。
| フック | 対象 | 意味 |
|---|---|---|
hidden |
折りたたみ項目 | 折りたたみ時に付与、展開時や収まるときは除去。 |
hidden |
省略項目 | 溢れている間は除去、収まるときは付与。 |
aria-expanded |
トリガー | 折りたたみ項目を展開している間は "true"。 |