アクセシビリティ
@lh-ui/react はファミリーの他のライブラリと同じアクセシビリティ契約を共有します:セマンティックなタグ、ARIA 属性、キーボード操作はすべて @lh-ui/share/core 内で定義され、各端で一致した実装になります。本ライブラリはさらに、React エコシステムでよくある a11y の落とし穴が起きないことを保証します。
セマンティクスと ARIA
LhSwitchは視覚的に偽装した checkbox ではなく、<div role="switch" aria-checked>を描画しますLhSelectのトリガーはrole="combobox"、展開パネルはrole="listbox"、選択肢はrole="option"で、aria-activedescendantでキーボードのハイライトを同期しますLhDialogはrole="dialog" aria-modal"で、タイトルはaria-labelのフォールバックとaria-labelledbyの正確な関連付けの両方を提供しますLhTooltipはaria-describedbyで通知をトリガーに関連付けますLhTagはクリック可能な場合role="button"に昇格し、Enter / Space に応答しますLhFormItemはバリデーション失敗時にrole="alert"のエラー通知を描画し、aria-invalidを設定します
キーボード操作
| コンポーネント | キー |
|---|---|
LhButton / LhTag | Enter / Space でクリックを発火 |
LhSwitch | Enter / Space で切り替え |
LhSelect | ArrowUp / ArrowDown で選択肢をハイライト、Enter で選択、Escape で閉じる |
LhDialog | Escape で閉じる(スタック最上位のオーバー レイのみ応答) |
LhTooltip | Escape で閉じる |
複数のオーバーレイが重なっている場合は useLhOverlayStack が開いた順のスタックを管理し、Escape はスタック最上位だけを閉じます。一度のキー操作で全オーバーレイが消えるのを防ぎます。
フォーカス管理
LhDialogは開いている間useLhFocusTrapでフォーカスをダイアログ内に制限し(Tab / Shift+Tab が外に逃げない)、閉じた後にフォーカスをトリガーに返しますLhFormItemは label のクリック時に内容領域の最初のフォーカス可能要素にフォーカスします(focusControl)。ネイティブの label ラップは複合コントロールでは信頼できないためです
装飾的なアイコン
LhIcon はデフォルトで decorative:aria-hidden="true" を出力し、スクリーンリーダーからは見えません。セマンティクスを持たせたい場合は decorative={false} + ariaLabel を渡してください:
<LhIcon name="search" decorative={false} ariaLabel="検索" />
この時 <svg role="img" aria-label="検索"> として描画されます。
StrictMode の安全性
すべてのコンポーネントは React StrictMode 下で安全です:effect の cleanup と重複マウントはすべて冪等に処理されます(オーバーレイスタックの登録 / 削除、スクロールロックの保持者検証、focus trap の解放)。
ファミリーの一致性
アクセシビリティの挙動は『设计语言基线』に登録され、双血脈(web / ネイティブ)の統一契約です。各端は同一の @lh-ui/share/core ロジックで実装され、aria 属性とキーのセマンティクスが一致します。