크라우니 오피스 문서 편집기 — 툴바 드롭다운 3종 (punch #10, Phase 1-A 마지막)
개요
문서기능-판정표.md의 마지막 punch 항목 — 툴바 스타일(본문 ▾)·폰트(Pretendard ▾)·크기(15 ▾)
3개 드롭다운은 onClick 자체가 없는 정적 라벨이라 클릭해도 아무 반응이 없었다. 이번 작업으로
셋 다 실제 드롭다운 UI + 적용 로직을 배선해 Phase 1-A(문서 완전성 punch list 10개)가 완료됐다.
무엇을 했는지
- 스타일 드롭다운 — 클릭 시 제목1/제목2/본문/코드/인용 5종 목록이 열리고, 선택하면
applyParagraphPreset()를 그대로 재사용해 적용(새 서식 로직 없음, 동일
진입점 하나 더). 커서 위치 블록의 실제 스타일을 판정해 라벨을 실시간 동기화.
- 폰트 드롭다운 — Pretendard·시스템 산세리프·세리프·모노 4종.
execCommand('fontName')을
<font> 태그를 즉시
<span style="font-family:...">로 치환(정확한 CSS 폰트스택 적용, 임의 face 속성 값 문제
회피). 커서 위치의 font-family를 역추적해 라벨 동기화.
- 크기 드롭다운 — 10/12/14/15/16/18/24/30 8종.
execCommand('fontSize')는 1~7 계단이라
<span style="font-size:Npx">로
적용. 실측: 24 선택 시 정확히 font-size: 24px; 적용 확인(계단 오차 없음).
- 드롭다운 UI는 기존 표 삽입 팝오버(punch #5)와 동일 톤(크림 #FDFBF7·골드 #E2D9C8·라운드)·
- 한선씨 정본
bundle/office/bridge/툴바선택.한선신규 — 옵션목록 3종·현재값판정·폰트값
실측 검증 (CDP :9333, 새로고침 단일주입)
- 스타일: 본문 블록에 커서 → 라벨 "본문 ▾" 정확 → 클릭 → 5항목 드롭다운 열림 → "제목 2" 선택
<DIV style="font-size:20px;font-weight:800;margin:26px 0 10px;">로 전환(DOM diff
확인) → ⌘Z로 완전 원복.
- 폰트: 문단 전체 선택 → "Pretendard ▾" → "모노" 선택 → `<span style="font-family:"JetBrains
- 크기: 문단 전체 선택 → "15 ▾" → "24" 선택 →
<span style="font-size: 24px;">정확 적용 →
- 드롭다운 상호배타(다른 것 열면 기존 닫힘) 확인, Esc 닫힘 확인.
- 회귀: B(굵게) 적용+⌘Z 원복(전체 HTML diff로 재확인 — 첫 시도에서 문서 안에 원래부터 있던
<b>Crowny Office</b> 태그 때문에 정규식 오탐이 있어 재확인함), ⌘F 찾기바 열림, 우패널
스타일박스(제목1 클릭) 적용+원복 — 전부 정상.실측 중 발견한 버그(수정 완료)
paragraphPresetKindFor(block)가 block.getAttribute()를 무조건 호출해, 커서가 편집영역의
loose 텍스트노드(블록 사이 공백/개행이 이 문서 실측처럼 editable 직계 텍스트노드로 존재하는
경우)에 있을 때 TypeError로 크래시했다. block.nodeType !== 1(Element 아님) 가드 추가로
수정, 재검증 통과.
실측 중 발견한 기존 이슈(이번 작업 범위 밖 — punch #9, 미수정)
⌘⌥1/⌘⌥2/⌘⌥0 등 Alt 조합 단축키를, 셸(index)의 자체 window 캡처 keydown 리스너가
브릿지보다 먼저 등록되는 로딩 순서에서 실행하면, 브릿지의 stop(e)(stopImmediatePropagation
포함)가 이미 실행된 셸 리스너를 소급 차단하지 못해 문서 탭이 홈으로 언마운트되는 경우가
재현됐다(같은 노드+같은 phase는 등록 순서로 실행되므로, 셸 리스너가 먼저 등록되면 나중에
등록된 브릿지가 아무리 stopPropagation해도 못 막음). crownyBridge.js 섹션14(통합 단축키
디스패처)는 이번 작업에서 전혀 손대지 않았고, 재현도 특정 로딩 순서에서만 발생(항상은 아님)
— punch #9 후속 과제로 별도 기록. 마우스 클릭 기반 드롭다운(이번 punch #10 본체)은 이 경로와
무관해 영향 없음.
관련 파일
/Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js— 섹션15(드롭다운 3종) 신규
updateDropdownLabels() 훅 추가 + paragraphPresetKindFor 버그수정
/Users/ef/crownybrowser/bundle/office/bridge/툴바선택.한선— 신규, 자체시험 21/21/Users/ef/crownybrowser/spec/문서기능-판정표.md— punch #10 대상 정의(원본, 무수정)/Users/ef/crownybrowser/spec/오피스-개발계획.md— Phase 1-A 착수순서 9번째 항목(원본, 무수정)
bundle/office/app/index.html)·native/crowny-browser.m·native/crowny-shell.m·
native/Makefile 무수정 확인(make ai → "Nothing to be done", ./CrownyAI 3초+ 생존 확인).잔여 이슈
- 위 "⌘⌥ 단축키 vs 셸 리스너 등록순서" 레이스 — punch #9 후속으로 별도 세션에서 재현조건
- Phase 1-A(문서 punch #1~#10) 전항 완료 → 다음은 spec/오피스-개발계획.md 1-B(무버그 회귀