Skip to content

Commit f021828

Browse files
authored
Merge pull request #82 from myoshi2891/dev
ISTQB CTFL v4.0 関連ドキュメント・学習ガイドの拡充、Next.js App Router への移行 (第1章 テストの基礎)、移行ワークフロー(SKILL.md)および共通スタイルの改善等
2 parents 5ac0a0b + 99d4f77 commit f021828

29 files changed

Lines changed: 26591 additions & 1842 deletions

.claude/skills/html-to-nextjs-migration/SKILL.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,75 @@ Map every HTML CSS variable to the project's `globals.css` `@theme` token. Do NO
121121
| page-sticky nav の top | `position: sticky; top: 0;` | `top: 60px`(グローバル Header の高さ分オフセット) |
122122
| アニメーションの消失 | `max-width: 0` のまま固定され見えなくなる | `@media (prefers-reduced-motion: reduce)` 内で `max-width: 100% !important;` を指定 |
123123
| 背景クリック妨害 | `::before``z-index` 指定なし | `pointer-events: none;``z-index: 0`(または負の値)を指定 |
124+
| ヘッダーオフセット二重カウント | `.page-layout { margin-top: 60px; }` | 削除。`layout-content` が既に `padding-top: 60px` を持つため不要。60px の余白が二重になる |
125+
| globals `section` 干渉 | ページ固有 section に余分な `padding-top: 5rem`(80px) が付く | `.page-layout section { padding-top: 0; }` でリセット |
126+
| globals `.hero` 干渉 | `.hero { min-height: 100vh; }` でヒーローが全画面高さになりコンテンツが押し下がる | `.page-layout .hero { min-height: 0; display: block; padding-top: 0; }` でリセット |
127+
| globals `main` 干渉 | `main { max-width: 1100px; margin: 0 auto; }` で幅が制限・中央寄せになる | `.page-layout .main { max-width: none; margin: 0; }` でリセット |
128+
| Mermaid 図の表示圧縮 | ページ固有 Flexbox と `globals.css``.mermaid-wrapper` (max-width) が競合し、図が極端に縮小される | ページ固有 CSS で `.mermaid-wrapper``max-width: 100% !important` 化と背景・ボーダーの透明化リセットを適用 |
129+
| コードブロックCSSの欠落 | ページ固有 CSS に `.code-block``.code-line` 等の定義が抜けている | ページ固有 CSS に `.code-block`, `.code-line` および `.code-keyword` 等のシンタックスハイライト定義を追加してインデント・配色を適用する |
130+
| 機械翻訳調の誤記(of) | Mermaid 等の中に「成果物 of 誤り」「インタフェース of 検証」などの直訳表現が残る | 機械翻訳で発生しやすい「A of B」の直訳を「AのB」といった適切な日本語表現に修正する |
131+
132+
### Phase 3b: 独自レイアウト(サイドバー付きドキュメントページ)の globals.css 干渉リセット
133+
134+
サイドバーナビ+メインコンテンツの2カラムレイアウト(`display: flex` で独自スコープを持つページ)を実装する場合、`globals.css` の汎用セレクターが干渉し**大きな余白崩れ**を引き起こす。必ず以下をページ固有 CSS でリセットすること。
135+
136+
#### 干渉の仕組み
137+
138+
| globals.css の定義 | 干渉の症状 |
139+
| --- | --- |
140+
| `body { padding-top: var(--disclaimer-height) }` | body 全体が disclaimer 分下にずれる(意図通り) |
141+
| `.layout-content { padding-top: 60px }` | layout-content がヘッダー分下にずれる(意図通り) |
142+
| `section { padding-top: 5rem }` |`<section>` に 80px の上余白が付く → ヒーロー等がずれる |
143+
| `.hero { min-height: 100vh; display: flex; justify-content: center }` | ヒーローが全画面高さになりコンテンツが中央に押し下がる |
144+
| `main { max-width: 1100px; margin: 0 auto }` | `<main>` 要素の幅が 1100px に制限・中央寄せになる |
145+
146+
#### 必須リセット CSS テンプレート
147+
148+
```css
149+
/* layout-content が padding-top: 60px を持つため、ページ固有 wrapper に margin-top は不要 */
150+
.my-page-layout {
151+
display: flex;
152+
min-height: 100vh;
153+
width: 100%;
154+
/* margin-top: 60px は書かない */
155+
}
156+
157+
/* globals.css の section { padding-top: 5rem } をリセット */
158+
.my-page-layout section {
159+
padding-top: 0;
160+
}
161+
162+
/* globals.css の .hero { min-height: 100vh } をリセット */
163+
.my-page-layout .hero {
164+
min-height: 0;
165+
display: block;
166+
padding-top: 0;
167+
/* ページ固有の余白はここに追加 */
168+
}
169+
170+
/* globals.css の main { max-width: 1100px; margin: 0 auto } をリセット */
171+
.my-page-layout .main {
172+
flex: 1;
173+
min-width: 0;
174+
max-width: none;
175+
margin: 0;
176+
padding: 24px 20px;
177+
}
178+
```
179+
180+
#### サイドバーの sticky 計算
181+
182+
```css
183+
.my-page-layout .sidebar {
184+
position: sticky;
185+
/* ヘッダー(60px) + DisclaimerBanner(var(--disclaimer-height)) の合算 */
186+
top: calc(60px + var(--disclaimer-height, 0px));
187+
height: calc(100vh - 60px - var(--disclaimer-height, 0px));
188+
z-index: 40; /* Header の z-50(50) より低く */
189+
}
190+
```
191+
192+
**注意**: `--disclaimer-height``DisclaimerBanner` コンポーネントが JS で動的に計算してセットする。CSS 変数の初期値は `38px`(デスクトップ1行)、モバイルでは `76px`(2行)になる。
124193

125194
### Phase 4: Convert HTML to TSX
126195

@@ -154,6 +223,23 @@ Map every HTML CSS variable to the project's `globals.css` `@theme` token. Do NO
154223

155224
**デシジョンテーブル・行列データ**: テキストのスペース揃えで列を表現している場合はフォント変更に脆弱なため、`<table>` 要素への変換を優先する。
156225

226+
**Mermaid 図解の移植**:
227+
- HTML 内に Mermaid 図解(`<div class="mermaid">` 等)が含まれる場合は、プロジェクト共通の `<Mermaid>` コンポーネントに移植してください。
228+
- 移植の際は、以下の Mermaid 構文規則(ブラウザレンダラーでシンタックスエラーを起こさないための必須ルール)を遵守してください:
229+
1. **カラム0配置 (先頭空白なし)**: Mermaid ブロック内のコンテンツはインデントなし(先頭空白なし)でカラム0に配置します。
230+
2. **改行で分離**: 各ステートメントは改行で分離し、1行に複数ステートメントを連結しないでください。
231+
3. **ノードラベルの1行化**: ノードラベル `A["text"]` の内容は必ず1行に収めてください。
232+
4. **mindmap例外**: `mindmap` はインデントを保持して記述します。
233+
5. **block-beta禁止**: `block-beta` は全体クラッシュの原因になるため、使用禁止とします(`graph TD` 等で代替してください)。
234+
6. **全角・特殊記号の制限**:
235+
- 全角波ダッシュ ```から` 等の日本語に置換
236+
- 全角丸括弧 `()` → 半角 `()` に置換
237+
- 全角ダッシュ `` → 半角ハイフン `-` に置換
238+
- 全角コロン `` → 半角コロン `:` に置換
239+
- `subgraph` ラベルや `participant` 等に丸括弧 `()` や絵文字(`🌐` `🖥️` `👤` `` 等)を含めない(削除・置換する)
240+
- 菱形ノード `{}``quadrantChart` 内テキストはダブルクォーテーションで適切に囲む
241+
- また、共通コンポーネントが出力する `.mermaid-wrapper` の表示圧縮や二重枠線を防ぐため、必ずページ固有 CSS にて正準リセットスタイル(`width: 100%`, `max-width: 100% !important`, `background: transparent !important` 等)を記述してください。
242+
157243
5. **Wrap** page content in a React component:
158244

159245
```tsx
@@ -334,3 +420,8 @@ Do NOT redefine these in page-specific CSS. Use them directly in TSX:
334420
- **Never align tabular data with spaces in `.code-block`** — デシジョンテーブルや行列データはフォント変更で列ズレが起きるため `<table>` 要素を使うこと
335421
- **Never remove page-specific anchor nav bars** — ページ固有のスティッキーナビ(`IntersectionObserver` 付き)はグローバル Header と別物。`'use client'` コンポーネントとして移行し `top: 60px` を設定すること
336422
- **Never duplicate page scope classes in CSS selectors**`.page-class .alert.page-class .green` ではなく、`.page-class .alert.green` のようにページクラスは最上位の1回のみ使用すること
423+
- **Never add `margin-top: 60px` to page-specific layout wrappers**`layout-content` が既に `padding-top: 60px`(ヘッダー分)を持つ。さらに `margin-top: 60px` を追加すると 60px の余白が二重になる
424+
- **Always reset globals.css interference for custom layout pages** — サイドバー付き独自レイアウトでは `section { padding-top: 0 }`, `.hero { min-height: 0; display: block; padding-top: 0 }`, `.main { max-width: none; margin: 0 }` を必ずリセットすること(Phase 3b 参照)
425+
- **Always verify and reset Mermaid sizing rules for migrated pages** — 移行するページ内に Mermaid が含まれる場合は、必ず `.claude/skills/fix-mermaid/SKILL.md` の確認を徹底し、かつページ固有 CSS 内で `.mermaid-wrapper` の幅を `100%` に広げて背景・枠線を透明化するリセット規則を追加し、表示サイズが極端に圧縮されるのを防ぐこと。
426+
- **Always ensure code block CSS is defined** — ページ固有 CSS ファイル内に `.code-block`, `.code-line`, および必要なシンタックスハイライト(`.code-keyword`, `.code-cyan` 等)のスタイル定義が存在していることを必ず確認する。定義がない場合は、他の移行済みページから定義をコピーして追加すること。
427+
- **Always review and correct translation errors** — 特に「A of B」(例: `成果物 of 誤り`, `インタフェース of 検証` など)のように英語の直訳表現が不自然に日本語テキストや Mermaid 図の中に残っていないかを必ず走査し、「AB」などの自然な日本語表現に修正すること。

CLAUDE.md

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ bun run dev # 開発サーバー起動(HMR あり)
1818
bun run build # 本番ビルド(.next/ へ出力)
1919
bun start # ビルド成果物をプロダクションモードで起動
2020
bun run lint # ESLint 実行
21-
bun test # ユニットテスト (bun test, 154 specs)
21+
bun test # ユニットテスト (bun test, 161 specs)
2222
```
2323

2424
### E2E テスト (Playwright)
2525

2626
```sh
2727
bun run e2e:install # 初回のみ: chromium バイナリ取得 (~150 MB)
28-
bun run e2e #33 ルートのスモーク E2E (webServer 自動起動)
28+
bun run e2e #36 ルートのスモーク E2E (webServer 自動起動)
2929
bun run e2e:ui # Playwright UI モードで対話実行
3030
bun run lhci:autorun # Lighthouse CI 自動実行(本番ビルドの品質予算検証)
3131
bun run e2e:report # 直近の HTML レポートを表示
@@ -97,6 +97,9 @@ Next.js App Router 構成:
9797
- `app/istqb-ctfl-complete-guide/istqb-ctfl-complete-guide.css` — ISTQB CTFL v4.0 ガイド固有スタイル
9898
- `app/istqb-ctfl-complete-guide/page.tsx` — ISTQB CTFL v4.0 ガイドページ
9999
- `app/istqb-ctfl-complete-guide/NavBar.tsx` — CTFL ページ固有スティッキーナビ(`'use client'``IntersectionObserver` でアクティブリンク制御)
100+
- `app/istqb-ctfl-v4-chapter1-fundamentals/istqb-ctfl-v4-chapter1-fundamentals.css` — CTFL v4.0 第1章ガイド固有スタイル
101+
- `app/istqb-ctfl-v4-chapter1-fundamentals/page.tsx` — CTFL v4.0 第1章ガイドページ
102+
- `app/istqb-ctfl-v4-chapter1-fundamentals/NavBar.tsx` — CTFL v4.0 第1章ページ固有スティッキーナビ
100103
- `app/software-testing-methodologies-guide.css` — テスト手法ガイド固有スタイル
101104
- `app/software-testing-methodologies-guide/page.tsx` — テスト手法ガイドページ
102105
- `app/istqb-ctal-tae-complete-guide.css` — テスト自動化(CTAL-TAE)ガイド固有スタイル
@@ -254,6 +257,37 @@ HTML から移行した `<nav>` がページ内アンカーリンク + `Intersec
254257
| `.pyramid-layer` / `.py-unit/int/func/e2e` | テストピラミッド図 |
255258
| `.tab-btn` / `.tab-panel` | タブ UI |
256259

260+
### globals.css のグローバルスタイル干渉(サイドバー付き独自レイアウト)
261+
262+
サイドバー+メインコンテンツの2カラムレイアウトを持つページでは、`globals.css` の汎用セレクターが干渉して**大きな余白崩れ**を引き起こす既知パターンがある。
263+
264+
**干渉する globals.css の定義(抜粋):**
265+
266+
| セレクター | 干渉の症状 |
267+
|---|---|
268+
| `section { padding-top: 5rem }` | 全 `<section>` に 80px の上余白 → ヒーロー等が押し下がる |
269+
| `.hero { min-height: 100vh; display: flex; justify-content: center }` | ヒーローが全画面高さになりコンテンツが中央に押し下がる |
270+
| `main { max-width: 1100px; margin: 0 auto }` | `<main>` 幅が 1100px に制限・中央寄せになる |
271+
272+
**必須リセット(ページ固有 CSS に追加):**
273+
274+
```css
275+
/* globals の section { padding-top: 5rem } をリセット */
276+
.my-page-layout section { padding-top: 0; }
277+
278+
/* globals の .hero { min-height: 100vh } をリセット */
279+
.my-page-layout .hero { min-height: 0; display: block; padding-top: 0; }
280+
281+
/* globals の main { max-width: 1100px } をリセット */
282+
.my-page-layout .main { max-width: none; margin: 0; }
283+
```
284+
285+
**ヘッダーオフセットの二重カウント禁止:**
286+
287+
`layout-content` が既に `padding-top: 60px`(ヘッダー分)を持つため、ページ固有の layout wrapper に `margin-top: 60px` を追加してはならない。追加すると 60px の余白が二重になる。
288+
289+
詳細は `.claude/skills/html-to-nextjs-migration/SKILL.md` の Phase 3b を参照。
290+
257291
### 開発・デバッグ用スクリプトの管理ルール
258292

259293
一時的に作成する開発・調査用スクリプトと、永続的にリポジトリに残すスクリプトを厳密に区別して管理します。
@@ -317,6 +351,7 @@ bun test # ユニットテスト成功
317351
| `istqb-ct-tas-complete-guide.html` | `/istqb-ct-tas-complete-guide` | ✅ NavBar あり |
318352
| `istqb-ct-ut-complete-guide.html` | `/istqb-ct-ut-complete-guide` | ✅ NavBar あり |
319353
| `Istqb-ctfl.html` | `/istqb-ctfl-complete-guide` | ✅ NavBar あり |
354+
| `Ctfl-v4-chapter1-fundamentals.html` | `/istqb-ctfl-v4-chapter1-fundamentals` | ✅ NavBar あり |
320355
| `istqb-ctal-atlas-complete-guide.html` | `/istqb-ctal-atlas-complete-guide` | ✅ NavBar あり |
321356
| `istqb-ctal-att-complete-guide.html` | `/istqb-ctal-att-complete-guide` | ✅ NavBar あり |
322357
| `istqb-ctal-ta-complete-guide.html` | `/istqb-ctal-ta-complete-guide` | ✅ NavBar あり |
@@ -345,8 +380,8 @@ bun test # ユニットテスト成功
345380

346381
```text
347382
コンテキスト:
348-
- **全ガイド移行完了**: プロジェクトルートに存在した全35ルート分のHTMLおよびMarkdownファイルの Next.js App Router への移行が完全に終了しました(ISTQB CTFL v4.0 ガイドを含む)。
349-
- 合計 35 ルート(ホーム + 34 ガイド)が管理されています。
383+
- **全ガイド移行完了**: プロジェクトルートに存在した全36ルート分のHTMLおよびMarkdownファイルの Next.js App Router への移行が完全に終了しました(ISTQB CTFL v4.0 ガイドを含む)。
384+
- 合計 36 ルート(ホーム + 35 ガイド)が管理されています。
350385
- 各種テスト(ユニット、型チェック、ESLint)はすべて最新の構成に同期され、通過しています。
351386
- 最新 HEAD は `docs/MIGRATION_PROGRESS.md` の「現在地」テーブルを参照(ここに固定値を書かない)。
352387

0 commit comments

Comments
 (0)