webg unittest: embedded layout

固定サイズ canvas を本文へ埋め込んだ状態で overlay の追従を確認する test

この unittest は、`WebgApp` の `layoutMode: "embedded"` と `fixedCanvasSize` を組み合わせたときに、 HTML 文書のスクロールと canvas 内 overlay が同じ host 要素を基準に動くかを確認するためのものです

右側の status では、canvas host、HelpPanel、dialogue、fixed panel、touch controls の矩形を毎フレーム読み取り、 host 基準で揃っているかを PASS / WAIT / FAIL で表示します

確認したいポイント

1. ページ全体をスクロールしても canvas が本文中の位置に残り、本文だけでなく HelpPanel や touch controls も一緒に移動すること

2. `Hide Help` で閉じたあとに、HelpPanel の枠が host 全幅へ広がらず `Show Help` ボタンに近い幅へ保たれること

3. `D` で dialogue、`F` で fixed panel を出したまま上下へスクロールしても、overlay が viewport 固定にならず canvas に付いてくること

4. `S` でスクリーンショット、`F9` → `M` で debug mode 切替を行っても、embedded の基本配置が崩れないこと

埋め込み canvas

下の canvas は `fixedCanvasSize: { width: 720, height: 540 }` で固定し、`layoutMode: "embedded"` で本文へ埋め込んでいます

マウスドラッグで orbit、`ArrowLeft` / `ArrowRight` または touch ボタンで自動回転の位相を変えられます

`Enter` / `Space` で dialogue 次送り、`H` で HelpPanel、`D` で dialogue、`F` で fixed panel、`S` で screenshot、`R` で camera を初期状態へ戻します

const app = new WebgApp({
  document,
  layoutMode: "embedded",
  fixedCanvasSize: {
    width: 720,
    height: 540,
    useDevicePixelRatio: false
  }
});

本文の中に canvas を置くときの確認メモ

HTML 側で `overflow: hidden` を指定したままだと、`layoutMode: "embedded"` を使ってもページ自体はスクロールしません。 この unittest では意図的に長い本文を前後へ置き、文書フローと canvas host の関係を追いやすくしています

同じ要領で教材ページを作る場合は、解説文、画像、コード例のあいだに canvas を差し込めます。WebgApp 側は host を自動で作り、 HelpPanel、dialogue、fixed panel、touch controls をその host 内の absolute overlay として扱います

下へスクロールしたあと、右上の status が見えていれば、そこで現在の矩形差分を数値でも追えます