コンテキストメニュー
hc-context-menu は、ユーザーが右クリックした場所にメニューを表示
します — shadcn の ContextMenu に相当します。
メニューの面を丸ごと
再利用します — 同じ .hc-menu マークアップ、項目、セパレータ、
ラベル、menuitemcheckbox / menuitemradio — なので新しい CSS は
ありません。違いは開き方だけです: トリガーボタンにアンカーされる
代わりに、contextmenu イベント経由でポインタ位置に開きます。
ビヘイビアは installContextMenu にあります。
別名: 右クリックメニュー。
基本の HTML
Section titled “基本の HTML”右クリックでカスタムメニューを表示すべき領域に
data-hc-context-menu="<menu-id>" を足し、.hc-menu ポップオーバーを
指させます。
Right-click (or focus + Shift+F10) inside this box.
<div data-hc-context-menu="file-ctx">…right-clickable region…</div>
<div class="hc-menu" id="file-ctx" popover role="menu" aria-label="File actions"> <button class="hc-menu__item" role="menuitem" type="button">Open</button> <button class="hc-menu__item" role="menuitem" type="button">Rename</button> <button class="hc-menu__item" role="menuitemcheckbox" aria-checked="false" type="button">Bookmark</button> <hr class="hc-menu__separator"> <button class="hc-menu__item" role="menuitem" type="button" data-variant="error">Delete</button></div>メニューの面はドロップダウンの
メニューと同一なので、
そちらでドキュメントされているすべて —
menuitemcheckbox / menuitemradio、グループラベル、破壊的な
data-variant="error" 項目 — がここでも機能します。
JavaScript
Section titled “JavaScript”import { installContextMenu } from '@hypermedia-components/core';installContextMenu(); // idempotent; returns an uninstallerゼロ設定の @hypermedia-components/core/behaviors エントリは自動で
インストールします。
開き方とキーボード
Section titled “開き方とキーボード”- 右クリック(およびタッチの長押し、キーボードの Menu キー)は
contextmenuイベントを発火します。ビヘイビアはpreventDefault()でネイティブメニューをキャンセルし、ビューポート 内に収まるようクランプしてポインタ位置にポップオーバーを開きます。 Shift+F10はフォーカス中の要素の位置でメニューを開きます。Shift+F10はcontextmenuイベントを発火しないため、別途 処理されています。ビヘイビアに届くには、領域(またはフォーカス可能な 子孫)がフォーカスを保持できる必要があります — 汎用の領域にはtabindex="0"を足すか、中のフォーカス可能な行 / コントロールに 頼ってください。
開いた後のナビゲーションは標準のメニューキーボード契約です:
↓ / ↑ が項目間を移動、Home / End が最初 / 最後の有効な項目へ
ジャンプ、頭文字のタイプアヘッド、Tab と Escape が閉じる。無効な
項目はスキップされます。Escape / 外側クリックの解散とフォーカス
復元はネイティブの popover から来ます。
選択イベント
Section titled “選択イベント”項目を選ぶと、ドロップダウンメニューと同じバブリングする
hc:menuselect イベントが、contextTarget — 右クリックされた要素 —
を加えて発火します:
menu.addEventListener('hc:menuselect', (e) => { const { item, contextTarget, checked } = e.detail; // contextTarget is the element the menu was opened on — e.g. the row // or file the action applies to.});素の menuitem は選択後にメニューを閉じます。
menuitemcheckbox / menuitemradio は複数トグルできるよう開いたまま
にします。
サブメニュー
Section titled “サブメニュー”コンテキストメニューはドロップダウンのサブメニューサポートを共有
します: menuitem に、入れ子の .hc-menu を指す
data-hc-submenu="<id>" を与えます。ホバーまたは → で
開き、← / Esc で閉じ、末端を選ぶとツリー全体が
閉じます。完全なマークアップとインタラクションモデルは
メニュー → サブメニューを
参照してください。
htmx での利用
Section titled “htmx での利用”hc:menuselect から直接リクエストを配線し、右クリックされた要素で
アクションをスコープします:
<ul id="files"> <li data-hc-context-menu="row-ctx" data-id="42">report.pdf</li> …</ul>
<div class="hc-menu" id="row-ctx" popover role="menu" aria-label="Row actions" data-hx-post="/files/delete" data-hx-trigger="hc:menuselect" data-hx-include="this"> <button class="hc-menu__item" role="menuitem" type="button" data-variant="error">Delete</button></div>htmx:configRequest ハンドラで
event.detail.contextTarget.dataset.id を読み、対象行の id を
リクエストに添付してください。
Hyperscript
Section titled “Hyperscript”右クリックされた行にインラインで作用します — detail.contextTarget は
メニューが開かれた要素です:
<div class="hc-menu" id="row-ctx" popover role="menu" aria-label="Row actions" _="on hc:menuselect call rowAction(event.detail.item.dataset.action, event.detail.contextTarget)"> …</div>さらなるパターン: Hyperscript → コンポーネントイベントへの反応。
アクセシビリティ
Section titled “アクセシビリティ”- ポップアップは
menuitemの子を持つrole="menu"を使います — ドロップダウンと同じ WAI-ARIA APG メニューパターンです。 - キーボードの経路を用意してください: Menu キーは
contextmenuイベント経由で機能し、Shift+F10は明示的に処理 されます — ただし領域がフォーカスを受けられる場合だけです。領域か その行をフォーカス可能にしてください。 - コンテキストメニューをアクションへの唯一の経路にしないでください。 破壊的 / 重要なアクションは、見えるコントロールやドロップダウン メニューにも重ねてください。
テーマ用トークン
Section titled “テーマ用トークン”独自のものはありません —
メニューの面を描画する
ため、menu.* トークン(と --hc-menu-* 変数)が見た目を駆動します。
CSS 変数
Section titled “CSS 変数”独自のものはありません — 面は hc-menu なので、
--hc-menu-* 変数が
そのまま適用されます。