Skip to content

feat: 팝업 레이어 키보드 접근성 개편#96

Open
eun-yeon wants to merge 15 commits into
feature/atomic-store-pipelinefrom
feature/popup-layer-accessibility
Open

feat: 팝업 레이어 키보드 접근성 개편#96
eun-yeon wants to merge 15 commits into
feature/atomic-store-pipelinefrom
feature/popup-layer-accessibility

Conversation

@eun-yeon

Copy link
Copy Markdown
Member

개요

팝업 레이어 소유권을 기준으로 키보드 접근성을 다시 세우고, 플러그인 표시 요소 생명주기와 키 입력 유실 경로 정비

변경 내용

  • 팝업 레이어 소유권 기반으로 키보드 접근성 개편
  • 키 모드 전환 레이스와 오버레이 눌림 상태 유실 수정
  • 플러그인 표시 요소 인스턴스 생명주기 정비
  • 폰트 CDN 의존 제거하고 전량 프리로드로 메모리 개선
  • 카운터 초기화 저장 중 유입된 키 입력 유실 방지
  • 오버레이 생성 데드락과 키 데이터 유실 경로 수정
  • 키 저장을 원자 커맨드로 전환하고 오버레이 토글 실패를 롤백
  • 상주 크롬 렌더링 비용 완화하고 화면 전환 모션 제거
  • 테스트 전용 수제 FFI를 libc 크레이트로 교체

스택 5/15 · base feature/atomic-store-pipeline
순서대로 merge commit으로 머지 필요, squash나 rebase로 머지하면 위 PR들이 깨짐

eun-yeon added 15 commits July 15, 2026 00:16
팝업 레이어 스택을 도입해 Escape와 Tab 소유권을 DOM 구조 추측 대신
등록 순서로 판정한다. 모달, 플로팅 팝업, 리스트 팝업, 드롭다운에
ARIA 시맨틱과 방향키 내비게이션, 포커스 진입과 opener 복원을 넣고
호출부 전반의 ariaLabel을 필수화했다. 웹폰트 미리보기 CSS는
@font-face 블록만 추출해 전역 규칙이 앱에 새어드는 것을 차단한다.
setMode에 요청 세대 가드를 둬 뒤늦게 도착한 응답이 최신 상태를 덮지
않게 하고, 실패 시 권위 모드로 롤백한다. 구독 API가 확립 시점을
알리는 ready 프로미스를 노출하고, 오버레이는 구독을 먼저 맺은 뒤
bootstrap의 activeKeys 스냅샷으로 눌림 상태를 하이드레이션해 지연
생성 시 DOWN 상태 유실을 없앤다. 런타임 종류를 윈도우 전역에 마킹해
OBS 클라이언트는 로컬 변경만 수행한다.
복원 중 발생한 외부 변경을 완료 후 한 번에 반영하는 저장 배리어를
두고, bootstrap을 기다렸다가 복원하되 타임아웃 시 데이터 보존을
우선해 전체 복원으로 폴백한다. 삭제된 탭의 인스턴스는 메모리와
저장소에서 멱등하게 정리하고 storage 쓰기를 직렬화한다. 빌트인
키 모드 목록은 상수로 단일화했다.
CDN에서 받던 빌트인 Pretendard 항목을 제거하고, 저장 데이터에 남은
비가변 family 참조를 로컬 번들 가변 파일로 해석하는 alias를 추가해
오프라인에서도 동일하게 렌더링한다. 모든 폰트를 즉시 디코드하던
전량 프리로드를 제거해 상주 메모리 사용을 줄였다.
onKeyState 반환값의 ready 프로미스를 문서화하고, OBS 모드 브라우저
소스 설정 방법과 공유 URL 권한 경고를 영문과 국문에 추가했다.
LC_BUILD_VERSION의 minos가 없으면 LC_VERSION_MIN_MACOSX의 version을
폴백으로 읽고, 둘 다 없으면 조용히 종료하는 대신 명확한 실패
메시지를 낸다.
번들 ID 조회에 잡히지 않는 개발 실행 메인은 전달받은 pid 생존
확인으로 종료를 대기하고, 유예 시간 초과 시 강제 종료한다.
직접 선언한 rlimit 구조체와 하드코딩 상수를 libc dev-dependency의
정의로 바꿔 플랫폼별 값 차이 위험을 없앤다.
전체 초기화, 모드 초기화, 커스텀 탭 삭제가 카운터 스냅샷과 store
커밋, 런타임 미러 교체를 하나의 write lock 경계 안에서 수행한다.
저장 도중 들어온 입력은 잠시 대기했다가 초기화 결과 위에 반영된다.
설정 진입과 전면 시트 등장에서 translateY 성분을 없애 페이드만으로
전환한다. 지속 시간과 이징, 마운트 타이밍은 그대로다.
Windows에서 오버레이를 처음 켤 때 동기 커맨드의 WebView2 창 생성이
메시지 루프에 고착되던 것을 async 전환과 생성 직렬화로 해소하고,
종료 워치독을 모든 종료 경로에 적용해 행 상태에서도 프로세스가
실패 코드로 정직하게 끝나게 했다.

keys와 keyPositions를 단일 트랜잭션으로 커밋하는 커맨드를 추가하고
모든 커밋 경계에서 두 배열 길이를 요소 삭제 없이 패딩으로 정합시켜,
한쪽만 저장된 채 강제 종료되면 그리드에 없는 키가 오버레이에만
나타나던 불일치를 원천 차단했다.

1.6.1에서 합법이던 미바인딩 노브(빈 axisId)를 로드 시 삭제하던
회귀를 제거하고, Windows verbatim과 UNC 경로의 identity 정규화를
sweep까지 통일해 참조 중인 자산이 고아로 오판되는 구멍을 막았다.
해석 불가 참조는 해당 카테고리 정리를 보수적으로 건너뛰고 로드
시점에 요약 로그로 드러낸다.

첫 마이그레이션 직전 원본 store를 하드링크로 보존하는
pre-migration 백업과 1.6.1 원문 JSON 픽스처 테스트를 추가했고,
카운터 초기화 스냅샷과 개별 입력 이벤트의 순서를 락 경계로
보장한다.
mappings와 positions를 별도 커맨드 두 번으로 저장하던 경로를
단일 트랜잭션 커맨드 호출로 교체했다. 오버레이 토글은 실패 시
낙관적 갱신을 되돌려 스위치 표시가 실제 상태와 어긋나지 않는다.
캔버스 위에 상시 떠 있는 사이드 패널과 미니맵의 라이브 블러를
고알파 솔리드 토큰으로 교체하고, 모달 스크림의 전화면 블러와
블러 키프레임 보간을 제거해 Windows에서 조작 프레임마다 발생하던
재필터 비용을 없앴다. 비활성 패널 페이지는 전환이 끝나면 페인트
대상에서 제외한다.

설정 진입과 전면 시트의 등장 모션을 제거해 즉시 전환하고,
투명도 감소 접근성 설정에서는 남은 글래스 표면을 솔리드로
강등하는 폴백을 추가했다.
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