@sk8metal/michi-cli 0.13.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -0
- package/README.md +27 -8
- package/dist/src/commands/setup-existing.d.ts.map +1 -1
- package/dist/src/commands/setup-existing.js +19 -74
- package/dist/src/commands/setup-existing.js.map +1 -1
- package/package.json +1 -1
- package/templates/claude/agents/design-reviewer/AGENT.md +0 -497
- package/templates/claude/agents/e2e-first-planner/AGENT.md +0 -410
- package/templates/claude/agents/mermaid-validator/AGENT.md +0 -257
- package/templates/claude/agents/oss-license-checker/AGENT.md +0 -265
- package/templates/claude/agents/pr-resolver/AGENT.md +0 -208
- package/templates/claude/agents/pr-size-monitor/AGENT.md +0 -330
- package/templates/claude/agents/stable-version-auditor/AGENT.md +0 -279
- package/templates/claude/commands/kiro/kiro-spec-impl.md +0 -257
- package/templates/claude/commands/kiro/kiro-spec-tasks.md +0 -370
- package/templates/claude/commands/michi/confluence-sync.md +0 -44
- package/templates/claude/commands/michi/design-review.md +0 -70
- package/templates/claude/commands/michi/e2e-plan.md +0 -117
- package/templates/claude/commands/michi/license-check.md +0 -84
- package/templates/claude/commands/michi/pr-resolve.md +0 -157
- package/templates/claude/commands/michi/project-switch.md +0 -42
- package/templates/claude/commands/michi/spec-design.md +0 -78
- package/templates/claude/commands/michi/spec-impl.md +0 -889
- package/templates/claude/commands/michi/spec-tasks.md +0 -156
- package/templates/claude/commands/michi/test-planning.md +0 -174
- package/templates/claude/commands/michi/validate-design.md +0 -58
- package/templates/claude/commands/michi/version-audit.md +0 -95
- package/templates/claude/commands/michi-multi-repo/impl-all.md +0 -293
- package/templates/claude/commands/michi-multi-repo/propagate-specs.md +0 -284
- package/templates/claude/commands/michi-multi-repo/spec-design.md +0 -359
- package/templates/claude/commands/michi-multi-repo/spec-init.md +0 -228
- package/templates/claude/commands/michi-multi-repo/spec-requirements.md +0 -198
- package/templates/claude/commands/michi-multi-repo/spec-review.md +0 -261
- package/templates/claude/rules/atlassian-integration.md +0 -35
- package/templates/claude/rules/michi-core.md +0 -54
- package/templates/claude/skills/design-review/SKILL.md +0 -648
- package/templates/claude/skills/e2e-first-planning/SKILL.md +0 -360
- package/templates/claude/skills/mermaid-validator/SKILL.md +0 -261
- package/templates/claude/skills/oss-license/SKILL.md +0 -232
- package/templates/claude/skills/stable-version/SKILL.md +0 -252
- package/templates/claude-agent/rules/code-size-monitor.md +0 -26
- package/templates/claude-agent/rules/code-size-rules.md +0 -32
- package/templates/michi/cc-sdd-overrides/README.md +0 -58
- package/templates/michi/cc-sdd-overrides/settings/rules/design-review-michi.md +0 -53
- package/templates/michi/cc-sdd-overrides/settings/templates/specs/init.json +0 -24
- package/templates/michi/cc-sdd-overrides/settings/templates/specs/tasks.md +0 -446
|
@@ -1,648 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: design-review
|
|
3
|
-
description: |
|
|
4
|
-
UIデザインレビューガイド。
|
|
5
|
-
アクセシビリティ、レスポンシブ、UXパターン、パフォーマンスをチェック。
|
|
6
|
-
allowed-tools: Read, Grep, Glob
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# デザインレビュースキル
|
|
10
|
-
|
|
11
|
-
## 目的
|
|
12
|
-
|
|
13
|
-
UIデザインの品質を評価し、アクセシビリティ、レスポンシブデザイン、UXパターン、パフォーマンスの観点から改善提案を行う。
|
|
14
|
-
|
|
15
|
-
## レビューの4つの観点
|
|
16
|
-
|
|
17
|
-
### 1. アクセシビリティ(A11y)
|
|
18
|
-
### 2. レスポンシブデザイン
|
|
19
|
-
### 3. UXパターン
|
|
20
|
-
### 4. パフォーマンス
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 1. アクセシビリティ(WCAG 2.1 AA準拠)
|
|
25
|
-
|
|
26
|
-
### 重要な原則
|
|
27
|
-
|
|
28
|
-
#### POUR原則
|
|
29
|
-
|
|
30
|
-
| 原則 | 説明 |
|
|
31
|
-
|------|------|
|
|
32
|
-
| **P**erceivable(知覚可能) | すべてのユーザーが情報を知覚できる |
|
|
33
|
-
| **O**perable(操作可能) | すべてのユーザーがUIを操作できる |
|
|
34
|
-
| **U**nderstandable(理解可能) | 情報とUIが理解可能 |
|
|
35
|
-
| **R**obust(堅牢) | 多様な技術で解釈可能 |
|
|
36
|
-
|
|
37
|
-
### チェックリスト
|
|
38
|
-
|
|
39
|
-
#### 1.1 テキストの代替
|
|
40
|
-
|
|
41
|
-
```html
|
|
42
|
-
<!-- ❌ 悪い例 -->
|
|
43
|
-
<img src="logo.png">
|
|
44
|
-
<button><i class="icon-save"></i></button>
|
|
45
|
-
|
|
46
|
-
<!-- ✅ 良い例 -->
|
|
47
|
-
<img src="logo.png" alt="Company Logo">
|
|
48
|
-
<button aria-label="保存"><i class="icon-save" aria-hidden="true"></i></button>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
#### 1.2 コントラスト比
|
|
52
|
-
|
|
53
|
-
**WCAG 2.1 AA基準:**
|
|
54
|
-
- 通常テキスト: 4.5:1 以上
|
|
55
|
-
- 大きなテキスト(18pt以上 or 14pt太字以上): 3:1 以上
|
|
56
|
-
|
|
57
|
-
**確認ツール:**
|
|
58
|
-
- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/)
|
|
59
|
-
- Chrome DevTools: Lighthouse
|
|
60
|
-
|
|
61
|
-
```css
|
|
62
|
-
/* ❌ 悪い例: コントラスト比 2.5:1 */
|
|
63
|
-
.text {
|
|
64
|
-
color: #999;
|
|
65
|
-
background: #fff;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* ✅ 良い例: コントラスト比 7:1 */
|
|
69
|
-
.text {
|
|
70
|
-
color: #555;
|
|
71
|
-
background: #fff;
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
#### 1.3 キーボード操作
|
|
76
|
-
|
|
77
|
-
```html
|
|
78
|
-
<!-- ❌ 悪い例: キーボード操作不可 -->
|
|
79
|
-
<div onclick="submit()">送信</div>
|
|
80
|
-
|
|
81
|
-
<!-- ✅ 良い例 -->
|
|
82
|
-
<button type="submit">送信</button>
|
|
83
|
-
|
|
84
|
-
<!-- ✅ カスタム要素の場合 -->
|
|
85
|
-
<div role="button" tabindex="0" onclick="submit()" onkeydown="handleKey(event)">
|
|
86
|
-
送信
|
|
87
|
-
</div>
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**チェック項目:**
|
|
91
|
-
- [ ] すべての操作がキーボードで可能か
|
|
92
|
-
- [ ] Tab順序が論理的か
|
|
93
|
-
- [ ] フォーカスインジケーターが視認可能か
|
|
94
|
-
- [ ] Escキーでモーダルが閉じるか
|
|
95
|
-
|
|
96
|
-
#### 1.4 フォーカスの可視化
|
|
97
|
-
|
|
98
|
-
```css
|
|
99
|
-
/* ❌ 悪い例: フォーカスを消す */
|
|
100
|
-
button:focus {
|
|
101
|
-
outline: none;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/* ✅ 良い例 */
|
|
105
|
-
button:focus {
|
|
106
|
-
outline: 2px solid #0066cc;
|
|
107
|
-
outline-offset: 2px;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* ✅ より良い例 */
|
|
111
|
-
button:focus-visible {
|
|
112
|
-
outline: 2px solid #0066cc;
|
|
113
|
-
outline-offset: 2px;
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
#### 1.5 セマンティックHTML
|
|
118
|
-
|
|
119
|
-
```html
|
|
120
|
-
<!-- ❌ 悪い例 -->
|
|
121
|
-
<div class="header">
|
|
122
|
-
<div class="nav">
|
|
123
|
-
<div class="link">Home</div>
|
|
124
|
-
<div class="link">About</div>
|
|
125
|
-
</div>
|
|
126
|
-
</div>
|
|
127
|
-
|
|
128
|
-
<!-- ✅ 良い例 -->
|
|
129
|
-
<header>
|
|
130
|
-
<nav>
|
|
131
|
-
<ul>
|
|
132
|
-
<li><a href="/">Home</a></li>
|
|
133
|
-
<li><a href="/about">About</a></li>
|
|
134
|
-
</ul>
|
|
135
|
-
</nav>
|
|
136
|
-
</header>
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
#### 1.6 ARIAの適切な使用
|
|
140
|
-
|
|
141
|
-
```html
|
|
142
|
-
<!-- ❌ 悪い例: 不要なARIA -->
|
|
143
|
-
<button role="button">送信</button>
|
|
144
|
-
|
|
145
|
-
<!-- ✅ 良い例: 必要最小限 -->
|
|
146
|
-
<button>送信</button>
|
|
147
|
-
|
|
148
|
-
<!-- ✅ 良い例: カスタムコンポーネントで必要 -->
|
|
149
|
-
<div role="dialog" aria-labelledby="dialog-title" aria-modal="true">
|
|
150
|
-
<h2 id="dialog-title">確認</h2>
|
|
151
|
-
<p>本当に削除しますか?</p>
|
|
152
|
-
<button>削除</button>
|
|
153
|
-
<button>キャンセル</button>
|
|
154
|
-
</div>
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
#### 1.7 フォームのラベル
|
|
158
|
-
|
|
159
|
-
```html
|
|
160
|
-
<!-- ❌ 悪い例 -->
|
|
161
|
-
<input type="text" placeholder="メールアドレス">
|
|
162
|
-
|
|
163
|
-
<!-- ✅ 良い例 -->
|
|
164
|
-
<label for="email">メールアドレス</label>
|
|
165
|
-
<input type="email" id="email" name="email" required>
|
|
166
|
-
|
|
167
|
-
<!-- ✅ エラーメッセージの関連付け -->
|
|
168
|
-
<label for="email">メールアドレス</label>
|
|
169
|
-
<input type="email" id="email" name="email" aria-describedby="email-error" required>
|
|
170
|
-
<span id="email-error" role="alert">有効なメールアドレスを入力してください</span>
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### アクセシビリティツール
|
|
174
|
-
|
|
175
|
-
| ツール | 用途 |
|
|
176
|
-
|--------|------|
|
|
177
|
-
| [axe DevTools](https://www.deque.com/axe/devtools/) | 自動検出ツール |
|
|
178
|
-
| [WAVE](https://wave.webaim.org/) | ページ全体の評価 |
|
|
179
|
-
| [Lighthouse](https://developers.google.com/web/tools/lighthouse) | Chrome DevTools統合 |
|
|
180
|
-
| [NVDA](https://www.nvaccess.org/) | スクリーンリーダー(Windows) |
|
|
181
|
-
| [VoiceOver](https://www.apple.com/accessibility/voiceover/) | スクリーンリーダー(Mac/iOS) |
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## 2. レスポンシブデザイン
|
|
186
|
-
|
|
187
|
-
### ブレークポイント標準
|
|
188
|
-
|
|
189
|
-
| デバイス | 幅 | 備考 |
|
|
190
|
-
|---------|-----|------|
|
|
191
|
-
| Mobile(縦) | 320px - 480px | iPhone SE, etc. |
|
|
192
|
-
| Mobile(横) | 481px - 767px | |
|
|
193
|
-
| Tablet(縦) | 768px - 1024px | iPad, etc. |
|
|
194
|
-
| Tablet(横) | 1025px - 1280px | |
|
|
195
|
-
| Desktop | 1281px - 1920px | 標準的なPC |
|
|
196
|
-
| Large Desktop | 1921px+ | 4K, ウルトラワイド |
|
|
197
|
-
|
|
198
|
-
### レスポンシブチェックリスト
|
|
199
|
-
|
|
200
|
-
#### 2.1 ビューポート設定
|
|
201
|
-
|
|
202
|
-
```html
|
|
203
|
-
<!-- ✅ 必須 -->
|
|
204
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
#### 2.2 フルードグリッド
|
|
208
|
-
|
|
209
|
-
```css
|
|
210
|
-
/* ❌ 悪い例: 固定幅 */
|
|
211
|
-
.container {
|
|
212
|
-
width: 1200px;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/* ✅ 良い例: 可変幅 */
|
|
216
|
-
.container {
|
|
217
|
-
max-width: 1200px;
|
|
218
|
-
width: 100%;
|
|
219
|
-
padding: 0 16px;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/* ✅ より良い例: CSS Grid */
|
|
223
|
-
.grid {
|
|
224
|
-
display: grid;
|
|
225
|
-
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
226
|
-
gap: 16px;
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
#### 2.3 フレキシブル画像
|
|
231
|
-
|
|
232
|
-
```css
|
|
233
|
-
/* ✅ 基本 */
|
|
234
|
-
img {
|
|
235
|
-
max-width: 100%;
|
|
236
|
-
height: auto;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/* ✅ レスポンシブ画像 */
|
|
240
|
-
<picture>
|
|
241
|
-
<source media="(min-width: 1024px)" srcset="large.jpg">
|
|
242
|
-
<source media="(min-width: 768px)" srcset="medium.jpg">
|
|
243
|
-
<img src="small.jpg" alt="説明">
|
|
244
|
-
</picture>
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
#### 2.4 メディアクエリ
|
|
248
|
-
|
|
249
|
-
```css
|
|
250
|
-
/* モバイルファースト推奨 */
|
|
251
|
-
|
|
252
|
-
/* Base: Mobile */
|
|
253
|
-
.menu {
|
|
254
|
-
display: none;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/* Tablet以上 */
|
|
258
|
-
@media (min-width: 768px) {
|
|
259
|
-
.menu {
|
|
260
|
-
display: flex;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/* Desktop以上 */
|
|
265
|
-
@media (min-width: 1280px) {
|
|
266
|
-
.menu {
|
|
267
|
-
font-size: 18px;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
#### 2.5 タッチターゲットサイズ
|
|
273
|
-
|
|
274
|
-
**最小サイズ: 44x44px(Apple HIG)/ 48x48px(Material Design)**
|
|
275
|
-
|
|
276
|
-
```css
|
|
277
|
-
/* ❌ 悪い例: タップしづらい */
|
|
278
|
-
.button {
|
|
279
|
-
width: 30px;
|
|
280
|
-
height: 30px;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/* ✅ 良い例 */
|
|
284
|
-
.button {
|
|
285
|
-
min-width: 44px;
|
|
286
|
-
min-height: 44px;
|
|
287
|
-
padding: 12px 16px;
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### レスポンシブテストツール
|
|
292
|
-
|
|
293
|
-
- Chrome DevTools: Device Toolbar
|
|
294
|
-
- Firefox: Responsive Design Mode
|
|
295
|
-
- [BrowserStack](https://www.browserstack.com/): 実機テスト
|
|
296
|
-
- [Responsively App](https://responsively.app/): 複数デバイス同時表示
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## 3. UXパターン
|
|
301
|
-
|
|
302
|
-
### 3.1 フォームデザイン
|
|
303
|
-
|
|
304
|
-
#### フォームのベストプラクティス
|
|
305
|
-
|
|
306
|
-
```html
|
|
307
|
-
<!-- ✅ 良いフォーム -->
|
|
308
|
-
<form>
|
|
309
|
-
<!-- ラベルは上に配置 -->
|
|
310
|
-
<label for="name">お名前 <span aria-label="必須">*</span></label>
|
|
311
|
-
<input type="text" id="name" name="name" required autocomplete="name">
|
|
312
|
-
|
|
313
|
-
<!-- ヘルプテキスト -->
|
|
314
|
-
<label for="password">パスワード</label>
|
|
315
|
-
<input type="password" id="password" name="password"
|
|
316
|
-
aria-describedby="password-help" required>
|
|
317
|
-
<small id="password-help">8文字以上、英数字を含む</small>
|
|
318
|
-
|
|
319
|
-
<!-- エラーメッセージ -->
|
|
320
|
-
<label for="email">メールアドレス</label>
|
|
321
|
-
<input type="email" id="email" name="email"
|
|
322
|
-
aria-describedby="email-error" aria-invalid="true" required>
|
|
323
|
-
<span id="email-error" role="alert" class="error">
|
|
324
|
-
有効なメールアドレスを入力してください
|
|
325
|
-
</span>
|
|
326
|
-
|
|
327
|
-
<!-- ボタン -->
|
|
328
|
-
<button type="submit">送信</button>
|
|
329
|
-
<button type="button">キャンセル</button>
|
|
330
|
-
</form>
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
**チェック項目:**
|
|
334
|
-
- [ ] ラベルがすべての入力フィールドに付いているか
|
|
335
|
-
- [ ] 必須項目が明示されているか
|
|
336
|
-
- [ ] プレースホルダーをラベルの代わりにしていないか
|
|
337
|
-
- [ ] エラーメッセージが具体的か
|
|
338
|
-
- [ ] 送信ボタンが明確か
|
|
339
|
-
|
|
340
|
-
#### フォームバリデーション
|
|
341
|
-
|
|
342
|
-
```javascript
|
|
343
|
-
// ✅ リアルタイムバリデーション(onBlurで)
|
|
344
|
-
input.addEventListener('blur', (e) => {
|
|
345
|
-
if (!e.target.validity.valid) {
|
|
346
|
-
showError(e.target, getErrorMessage(e.target));
|
|
347
|
-
} else {
|
|
348
|
-
clearError(e.target);
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
// ✅ 送信時の全体バリデーション
|
|
353
|
-
form.addEventListener('submit', (e) => {
|
|
354
|
-
if (!form.checkValidity()) {
|
|
355
|
-
e.preventDefault();
|
|
356
|
-
// 最初のエラーフィールドにフォーカス
|
|
357
|
-
const firstError = form.querySelector('[aria-invalid="true"]');
|
|
358
|
-
firstError?.focus();
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
### 3.2 フィードバック
|
|
364
|
-
|
|
365
|
-
#### ローディング状態
|
|
366
|
-
|
|
367
|
-
```html
|
|
368
|
-
<!-- ✅ ローディング表示 -->
|
|
369
|
-
<button type="submit" aria-busy="true" disabled>
|
|
370
|
-
<span class="spinner" aria-hidden="true"></span>
|
|
371
|
-
送信中...
|
|
372
|
-
</button>
|
|
373
|
-
|
|
374
|
-
<!-- スクリーンリーダー用 -->
|
|
375
|
-
<div role="status" aria-live="polite" class="sr-only">
|
|
376
|
-
データを送信しています。しばらくお待ちください。
|
|
377
|
-
</div>
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
#### 成功/エラー通知
|
|
381
|
-
|
|
382
|
-
```html
|
|
383
|
-
<!-- ✅ 成功メッセージ -->
|
|
384
|
-
<div role="alert" aria-live="assertive" class="success">
|
|
385
|
-
✓ 保存しました
|
|
386
|
-
</div>
|
|
387
|
-
|
|
388
|
-
<!-- ✅ エラーメッセージ -->
|
|
389
|
-
<div role="alert" aria-live="assertive" class="error">
|
|
390
|
-
✗ 保存に失敗しました。もう一度お試しください。
|
|
391
|
-
</div>
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
### 3.3 ナビゲーション
|
|
395
|
-
|
|
396
|
-
#### パンくずリスト
|
|
397
|
-
|
|
398
|
-
```html
|
|
399
|
-
<!-- ✅ セマンティックなパンくずリスト -->
|
|
400
|
-
<nav aria-label="パンくずリスト">
|
|
401
|
-
<ol>
|
|
402
|
-
<li><a href="/">ホーム</a></li>
|
|
403
|
-
<li><a href="/products">商品</a></li>
|
|
404
|
-
<li aria-current="page">商品詳細</li>
|
|
405
|
-
</ol>
|
|
406
|
-
</nav>
|
|
407
|
-
```
|
|
408
|
-
|
|
409
|
-
#### ページネーション
|
|
410
|
-
|
|
411
|
-
```html
|
|
412
|
-
<!-- ✅ アクセシブルなページネーション -->
|
|
413
|
-
<nav aria-label="ページネーション">
|
|
414
|
-
<ul>
|
|
415
|
-
<li><a href="?page=1" aria-label="前のページ">←</a></li>
|
|
416
|
-
<li><a href="?page=1">1</a></li>
|
|
417
|
-
<li><span aria-current="page">2</span></li>
|
|
418
|
-
<li><a href="?page=3">3</a></li>
|
|
419
|
-
<li><a href="?page=3" aria-label="次のページ">→</a></li>
|
|
420
|
-
</ul>
|
|
421
|
-
</nav>
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
### 3.4 モーダル/ダイアログ
|
|
425
|
-
|
|
426
|
-
```html
|
|
427
|
-
<!-- ✅ アクセシブルなモーダル -->
|
|
428
|
-
<div role="dialog" aria-labelledby="modal-title" aria-modal="true">
|
|
429
|
-
<h2 id="modal-title">確認</h2>
|
|
430
|
-
<p>本当に削除しますか?この操作は取り消せません。</p>
|
|
431
|
-
<button autofocus>削除</button>
|
|
432
|
-
<button>キャンセル</button>
|
|
433
|
-
</div>
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
**モーダルのJavaScript要件:**
|
|
437
|
-
- [ ] 開いたときに最初の要素にフォーカス
|
|
438
|
-
- [ ] Tabキーでモーダル内を循環
|
|
439
|
-
- [ ] Escキーで閉じる
|
|
440
|
-
- [ ] 背景をスクロール不可にする
|
|
441
|
-
- [ ] 閉じたときに元の位置にフォーカスを戻す
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## 4. パフォーマンス(Core Web Vitals)
|
|
446
|
-
|
|
447
|
-
### Core Web Vitals 基準
|
|
448
|
-
|
|
449
|
-
| 指標 | 良好 | 改善が必要 | 不良 |
|
|
450
|
-
|------|------|-----------|------|
|
|
451
|
-
| **LCP** (Largest Contentful Paint) | ≤ 2.5s | 2.5s - 4.0s | > 4.0s |
|
|
452
|
-
| **FID** (First Input Delay) | ≤ 100ms | 100ms - 300ms | > 300ms |
|
|
453
|
-
| **CLS** (Cumulative Layout Shift) | ≤ 0.1 | 0.1 - 0.25 | > 0.25 |
|
|
454
|
-
|
|
455
|
-
### 4.1 LCP(最大コンテンツの描画)
|
|
456
|
-
|
|
457
|
-
**改善方法:**
|
|
458
|
-
|
|
459
|
-
```html
|
|
460
|
-
<!-- ✅ 画像の最適化 -->
|
|
461
|
-
<img src="hero.jpg"
|
|
462
|
-
width="1200"
|
|
463
|
-
height="600"
|
|
464
|
-
loading="eager"
|
|
465
|
-
fetchpriority="high"
|
|
466
|
-
alt="Hero image">
|
|
467
|
-
|
|
468
|
-
<!-- ✅ WebPフォーマット -->
|
|
469
|
-
<picture>
|
|
470
|
-
<source type="image/webp" srcset="hero.webp">
|
|
471
|
-
<img src="hero.jpg" alt="Hero image">
|
|
472
|
-
</picture>
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
**チェック項目:**
|
|
476
|
-
- [ ] 画像をWebP形式で提供しているか
|
|
477
|
-
- [ ] 画像サイズを指定しているか(width, height)
|
|
478
|
-
- [ ] Critical CSSをインライン化しているか
|
|
479
|
-
- [ ] 不要なJavaScriptをレンダリングブロックしていないか
|
|
480
|
-
|
|
481
|
-
### 4.2 FID(初回入力遅延)
|
|
482
|
-
|
|
483
|
-
**改善方法:**
|
|
484
|
-
|
|
485
|
-
```html
|
|
486
|
-
<!-- ✅ JavaScriptの遅延読み込み -->
|
|
487
|
-
<script src="analytics.js" defer></script>
|
|
488
|
-
<script src="non-critical.js" async></script>
|
|
489
|
-
|
|
490
|
-
<!-- ✅ Code Splitting -->
|
|
491
|
-
<script type="module">
|
|
492
|
-
import('./critical.js');
|
|
493
|
-
|
|
494
|
-
// 必要なときだけ読み込み
|
|
495
|
-
button.addEventListener('click', async () => {
|
|
496
|
-
const module = await import('./heavy-feature.js');
|
|
497
|
-
module.init();
|
|
498
|
-
});
|
|
499
|
-
</script>
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
**チェック項目:**
|
|
503
|
-
- [ ] JavaScriptバンドルサイズを最小化しているか
|
|
504
|
-
- [ ] Tree Shakingを有効にしているか
|
|
505
|
-
- [ ] 不要なpolyfillを削除したか
|
|
506
|
-
- [ ] Long Tasksを分割したか
|
|
507
|
-
|
|
508
|
-
### 4.3 CLS(累積レイアウトシフト)
|
|
509
|
-
|
|
510
|
-
**改善方法:**
|
|
511
|
-
|
|
512
|
-
```css
|
|
513
|
-
/* ✅ 画像/動画のサイズ指定 */
|
|
514
|
-
img, video {
|
|
515
|
-
aspect-ratio: 16 / 9;
|
|
516
|
-
width: 100%;
|
|
517
|
-
height: auto;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/* ✅ フォント読み込み時のレイアウトシフト防止 */
|
|
521
|
-
@font-face {
|
|
522
|
-
font-family: 'CustomFont';
|
|
523
|
-
src: url('font.woff2') format('woff2');
|
|
524
|
-
font-display: swap; /* または optional */
|
|
525
|
-
}
|
|
526
|
-
```
|
|
527
|
-
|
|
528
|
-
**チェック項目:**
|
|
529
|
-
- [ ] 画像・動画にwidth/height属性を指定しているか
|
|
530
|
-
- [ ] Webフォント読み込み中のフォールバックが適切か
|
|
531
|
-
- [ ] 広告・埋め込みコンテンツの領域を確保しているか
|
|
532
|
-
- [ ] アニメーションでtransformを使用しているか(topではなく)
|
|
533
|
-
|
|
534
|
-
### パフォーマンステストツール
|
|
535
|
-
|
|
536
|
-
| ツール | 用途 |
|
|
537
|
-
|--------|------|
|
|
538
|
-
| [Lighthouse](https://developers.google.com/web/tools/lighthouse) | 総合評価 |
|
|
539
|
-
| [PageSpeed Insights](https://pagespeed.web.dev/) | 実ユーザーデータ |
|
|
540
|
-
| [WebPageTest](https://www.webpagetest.org/) | 詳細分析 |
|
|
541
|
-
| Chrome DevTools: Performance | プロファイリング |
|
|
542
|
-
|
|
543
|
-
---
|
|
544
|
-
|
|
545
|
-
## レビューレポートフォーマット
|
|
546
|
-
|
|
547
|
-
### テンプレート
|
|
548
|
-
|
|
549
|
-
```markdown
|
|
550
|
-
# デザインレビューレポート
|
|
551
|
-
|
|
552
|
-
## サマリー
|
|
553
|
-
- レビュー日時: YYYY-MM-DD
|
|
554
|
-
- ページ/コンポーネント: [対象]
|
|
555
|
-
- 総合評価: [A/B/C/D]
|
|
556
|
-
|
|
557
|
-
## 1. アクセシビリティ(評価: X/10)
|
|
558
|
-
|
|
559
|
-
### Critical(即時対応)
|
|
560
|
-
- [ ] **コントラスト不足**: ボタンのコントラスト比が3:1(推奨: 4.5:1)
|
|
561
|
-
- 場所: `.primary-button`
|
|
562
|
-
- 推奨: `color: #005A9C` に変更
|
|
563
|
-
|
|
564
|
-
### Warning(対応推奨)
|
|
565
|
-
- [ ] **フォーカス不明**: フォーカスインジケーターが視認困難
|
|
566
|
-
- 場所: `input:focus`
|
|
567
|
-
- 推奨: `outline: 2px solid #0066cc` を追加
|
|
568
|
-
|
|
569
|
-
### Info(改善提案)
|
|
570
|
-
- [ ] **ARIA不足**: モーダルに `aria-modal="true"` がない
|
|
571
|
-
- 場所: `.modal`
|
|
572
|
-
- 推奨: 属性を追加
|
|
573
|
-
|
|
574
|
-
## 2. レスポンシブデザイン(評価: X/10)
|
|
575
|
-
|
|
576
|
-
### Critical
|
|
577
|
-
- [ ] **横スクロール発生**: Mobile (375px) で横スクロール
|
|
578
|
-
- 原因: `.container { width: 400px }`
|
|
579
|
-
- 推奨: `max-width: 100%` に変更
|
|
580
|
-
|
|
581
|
-
### Info
|
|
582
|
-
- [ ] **タッチターゲット小**: ボタンが40x40px
|
|
583
|
-
- 推奨: 最小 44x44px に拡大
|
|
584
|
-
|
|
585
|
-
## 3. UXパターン(評価: X/10)
|
|
586
|
-
|
|
587
|
-
### Warning
|
|
588
|
-
- [ ] **エラーメッセージ不明確**: "Invalid input"
|
|
589
|
-
- 推奨: 「メールアドレスの形式が正しくありません」
|
|
590
|
-
|
|
591
|
-
### Info
|
|
592
|
-
- [ ] **ローディング状態なし**: 送信ボタンにフィードバックなし
|
|
593
|
-
- 推奨: `aria-busy="true"` とスピナー表示
|
|
594
|
-
|
|
595
|
-
## 4. パフォーマンス(評価: X/10)
|
|
596
|
-
|
|
597
|
-
### Core Web Vitals
|
|
598
|
-
- LCP: 3.2s(改善が必要)
|
|
599
|
-
- FID: 80ms(良好)
|
|
600
|
-
- CLS: 0.15(改善が必要)
|
|
601
|
-
|
|
602
|
-
### Critical
|
|
603
|
-
- [ ] **LCP遅延**: Hero画像 (2.5MB) が最適化されていない
|
|
604
|
-
- 推奨: WebP形式 (300KB) に変換
|
|
605
|
-
|
|
606
|
-
### Warning
|
|
607
|
-
- [ ] **CLS発生**: Webフォント読み込み時にレイアウトシフト
|
|
608
|
-
- 推奨: `font-display: swap` を設定
|
|
609
|
-
|
|
610
|
-
## 推奨アクション
|
|
611
|
-
|
|
612
|
-
### 優先度1(即時対応)
|
|
613
|
-
1. コントラスト比の改善
|
|
614
|
-
2. 横スクロールの修正
|
|
615
|
-
3. 画像の最適化
|
|
616
|
-
|
|
617
|
-
### 優先度2(1週間以内)
|
|
618
|
-
1. フォーカスインジケーターの改善
|
|
619
|
-
2. エラーメッセージの具体化
|
|
620
|
-
3. Webフォントの最適化
|
|
621
|
-
|
|
622
|
-
### 優先度3(任意)
|
|
623
|
-
1. ARIA属性の追加
|
|
624
|
-
2. タッチターゲットの拡大
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
---
|
|
628
|
-
|
|
629
|
-
## 参考資料
|
|
630
|
-
|
|
631
|
-
### アクセシビリティ
|
|
632
|
-
- [WCAG 2.1 ガイドライン](https://www.w3.org/WAI/WCAG21/quickref/)
|
|
633
|
-
- [WebAIM](https://webaim.org/)
|
|
634
|
-
- [A11y Project](https://www.a11yproject.com/)
|
|
635
|
-
- [MDN Accessibility](https://developer.mozilla.org/ja/docs/Web/Accessibility)
|
|
636
|
-
|
|
637
|
-
### レスポンシブデザイン
|
|
638
|
-
- [Responsive Web Design Basics](https://web.dev/responsive-web-design-basics/)
|
|
639
|
-
- [CSS Grid Layout](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Grid_Layout)
|
|
640
|
-
|
|
641
|
-
### UXパターン
|
|
642
|
-
- [Material Design](https://material.io/)
|
|
643
|
-
- [Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/)
|
|
644
|
-
- [Nielsen Norman Group](https://www.nngroup.com/)
|
|
645
|
-
|
|
646
|
-
### パフォーマンス
|
|
647
|
-
- [Web Vitals](https://web.dev/vitals/)
|
|
648
|
-
- [Lighthouse Performance Scoring](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/)
|