- 지도 스타일 상수를 mapStyles.ts로 추출
- useBaseMapStyle 훅 생성 (mapToggles 기반 스타일 반환)
- 9개 탭 컴포넌트의 하드코딩 스타일을 공유 훅으로 교체
- 각 Map에 S57EncOverlay 추가
- 초기 mapToggles를 모두 false로 변경 (기본지도 표시)
- 함정: MarineTraffic 스타일 삼각형 (선수 방향 위, 상태색 채움)
- 드론: 쿼드콥터 아이콘 (X자 팔 + 프로펠러 회전 애니메이션 + 카메라 렌즈)
- 함정↔드론 점선 연결선 유지
- 송출중 REC LED 깜빡임, 드론 모델명 라벨
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 함정: 삼각형 아이콘 + 함정명 라벨 (좌하단)
- 드론: 원형 아이콘 (십자 프로펠러 + 본체 + 카메라 렌즈) (우상단)
- 함정↔드론 점선 연결선으로 소속 관계 표시
- 상태별 색상: 송출중(초록), 연결중(시안), 오류(빨강), 대기(회색)
- 송출중 드론 빨간 LED 깜빡임 유지
- 드론 모델명 라벨 (M300/M30T/Mavic3E)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 드론 미선택 시 MapLibre 지도에 드론 위치 표시 (부산/인천/목포)
- 드론 SVG 아이콘 (본체+팔4개+프로펠러+카메라, 상태별 색상)
- 송출중 드론은 빨간 LED 깜빡임 애니메이션
- 드론 클릭 → 다크 팝업 (함정명, 드론모델, IP, 상태)
대기중: "스트림 시작" 버튼 / 송출중: "영상 보기" 버튼
- 스트림 선택 시 자동으로 영상 그리드로 전환
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
대형 파일 집중 변환:
- SatelliteRequest: 134→66 (hex 색상 일괄 변환)
- IncidentsView: 141→90, MediaModal: 97→38
- HNSScenarioView: 78→38, HNSView: 49→31
- LoginPage, MapView, PredictionInputSection 등 중소 파일 8개
변환 패턴: hex 색상→text-[#hex], CSS 변수→Tailwind 유틸리티,
flex/grid/padding/fontSize/fontWeight/overflow 등 정적 속성 className 이동
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TextLayer: characterSet 'auto', NanumSquare 한글 폰트, outline 설정 (MapView, RealtimeDrone)
- 확산분석 탭: 진입 시 데모 궤적/방어선/민감자원 자동 로드 (useEffect + handleSelectAnalysis)
- SensorAnalysis: Vessel/Pollution 3DModel을 requestAnimationFrame 기반 360° 회전으로 전환
- 3D geometry useMemo 생성, Y축 회전 + X축 틸트, depth 기반 크기/밝기
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
항공탐색 탭:
- CctvView 크래시 수정 (cctvCameras → cameras 필드 매핑)
- AerialView 이중 서브메뉴 분기 → 플랫 switch 단순화
- SensorAnalysis SVG 300pt → Canvas 2D 5000/8000pt 고밀도 전환
- RealtimeDrone CSS 시뮬레이션 → MapLibre + deck.gl 실제 지도 전환
확산분석 탭:
- 시뮬레이션 백엔드 미구현 시 클라이언트 데모 궤적 fallback 생성
- AI 방어선 3개(직교차단/U형포위/연안보호) 자동 배치
- 민감자원 5개소(양식장/해수욕장/보호구역) deck.gl 레이어 표시
- 해류 화살표 11x11 그리드 TextLayer 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>