From ee0475d0a49e863f03090b328e0f3b64c9012e8a Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 28 Sep 2026 22:38:37 +0900 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=EA=B3=B5=EC=9A=A9=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EC=B0=BD=20=EB=8B=AB=ED=9E=90=20=EB=95=8C=20?= =?UTF-8?q?=EC=B4=88=EC=A0=90=EC=9D=84=20=EC=97=B0=20=EC=9E=90=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=20=EB=90=98=EB=8F=8C=EB=A6=BC=20=C2=B7=20Esc=20?= =?UTF-8?q?=EB=A1=9C=20=EC=B7=A8=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - showConfirmDialog: 열기 전 초점을 기억해 취소 · 확인 · Esc 로 닫힐 때 그 요소가 아직 화면에 있으면 되돌림 - 열리면 [취소]에 초점 — 뒤 칸에 글이 들어가지 않고 Esc 가 먹음 · Esc 는 확인 창만 닫음(뒤 창 · 페이지로 안 넘김) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_019Kyw9qnkJ94pC1A4PfpDtA --- ui_template/ui_template_elements.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ui_template/ui_template_elements.ts b/ui_template/ui_template_elements.ts index 4bd498b4..40285e34 100644 --- a/ui_template/ui_template_elements.ts +++ b/ui_template/ui_template_elements.ts @@ -318,17 +318,26 @@ export function showConfirmDialog(message: string, confirmLabel = "확인"): Pro const panel = el("div", { className: "ui-confirm__panel" }); const text = el("p", { className: "ui-confirm__message", text: message }); const actions = el("div", { className: "ui-confirm__actions" }); + const back = document.activeElement as HTMLElement | null; // 닫힐 때 초점을 돌려놓을 자리 const done = (result: boolean): void => { overlay.remove(); + if (back?.isConnected && back !== document.body) back.focus({ preventScroll: true }); resolve(result); }; + const cancel = createButton({ label: "취소", variant: "ghost", onClick: () => done(false) }); actions.append( - createButton({ label: "취소", variant: "ghost", onClick: () => done(false) }), + cancel, createButton({ label: confirmLabel, variant: "danger", onClick: () => done(true) }), ); + overlay.addEventListener("keydown", (ev) => { + if (ev.key !== "Escape") return; + ev.stopPropagation(); // 뒤 창 · 페이지 Esc 까지 닫지 않음 + done(false); + }); panel.append(text, actions); overlay.append(panel); document.body.append(overlay); + cancel.focus(); // 창에 초점 — 뒤 칸에 글이 들어가지 않고 Esc 가 먹음 }); }