← 목록
기타 2026-07-16 6KB 읽기 6분

크라우니 오피스 문서 편집기 — 툴바 드롭다운 3종 (punch #10, Phase 1-A 마지막)

개요

문서기능-판정표.md의 마지막 punch 항목 — 툴바 스타일(본문 ▾)·폰트(Pretendard ▾)·크기(15 ▾) 3개 드롭다운은 onClick 자체가 없는 정적 라벨이라 클릭해도 아무 반응이 없었다. 이번 작업으로 셋 다 실제 드롭다운 UI + 적용 로직을 배선해 Phase 1-A(문서 완전성 punch list 10개)가 완료됐다.

무엇을 했는지

  1. 스타일 드롭다운 — 클릭 시 제목1/제목2/본문/코드/인용 5종 목록이 열리고, 선택하면
punch #1/#9의 applyParagraphPreset()를 그대로 재사용해 적용(새 서식 로직 없음, 동일 진입점 하나 더). 커서 위치 블록의 실제 스타일을 판정해 라벨을 실시간 동기화.
  1. 폰트 드롭다운 — Pretendard·시스템 산세리프·세리프·모노 4종. execCommand('fontName')
임시 마커 문자열로 호출해 선택영역을 감싸게 한 뒤, 생성된 <font> 태그를 즉시 <span style="font-family:...">로 치환(정확한 CSS 폰트스택 적용, 임의 face 속성 값 문제 회피). 커서 위치의 font-family를 역추적해 라벨 동기화.
  1. 크기 드롭다운 — 10/12/14/15/16/18/24/30 8종. execCommand('fontSize')는 1~7 계단이라
부정확해 폰트와 동일한 "마커 후 치환" 전략으로 정확한 px를 <span style="font-size:Npx">로 적용. 실측: 24 선택 시 정확히 font-size: 24px; 적용 확인(계단 오차 없음).
  1. 드롭다운 UI는 기존 표 삽입 팝오버(punch #5)와 동일 톤(크림 #FDFBF7·골드 #E2D9C8·라운드)·
구조(ACTIVE_POPOVER 단일슬롯 재사용) — 다른 팝오버/모달이 열려 있으면 자동으로 닫히고, Esc는 섹션14 통합 디스패처가 이미 ACTIVE_POPOVER를 최우선 처리하므로 추가 배선 없이 그대로 동작.
  1. 한선씨 정본 bundle/office/bridge/툴바선택.한선 신규 — 옵션목록 3종·현재값판정·폰트값
매핑·크기 유효성/클램프. hanseonc_high 컴파일+crownyc run 자체시험 21/21 PASS.

실측 검증 (CDP :9333, 새로고침 단일주입)

  • 스타일: 본문 블록에 커서 → 라벨 "본문 ▾" 정확 → 클릭 → 5항목 드롭다운 열림 → "제목 2" 선택
→ 블록이 <DIV style="font-size:20px;font-weight:800;margin:26px 0 10px;">로 전환(DOM diff 확인) → ⌘Z로 완전 원복.
  • 폰트: 문단 전체 선택 → "Pretendard ▾" → "모노" 선택 → `<span style="font-family:&quot;JetBrains
Mono&quot;,...">` 로 정확히 wrap → ⌘Z로 완전 원복.
  • 크기: 문단 전체 선택 → "15 ▾" → "24" 선택 → <span style="font-size: 24px;"> 정확 적용 →
라벨 "24 ▾"로 즉시 동기화 → ⌘Z로 완전 원복.
  • 드롭다운 상호배타(다른 것 열면 기존 닫힘) 확인, 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종) 신규
+ schedule()에 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.htmlnative/crowny-browser.m·native/crowny-shell.m· native/Makefile 무수정 확인(make ai → "Nothing to be done", ./CrownyAI 3초+ 생존 확인).

잔여 이슈

  • 위 "⌘⌥ 단축키 vs 셸 리스너 등록순서" 레이스 — punch #9 후속으로 별도 세션에서 재현조건
고정 후 수정 필요(브릿지를 WKUserScript atDocumentStart로 승격하거나, 셸 스크립트 자체에 altKey 가드를 추가하는 두 방향 검토 가치 있음).
  • Phase 1-A(문서 punch #1~#10) 전항 완료 → 다음은 spec/오피스-개발계획.md 1-B(무버그 회귀
하니스)·1-C(취약점 보완)로 진행.