- #dashboard-header-slot: flex + justify-content:center 기본 중앙 배치
- 이란 mode-toggle-left: position:absolute left:0 → 탭 오른쪽 배치
- 한국 필터 탭: 중앙 배치 유지
- 감시 목록 Flag 빈값: '??' → '-'
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- cnFishing을 KoreaFilters 인터페이스에 통합 (koreaLayers → koreaFilters)
→ 다른 필터 탭과 동일한 선박 비활성화/상단 배지/카운트 동작
- 상단 필터 배지 클릭 → 대상 선박 목록 패널 (MMSI/이름/국적/유형/속도)
→ 선박 클릭 시 flyTo, 200척까지 표시
- CSV 다운로드: BOM 포함 UTF-8, 필터별 파일명 (e.g. cnFishing_2026-03-23.csv)
- cnFishingSuspects Set 추가 (useKoreaFilters 반환값)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- anyKoreaFilterOn 시 filteredShips(필터 결과) 전달, 비활성 시 allShips(전체) 전달
- 상단 배너: 합산 "N척 탐지" → 필터별 개별 카운트 (불법어선 3척, 다크베셀 5척 등)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- liveShips: baseShipsKorea 변경(5분 polling) 시에만 계산. currentTime 의존성 없음.
- replayShips: REPLAY 모드에서만 currentTime으로 위치 보간.
- LIVE 모드: 매초 useMemo 실행 자체가 발생하지 않음.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- LIVE 모드: enrichedShipsRef 동일 참조 반환
→ currentTime 매초 변경 시에도 visibleShips/filteredShips/shipGeoJson 재실행 안 함
- mtCategory/natGroup: baseShipsKorea 변경 시 1회 새 배열 생성 (useState 불변성 준수)
- REPLAY 모드: propagateShips로 위치 보간 유지 (mtCategory는 spread로 상속)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- deck.gl updateTriggers 적용: 정적 레이어(4개 sub-hook) + 분석 레이어 + KoreaMap 인라인 레이어
→ 줌 변경 시 accessor 재평가 최소화
- 선박 카테고리/국적 토글: JS-level 배열 필터링 → MapLibre GPU-side filter 표현식
→ 토글 시 13K GeoJSON 재생성 + GPU 재업로드 제거
- Ship.mtCategory/natGroup 사전 계산: propagateShips 후 1회 계산, 이후 Set.has() O(1)
→ getMarineTrafficCategory() 13K×N회 호출 제거
- onPick useCallback 안정화: 매 렌더마다 28개 정적 레이어 불필요 재생성 방지
- SVG 데이터 URI 모듈 레벨 캐싱: 함수 호출 간 캐시 유지
- useAnalysisDeckLayers 데이터/스타일 분리: 줌 변경 시 ships 필터링 스킵
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>