Upgrade to Pro — share decks privately, control downloads, hide ads and more …

React Aria で実現する次世代のアクセシビリティ

mattsuu
September 07, 2024

React Aria で実現する次世代のアクセシビリティ

Web Developer Conference 2024 (2024/09/07) での発表資料
https://web-study.connpass.com/event/321711/

mattsuu

September 07, 2024
Tweet

More Decks by mattsuu

Other Decks in Technology

Transcript

  1. React Aria とは • Adobe が提供する Headless UI ライブラリ •

    APG に従ってセマンティクスとキーボード操作が実装 • モバイルや支援技術での振る舞いもサポート 7
  2. React Aria の活用事例 • Apple の iCloud で一部使用されている • デジタル庁のデザインコンポーネントで、React

    Aria が 推奨されている(他に Radix UI など) • サイボウズでも導入経験あり https://blog.cybozu.io/entry/2024/05/22/090000 8
  3. Adobe (Spectrum) が提供するライブラリ • React Aria • React Stately •

    React Aria Components • React Spectrum • Internationalized 9
  4. Adobe (Spectrum) が提供するライブラリ • React Aria • React Stately •

    React Aria Components • React Spectrum • Internationalized この3つを使う 10
  5. • Hooks 内部で State をもと に ARIA を動的に設定 • 呼び出し元では

    props を そのまま DOM に渡す React Aria Hooks と React Stately の連携 14
  6. Hooks だけでは実装が大変 • React Aria Hooks と React Stately を適切に組み合わせ

    て、コンポーネントを作るのはやや難易度が高い • RadixUI や Ark UI のような Headless UI コンポーネント ライブラリのほうが気軽に使える... 18
  7. React Aria Components 20 • React Aria Hooks と React

    Stately を組み合わせて構築 された Headless UI コンポーネント • 40以上のカスタマイズを可能なコンポーネントを提供
  8. 課題が解決された • React Aria Hooks: 振る舞いとアクセシビリティを提供 • React Stately: コンポーネント特有の状態管理

    React Aria Components の登場により学習難易度が高い問 題が解消される→ 基本はコンポーネントを組み合わせてスタ イルを当てるだけ 21 学習難易度が高い...
  9. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 23
  10. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 24
  11. APG は仕様ではない • APG の目的は ARIA 1.2 の適切な仕様を説明すること • APG

    のコードを本番で使用する際は各ブラウザと支援技 術の組み合わせでテストすることが望まれる 25 https://www.w3.org/WAI/ARIA/apg/practices/read-me-first
  12. React Aria のテスト状況 複数のデバイスとブラウザ、スクリーンリーダーを組み合わ せてテストを実施している 26 デバイス ブラウザ スクリーンリーダー macOS

    Safari, Chrome VoiceOver Windows Firefox, Chrome JAWS, NVDA iOS Safari VoiceOver Android Chrome TalkBack https://react-spectrum.adobe.com/react-aria/accessibility.html
  13. なぜ Adobe が力を入れているのか • 数百を超える製品があり UI の一貫性やアクセシビリ ティ、国際化、使いやすさなど高い基準が設定されてい る •

    React Aria を OSS としてコミュニティに共有し、 Web アプリケーションの水準を共に高めようとしている 27 https://react-spectrum.adobe.com/blog/introducing-react-spectrum.html
  14. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 28
  15. • Vanilla CSS, TailwindCSS, Styled Components, Panda CSS, etc.. •

    Framer Motion などの JavaScript アニメーション ライブラリも使える 任意の CSS フレームワークが使用可能 29
  16. • Vanilla CSS と Tailwind CSS のサンプル実装が Storybook にまとまっ ている

    • ソースコードは Zip で 落とせる 充実した Starter Kits 30
  17. data 属性を使ったスタイルの適用 • :hover や :active などを data 属性で公開している •

    マウス、タッチ、キーボードといった異なる操作方法で も一貫した動作を保証する 31
  18. どのように解決しているか • usePress, useHover, useFocus などの hooks で状態を管 理している •

    詳しくは Spectrum のブログを読んでみてください ◦ Building a Button Part 1: Press Events ◦ Building a Button Part 2: Hover Interactions ◦ Building a Button Part 3: Keyboard Focus Behavior 34
  19. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 39
  20. Collection の概要 • Menu や Listbox などの複数の要素を組み合わせたコン ポーネントを一貫して扱うための JSX ベースの

    API • 大規模なコレクションでもパフォーマンスが低下しない ように設計されている • 静的コレクションと動的コレクションの2種類がある 40
  21. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 46
  22. 様々なライブラリと組み合わせられる React Server Actions や Remix actions, React Hook Form,

    Zod など様々なライブラリとの組み合わせられる 51 https://react-spectrum.adobe.com/react-aria/forms.html
  23. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 52
  24. React Aria の特徴 • アクセシビリティ • スタイリング • コレクション •

    フォーム • 拡張性に優れた設計 • 多言語対応 • ドラッグアンドドロップ 54
  25. React Aria の特徴 • アクセシビリティ • Styling • Collection •

    Form • 多言語対応 • 拡張性 • ドラッグアンドドロップ 59
  26. ドラッグアンドドロップの課題 • ブラウザ間の互換性 ◦ HTML Drag and Drop API のイベントの順序や挙動がブラウザ

    によって異なる • アクセシビリティへの制約 ◦ キーボードとスクリーンリーダーのサポートが欠けている • APG に記載がない 60
  27. ドラッグアンドドロップの RFC が作成 • React Ariaでドラッグアンドドロップをサポートするた めの API とインタラクションを定義 •

    マウスやタッチ操作だけでなく、キーボードとスクリー ンリーダーの完全なサポートも目指す 61 https://github.com/adobe/react-spectrum/blob/main/rfcs/2020-v3-dnd.md
  28. RFC を元に実装 • マウスとタッチでは HTML Drag and Drop API を使用

    し、キーボードとスクリーンリーダー向けのインタラク ションをフルスクラッチで実装 • 13種類以上のブラウザバグの対処 • 確立されたパターンではないため、多くの実験と試行錯 誤を経て完成した 62 https://react-spectrum.adobe.com/blog/drag-and-drop.html
  29. どのように運用していたか • 刷新プロジェクトで全面的に React Aria を導入 • はじめはメンバーで勉強会を開催 ◦ Collection

    を理解する会、拡張の仕方を学ぶ会など • 初期は React Aria Hooks と React Stately の組み合わせ • 途中から React Aria Components をメインで活用 65
  30. 大変だったこと • 初期は React Aria hooks と React Stately を組み合わせ

    て作成していたため、学習コストがかかった • React Server Components との組み合わせにも多少問題 があった(現在は改修されている) 66