CrownyDesign Partner — 모바일 지원 구현
개요
design.crowny.org (CDP v4.2) CATIA급 CAD/CAM 웹 앱에 완전한 모바일 지원을 추가했다. 로그인부터 3D 뷰어, 리뷰 마크업, 작업 모드 전환까지 모바일에서 전체 워크플로우가 동작한다.
구현 내용
Phase 1: 모바일 인증 + 레이아웃 + 제스처
- mobile-auth.js: 역할 기반 로그인 (admin/designer/engineer/reviewer/viewer), localStorage 세션, 게스트 모드
- mobile-layout.js: 모바일 헤더, 하단 탭바, FAB 메뉴, 바텀시트 (peek/half/full), 도구 팔레트, AI 코파일럿 시트
- mobile-gestures.js: 터치 제스처 엔진 (1손가락 오빗, 2손가락 핀치줌/팬, 더블탭 프레임올, 롱프레스 컨텍스트, 3손가락 언두)
- mobile.css: 480줄+ 모바일 전용 스타일, CSS Grid 재정의 (<768px), 노치/세이프에리어, 가로모드
Phase 2: 리뷰 마크업
mobile-review.js: Canvas 기반 3D 마크업 시스템
도구: 원, 화살표, 텍스트, 측정
터치 드로잉 (프리뷰 + 확정)
실행취소/전체삭제
승인/반려 워크플로우
코멘트 바 + 음성 입력 (Web Speech API, ko-KR)Phase 3: 작업 모드
mobile-modes.js: 4개 작업 모드 전환
뷰어 (모든 역할) — 궤도 제어 활성, 편집 비활성
리뷰 (reviewer+) — 궤도 비활성, 마크업 오버레이
편집 (engineer+) — 궤도+변환 활성
모델링 (engineer+) — 궤도+변환 활성
역할 레벨 게이팅, 모드 인디케이터 배지, 스위처 드롭다운Phase 4: PWA + Service Worker
- sw.js: stale-while-revalidate 캐싱 (JS/CSS/HTML)
- manifest.json: standalone 디스플레이, SVG 아이콘, 테마색 #2D7D5F
cdp-dist 동기화
- cdp-dist/index.html에 리뷰/모드 CSS, HTML, JS 인라인 통합
- sw.js, manifest.json 복사
파일 구조
cdp/
├── mobile.css # 모바일 전용 스타일 (480줄+)
├── sw.js # Service Worker
├── manifest.json # PWA 매니페스트
├── MOBILE_SPEC.md # 모바일 기획 선언서
├── src/
│ ├── app.js # (수정) 모바일 모듈 임포트/초기화
│ └── mobile/
│ ├── mobile-auth.js # 인증
│ ├── mobile-layout.js # 레이아웃
│ ├── mobile-gestures.js # 터치 제스처
│ ├── mobile-review.js # 리뷰 마크업
│ └── mobile-modes.js # 작업 모드
├── han/
│ ├── 모바일인증.한선 # 역할 권한 로직
│ ├── 모바일레이아웃.한선 # 탭/시트/FAB 상태
│ ├── 모바일제스처.한선 # 거리/제스처 계산
│ ├── 모바일리뷰.한선 # 마크업/코멘트/승인 로직
│ └── 모바일모드.한선 # 모드 전환/접근 제어
cdp-dist/
├── index.html # (수정) 인라인 모바일 전체 통합
├── sw.js # (복사)
└── manifest.json # (복사)
기술 결정
- 바텀시트 UX 패턴: 사이드바 대신 바텀시트로 모바일 패널 접근 (peek 60px / half 50% / full 85%)
- CSS Grid 오버라이드: <768px에서 데스크톱 패널 숨기고 모바일 헤더+뷰포트+탭바 3행 그리드
- cdp-dist 인라인: cdp-dist는 단일 HTML이므로 모든 모바일 코드를 인라인으로 통합
서버
- 개발: cdp/ (모듈 기반)
- 프로덕션: cdp-dist/ (인라인 단일파일, :8729)
잔여 이슈
- Phase 5: IndexedDB 로컬 저장소 (오프라인 프로젝트 데이터) 미구현
- Apple Pencil 태블릿 스케칭 지원 미구현
- crownyc VM 틱/배열 한계로 한선씨 런타임 테스트 제한적