Slide 1

Slide 1 text

田嶋幸智子 株式会社SmartHRアクセシビリティエンジニア コンポーネントライブ ラリで実現する、 アクセシビリティの正 しい実装パターン

Slide 2

Slide 2 text

「TypeScriptとReactで、 WAI-ARIAの属性を正しく利用する」 トグルルーム 15:50~16:20 ✕ WAI-ARIA の詳しい使い方や全般的な注意点 ✕ TypeScriptのニッチな話 話さないこと ○ コンポーネントライブラリの嬉しさ ○ コンポーネントライブラリでアクセシブル な実装をするときに気をつけていること このLTで話すこと はじめに

Slide 3

Slide 3 text

⚫ 2024年8月入社(入社して9ヶ月) ⚫ 前職はフロントエンドエンジニア ⚫ 最近ポケポケに課金するべきか悩んでいる SmartHR / アクセシビリティエンジニア たじまん (tajiman, schktjm) 自己紹介

Slide 4

Slide 4 text

※ チームトポロジーで定義されたチームのひとつ ⚫ アクセシビリティ本部というイネイブリング チーム※ に所属 ⚫ アクセシビリティスペシャリストとアクセシ ビリティテスターが同じチームにいる アクセシビリティの専門知識をもつエンジニア アクセシビリティエンジニア 自己紹介

Slide 5

Slide 5 text

労働にまつわる社会課題をなくし、 誰もがその人らしく働ける社会をつくる。 well-working 会社紹介

Slide 6

Slide 6 text

2015年のローンチ以降 継続的に新プロダクトをリリースし 領域を拡大していきます サービス紹介

Slide 7

Slide 7 text

急成長するプロダクトの アクセシビリティ品質を 保つには 01

Slide 8

Slide 8 text

プロダクトを早く アクセシブルな状態で 届ける 【私たちが目指していること】 アクセシビリティ本部のミッション

Slide 9

Slide 9 text

できるならしたいけどネ すべての開発者を アクセシビリティマスターにする ということではありません アクセシビリティ本部のミッション

Slide 10

Slide 10 text

仕組みを作ろうとしています すべての開発者がWAI-ARIAを完 全に理解しなくてもプロダクトが アクセシブルになる アクセシビリティ本部のミッション

Slide 11

Slide 11 text

リッチなアプリケーションの 状態や意味を支援技術に伝える HTML属性 WAI-ARIA(ARIA)とは アクセシビリティ文脈でよく聞く「ARIA」

Slide 12

Slide 12 text

大いなる力 破壊することもできる 強化することも ARIAは支援技術のウェブの体験を、 アクセシビリティ文脈でよく聞く「ARIA」

Slide 13

Slide 13 text

WAI-ARIAはどのような場合に使うとよいでしょうか A. HTMLだけでは十分にセマンティクスを表現 しきれないときにWAI-ARIAを利用します。 Q.WAI-ARIAはどのような場合に使えばいいの? アクセシビリティ文脈でよく聞く「ARIA」

Slide 14

Slide 14 text

判断するのむつかしい … 十分なセマンティクス? アクセシビリティ文脈でよく聞く「ARIA」

Slide 15

Slide 15 text

アクセシブルな コンポーネントライブラリを提供して、 現場で判断コストを下げよう! アクセシビリティ文脈でよく聞く「ARIA」

Slide 16

Slide 16 text

コンポーネントライブラリで、 アクセシビリティ品質を守る 02

Slide 17

Slide 17 text

SmartHRらしさを表現するための基準や素材 SmartHR Design System デザインシステム

Slide 18

Slide 18 text

SmartHR UI ⚫ Reactでつくられたコンポーネント集 ⚫ OSSとして公開されている ⚫ 社内の有志のメンバーによりメンテナンスされている コンポーネントライブラリ

Slide 19

Slide 19 text

⚫ アクセシビリティ品質を保つ ⚫ シンプルで誤用をしにくい つくりにする 【大事にしていること】 アクセシブルなコンポーネントをつくるために

Slide 20

Slide 20 text

実際のコンポーネントをもとに 実践してみよう アクセシブルなコンポーネントをつくるために

Slide 21

Slide 21 text

⚫ title: string; //必須 ⚫ children: ReactNode; //必須 ⚫ errorMessage?: ReactNode; ⚫ helpMessage?: ReactNode; … まず入力要素以外をまとめられそう アクセシブルなコンポーネントをつくるために

Slide 22

Slide 22 text

⚫ 様々な入力要素 ⚫ 前後の補足の文章や画像 childrenとして渡すもの アクセシブルなコンポーネントをつくるために

Slide 23

Slide 23 text

etc. ①適切なラベルを紐づける ②説明テキストも紐づける ③エラー状態のとき色だけで 表現しない アクセシビリティチェックポイント アクセシブルな実装を考える

Slide 24

Slide 24 text

※childrenにはInput要素とラベルには適さ ないアイコンが入っている状態 ① 適切なラベルを紐づける アクセシブルな実装を考える

Slide 25

Slide 25 text

⚫ childrenに渡された入力要素にラベルがアクセ シブルネームとして紐づくようにする ⚫ childrenは入力要素以外が入ることも許容する 【ポイント】 ①適切なラベルを紐づける

Slide 26

Slide 26 text

コンポーネントライブラリで提供する入力要素に 共通のデータ属性を定義する ①適切なラベルを紐づける

Slide 27

Slide 27 text

データ属性を使って入力要素を取得 ①適切なラベルを紐づける

Slide 28

Slide 28 text

childrenに入力要素以外が含ま れていても、正しくラベルと紐 づけられるように ①適切なラベルを紐づける

Slide 29

Slide 29 text

② 説明テキストを aria-describedbyで紐づける

Slide 30

Slide 30 text

⚫ 補足のテキストを入力要素を詳しく説明する ものとして入力要素に登録する ⚫ スクリーンリーダー向けに補足テキストを無 闇に増やすのではなく、表示している情報と 揃えるということを意識する 【ポイント】 ②説明テキストをaria-describedbyで紐づける

Slide 31

Slide 31 text

入力要素を詳しく説明するもの として紐づけされる 説明要素のIDを連結して入力 要素のaria-describedby に渡す ②説明テキストをaria-describedbyで紐づける

Slide 32

Slide 32 text

②説明テキストをaria-describedbyで紐づける

Slide 33

Slide 33 text

③ エラーを色だけで表現しない

Slide 34

Slide 34 text

⚫ 入力が想定される形じゃないことを色以外の 情報でも伝えたい ⚫ バリデーション実行後、スクリーンリーダー にも何がエラーになったか伝わるように 【ポイント】 ③エラーを色だけで表現しない

Slide 35

Slide 35 text

入力要素の入力が想定される形で はないことを表現できる props.errorMessage > 0 の場合、 入力要素に aria-invalid=“true” を つける ③エラーを色だけで表現しない

Slide 36

Slide 36 text

③エラーを色だけで表現しない

Slide 37

Slide 37 text

エラー要素が追加されると スクリーンリーダーユーザーに通 知が出る エラー文言のラッパーに role=“alert” をつける ③エラーを色だけで表現しない

Slide 38

Slide 38 text

③エラーを色だけで表現しない

Slide 39

Slide 39 text

でも単体で使っちゃうとアクセシブルじゃなくなる!? これで、入力要素とを 使えばアクセシブルになる状態になった!

Slide 40

Slide 40 text

入力要素を もしくは で囲むことを促すEslintの独自ルール smarthr/a11y-input-in-form-control

Slide 41

Slide 41 text

Eslintの独自ルールの話は、テックブログにあ がっているので気になる方は見てください!

Slide 42

Slide 42 text

⚫ アクセシブルなコンポーネントライブラリを提供するこ とでプロダクトを最初からアクセシブルにできる ⚫ 想定されるパターンや使い方をPropsやeslintを使って限 定することで、意図通りのアクセシビリティを届ける まとめ

Slide 43

Slide 43 text

Q. コンポーネントライブラリにない パターンが出てきたらどうするの? Q&A

Slide 44

Slide 44 text

⚫ 新規の概念が出てきたとき、アクセシビリティ本部 がアクセシブルな実装を検討する ⚫ 場合によってはSmartHR UIに逆輸入する ⚫ プロデザが既存のパターンで表現できないか徹底的 に検討しているので、プロダクトごとに微妙に異な る状態はない A. アクセシビリティ本部で実装の補助を したりチェックをしています。 Q&A

Slide 45

Slide 45 text

We are hiring!! https://recruit.smarthr.co.jp/ ありがとうございました