크라우니 오피스 마인드맵 punch #2 — 노드 추가(Tab/Enter) + 키보드
개요
판정표(spec/마인드맵기능-판정표.md) punch #2: 키 가이드 패널이 Tab=자식/Enter=형제/Space=접기/
Delete=삭제/⌥arrows=이동을 "광고"만 하고 componentDidMount 부재로 실제 keydown 리스너 0(장식).
실제 노드 추가 + 키보드 활성으로 구현. 앱 번들 무수정, §21 installMapBridge 확장 + 한선씨 정본 신설.
무엇을 했는지
- 한선씨 정본
bundle/office/bridge/마인드맵편집.한선(신규): 자식/형제 parentId 계산·노드삭제
(하위트리·루트금지)·선택이동(트리 탐색 ←부모/→첫자식/↓다음/↑이전)·키 라우팅(편집중 vs 비편집
분기). hanseonc_high 자체시험
30/30. (마인드맵모델.한선 punch#1은 20/20 그대로 무회귀.)
crownyBridge.js §21 확장(installMapBridge 내부만):
노드 CRUD: nextMapId/addChild(Tab)/addSibling(Enter, 대상 뒤 splice)/deleteNode/navigateSel/
toggleCollapse/commitEditing. 모두 setState 로 새 nodes 커밋 → 3레이아웃/방사형/트리·엣지 자동 정합.
window 캡처 keydown(onMapKeydown): 마인드맵편집.한선 키라우팅() 미러. ⌘/Ctrl(⌘1~9)은 양보,
처리 키만 stopImmediatePropagation 로 셸 선점. 편집중 Enter=편집확정(요소 blur 양보)·일반 화살표/
문자=네이티브 편집 양보·⌥화살표/Tab=커밋 후 구조조작.
리스너 게이트: syncMapKeyListener 가 fixup 폴링(150ms)에서 findModuleRoot() 기준 부착/해제
(모듈 벗어나면 리스너 완전 해제).
새 노드 자동 편집 포커스(fixup) + stale focusId 클리어(선택 이동 시 포커스 하이재킹 방지).
★핵심 함정 수리(라이브 실측): 앱 DCLogic 리스트 reconciliation 이 한 렌더 늦게 적용 — 노드
추가 직후엔 sc-for 목록에 새 행 DOM 이 안 생기고(모델은 4자식인데 DOM 3행), 다음 setState 에서야
4번째 행 생성. fixup 은 setState 를 안 해 새 노드가 영영 안 보였음 →
scheduleReflow(추가/삭제
직후 다음 틱 재setState, 멱등)로 팔로업 렌더 강제 → 새 노드 즉시 표시·편집 가능.
게이트 결과 (전부 PASS)
- hanseonc_high 마인드맵편집.한선 30/30 / ./CrownyAI 3초 생존 ✓
- CDP(:9333) 실측: ①b0 선택+Tab→자식 추가(11→12, 부모 b0, b0자식 4, 새노드 선택) ②Enter→형제
(12→13, n2 부모 root) ③새 노드 auto-focus+편집("새 노드"→"편집된새노드") 영속 ④화살표 선택이동
(→ root→b0, ↓ b0→b0c0, ← b0c0→b0) ⑤모듈 벗어나면 리스너 해제(bound false)+키 비활성(카운트 불변)
⑥트리정합: 추가 2노드가 우측맵/방사형/트리 3레이아웃 모두 배선
- 문서 회귀 27/27 PASS (회귀실행.sh, 2회 확인)
- 마인드맵 #1 무회귀: 시드 노드 라벨 편집 영속 + 3레이아웃 보존 + 레이아웃 전환 정상
관련 파일
- /Users/ef/crownybrowser/bundle/office/bridge/마인드맵편집.한선 (신규, punch#2 정본 30/30)
- /Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js (§21 확장)
- /Users/ef/crownybrowser/bundle/office/bridge/마인드맵모델.한선 (punch#1, 무변 20/20)
- CDP 하네스(스크래치패드): mm_cdp_test.js
잔여 이슈
- punch #3(노드 삭제 UI·⌘. 접기 키보드)·#4(재부모화 ⌥←→↑↓+드래그)·#5(방사형/트리 접기 통일)·
#6(줌팬)·#7(색)·#8(아웃라인 변환)·#9(슬라이드/시트 내보내기) 미착수.
- dist/CrownyAI.app 내 bridge 사본 동기화는 배포 make 단계(SSOT=bundle/).