Promotee — 面接練習用フラッシュカードアプリの設計・開発
母語以外の言語で面接を受ける人向けに、CSVで用意した質問と回答を複数のモードで練習できるWebアプリを設計・実装。ログインやサーバー保存を必要としない構成とし、キーボード操作、モーション設定、動的通知などのアクセシビリティ対応も行った。
期間:2025年6月〜9月
関連サービス:
この実績が活きるご相談
WebアプリのUX設計、フロントエンド実装、状態管理、アクセシビリティ対応と検証に関する実績です。
- ユーザーが持ち込むデータの扱いを含めてWebアプリを設計したい
- フォームや動的な状態変化をキーボードや支援技術からも扱えるようにしたい
- 設計から実装、確認までを一貫して進めたい
概要
Promoteeは、英語など母語以外の言語で面接を受ける人のためのフラッシュカードアプリです。ユーザー自身が用意した質問と回答をCSVから読み込み、登録順、ランダム、カテゴリ別で練習できます。CSVの内容により、複数言語の質問と回答を扱えます。ログインは不要で、読み込んだ内容や練習状態はZustand storeで一時的に管理されます。データはサーバーに保存されず、ページをリロードすると消去されます。
背景
英語ネイティブではない自身の経験から、面接のように緊張する場面で、用意した回答を繰り返し練習できるツールを必要としていました。固定された教材を提供する形式ではなく、ユーザーが自分の面接に合わせた質問と回答を持ち込み、複数の方法で反復できる構成にしました。面接用の内容を扱うため、ログインやサーバー保存を必要としない設計を採用しています。
課題
- CSVで読み込んだ質問と回答を、複数の練習方法で扱えるようにする
- 「覚えた/まだ覚えていない」の状態を練習中だけ保持し、再練習できるようにする
- ログインやサーバー保存を使わずに練習フローを成立させる
- フォーム、カード操作、状態変化、通知などをキーボードや支援技術からも扱えるよう設計する
- アニメーションを含む画面で、モーション設定と読み込み性能を調整する
対象となる利用者
- 英語など、母語以外の言語で面接を受ける人
- 自分で準備した質問と回答を使って練習したい人
- 質問を登録順、ランダム、カテゴリ別に反復したい人
- 面接用の内容をサーバーへ保存せずに使いたい人
実施内容 / 進め方
練習フローと状態管理
- CSVから質問と回答を読み込み、登録順、ランダム、カテゴリ別で練習できるフローを実装
- 各カードを「覚えた/まだ覚えていない」に分け、リロードするまでは覚えていないカードを続けて練習できるようにした
- 読み込んだデータと練習状態をZustand storeで管理し、永続保存は行わない構成とした
画面構造とキーボード操作
- `header`、`main`、`footer`などのランドマークを使って画面構造を整理
- 本文へ直接移動するスキップリンクを実装
- フォームに`label`や`fieldset`を使用
- 主要画面の基本操作をTab、Shift+Tab、Enter、Space、矢印キーで確認
- フォーカス位置が分かるよう`:focus-visible`を設定
状態変化と通知
- カードの状態変更など、画面上で発生する動的な更新をLive Regionで通知
- React Toastifyに、`role="alert"`と`aria-live`を扱う独自ラッパーを実装
- 通知の種類が読み上げだけでも分かるよう、文脈を補うテキストを追加
コントラストとモーション
- WebAIM Contrast Checkerを使って色の組み合わせを確認
- WCAG AAのコントラスト比を満たしていなかったテキスト色と背景色を調整
- カード反転と完了時のアニメーションに、OSの`prefers-reduced-motion`とアプリ内設定を反映
- Reduced Motionが有効な場合は、回転や紙吹雪を使用せずに状態を切り替えるよう実装
動画とパフォーマンス
- 画面内で使用していたGIFをWebMとMP4の動画へ置き換え
- ファーストビューと説明用動画の用途に合わせ、ページごとに`preload`を調整
確認と検証
- 主要画面について、デスクトップとモバイルのLighthouse監査を実施
- クライアント側の状態を必要とする画面では、ローカル環境にダミーデータを読み込んで操作中の状態を再現
- VoiceOverで主要画面の基本操作、フォーム、ナビゲーション、状態通知を手動確認
設計・実装上のポイント
ログインと永続保存を必要としない構成
ユーザーが読み込んだ面接用データをZustand store内だけで扱い、サーバーには送信・保存しない構成にしました。リロードすると、読み込んだデータと練習状態が消去されます。
視覚以外でも伝わる状態変化
色やアニメーションだけに依存せず、カードの状態変更やToast通知をテキストとLive Regionでも伝えるようにしました。
画面ごとの読み込み調整
すべての動画に同じ読み込み方法を適用せず、表示位置と用途に合わせて動画形式と`preload`を設定しました。
成果物
- 公開Webアプリ
- CSV読み込みとフラッシュカード練習機能
- 登録順・ランダム・カテゴリ別の練習モード
- 一時的な「覚えた/まだ覚えていない」状態の管理と再練習機能
- キーボード操作と可視フォーカス
- Reduced Motion対応
- Live Regionを使用した通知
- アクセシビリティ実装のデモ動画
- Lighthouseおよびコントラスト確認結果
結果
Lighthouse Accessibility
主要画面 100(2025年)
Best Practices / SEO
主要画面 100(2025年)
Performance
動的画面を含めて97以上(2025年)
- ログインなしでCSVを読み込み、複数の方法で面接練習ができるWebアプリを公開
- 読み込んだCSVと練習状態をサーバーに保存しない構成を実装
- 主要画面の基本操作をキーボードとVoiceOverで確認
- コントラスト、モーション、フォーカス、フォーム、動的通知に関する対応を実装
掲載資料
キーボード操作とスキップリンク
キーボード操作時に表示され、本文へ直接移動できるスキップリンク。
セマンティックな画面構造
header、main、footerなどを使って整理したページ構造。
コントラストの確認と修正
WebAIM Contrast Checkerで確認した、色の組み合わせの修正例。
Reduced Motion
モーションを減らす設定が有効な場合のカード切り替え。
Toast通知のLive Region対応
Toast通知の内容を支援技術へ伝えるための実装。
2025年のLighthouse監査
2025年にデスクトップ環境で実施したLighthouse監査の一例。
振り返り
- 色の見え方は目視だけでは判断できないため、コントラスト比を計測して確認する必要があることを実装を通して確認した
- 自動監査、キーボード操作、スクリーンリーダーによる確認では、それぞれ確認できる範囲が異なる
- 動的な状態変化を含む画面では、コードや自動監査に加えて、実際の操作に沿った確認が必要だった
検証範囲
- Lighthouseの数値は2025年当時に実施した自動監査の結果
- 動的画面は、ローカル環境でダミーデータを使って必要なアプリ状態を再現して計測
- スクリーンリーダーによる確認は、macOSのVoiceOverを使った主要画面の基本操作が対象