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

Crowny Office B-강화: 시트·슬라이드 설계 스펙 강화

개요

docs.crowny.org/office 시트(sheet-core.js/sheet-formulas.js)와 슬라이드(slide-core.js/ slide-presenter.js)에 신규 파일만으로(기존 엔진 무수정) UX 강화 레이어를 얹었다. 프로토타입 래핑 + DOM 증강 방식(office-learn.js와 동일 관례)으로 동작하며, 병렬로 진행 중이던 B-셸(CrownyShell) 통합과 독립적으로 구축 — B-셸 빌더가 index.html에 두 스크립트를 이미 <script src='/static/enhance-sheet.js'> / enhance-slide.js로 미리 배선해둬 별도 배선 작업 없이 바로 라이브에 붙는다.

무엇을 했는지

시트 강화 — 한선씨/정적/enhance-sheet.js (+ enhance-sheet.한선 동반)

  • 함수 도우미 패널: 수식바(#formula-input)에 focus/input 이벤트로 플로팅 패널 표시. 자주 쓰는
9개 함수(AVERAGE·IF·VLOOKUP·COUNTIF·TODAY·SUM·COUNT·MAX·MIN — sheet-formulas.js 실제 case 구현과 1:1 대조 확인) 시그니처+설명+예시. 타이핑 중인 접두어로 실시간 필터, ↑↓로 후보 이동, Tab으로 자동완성.
  • 범위 선택 시 상태바 통계: CrownySheet.prototype.selectRange/selectCell을 래핑해 선택 범위의
합계/평균/개수를 계산 → CrownyShell.setStatus()(있으면) 또는 자체 상태바 폴백 span에 표시.
  • 표 스타일 1클릭 프리셋: 선택 범위 첫 행=브랜드 브라운 헤더(#3D2B1F/#F6EFE4), 나머지 행은
#FDFBF7/#FFFFFF 밴딩 — office-design-tokens 값과 1:1.
  • ⌘방향 데이터 경계 점프 / ⌘⇧방향 범위 확장: 엑셀 Ctrl+화살표와 동일 규칙(연속 블록 끝으로 이동,
빈 셀은 다음 값까지 건너뜀, 그리드 경계에서 정지). document에 capture:true 리스너를 추가해 sheet-core.js의 기존 비-capture 리스너보다 먼저 가로채고 stopImmediatePropagation으로 중복 이동 방지.
  • 조건부 서식 노출: 신규 구현이 아니라 기존 CrownyDialogs.conditionalFormat()(sheet-extras.js/
dialogs.js에 이미 완성돼 있던 기능, 툴바 🎨 버튼과 동일 로직)을 커맨드로 연결만 함.

슬라이드 강화 — 한선씨/정적/enhance-slide.js (+ enhance-slide.한선 동반)

  • 발표 모드 ⌘⏎: 기존 CrownyPresenter(발표자 화면: 현재+다음+노트+타이머, 이미 구현돼 있음)는
그대로 두고, start/_renderSlide/stop을 래핑해 window.open으로 청중 창을 분리 — 청중 창은 현재 슬라이드만 깨끗하게 표시. 팝업 차단 시 청중 창 오픈만 스킵하고 기존 단일 오버레이로 자동 폴백.
  • 썸네일 레일 키문법: Enter=새 슬라이드, ⌘D=복제, Delete=삭제(캔버스 엘리먼트가 선택 안 돼 있을 때만
— 기존 Delete=엘리먼트삭제 핸들러와 충돌하지 않게 selected===null 게이트). 드래그 재배열은 slide-core.js _bindSlideReorder가 이미 구현돼 있어 손대지 않음.
  • ⌘⌥O 슬라이드 아웃라인 보기: 슬라이드 배열을 {title, bullets} 모델로 압축 → "● 제목 / " - " 불릿"
텍스트로 직렬화해 편집 → 적용 시 슬라이드 elements로 되쓰기(기존 title/content 엘리먼트 위치·스타일 보존). ⚠️ 컨테이너 id는 mode-outline을 쓰지 않고 mode-slide-outline을 새로 만듦 — mode-outline은 CrownyShell 8모듈 계약의 모듈7 "아웃라인"(outline.js/module-bridge.js가 이미 구현한 프로젝트/작업 트리 편집기, 마인드맵과 데이터 공유)의 전용 컨테이너라 재사용하면 그 모듈을 덮어써버리는 충돌이었음 (병렬 빌드 중 발견·회피, 2026-07-13).

커맨드/키 바인딩 아키텍처

  • office-shell.js 실측 결과 CrownyShell.registerCommand()keys 필드는 팔레트(⌘K) 표시용
라벨일 뿐 전역 키 디스패치를 하지 않는다(wireKeyboard()는 ⌘K/⌃Space/⌘1-8만 처리). 그래서 실제 단축키는 이 두 파일이 항상 자체 document keydown 리스너로 직접 처리하고, registerCommand는 팔레트 노출용으로 독립적으로(최대 5초 폴링) 호출 — 두 경로가 상호배타적이지 않고 중복실행도 없음 (물리 키 입력과 팔레트 클릭은 서로 다른 트리거).

검증

  • node --check enhance-sheet.js / enhance-slide.js — 통과.
  • 순수 로직(경계점프·통계·함수매칭·아웃라인 왕복 등)을 CrownySheetEnhance/CrownySlideEnhance
네임스페이스로 분리해 Node 하네스로 검증: enhance-sheet 27/27 assert, enhance-slide 16/16 assert.
  • enhance-sheet.한선/enhance-slide.한선 동반본 — hanseonc_high 컴파일(CROWNY_STRICT=1, 경고 0)
+ crownyc run 자체시험: 22/22, 12/12 통과. 경계점프·표스타일·아웃라인 마커 왕복 로직을 한선씨로 재구현해 정본화(브라우저 DOM 의존 부분은 JS 전용으로 명시).
  • 크라우니코드 학습: PostToolUse 훅이 .한선 Write 시 자동으로 함수별 학습 등록
(fn_enhance-sheet_경계점프_가로 등 lookup 확인됨).

관련 파일

  • /Users/ef/CrownyDoc/한선씨/정적/enhance-sheet.js
  • /Users/ef/CrownyDoc/한선씨/정적/enhance-sheet.한선
  • /Users/ef/CrownyDoc/한선씨/정적/enhance-slide.js
  • /Users/ef/CrownyDoc/한선씨/정적/enhance-slide.한선
  • (읽기만, 무수정) sheet-core.js, sheet-formulas.js, sheet-extras.js, dialogs.js,
slide-core.js, slide-presenter.js, office-shell.js, index.html
  • 병렬 산출물 참조: 2026-07-13-crowny-office-B셸-통합.md, 2026-07-13-office-module-bridge.md

잔여 이슈

  • mode-slide-outline 패널은 position:fixed;inset:0로 전체화면 오버레이 방식 — CrownyShell의
.mode-panel 플로우(8모듈 탭 전환)에 편입된 정식 9번째 패널이 아니라 슬라이드 모듈 위에 뜨는 모달형 오버레이다. 필요시 향후 정식 모듈로 승격 검토(현재는 기능 요구사항인 "슬라이드↔텍스트 아웃라인 편집"에는 충분).
  • 함수 도우미 패널/표 스타일 프리셋 등은 브라우저 DOM 시나리오라 Node 하네스로 직접 구동 검증은
불가 — 라이브 index.html에서 수동 조작 검증 필요(다음 세션 또는 사장님 확인 시).
  • registerCommand 5초 폴링 실패 시(=CrownyShell이 끝까지 안 뜨는 경우) 팔레트 노출만 빠지고
실제 단축키는 이미 항상 바인딩돼 있어 기능 손실 없음.