AgentSkillsCN

ui-design-patterns

UI 组件设计模式、布局最佳实践以及无障碍访问指南。当您设计表单、布局、导航,或落实 WCAG 标准时,此技能将大显身手。

SKILL.md
--- frontmatter
name: ui-design-patterns
description: UI component design patterns, layout best practices, and accessibility guidelines. Use when designing forms, layouts, navigation, or implementing WCAG compliance.
version: 1.0.0

UI Design Patterns

UI コンポーネント設計パターン、レイアウト設計、アクセシビリティガイドライン。

前提条件

  • React/Vue/Svelte などのコンポーネントベースフレームワーク
  • TypeScript 推奨(型安全な Props 定義)

コンポーネント設計パターン

Atomic Design 階層

レベル責務
AtomsButton, Input, Label単一責任、再利用可能
MoleculesSearchBar, FormFieldAtoms の組み合わせ
OrganismsHeader, ProductCardビジネスロジック含む
TemplatesPageLayout構造定義(スロット配置)
PagesHomePageデータ注入・状態管理

フォーム設計パターン

1. Controlled vs Uncontrolled

パターン用途
Controlledリアルタイム検証、動的 UI<input value={state} onChange={...} />
Uncontrolledシンプルなフォーム、パフォーマンス重視<input ref={inputRef} />

推奨: 大半は Controlled で統一し、パフォーマンスが問題になった場合のみ Uncontrolled を検討。

2. バリデーション戦略

タイミング用途UX 特性
onChangeリアルタイムフィードバック即時性高、CPU負荷あり
onBlurフィールド離脱時検証バランス良好
onSubmit最終検証遅延フィードバック

推奨: onBlur + onSubmit の組み合わせ。

3. エラー表示パターン

パターン特徴適用場面
Inlineフィールド直下にエラー表示個別フィールドエラー
Summaryフォーム上部にまとめて表示複数エラーの概要
Toast非破壊的通知保存成功/失敗

コンポーネント Props 設計

Bad: 曖昧な Props

tsx
// 何を渡すべきか不明
<Button type="1" size="big" />

Good: 明確な Union Types

tsx
interface ButtonProps {
  variant: 'primary' | 'secondary' | 'danger' | 'ghost';
  size: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  loading?: boolean;
}

<Button variant="primary" size="md" loading />

レイアウトパターン

Grid vs Flexbox 使い分け

パターンGridFlexbox
2次元レイアウト(行と列)
1次元並び(横 or 縦)
不均等分割
要素サイズが動的

経験則: 「グリッド状」なら Grid、「並び」なら Flexbox。

レスポンシブ戦略

Mobile-first ブレークポイント

css
/* Base: mobile */
.container { padding: 1rem; }

/* Tablet */
@media (min-width: 768px) {
  .container { padding: 2rem; }
}

/* Desktop */
@media (min-width: 1024px) {
  .container { padding: 3rem; max-width: 1200px; }
}

よく使うレイアウトパターン

パターン構造用途
Holy GrailHeader + (Sidebar + Main + Sidebar) + Footerダッシュボード
Card Grid均等グリッド配置商品一覧、ギャラリー
Sticky Header固定ヘッダー + スクロールコンテンツ一般的な Web サイト
Sidebar Navigation固定サイドバー + メインコンテンツ管理画面

詳細は references/layout-patterns.md を参照。


アクセシビリティ(WCAG 2.1)

必須チェックリスト

項目実装確認方法
キーボード操作tabIndex, onKeyDownTab キーで全要素にアクセス可能
スクリーンリーダーaria-label, aria-describedbyVoiceOver/NVDA でテスト
コントラスト比4.5:1 (AA), 7:1 (AAA)Chrome DevTools でチェック
フォーカス表示focus-visible スタイル視覚的なフォーカスリング

aria-* 属性リファレンス

属性用途
aria-label視覚的ラベルなしの要素アイコンボタン
aria-describedby追加説明の関連付けフォームヘルプテキスト
aria-expanded展開状態アコーディオン、ドロップダウン
aria-hidden装飾要素の非表示アイコン(テキストと併用時)
aria-live動的更新の通知通知、ローディング状態
aria-invalid入力エラー状態フォームバリデーション

詳細は references/accessibility-guide.md を参照。

フォーカス管理

モーダルのフォーカストラップ

tsx
// モーダルを開いたら最初のフォーカス可能要素にフォーカス
// Tab でモーダル内のみ循環
// Escape で閉じる
// 閉じたら元のトリガー要素にフォーカスを戻す

スキップリンク

html
<a href="#main-content" class="skip-link">
  メインコンテンツへスキップ
</a>

使用例

フォーム設計依頼

code
User: "ログインフォームを設計して"

Claude:
1. Controlled パターンで状態管理
2. onBlur + onSubmit バリデーション
3. Inline エラー表示
4. aria-invalid でエラー状態を伝達
5. 送信ボタンに loading 状態

レイアウト設計依頼

code
User: "ダッシュボードのレイアウトを作成して"

Claude:
1. Sidebar Navigation パターンを採用
2. CSS Grid で 2 カラムレイアウト
3. サイドバー: 固定幅 240px
4. メイン: 残り幅(fr 単位)
5. モバイル: ハンバーガーメニューに切り替え

アクセシビリティ改善依頼

code
User: "このコンポーネントを a11y 対応して"

Claude:
1. インタラクティブ要素に role 属性追加
2. aria-label/aria-describedby 設定
3. キーボードナビゲーション実装
4. コントラスト比確認
5. フォーカス表示追加

エラーハンドリング

状況対応
デザインシステム未定義Atomic Design を提案
a11y 要件不明WCAG 2.1 AA を基準に
ブレークポイント未定義768px / 1024px を提案
コンポーネント粒度の判断3回以上再利用されるなら分離

リソース

references/

  • component-patterns.md: コンポーネント設計パターン詳細
  • layout-patterns.md: レイアウトパターン詳細
  • accessibility-guide.md: WCAG 2.1 AA チェックリスト・aria-* 完全ガイド