feat(480 드롭다운): 마우스로 고른 뒤 한 박자 뒤 초점 뺌 — 키보드 고름 그대로 · 공용 진입 · CAD iframe · 종단 새 창 세 자리
- ui_template_native_menu.ts releaseSelectAfterPick — 창 캡처 pointerdown · keydown · change · 아직 그 select 에 초점일 때만 blur - 시험 test_280_6_select_release 새로 · 옛 가짜 import 두 헬퍼(282-1 · 224-1c)에 새 함수 흉내 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
|
||||
import "./cad_host.css";
|
||||
import { showToast } from "@ui/ui_template_elements";
|
||||
import { blockNativeMenu } from "@ui/ui_template_native_menu";
|
||||
import { blockNativeMenu, releaseSelectAfterPick } from "@ui/ui_template_native_menu";
|
||||
|
||||
/** CAD 앱 정적 경로 (main.py 마운트, dev는 vite proxy 위임) */
|
||||
const CAD_APP_URL = "/b07-cad/index.html";
|
||||
@@ -148,7 +148,9 @@ export function createCadHost<D extends CadHostDrawing, M = unknown, Q = unknown
|
||||
frame.title = options.title;
|
||||
// CAD 안(리본 · 패널)도 브라우저 기본 메뉴를 막음 — 부모 문서의 듣기는 iframe 에 안 닿음(계획서 39-9a)
|
||||
frame.addEventListener("load", () => {
|
||||
if (frame.contentWindow) blockNativeMenu(frame.contentWindow, () => true);
|
||||
if (!frame.contentWindow) return;
|
||||
blockNativeMenu(frame.contentWindow, () => true);
|
||||
releaseSelectAfterPick(frame.contentWindow); // 리본 드롭다운도 고른 뒤 초점 뺌(요구 280-6)
|
||||
});
|
||||
// 포인터가 CAD 위에 오면 키(Ctrl+Z · Ctrl+Y …)가 CAD 로 가게 초점을 넘김 — 부모 입력 칸에서 치는 중이면 안 뺏음
|
||||
frame.addEventListener("mouseenter", () => {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/* =============================================================================
|
||||
* ui_template_native_menu.ts
|
||||
* 브라우저 기본 오른쪽 클릭 메뉴 막기 — 공용 진입(`A00_Common/main.ts`) · CAD iframe(`cad_host.ts`)이 부름.
|
||||
* 브라우저 기본 동작 손봄 — 공용 진입(`A00_Common/main.ts`) · CAD iframe(`cad_host.ts`) · 종단 새 창(`design_profile_popout.ts`)이 부름.
|
||||
*
|
||||
* 창 캡처 단계에서 `preventDefault` 만 함 — 이벤트는 멈추지 않으므로 우리 메뉴 듣기는 그대로 돎.
|
||||
* 오른쪽 클릭 메뉴 막기 — 창 캡처 단계에서 `preventDefault` 만 함 — 이벤트는 멈추지 않으므로 우리 메뉴 듣기는 그대로 돎.
|
||||
* 글 입력 칸도 막음 — 붙여넣기 · 복사는 Ctrl+V · Ctrl+C · 그 칸에 우리 메뉴가 붙어 있으면 그 메뉴가 뜸.
|
||||
* 드롭다운 초점 빼기 — 마우스로 고른 뒤 초점이 남으면 휠 · ↑↓ 가 값을 또 바꿈(요구 280-6).
|
||||
* ========================================================================== */
|
||||
|
||||
/** 막을 주소 — B · M 영역(`b01-…` · `m02-…`) · A 영역은 그대로 */
|
||||
@@ -19,3 +20,23 @@ export function blockNativeMenu(win: Window, isOn: () => boolean): void {
|
||||
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,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user