/* ============================================================================= * ui_template_native_menu.ts * 브라우저 기본 동작 손봄 — 공용 진입(`A00_Common/main.ts`) · CAD iframe(`cad_host.ts`) · 종단 새 창(`design_profile_popout.ts`)이 부름. * * 오른쪽 클릭 메뉴 막기 — 창 캡처 단계에서 `preventDefault` 만 함 — 이벤트는 멈추지 않으므로 우리 메뉴 듣기는 그대로 돎. * 글 입력 칸도 막음 — 붙여넣기 · 복사는 Ctrl+V · Ctrl+C · 그 칸에 우리 메뉴가 붙어 있으면 그 메뉴가 뜸. * 드롭다운 초점 빼기 — 마우스로 고른 뒤 초점이 남으면 휠 · ↑↓ 가 값을 또 바꿈(요구 280-6). * ========================================================================== */ /** 막을 주소 — B · M 영역(`b01-…` · `m02-…`) · A 영역은 그대로 */ export const NATIVE_MENU_ROUTE = /^[bm]\d/; /** `win` 의 기본 메뉴를 막음 — `isOn()` 이 거짓이면(예: A 영역 주소) 그대로 둠 */ export function blockNativeMenu(win: Window, isOn: () => boolean): void { win.addEventListener( "contextmenu", (event) => { if (isOn()) event.preventDefault(); }, true, ); } /** `win` 안 드롭다운을 마우스로 고르면 한 박자 뒤 초점을 뺌 — 키보드로 고른 때(↑↓ 훑기)는 그대로 둠. * 한 박자 뒤 · 아직 그 select 에 초점일 때만 — 페이지 처리(다시 그림 · 다른 칸 초점)가 먼저 끝남. * iframe 은 다른 realm — `instanceof` 대신 `tagName` 으로 가림. */ export function releaseSelectAfterPick(win: Window): void { let byKey = false; win.addEventListener("pointerdown", () => (byKey = false), true); win.addEventListener("keydown", () => (byKey = true), true); win.addEventListener( "change", (event) => { const select = event.target as HTMLSelectElement | null; if (byKey || select?.tagName !== "SELECT") return; win.setTimeout(() => { if (select.ownerDocument.activeElement === select) select.blur(); }, 0); }, true, ); }