# W-013 Status status: done task: 建立 Three.js 视口烟测 ## Evidence - Adapter: `web/app/src/three-adapter/viewport.ts` - Uses vendored Three.js `0.185.1` from `web/app/src/vendor/three/`, `WebGLRenderer`, `Scene`, `PerspectiveCamera`, `OrbitControls`, `GridHelper`, lights, resize observer and disposal. - No runtime CDN request is required; Playwright asserts all requests stay on the local dev origin. - Screenshot: `tests/golden/W-013/three-viewport-1440x900.png` ## Verification ```text npm run typecheck # passed npm run lint # passed npm run build # passed Chrome headless --use-gl=swiftshader --virtual-time-budget=60000 # rendered cube/grid ``` The renderer failure path is contained in the viewport component, so browsers without a WebGL context keep the editor shell available.