web-design-guidelines について
web-design-guidelinesは、Webインターフェースを監査する開発者向けのガイドです。アクセシビリティ、性能、レスポンシブ設計などを扱い、確認順序と報告形式も定めています。
主な機能
- 01アクセシビリティとARIAの確認
- 02性能とCore Web Vitalsの指針
- 03レスポンシブ設計の推奨事項
- 04コンポーネント、CSS、安全性のルール
- 05優先度付き監査チェックリスト
- 06統一された指摘形式
活用シーン
- 01UIコードのアクセシビリティ監査
- 02各画面幅での表示確認
- 03性能と読み込み状態の評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ cloudai-x/ claude-workflow-v2 --skill web-design-guidelinesインストール後、Claude Code で/web-design-guidelinesを入力して読み込まれたか確認します。
詳細
Web Interface Guidelines
読み込むタイミング
- トリガー:UI 監査、アクセシビリティチェック、レスポンシブデザインレビュー、UX のベストプラクティス評価
- スキップ:UI コンポーネントを含まないバックエンドのみの作業
Web インターフェースをレビューするための自己完結型ガイドラインです。UI コードを監査する際に、これらのルールを適用してください。
出力形式
次の形式で問題を報告してください:file:line — [RULE_ID] description
例:src/Button.tsx:12 — [A11Y-01] アイコンボタンに aria-label がありません
1. アクセシビリティ(A11Y)
A11Y-01:セマンティック HTML
- アクションには
<button>、ナビゲーションには<a>、データ入力には<input>を使用します - インタラクティブ要素に
<div onClick>や<span onClick>を使用しないでください - ランドマークには
<nav>、<main>、<aside>、<header>、<footer>を使用します
A11Y-02:ARIA ラベル
- すべてのインタラクティブ要素に、アクセシブルな名前を設定する必要があります
- アイコンのみのボタンには、必ず
aria-labelを設定します - フォーム入力には、対応する
<label>またはaria-labelを設定する必要があります - 画像には
altテキストが必要です(装飾画像の場合はalt="")
A11Y-03:キーボード操作
- すべてのインタラクティブ要素に Tab キーで移動できる必要があります
- カスタムコンポーネントには、適切な
role、tabIndex、キーイベントハンドラーが必要です - フォーカスを視認できるようにします(代替手段なしで
outline: noneを使用しないでください) - モーダル/ダイアログではフォーカスをトラップし、閉じたときにフォーカスを元の位置に戻す必要があります
A11Y-04:色とコントラスト
- テキストのコントラスト比は最低 4.5:1(大きなテキストは 3:1)にします
- 意味を色だけで伝えないでください(アイコン、テキスト、パターンを追加します)
- 200% のズームでも UI を使用できるようにします
A11Y-05:スクリーンリーダー
- 動的コンテンツの変更には
aria-live領域が必要です - 読み込み状態には
aria-busy="true"を設定します - エラーメッセージは
aria-describedbyで入力欄に関連付けます
2. パフォーマンス(PERF)
PERF-01:画像の最適化
next/imageまたはsrcsetを使ったレスポンシブ画像を使用します- レイアウトシフトを防ぐため、
widthとheightを指定します - ファーストビューより下の画像は遅延読み込みします:
loading="lazy" - フォールバックを用意したうえで WebP/AVIF を使用します
PERF-02:バンドルサイズ
- バレルインポートは使用しません:
import { Button } from 'lib'ではなくimport Button from 'lib/Button'を使用します(またはoptimizePackageImportsを有効にします) - CSS をツリーシェイクします:CSS モジュール、または Tailwind の
content設定(v3)/自動検出(v4)を使用します - ルートと大きなコンポーネントは遅延読み込みします:
React.lazy()または動的インポートを使用します
PERF-03:レンダリング
- レイアウトスラッシングを避けます:ループ内で DOM の読み取りと書き込みを繰り返さないでください
will-changeは必要な場合に限って使用します(アニメーションが明確に分かっている場合のみ)- JS アニメーションより CSS アニメーションを優先します
- 60fps のアニメーションには
transformとopacityを使用します(コンポジターのみで処理)
PERF-04:Core Web Vitals
- LCP < 2.5s:最大の画像/テキストを最適化し、重要なリソースをプリロードします
- INP < 200ms:メインスレッドで長時間タスクを実行せず、重要でない JS は後回しにします
- CLS < 0.1:画像/埋め込みコンテンツに寸法を指定し、ファーストビューより上にコンテンツを挿入しないようにします
3. レスポンシブデザイン(RD)
RD-01:モバイルファースト
- モバイル向けの基本スタイルを設定し、その後
@media (min-width)で大きな画面向けのスタイルを追加します - タッチターゲットは最小 44x44px にします
- どのビューポートでも横スクロールが発生しないようにします
RD-02:流動的なレイアウト
- タイポグラフィには
pxではなくrem/emを使用します - 流動的なタイポグラフィには
clamp()を使用します:font-size: clamp(1rem, 2.5vw, 2rem) - 固定幅より Flex/Grid を優先します
- コンテンツの最大幅は、読みやすさを考慮して
max-width: 65chにします
RD-03:ブレークポイント
- デバイスではなく、コンテンツに応じたブレークポイントを設定します
- 一般的な設定:640px(sm)、768px(md)、1024px(lg)、1280px(xl)
- 320px、375px、768px、1024px、1440px、1920px でテストします
4. コンポーネントのパターン(CP)
CP-01:フォーム
- 入力欄の横にインラインでバリデーションエラーを表示します
- モバイルキーボード向けに
type="email"、type="tel"、inputmode="numeric"を使用します - 送信中は送信ボタンを無効にします(二重送信を防止)
- エラー時もフォームの状態を保持します(入力欄をクリアしないでください)
CP-02:読み込み状態
- コンテンツ領域ではスピナーよりスケルトン画面を表示します
- 時間のかかる処理では進行状況を示します(スピナーよりプログレスバーを優先)
- 読み込み中はインタラクティブ要素を無効にします
- 読み込み中のコンテナには
aria-busy="true"を設定します
CP-03: エラー状態
- 実行可能なエラーメッセージを必ず表示します(単に「エラー」と表示するのではなく、「再試行」ボタンを用意します)
- 技術的なエラーをユーザーに表示しないでください(内部でログに記録し、わかりやすいメッセージを表示します)
- React コンポーネントツリーにエラーバウンダリーを設定します
- ネットワーク障害に対する再試行ロジックを実装します
CP-04: 空の状態
- 空白のページを表示せず、役立つ空の状態を用意します
- 行動を促すメッセージを含めます:「まだ項目がありません。最初の項目を作成してください。」
- イラストは控えめに使用します(バンドルサイズが増加します)
CP-05: モーダルとダイアログ
<dialog>要素、または適切なrole="dialog"を使用します- モーダル内にフォーカスを閉じ込めます
- Escape キーと背景のクリックで閉じるようにします
- 閉じたときに、トリガー要素へフォーカスを戻します
- 開いている間は body のスクロールを防ぎます
5. CSS のプラクティス(CSS)
CSS-01: 詳細度
- ID セレクターや要素セレクターよりもクラスセレクターを優先します
!importantは避けます(詳細度またはカスケードレイヤーを使用します)- テーマ設定には CSS カスタムプロパティを使用します
- 余白の方向を統一します。
margin-topよりもmargin-bottomを優先します
CSS-02: レイアウト
- 1 次元レイアウトには Flexbox、2 次元レイアウトには Grid を使用します
- レイアウトには
position: absoluteを避けます(オーバーレイにのみ使用します) - Flexbox や Grid の子要素間の余白には、マージンよりも
gapを使用します - 高さ全体を使うレイアウトには、
100vhではなくmin-height: 100dvhを使用します
CSS-03: ダークモード
prefers-color-schemeメディアクエリーを使用します- すべての色を CSS カスタムプロパティとして定義します
- 両方のモードをテストし、どちらもコントラストを確認します
- 色を単純に反転するのではなく、ダークモード向けに意図的にデザインします
6. セキュリティ(SEC)
SEC-01: コンテンツセキュリティ
- サニタイズせずに
dangerouslySetInnerHTMLを使用しないでください - ユーザー生成コンテンツは、レンダリング前にサニタイズします
target="_blank"を指定した外部リンクにはrel="noopener noreferrer"を使用します
SEC-02: フォームと入力
- すべてのフォームで CSRF 対策を行います
- フォーム送信をレート制限します
- クライアントとサーバーの両方で検証します
7. 国際化(I18N)
I18N-01: テキスト
- 文字列をハードコードせず、i18n ライブラリまたは定数を使用します
- RTL レイアウトに対応します。
logical propertiesを使用し(margin-leftよりもmargin-inline-startを優先します) - テキストを切り詰めないでください。デザインはテキストが 40% 増えることを想定する必要があります
<html>タグにlang属性を使用します
レビューチェックリスト
ファイルを監査する際は、次の順序(最初に CRITICAL)で確認します。
- CRITICAL:A11Y-01、A11Y-02、SEC-01 — セマンティック HTML、ARIA、XSS 対策
- HIGH:PERF-04、A11Y-03、CP-01 — Core Web Vitals、キーボード操作、フォーム
- MEDIUM:RD-01、CSS-02、CP-02、CP-03 — レスポンシブ対応、レイアウト、読み込み/エラー
- LOW:CSS-03、I18N-01、CP-04 — ダークモード、i18n、空の状態
コメント
Markdown 対応