Skip to content

fix(blog): 모바일 사이드바 Esc 닫기를 포커스 위치와 무관하게 동작시킴#133

Merged
Malloc72P merged 2 commits into
mainfrom
claude/mobile-sidebar-esc
Jul 10, 2026
Merged

fix(blog): 모바일 사이드바 Esc 닫기를 포커스 위치와 무관하게 동작시킴#133
Malloc72P merged 2 commits into
mainfrom
claude/mobile-sidebar-esc

Conversation

@Malloc72P

Copy link
Copy Markdown
Owner

배경

PR #132(모바일 목차) 리뷰 중 발견된, 모바일 사이드바의 형제 결함입니다. GitHub 이슈는 없습니다.

증상

  • 모바일 사이드바에서 Esc 닫기가 패널 내부에 포커스가 있을 때만 동작했습니다.
  • 사용자가 비인터랙티브 영역(헤더 제목, 패딩 영역)을 클릭해 포커스가 document.body로 떨어지면, Esc를 눌러도 사이드바가 닫히지 않았습니다.

원인

  • onKeyDown이 패널 래퍼 div에 바인딩돼 있어, 포커스가 body로 빠지면 keydown 이벤트가 래퍼까지 버블링되지 않았습니다.
  • role="dialog" + aria-modal="true"를 선언한 이상, WAI-ARIA dialog 패턴대로 Esc는 포커스 위치와 무관하게 동작해야 합니다.

수정

  • 열려 있는 동안 document 레벨 keydown 리스너를 등록하는 useEffect를 추가하고, Escape 시 사이드바를 닫습니다. open이 false가 되면 리스너를 해제합니다. (PR #132에서 mobile-toc.tsx가 동일 문제를 해결한 패턴을 재사용)
  • 래퍼 onKeyDown에서는 Escape 분기를 제거하고 Tab 포커스 트랩만 유지해 중복 호출을 방지합니다.
  • 포커스가 패널 밖(body)에 있을 때 Esc로 닫히는지 확인하는 회귀 테스트를 추가했습니다.

검증

  • pnpm run build 성공
  • pnpm run lint 통과 (--max-warnings 0)
  • pnpm test (apps/blog) 통과 — 113 tests, mobile-sidebar 10 tests

- 열려 있는 동안 document 레벨 keydown 리스너로 Escape를 수신해 포커스가 body로 빠져도 닫히게 함
- 래퍼 onKeyDown에서는 Escape 분기를 제거하고 Tab 포커스 트랩만 유지(중복 호출 방지)
- 포커스가 패널 밖(body)에 있을 때 Esc로 닫히는 회귀 테스트 추가
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
blog Ignored Ignored Preview Jul 10, 2026 11:45am

- document Esc 리스너가 무조건 닫던 것을, 포커스가 패널 밖 인터랙티브 요소(상위 모달)에 있으면 양보하도록 수정
- 포커스가 body로 빠진 원래 버그 케이스는 그대로 닫히고, 검색 모달 등 상위 모달과의 Esc 동시 닫힘 회귀 제거
- mobile-sidebar·mobile-toc 동일 패턴 반영 + 양보 동작 회귀 테스트 추가
@Malloc72P Malloc72P merged commit a9342c6 into main Jul 10, 2026
3 checks passed
@Malloc72P Malloc72P deleted the claude/mobile-sidebar-esc branch July 10, 2026 11:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant