---
name: interface-review
description: Review web interface implementations across Interactivity, Typography, Motion, Touch, Optimizations, Accessibility, and Design/UX. Based on industry best practices and UX psychology principles. Use for UI component and page implementation reviews.
allowed-tools: Read, Grep, Glob
---
# Interface Review Skill
このスキルは、Web インターフェースの実装を業界のベストプラクティスと UX 心理学に基づいてレビューします。
## 目的
- インタラクティブ要素のユーザビリティを検証
- タイポグラフィの品質を確認
- アニメーションとモーションの適切性をチェック
- タッチデバイス対応を検証
- パフォーマンス最適化を確認
- アクセシビリティ準拠を検証
- デザイン、ユーザー体験、UX 心理効果を統合的に評価
## レビュー領域
### 1. Interactivity(インタラクティビティ)
**主要チェックポイント**:
- フォーム要素の適切な実装
- ボタンの二重送信防止
- インタラクティブ要素の `user-select` 設定
- ラベルとインプットの関連付け
- Enter キーでのフォーム送信
**検証項目**:
```typescript
// ✅ 正しい実装
// ❌ 問題のある実装
{/* form タグなし */}
Email {/* label なし */}
{/* type が不適切 */}
```
### 2. Typography(タイポグラフィ)
**主要チェックポイント**:
- フォントスムージングの適用
- フォントウェイトの適切な使用(400 以上)
- タブラー数字の使用(テーブル、タイマーなど)
- レスポンシブなフォントサイズ(`clamp()` の使用)
- iOS での予期しないテキストリサイズ防止
**検証項目**:
```css
/* ✅ 推奨スタイル */
body {
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
h1 {
font-size: clamp(48px, 5vw, 72px);
font-weight: 500; /* 400 以上 */
}
.timer {
font-variant-numeric: tabular-nums;
}
/* ❌ 問題のあるスタイル */
p {
font-weight: 300; /* 400 未満 */
}
```
### 3. Motion(モーション・アニメーション)
**主要チェックポイント**:
- アニメーション時間は 200ms 以内
- テーマ切り替え時のトランジション防止
- 頻繁な操作には過度なアニメーションを避ける
- スケールアニメーションの適切な値
- 画面外での無限ループアニメーション停止
**検証項目**:
```typescript
// ✅ 適切なアニメーション
const Dialog = styled.div`
animation: fadeIn 150ms ease-out;
@keyframes fadeIn {
from {
opacity: 0;
transform: scale(0.95); /* 0 からではなく 0.95 から */
}
to {
opacity: 1;
transform: scale(1);
}
}
`;
// ❌ 過度なアニメーション
const Button = styled.button`
transition: all 500ms; /* 長すぎる */
&:active {
transform: scale(0.5); /* 変化が大きすぎる */
}
`;
```
### 4. Touch(タッチデバイス対応)
**⚠️ プロジェクト固有**: `:hover` は PostCSS プラグイン (`postcss-media-hover-any-hover`) が自動的に `@media (any-hover: hover)` でラップします。手動でメディアクエリを追加しないでください。
**主要チェックポイント**:
- インプットのフォントサイズ 16px 以上(iOS ズーム防止)
- タッチデバイスでの自動フォーカス無効化
- ビデオの自動再生設定(`muted`, `playsinline`)
- iOS タップハイライトの適切な置き換え
**検証項目**:
```css
/* ✅ 正しい実装 */
button {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
button:hover {
background-color: #eee; /* PostCSS が自動ラップ */
}
input {
font-size: 16px; /* iOS ズーム防止 */
}
/* ❌ 間違った実装 */
@media (any-hover: hover) {
/* 冗長 */
button:hover {
background-color: #eee;
}
}
input {
font-size: 14px; /* iOS でズーム発生 */
}
```
### 5. Optimizations(パフォーマンス最適化)
**主要チェックポイント**:
- 大きな `blur()` 値の回避
- GPU レンダリングの適切な使用 (`transform: translateZ(0)`)
- `will-change` の慎重な使用
- 画面外ビデオの停止または削除
- React レンダリングのバイパス(必要時のみ)
**検証項目**:
```typescript
// ✅ 最適化された実装
const BlurredBox = styled.div`
backdrop-filter: blur(8px); /* 適度な値 */
`;
// スクロールアニメーション時のみ will-change を適用
const handleScroll = () => {
element.style.willChange = 'transform';
// アニメーション処理
requestAnimationFrame(() => {
element.style.willChange = 'auto'; // 終了後に削除
});
};
// ❌ パフォーマンス問題
const HeavyBlur = styled.div`
backdrop-filter: blur(50px); /* 重すぎる */
will-change: transform, opacity; /* 常時適用は避ける */
`;
```
### 6. Accessibility(アクセシビリティ)
**主要チェックポイント**:
- 無効化ボタンへのツールチップ禁止
- フォーカスリングに `box-shadow` を使用
- アイコンのみの要素に `aria-label` 追加
- 画像は `
` タグで実装
- キーボードナビゲーション対応(↑↓ キー)
**検証項目**:
```typescript
// ✅ アクセシブルな実装
const FocusRing = styled.button`
&:focus-visible {
box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.5);
outline: none;
}
`;
// ❌ アクセシビリティ問題
{/* img タグなし */}
```
### 7. Design & UX(デザイン・UX・心理効果)
#### 実装面のチェックポイント
**UI パターンと実装**:
- 楽観的 UI 更新とロールバック
- サーバー側での認証リダイレクト
- `::selection` のスタイリング
- フィードバックのトリガー相対配置
- 空状態の適切な処理
**検証項目**:
```typescript
// ✅ 楽観的 UI 更新
const handleDelete = async (id) => {
// 即座に UI を更新
setItems(items.filter((item) => item.id !== id));
try {
await api.delete(id);
} catch (error) {
// エラー時にロールバック
setItems(originalItems);
showError('削除に失敗しました');
}
};
// ✅ フィードバックの相対配置
;
// ❌ 不適切なフィードバック
const handleCopy = () => {
copy(text);
showNotification('コピーしました'); /* 通知は不要 */
};
```
#### UX 心理効果のチェックポイント
**主要な心理効果**:
- 美的ユーザビリティ効果(視覚的洗練さ)
- 認知負荷の軽減(情報量、レイアウト、タイポグラフィ)
- 視覚的階層(見出し、本文、コードの優先度)
- ドハティの閾値(応答 400ms 以内)
- バナー・ブラインドネス回避(広告風デザインを避ける)
- 段階的開示(アコーディオン、タブの活用)
- 系列位置効果(重要項目の配置)
- ピーク・エンドの法則(ハイライトと締めくくり)
**技術ブログで特に重視すべき点**:
- コンテンツの質と明確性を最優先
- 技術記事ではコードブロック、シンタックスハイライト、適切な空白に注意
- タイトルの明確性(クリックベイト回避)
- 各記事の完結性を重視
- 過度な CTA や購読促進は控えめに
**検証項目**:
```typescript
// ✅ 認知負荷の軽減と視覚的階層
const Article = () => (
明確なタイトル
{/* 好奇心ギャップ回避 */}
{/* 視覚的階層: 見出し → 本文 → コード */}
セクション見出し
説明文...
{/* シンタックスハイライト適用 */}
{/* 段階的開示 */}
複雑な内容は折りたたみ
);
// ✅ ドハティの閾値(400ms 以内)
const handleAction = async () => {
// 即座に UI フィードバック
setLoading(true);
// バックグラウンド処理
await processData();
setLoading(false);
};
// ✅ バナー・ブラインドネス回避
const ImportantNotice = styled.div`
/* 広告風デザインを避ける */
background: transparent; /* 派手な背景色を避ける */
border: 1px solid var(--border);
padding: 16px;
`;
// ❌ 問題のある実装
const ClickbaitTitle = () => (
この方法を知らないと損します!
{/* 好奇心ギャップ */}
);
const OverwhelmingContent = () => (
{/* 認知負荷が高すぎる */}
段落1段落1段落1...
段落2段落2段落2...
{/* 適切な空白・階層なし */}
);
const SlowResponse = async () => {
await heavyOperation(); // 400ms 超過
updateUI(); // 遅すぎるフィードバック
};
```
**チェックリスト**:
- [ ] 楽観的 UI 更新を実装(実装面)
- [ ] フィードバックが適切な位置に表示(実装面)
- [ ] 空状態が適切に処理される(実装面)
- [ ] ページ応答時間が 400ms 以内(心理効果)
- [ ] 視覚的階層が明確(見出し、本文、コードの区別)(心理効果)
- [ ] 適切な空白とレイアウト(認知負荷軽減)(心理効果)
- [ ] コードブロックにシンタックスハイライト適用(心理効果)
- [ ] 重要情報が広告風デザインになっていない(心理効果)
- [ ] ナビゲーション項目が 7±2 個以内(心理効果)
- [ ] タイトルが明確で具体的(心理効果)
- [ ] 過度な購読促進・ポップアップなし(心理効果)
- [ ] 美的に洗練されたデザイン(心理効果)
- [ ] 複雑な情報は段階的に開示(心理効果)
## レビュー手順
### Step 1: ファイルの特定
対象ファイルを特定します:
- UI コンポーネント(`src/components/UI/`)
- Page コンポーネント(`src/components/Page/`)
- スタイル定義(`src/ui/`)
### Step 2: 領域別チェック
各領域のチェックポイントに従って検証:
1. **Interactivity**: フォーム、ボタン、インタラクティブ要素
2. **Typography**: CSS のフォント設定、font-weight
3. **Motion**: アニメーション、トランジション
4. **Touch**: メディアクエリ、フォントサイズ、タップ処理
5. **Optimizations**: blur, will-change、GPU 処理
6. **Accessibility**: aria-label、フォーカス、キーボード対応
7. **Design & UX**: UI パターン、フィードバック、心理効果、認知負荷、視覚的階層
### Step 3: 優先度の判定
検出された問題を優先度別に分類:
| 優先度 | 問題の種類 |
| ------ | ---------------------------------------- |
| 高 | アクセシビリティ違反、重大なUX問題 |
| 中 | パフォーマンス問題、タッチデバイス非対応 |
| 低 | 最適化の余地、細かいUX改善 |
### Step 4: レビュー結果の生成
検出された問題と改善提案を報告します。
## 出力形式
````markdown
## インターフェースレビュー結果
### 📊 レビューサマリー
- ファイル: `src/components/UI/Button/Button.tsx`
- チェック領域: 7
- 合格: 5
- 改善推奨: 1
- 問題検出: 1
### ✅ 適切に実装されている項目
- [✓] Interactivity: フォーム送信、ボタン無効化
- [✓] Typography: フォントスムージング適用
- [✓] Accessibility: aria-label 設定
### ⚠️ 改善推奨
- [例] **Performance**: 画像最適化が必要
**影響**: ページロード時間が長くなる
**提案**: Next.js Image コンポーネントを使用
> **Note**: このプロジェクトでは `:hover` のメディアクエリは PostCSS プラグインが自動処理するため、手動での追加を推奨しません
### ❌ 問題検出
- [Button.tsx:45] **Motion**: アニメーション時間が長すぎる (500ms)
**影響**: インタラクションが遅く感じられる
**修正**:
```diff
- transition: all 500ms;
+ transition: all 150ms ease-out;
```
````
### 📝 総合評価
- **評価**: ⚠️ 改善推奨
- **優先修正**: Motion のアニメーション時間短縮
- **推奨改善**: Touch デバイス対応の強化
```
## 使用例
### 例 1: UI コンポーネントのレビュー
```
User: Button コンポーネントのインターフェースをレビューして
Assistant: [スキルを起動して 7 つの領域から検証]
```
### 例 2: ページ全体のレビュー
```
User: HomePage のアクセシビリティとタッチ対応をチェック
Assistant: [Accessibility と Touch の領域を重点的に検証]
```
### 例 3: 特定領域のレビュー
```
User: このアニメーションがベストプラクティスに従っているか確認
Assistant: [Motion 領域を重点的に検証]
```
### 例 4: Design & UX のレビュー
```
User: この記事ページの認知負荷と視覚的階層をチェック
Assistant: [Design & UX 領域(UX 心理効果)を重点的に検証]
```
## 参照ドキュメント
詳細なガイドラインは以下を参照してください:
- `references/web-interface-guidelines.md` - Web インターフェースのベストプラクティス(raunofreiberg/interfaces より)
- `references/ux-psychology.md` - UX 心理効果と認知負荷のガイドライン(技術ブログ向け)
## 注意事項
- このスキルは **read-only** です(allowed-tools: Read, Grep, Glob)
- コードの自動修正は行いません
- レビュー結果に基づき、ユーザーが手動で修正します
- WAI-ARIA 仕様の詳細は含まれていませんが、基本的なアクセシビリティはカバーされています
## ベストプラクティスの出典
このスキルは以下のガイドラインに基づいています:
- [raunofreiberg/interfaces](https://github.com/raunofreiberg/interfaces) - Web インターフェース実装
- プロジェクト独自の UX 心理効果ガイドライン - 技術ブログにおける心理効果
```