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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for mattsuu mattsuu
September 07, 2024

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

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

Avatar for mattsuu

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