fix(B07): 트랙패드 핀치가 브라우저까지 확대하던 것을 막는다

핀치는 ctrl+wheel 이벤트인데 CAD 휠 처리가 preventDefault를 하지 않아 브라우저
기본 확대가 그대로 실행됐다. 캔버스 밖(리본·패널)에는 휠 핸들러조차 없었다.

- 캔버스 휠 리스너를 passive:false로 등록하고 handleMouseWheel에서 preventDefault
- document에 ctrl+wheel만 막는 리스너 — 리본·패널 위 핀치도 브라우저 확대 금지,
  ctrl 없는 휠은 남겨 패널 스크롤 유지

확대 감각(세기)·방향·로그는 건드리지 않았다 — 별도 제안으로 PLAN.md 보류 항목.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-29 16:54:23 +09:00
co-authored by Claude Fable 5
parent 3aed06eaca
commit b16053e9e4
@@ -67,13 +67,25 @@ export class InputController {
canvas?.addEventListener('mousedown', (evt: MouseEvent) => this.handleMouseDown(evt));
canvas?.addEventListener('mousemove', (evt: MouseEvent) => this.handleMouseMove(evt));
canvas?.addEventListener('mouseup', (evt: MouseEvent) => this.handleMouseUp(evt));
canvas?.addEventListener('wheel', (evt: WheelEvent) => this.handleMouseWheel(evt));
// passive:false — 핀치·휠의 브라우저 기본 확대/스크롤을 막아야 한다.
canvas?.addEventListener('wheel', (evt: WheelEvent) => this.handleMouseWheel(evt), {
passive: false,
});
canvas?.addEventListener('mouseout', () => this.handleMouseOut());
canvas?.addEventListener('mouseenter', () => this.handleMouseEnter());
// Stop the context menu from appearing when right-clicking
canvas?.addEventListener('contextmenu', (evt) => {
evt.preventDefault();
});
// 캔버스 밖(리본·패널) 위에서의 트랙패드 핀치도 브라우저를 확대시키지 않는다.
// ctrl이 없는 휠은 그대로 둬서 패널 스크롤은 살린다.
document.addEventListener(
'wheel',
(evt: WheelEvent) => {
if (evt.ctrlKey) evt.preventDefault();
},
{ passive: false }
);
}
public draw(drawController: ScreenCanvasDrawController) {
@@ -214,6 +226,8 @@ export class InputController {
* @param evt
*/
public handleMouseWheel(evt: WheelEvent) {
// 확대는 도면만 — 트랙패드 핀치(ctrl+휠)가 브라우저 전체를 키우던 것을 막는다.
evt.preventDefault();
if (Math.abs(evt.deltaY) === 0) {
return; // We can't zoom by zero delta
}