크라우니 오피스 아웃라인 모듈 완성 (punch #1~#9)
개요
크라우니AI 브라우저 내장 오피스의
아웃라인 모듈(ModuleOutline) = 계층 개요(노션식 5열 표: 주제·상태·담당·기한·노트). 읽기전용 뷰어에서 실작동 개요 편집기로 완성. 앱 번들 무수정 원칙 하에
crownyBridge.js §23 installOutlineBridge 신규 섹션 + 한선씨 정본 미러로 구현. §21 마인드맵 자산(마인드맵아웃라인.한선·재부모화) 재사용.
착수 시점 상태
트리 데이터 flat[]이 renderVals 내부 로컬 const(마인드맵과 동형, 편집 모델 없음 → hoist 선행 필요). 실작동 12/데모 4/없음 9.
무엇을 했는지 (9 punch)
- #1 flat[] hoist(parentId 트리) + 주제 편집(DCLogic이 topic을 element로 렌더·inline style 정규화 함정 수리, 아웃라인모델.한선 28/28)
- #2 항목 추가(형제 Enter/자식·uid·서브트리끝)·삭제(하위트리·sel 인접·open 키맵 누수0)·키보드 게이트(아웃라인편집.한선 28/28)
- #3 Tab 들여쓰기/Shift+Tab 내어쓰기(위형제 자식/부모의 형제·하위트리 동반·경계 no-op)+⌥↑↓ 순서이동, Tab 표준화(아웃라인이동.한선 30/30)
- #4 체크박스 완료 토글(status 전이·prevStatus 왕복·섹션 no-op·Space/⌘Enter·필터/카운트 파급, 아웃라인상태.한선 30/30)
- 자동번호(하드코딩 "1.1.1"→depth·형제순번 DFS 실계산·추가/삭제/이동 재계산, 아웃라인번호.한선 23/23)
- 열 표시/숨김(colVis 실소비 — 인라인 mutate 정규화 함정을 <style> 주입으로 회피) + 폴드배지 실계수(하드코딩 +6→실제 자손수, 아웃라인열폴드.한선 21/21)
- 모듈연동(아웃라인↔마인드맵 양방향·§21 재사용·합성루트 + 문서 개요 h1/h2/h3+노트 내보내기·스냅샷 독립, 아웃라인연동.한선 17/17)
검증
- 각 punch: hanseonc_high 자가검증 + CDP 실측(before/after) + 문서 27/27 + 아웃라인 앞 punch 무회귀
- 배포: CrownyAI 1.5.1→1.6.0-beta (punch별 증분), 매 punch 착수전 wc -l 확인·완료후 크기 재확인·백업(절단 사고 대비)
반복 함정 (오피스 dc 브릿지 공통)
- DCLogic이 편집 노드 텍스트 바인딩을 스킵 → 뷰전환 stale, setText 강제정합(포커스#2)
- DCLogic이 {{ }}를 텍스트노드 아닌 element로 렌더 → 편집 대상=자식 인덱스
- 브라우저 inline style 정규화(hex→rgb·1fr→px·repeat 확장) → substring 셀렉터 파손, <style> 주입 or 마커 어트리뷰트로 회피
- componentDidMount 부재 → 키보드는 window 캡처 리스너+모듈 게이트로 신설
관련 파일
bundle/office/bridge/crownyBridge.js §23 installOutlineBridge (11740줄, 앱번들 무수정)
bundle/office/bridge/아웃라인{모델,편집,이동,상태,번호,열폴드,연동}.한선 (정본 미러 7종)
spec/아웃라인기능-판정표.md
잔여 이슈 / 다음
- cdf 실저장(아웃라인 트리): 시트 @@SEC 패턴 미러로 후속
- Phase 4 다음 순서 = 플랜 (→그래프)
- 완성 모듈: 시트(10)·슬라이드(10)·마인드맵(8)·포커스(9)·아웃라인(9) — 오피스 실작동 축 5개