Slide 1

Slide 1 text

React Spectrum Libraries によるアクセシブルなUIの構築 @ryo_manba 2023/12/14 Nihonbashi.js #8

Slide 2

Slide 2 text

⾃⼰紹介 • まっつー / Ryo Matsukawa • X(@ryo_manba) • Cybozu のフロントエンドエンジニア • 最近は Next.js の App Router 書いてます

Slide 3

Slide 3 text

話すこと 1. アクセシブルなコンポーネントについて 2. React Spectrum Libraries について 3. React Aria による振る舞いの実装 4. React Stately による状態の管理 5. メリット / デメリット 6. まとめ

Slide 4

Slide 4 text

ウェブアクセシビリティとは • ⼼⾝の機能に制約のある⼈でも、情報にアクセスし利⽤できること • ⼀時的な障害や状況的制約を持つ⼈々にもアクセスを提供する • メガネやコンタクトレンズを忘れたとき • マウスやキーボードの故障 • サポート例 • 視覚障害︓読み上げ機能 • 上肢障害︓細かい⼒加減が必要ない、インタラクティブな要素の設計

Slide 5

Slide 5 text

どのように実装するか • W3C の Authoring Practices Guide(APG) が役⽴つ • UI コンポーネントをアクセシブル にするための実装例と解説

Slide 6

Slide 6 text

APG のガイドライン • WAI-ARIA 属性の正しい使⽤⽅法やキーボードサポートなど、 アクセシブルなコンポーネント実装について解説されている

Slide 7

Slide 7 text

アクセシブルな実装における問題点 • WAI-ARIA 属性 • 使い⽅を誤ると本来の⽬的とは逆にアクセシビリティを低くしてしまう • キーボードサポート • 各キー⼊⼒に対してイベントハンドラを実装するとコード量が肥⼤する • ドメインロジックとの組み合わせでメンテが⼤変に aria-label などのスクリーンリーダーによる対応やキーボード、タッチデバイス による操作性については妥協するしかない…︖

Slide 8

Slide 8 text

React Spectrum Libraries • Adobe が提供するアクセシブルで堅牢なユーザー体験を⽀援 するライブラリ郡 • 4種類が提供されている • Internationalized︓国際化⽤のライブラリ • React Spectrum︓Adobe のデザインシステムを実装したもの • React Aria︓アクセシビリティと動作を提供する • React Stately︓クロスプラットフォームの状態管理

Slide 9

Slide 9 text

React Spectrum の設計思想 • State Hook • プラットフォーム間で共有され、ウェブ、React Native、 その他のどのプラットフォームでも動作する状態管理 • Behavior Hook • イベント処理、アクセシビリティ、国際化 • Component • Behavior Hook と State Hook を組み合わせて ⾒た⽬を実装

Slide 10

Slide 10 text

React Spectrum の設計思想

Slide 11

Slide 11 text

React Aria • React Hooks のライブラリ • useButton, useSelect, etc.. • UI コンポーネントにアクセシビリティと動作 を提供する • マウス、タッチ、キーボード、 スクリーンリーダーのサポート • マルチブラウザやクロスプラットフォーム、 国際化に対応

Slide 12

Slide 12 text

React Aria の使⽤例 • レンダリングを提供しないため、 DOM の構造を⾃由に定義 できる • Hooks によって返される DOM Props を適切な要素 に渡すのは実装者の責務

Slide 13

Slide 13 text

useButton を使う理由 • ボタンは実際にはかなりのインタラクションをサポートしている • マウスによるクリック • タッチスクリーンでのタップ • キーボードによるフォーカスと Enter や Space キーにより有効化 • スクリーンリーダーなどの⽀援技術 • デバイスやブラウザ間で動作が異なる • 詳しくは React Spectrum が提供しているブログを参照 • Building a Button Part 1: Press Events

Slide 14

Slide 14 text

React Stately • React Hooks のライブラリ • useSelectState, useTableState, etc.. • クロスプラットフォームの状態管理を 提供する • React Aria と組み合わせて使⽤できる

Slide 15

Slide 15 text

React Stately の使⽤例 • React Aria との 組み合わせが容易 • setValue などのメソッドで 外部から状態を変えることも できる

Slide 16

Slide 16 text

React Aria と React Stately のメリ/デメ • メリット • 柔軟なカスタマイズが可能 • 操作やアクセシビリティをコンポーネントの実装から切り出せる • デメリット • 意図的に低レベルな API として作られているため、学習コストがかかる

Slide 17

Slide 17 text

React Aria Components • React Aria と React Stately を組み合わせた Headless UI ライブラリ • スタイルを当てるだけで簡単に実装できる • 2023年内に安定版の v1.0 のリリースが明⾔されている

Slide 18

Slide 18 text

React Aria Components

Slide 19

Slide 19 text

まとめ • Headless UI ライブラリと⽐べ、柔軟なカスタマイズが可能 • React Aria Components から導⼊してみて、 必要に応じて React Aria と React Stately を活⽤すると良さそう • React Spectrum Libraries を活⽤してアクセシブルなコンポーネント を実装しよう