diff --git a/.claude/settings.json b/.claude/settings.json index 03c2889..b13b469 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -43,5 +43,42 @@ "Read(./**/.env.*)", "Read(./**/secrets/**)" ] + }, + "hooks": { + "SessionStart": [ + { + "matcher": "compact", + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-post-compact.sh", + "timeout": 10 + } + ] + } + ], + "PreCompact": [ + { + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-pre-compact.sh", + "timeout": 30 + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "bash .claude/scripts/on-commit.sh", + "timeout": 15 + } + ] + } + ] } } diff --git a/.claude/workflow-version.json b/.claude/workflow-version.json new file mode 100644 index 0000000..56519c9 --- /dev/null +++ b/.claude/workflow-version.json @@ -0,0 +1,6 @@ +{ + "applied_global_version": "1.6.1", + "applied_date": "2026-03-17", + "project_type": "react-ts", + "gitea_url": "https://gitea.gc-si.dev" +} diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..6e0c4af --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,75 @@ +name: Deploy KCG + +on: + push: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + # ═══ Frontend ═══ + - uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Configure npm registry + run: | + echo "registry=https://nexus.gc-si.dev/repository/npm-public/" > frontend/.npmrc + echo "//nexus.gc-si.dev/repository/npm-public/:_auth=${{ secrets.NEXUS_NPM_AUTH }}" >> frontend/.npmrc + + - name: Build frontend + working-directory: frontend + env: + VITE_GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} + run: | + npm ci + npx vite build + + - name: Deploy frontend + run: | + mkdir -p /deploy/kcg + rm -rf /deploy/kcg/* + cp -r frontend/dist/* /deploy/kcg/ + + # ═══ Backend ═══ + - name: Install JDK 17 + Maven + run: | + sudo apt-get update -qq + sudo apt-get install -y -qq openjdk-17-jdk-headless maven + + - name: Build backend + working-directory: backend + run: mvn -B clean package -DskipTests + + - name: Deploy backend + run: | + DEPLOY_DIR=/deploy/kcg-backend + mkdir -p $DEPLOY_DIR/backup + + # JAR 백업 (최근 5개 유지) + if [ -f $DEPLOY_DIR/kcg.jar ]; then + cp $DEPLOY_DIR/kcg.jar $DEPLOY_DIR/backup/kcg-$(date +%Y%m%d%H%M%S).jar + ls -t $DEPLOY_DIR/backup/*.jar | tail -n +6 | xargs -r rm + fi + + # 서비스 중지 → JAR 교체 → 서비스 시작 + sudo systemctl stop kcg-backend || true + cp backend/target/kcg.jar $DEPLOY_DIR/kcg.jar + sudo systemctl start kcg-backend + + - name: Health check + run: | + echo "Waiting for backend to start..." + for i in $(seq 1 30); do + HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/api/auth/me 2>/dev/null || echo "000") + if [ "$HTTP_CODE" != "000" ]; then + echo "Backend is up (HTTP $HTTP_CODE, attempt $i)" + exit 0 + fi + sleep 2 + done + echo "Backend health check failed after 60s" + exit 1 diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 7a28940..b713ed0 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -1,54 +1,88 @@ #!/bin/bash #============================================================================== -# pre-commit hook (React TypeScript) -# TypeScript 컴파일 + 린트 검증 — 실패 시 커밋 차단 +# pre-commit hook (모노레포: Frontend + Backend) +# Frontend: TypeScript 컴파일 + 린트 검증 +# Backend: Maven 컴파일 검증 +# 실패 시 커밋 차단 #============================================================================== -echo "pre-commit: TypeScript 타입 체크 중..." +FAILED=0 -# npm 확인 -if ! command -v npx &>/dev/null; then - echo "경고: npx가 설치되지 않았습니다. 검증을 건너뜁니다." - exit 0 -fi +#------------------------------------------------------------------------------ +# Frontend 검증 +#------------------------------------------------------------------------------ +if [ -d "frontend" ]; then + echo "pre-commit: [Frontend] TypeScript 타입 체크 중..." -# node_modules 확인 -if [ ! -d "node_modules" ]; then - echo "경고: node_modules가 없습니다. 'npm install' 실행 후 다시 시도하세요." - exit 1 -fi + if ! command -v npx &>/dev/null; then + echo "경고: npx가 설치되지 않았습니다. Frontend 검증을 건너뜁니다." + elif [ ! -d "frontend/node_modules" ]; then + echo "경고: frontend/node_modules가 없습니다. 'cd frontend && npm install' 실행 후 다시 시도하세요." + FAILED=1 + else + (cd frontend && npx tsc --noEmit --pretty 2>&1) + TSC_RESULT=$? -# TypeScript 타입 체크 -npx tsc --noEmit --pretty 2>&1 -TSC_RESULT=$? + if [ $TSC_RESULT -ne 0 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════╗" + echo "║ [Frontend] TypeScript 타입 에러! 커밋이 차단되었습니다.║" + echo "╚══════════════════════════════════════════════════════════╝" + FAILED=1 + else + echo "pre-commit: [Frontend] 타입 체크 성공" + fi -if [ $TSC_RESULT -ne 0 ]; then - echo "" - echo "╔══════════════════════════════════════════════════════════╗" - echo "║ TypeScript 타입 에러! 커밋이 차단되었습니다. ║" - echo "║ 타입 에러를 수정한 후 다시 커밋해주세요. ║" - echo "╚══════════════════════════════════════════════════════════╝" - echo "" - exit 1 -fi + # ESLint 검증 + if [ -f "frontend/eslint.config.js" ] || [ -f "frontend/eslint.config.mjs" ] || [ -f "frontend/.eslintrc.js" ] || [ -f "frontend/.eslintrc.json" ]; then + echo "pre-commit: [Frontend] ESLint 검증 중..." + (cd frontend && npx eslint src/ --ext .ts,.tsx --quiet 2>&1) + LINT_RESULT=$? -echo "pre-commit: 타입 체크 성공" - -# ESLint 검증 (설정 파일이 있는 경우만) -if [ -f ".eslintrc.js" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.cjs" ] || [ -f "eslint.config.js" ] || [ -f "eslint.config.mjs" ]; then - echo "pre-commit: ESLint 검증 중..." - npx eslint src/ --ext .ts,.tsx --quiet 2>&1 - LINT_RESULT=$? - - if [ $LINT_RESULT -ne 0 ]; then - echo "" - echo "╔══════════════════════════════════════════════════════════╗" - echo "║ ESLint 에러! 커밋이 차단되었습니다. ║" - echo "║ 'npm run lint -- --fix'로 자동 수정을 시도해보세요. ║" - echo "╚══════════════════════════════════════════════════════════╝" - echo "" - exit 1 + if [ $LINT_RESULT -ne 0 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════╗" + echo "║ [Frontend] ESLint 에러! 커밋이 차단되었습니다. ║" + echo "╚══════════════════════════════════════════════════════════╝" + FAILED=1 + else + echo "pre-commit: [Frontend] ESLint 통과" + fi + fi fi - - echo "pre-commit: ESLint 통과" fi + +#------------------------------------------------------------------------------ +# Backend 검증 +#------------------------------------------------------------------------------ +if [ -d "backend" ] && [ -f "backend/pom.xml" ]; then + echo "pre-commit: [Backend] Maven 컴파일 검증 중..." + + if ! command -v mvn &>/dev/null; then + echo "경고: mvn이 설치되지 않았습니다. Backend 검증을 건너뜁니다." + else + (cd backend && mvn compile -q 2>&1) + MVN_RESULT=$? + + if [ $MVN_RESULT -ne 0 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════╗" + echo "║ [Backend] Maven 컴파일 에러! 커밋이 차단되었습니다. ║" + echo "╚══════════════════════════════════════════════════════════╝" + FAILED=1 + else + echo "pre-commit: [Backend] 컴파일 성공" + fi + fi +fi + +#------------------------------------------------------------------------------ +# 결과 +#------------------------------------------------------------------------------ +if [ $FAILED -ne 0 ]; then + echo "" + echo "pre-commit: 검증 실패! 에러를 수정한 후 다시 커밋해주세요." + exit 1 +fi + +echo "pre-commit: 모든 검증 통과" diff --git a/.gitignore b/.gitignore index 9e1fa2e..83d80c2 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,18 @@ dist-ssr *.sln *.sw? *.pdf + +# === Frontend === +frontend/dist/ +frontend/node_modules/ + +# === Backend === +backend/target/ +backend/.env +backend/src/main/resources/application-local.yml +backend/src/main/resources/application-prod.yml + +# === Prediction === +prediction/__pycache__/ +prediction/venv/ +prediction/.env diff --git a/CLAUDE.md b/CLAUDE.md index f10228b..7958058 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,48 +1,90 @@ # 프로젝트 개요 -- **타입**: React + TypeScript + Vite +- **타입**: 모노레포 (Frontend + Backend + Prediction) +- **Frontend**: React + TypeScript + Vite +- **Backend**: Spring Boot 3.2.5 + Java 17 + PostgreSQL +- **Prediction**: FastAPI (Python) - **Node.js**: `.node-version` 참조 -- **패키지 매니저**: npm -- **빌드 도구**: Vite +- **Java**: `backend/.sdkmanrc` 참조 +- **패키지 매니저**: npm (frontend), Maven (backend), pip (prediction) ## 빌드 및 실행 +### Frontend ```bash -# 의존성 설치 +cd frontend npm install - -# 개발 서버 npm run dev +``` -# 빌드 -npm run build +### Backend +```bash +cd backend +# application-local.yml 설정 필요 (application-local.yml.example 참조) +cp src/main/resources/application-local.yml.example src/main/resources/application-local.yml +mvn spring-boot:run -Dspring-boot.run.profiles=local +``` -# 테스트 -npm run test +### Database +```bash +psql -U postgres -f database/init.sql +psql -U postgres -d kcgdb -f database/migration/001_initial_schema.sql +``` -# 린트 -npm run lint +### Prediction +```bash +cd prediction +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +uvicorn main:app --reload --port 8000 +``` -# 포맷팅 -npm run format +### 린트/검증 +```bash +# Frontend +cd frontend && npm run lint + +# Backend +cd backend && mvn compile ``` ## 프로젝트 구조 ``` -src/ -├── assets/ # 정적 리소스 (이미지, 폰트 등) -├── components/ # 공통 UI 컴포넌트 -│ ├── common/ # 범용 컴포넌트 (Button, Input 등) -│ └── layout/ # 레이아웃 컴포넌트 (Header, Sidebar 등) -├── hooks/ # 커스텀 훅 -├── pages/ # 페이지 컴포넌트 (라우팅 단위) -├── services/ # API 호출 로직 -├── store/ # 상태 관리 (Context, Zustand 등) -├── types/ # TypeScript 타입 정의 -├── utils/ # 유틸리티 함수 -├── App.tsx -└── main.tsx +frontend/ +├── src/ +│ ├── assets/ +│ ├── components/ +│ ├── hooks/ +│ ├── pages/ +│ ├── services/ +│ ├── store/ +│ ├── types/ +│ ├── utils/ +│ ├── App.tsx +│ └── main.tsx +├── package.json +└── vite.config.ts + +backend/ +├── src/main/java/gc/mda/kcg/ +│ ├── config/ # 설정 (CORS, Security, Properties) +│ ├── auth/ # 인증 (Google OAuth + JWT) +│ ├── domain/ # 도메인 (event, news, osint, aircraft) +│ └── collector/ # 데이터 수집기 (GDELT, GoogleNews, CENTCOM) +├── src/main/resources/ +│ ├── application.yml +│ └── application-*.yml.example +└── pom.xml + +database/ +├── init.sql +└── migration/ + +prediction/ +├── main.py +└── requirements.txt ``` ## 팀 규칙 @@ -55,6 +97,6 @@ src/ ## 의존성 관리 -- Nexus 프록시 레포지토리를 통해 npm 패키지 관리 (`.npmrc`) -- 새 의존성 추가: `npm install 패키지명` -- devDependency: `npm install -D 패키지명` +- Frontend: Nexus 프록시 레포지토리를 통해 npm 패키지 관리 (`.npmrc`) +- Backend: Maven Central (pom.xml) +- Prediction: pip (requirements.txt) diff --git a/backend/.sdkmanrc b/backend/.sdkmanrc new file mode 100644 index 0000000..a4417cd --- /dev/null +++ b/backend/.sdkmanrc @@ -0,0 +1 @@ +java=17.0.18-amzn diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..c99e425 --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + gc.mda + kcg + 0.0.1-SNAPSHOT + kcg + KCG Monitoring Dashboard Backend + + + 17 + 0.12.6 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.postgresql + postgresql + runtime + + + + + org.projectlombok + lombok + true + + + + + io.jsonwebtoken + jjwt-api + ${jjwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + runtime + + + io.jsonwebtoken + jjwt-jackson + ${jjwt.version} + runtime + + + + + com.google.api-client + google-api-client + 2.7.0 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + kcg + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + diff --git a/backend/src/main/java/gc/mda/kcg/KcgApplication.java b/backend/src/main/java/gc/mda/kcg/KcgApplication.java new file mode 100644 index 0000000..8c11f99 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/KcgApplication.java @@ -0,0 +1,14 @@ +package gc.mda.kcg; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class KcgApplication { + + public static void main(String[] args) { + SpringApplication.run(KcgApplication.class, args); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/AuthController.java b/backend/src/main/java/gc/mda/kcg/auth/AuthController.java new file mode 100644 index 0000000..655088c --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/AuthController.java @@ -0,0 +1,77 @@ +package gc.mda.kcg.auth; + +import gc.mda.kcg.auth.dto.AuthResponse; +import gc.mda.kcg.auth.dto.GoogleAuthRequest; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/auth") +@RequiredArgsConstructor +public class AuthController { + + private static final String JWT_COOKIE_NAME = "kcg_token"; + + private final AuthService authService; + private final JwtProvider jwtProvider; + + /** + * Google OAuth2 id_token 검증 후 JWT 쿠키 발급 + */ + @PostMapping("/google") + public ResponseEntity googleLogin( + @Valid @RequestBody GoogleAuthRequest request, + HttpServletResponse response) { + + AuthResponse authResponse = authService.authenticateWithGoogle(request.getCredential()); + String token = jwtProvider.generateToken(authResponse.getEmail(), authResponse.getName()); + + Cookie cookie = new Cookie(JWT_COOKIE_NAME, token); + cookie.setHttpOnly(true); + cookie.setSecure(false); + cookie.setPath("/"); + cookie.setMaxAge((int) (jwtProvider.getExpirationMs() / 1000)); + response.addCookie(cookie); + + return ResponseEntity.ok(authResponse); + } + + /** + * JWT 쿠키에서 현재 사용자 정보 반환 + */ + @GetMapping("/me") + public ResponseEntity me( + @CookieValue(name = JWT_COOKIE_NAME, required = false) String token) { + + if (token == null || token.isBlank()) { + return ResponseEntity.status(401).build(); + } + + AuthResponse authResponse = authService.getUserFromToken(token); + return ResponseEntity.ok(authResponse); + } + + /** + * JWT 쿠키 삭제 (로그아웃) + */ + @PostMapping("/logout") + public ResponseEntity logout(HttpServletResponse response) { + Cookie cookie = new Cookie(JWT_COOKIE_NAME, ""); + cookie.setHttpOnly(true); + cookie.setSecure(false); + cookie.setPath("/"); + cookie.setMaxAge(0); + response.addCookie(cookie); + + return ResponseEntity.ok().build(); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/AuthFilter.java b/backend/src/main/java/gc/mda/kcg/auth/AuthFilter.java new file mode 100644 index 0000000..d25beb4 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/AuthFilter.java @@ -0,0 +1,70 @@ +package gc.mda.kcg.auth; + +import io.jsonwebtoken.Claims; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Arrays; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AuthFilter extends OncePerRequestFilter { + + private static final String JWT_COOKIE_NAME = "kcg_token"; + private static final String AUTH_PATH_PREFIX = "/api/auth/"; + + private final JwtProvider jwtProvider; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String path = request.getRequestURI(); + return path.startsWith(AUTH_PATH_PREFIX); + } + + @Override + protected void doFilterInternal( + HttpServletRequest request, + HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + + String token = extractTokenFromCookies(request); + + if (token == null || token.isBlank()) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("{\"error\":\"인증이 필요합니다.\"}"); + return; + } + + try { + Claims claims = jwtProvider.validateToken(token); + request.setAttribute("userEmail", claims.getSubject()); + request.setAttribute("userName", claims.get("name", String.class)); + filterChain.doFilter(request, response); + } catch (IllegalArgumentException e) { + log.warn("인증 실패: {}", e.getMessage()); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.getWriter().write("{\"error\":\"유효하지 않은 토큰입니다.\"}"); + } + } + + private String extractTokenFromCookies(HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies == null) { + return null; + } + return Arrays.stream(cookies) + .filter(c -> JWT_COOKIE_NAME.equals(c.getName())) + .findFirst() + .map(Cookie::getValue) + .orElse(null); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/AuthService.java b/backend/src/main/java/gc/mda/kcg/auth/AuthService.java new file mode 100644 index 0000000..876e272 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/AuthService.java @@ -0,0 +1,130 @@ +package gc.mda.kcg.auth; + +import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; +import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.gson.GsonFactory; +import gc.mda.kcg.auth.dto.AuthResponse; +import gc.mda.kcg.auth.entity.LoginHistory; +import gc.mda.kcg.auth.entity.User; +import gc.mda.kcg.auth.repository.LoginHistoryRepository; +import gc.mda.kcg.auth.repository.UserRepository; +import gc.mda.kcg.config.AppProperties; +import io.jsonwebtoken.Claims; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Collections; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AuthService { + + private final AppProperties appProperties; + private final JwtProvider jwtProvider; + private final UserRepository userRepository; + private final LoginHistoryRepository loginHistoryRepository; + + /** + * Google id_token 검증 후 사용자 upsert 및 로그인 이력 기록 + */ + @Transactional + public AuthResponse authenticateWithGoogle(String credential) { + GoogleIdToken idToken = verifyGoogleToken(credential); + GoogleIdToken.Payload payload = idToken.getPayload(); + + String email = payload.getEmail(); + String name = (String) payload.get("name"); + String picture = (String) payload.get("picture"); + + validateEmailDomain(email); + + User user = upsertUser(email, name, picture); + recordLoginHistory(user); + + return AuthResponse.builder() + .email(user.getEmail()) + .name(user.getName()) + .picture(user.getPicture()) + .build(); + } + + /** + * JWT 토큰에서 사용자 정보 조회 + */ + @Transactional(readOnly = true) + public AuthResponse getUserFromToken(String token) { + Claims claims = jwtProvider.validateToken(token); + String email = claims.getSubject(); + + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다: " + email)); + + return AuthResponse.builder() + .email(user.getEmail()) + .name(user.getName()) + .picture(user.getPicture()) + .build(); + } + + private GoogleIdToken verifyGoogleToken(String credential) { + try { + GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder( + new NetHttpTransport(), GsonFactory.getDefaultInstance()) + .setAudience(Collections.singletonList(appProperties.getGoogle().getClientId())) + .build(); + + GoogleIdToken idToken = verifier.verify(credential); + if (idToken == null) { + throw new IllegalArgumentException("유효하지 않은 Google 토큰입니다."); + } + return idToken; + } catch (IllegalArgumentException e) { + throw e; + } catch (Exception e) { + log.error("Google 토큰 검증 실패", e); + throw new IllegalArgumentException("Google 토큰 검증에 실패했습니다.", e); + } + } + + private void validateEmailDomain(String email) { + String allowedDomain = appProperties.getAuth().getAllowedDomain(); + if (allowedDomain != null && !allowedDomain.isBlank()) { + String domain = email.substring(email.indexOf('@') + 1); + if (!domain.equals(allowedDomain)) { + throw new IllegalArgumentException("허용되지 않은 이메일 도메인입니다: " + domain); + } + } + } + + private User upsertUser(String email, String name, String picture) { + return userRepository.findByEmail(email) + .map(existing -> { + existing.setName(name); + existing.setPicture(picture); + existing.setLastLoginAt(LocalDateTime.now()); + return userRepository.save(existing); + }) + .orElseGet(() -> { + User newUser = User.builder() + .email(email) + .name(name) + .picture(picture) + .lastLoginAt(LocalDateTime.now()) + .build(); + return userRepository.save(newUser); + }); + } + + private void recordLoginHistory(User user) { + LoginHistory history = LoginHistory.builder() + .user(user) + .loginAt(LocalDateTime.now()) + .build(); + loginHistoryRepository.save(history); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/JwtProvider.java b/backend/src/main/java/gc/mda/kcg/auth/JwtProvider.java new file mode 100644 index 0000000..3cd15a3 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/JwtProvider.java @@ -0,0 +1,68 @@ +package gc.mda.kcg.auth; + +import gc.mda.kcg.config.AppProperties; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.security.Keys; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; + +@Slf4j +@Component +public class JwtProvider { + + private final SecretKey secretKey; + @Getter + private final long expirationMs; + + public JwtProvider(AppProperties appProperties) { + this.secretKey = Keys.hmacShaKeyFor( + appProperties.getJwt().getSecret().getBytes(StandardCharsets.UTF_8)); + this.expirationMs = appProperties.getJwt().getExpirationMs(); + } + + /** + * JWT 토큰 생성 + */ + public String generateToken(String email, String name) { + Date now = new Date(); + Date expiry = new Date(now.getTime() + expirationMs); + + return Jwts.builder() + .subject(email) + .claim("name", name) + .issuedAt(now) + .expiration(expiry) + .signWith(secretKey) + .compact(); + } + + /** + * JWT 토큰 검증 및 Claims 반환 + */ + public Claims validateToken(String token) { + try { + return Jwts.parser() + .verifyWith(secretKey) + .build() + .parseSignedClaims(token) + .getPayload(); + } catch (JwtException e) { + log.warn("JWT 토큰 검증 실패: {}", e.getMessage()); + throw new IllegalArgumentException("유효하지 않은 토큰입니다.", e); + } + } + + /** + * 토큰에서 이메일 추출 + */ + public String getEmailFromToken(String token) { + return validateToken(token).getSubject(); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/dto/AuthResponse.java b/backend/src/main/java/gc/mda/kcg/auth/dto/AuthResponse.java new file mode 100644 index 0000000..e7a5901 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/dto/AuthResponse.java @@ -0,0 +1,17 @@ +package gc.mda.kcg.auth.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AuthResponse { + + private String email; + private String name; + private String picture; +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/dto/GoogleAuthRequest.java b/backend/src/main/java/gc/mda/kcg/auth/dto/GoogleAuthRequest.java new file mode 100644 index 0000000..6239c4b --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/dto/GoogleAuthRequest.java @@ -0,0 +1,15 @@ +package gc.mda.kcg.auth.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class GoogleAuthRequest { + + @NotBlank(message = "credential은 필수입니다.") + private String credential; +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/entity/LoginHistory.java b/backend/src/main/java/gc/mda/kcg/auth/entity/LoginHistory.java new file mode 100644 index 0000000..e994de7 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/entity/LoginHistory.java @@ -0,0 +1,38 @@ +package gc.mda.kcg.auth.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "login_history", schema = "kcg") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LoginHistory { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + @Column(name = "login_at", nullable = false) + @Builder.Default + private LocalDateTime loginAt = LocalDateTime.now(); +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/entity/User.java b/backend/src/main/java/gc/mda/kcg/auth/entity/User.java new file mode 100644 index 0000000..d939d15 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/entity/User.java @@ -0,0 +1,44 @@ +package gc.mda.kcg.auth.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "users", schema = "kcg") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String email; + + @Column(nullable = false) + private String name; + + private String picture; + + @Column(name = "last_login_at") + private LocalDateTime lastLoginAt; + + @Column(name = "created_at", nullable = false, updatable = false) + @Builder.Default + private LocalDateTime createdAt = LocalDateTime.now(); +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/repository/LoginHistoryRepository.java b/backend/src/main/java/gc/mda/kcg/auth/repository/LoginHistoryRepository.java new file mode 100644 index 0000000..b7c3556 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/repository/LoginHistoryRepository.java @@ -0,0 +1,7 @@ +package gc.mda.kcg.auth.repository; + +import gc.mda.kcg.auth.entity.LoginHistory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LoginHistoryRepository extends JpaRepository { +} diff --git a/backend/src/main/java/gc/mda/kcg/auth/repository/UserRepository.java b/backend/src/main/java/gc/mda/kcg/auth/repository/UserRepository.java new file mode 100644 index 0000000..17d9ae5 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/auth/repository/UserRepository.java @@ -0,0 +1,11 @@ +package gc.mda.kcg.auth.repository; + +import gc.mda.kcg.auth.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + + Optional findByEmail(String email); +} diff --git a/backend/src/main/java/gc/mda/kcg/collector/ArticleClassifier.java b/backend/src/main/java/gc/mda/kcg/collector/ArticleClassifier.java new file mode 100644 index 0000000..83d6cd4 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/collector/ArticleClassifier.java @@ -0,0 +1,39 @@ +package gc.mda.kcg.collector; + +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.regex.Pattern; + +/** + * 기사 분류기 (정규식 기반) + * TODO: 프론트엔드 classifyArticle() 로직 이식 + */ +@Component +public class ArticleClassifier { + + private static final Map CATEGORY_PATTERNS = Map.of( + "military", Pattern.compile("(?i)(strike|attack|military|weapon|missile|drone|bomb|combat|war|force)"), + "political", Pattern.compile("(?i)(sanction|diplomat|negotiat|treaty|nuclear|iran|deal|policy)"), + "intelligence", Pattern.compile("(?i)(intel|spy|surveillance|intercept|sigint|osint|recon)") + ); + + /** + * 기사 제목/본문을 분석하여 카테고리를 반환 + * + * @param title 기사 제목 + * @param content 기사 본문 + * @return 분류된 카테고리 (military, political, intelligence, general) + */ + public String classifyArticle(String title, String content) { + String text = (title + " " + content).toLowerCase(); + + for (Map.Entry entry : CATEGORY_PATTERNS.entrySet()) { + if (entry.getValue().matcher(text).find()) { + return entry.getKey(); + } + } + + return "general"; + } +} diff --git a/backend/src/main/java/gc/mda/kcg/collector/CentcomCollector.java b/backend/src/main/java/gc/mda/kcg/collector/CentcomCollector.java new file mode 100644 index 0000000..3708228 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/collector/CentcomCollector.java @@ -0,0 +1,11 @@ +package gc.mda.kcg.collector; + +import org.springframework.stereotype.Component; + +/** + * CENTCOM 보도자료 수집기 + * TODO: CENTCOM 웹사이트에서 보도자료 수집 구현 + */ +@Component +public class CentcomCollector { +} diff --git a/backend/src/main/java/gc/mda/kcg/collector/GdeltCollector.java b/backend/src/main/java/gc/mda/kcg/collector/GdeltCollector.java new file mode 100644 index 0000000..9433654 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/collector/GdeltCollector.java @@ -0,0 +1,11 @@ +package gc.mda.kcg.collector; + +import org.springframework.stereotype.Component; + +/** + * GDELT 데이터 수집기 + * TODO: GDELT API를 통한 이벤트/뉴스 데이터 수집 구현 + */ +@Component +public class GdeltCollector { +} diff --git a/backend/src/main/java/gc/mda/kcg/collector/GoogleNewsCollector.java b/backend/src/main/java/gc/mda/kcg/collector/GoogleNewsCollector.java new file mode 100644 index 0000000..3327623 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/collector/GoogleNewsCollector.java @@ -0,0 +1,11 @@ +package gc.mda.kcg.collector; + +import org.springframework.stereotype.Component; + +/** + * Google News RSS 수집기 + * TODO: Google News RSS 피드를 통한 뉴스 데이터 수집 구현 + */ +@Component +public class GoogleNewsCollector { +} diff --git a/backend/src/main/java/gc/mda/kcg/config/AppProperties.java b/backend/src/main/java/gc/mda/kcg/config/AppProperties.java new file mode 100644 index 0000000..686b67d --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/config/AppProperties.java @@ -0,0 +1,36 @@ +package gc.mda.kcg.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Getter +@Setter +@Configuration +@ConfigurationProperties(prefix = "app") +public class AppProperties { + + private Jwt jwt = new Jwt(); + private Google google = new Google(); + private Auth auth = new Auth(); + + @Getter + @Setter + public static class Jwt { + private String secret; + private long expirationMs; + } + + @Getter + @Setter + public static class Google { + private String clientId; + } + + @Getter + @Setter + public static class Auth { + private String allowedDomain; + } +} diff --git a/backend/src/main/java/gc/mda/kcg/config/SecurityConfig.java b/backend/src/main/java/gc/mda/kcg/config/SecurityConfig.java new file mode 100644 index 0000000..986479e --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/config/SecurityConfig.java @@ -0,0 +1,19 @@ +package gc.mda.kcg.config; + +import gc.mda.kcg.auth.AuthFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SecurityConfig { + + @Bean + public FilterRegistrationBean authFilterRegistration(AuthFilter authFilter) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setFilter(authFilter); + registration.addUrlPatterns("/api/*"); + registration.setOrder(1); + return registration; + } +} diff --git a/backend/src/main/java/gc/mda/kcg/config/WebConfig.java b/backend/src/main/java/gc/mda/kcg/config/WebConfig.java new file mode 100644 index 0000000..f18492d --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/config/WebConfig.java @@ -0,0 +1,18 @@ +package gc.mda.kcg.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") + .allowedOrigins("http://localhost:5173") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} diff --git a/backend/src/main/java/gc/mda/kcg/domain/aircraft/package-info.java b/backend/src/main/java/gc/mda/kcg/domain/aircraft/package-info.java new file mode 100644 index 0000000..f62a8d0 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/domain/aircraft/package-info.java @@ -0,0 +1,4 @@ +/** + * 항공기 도메인 (향후 구현) + */ +package gc.mda.kcg.domain.aircraft; diff --git a/backend/src/main/java/gc/mda/kcg/domain/event/package-info.java b/backend/src/main/java/gc/mda/kcg/domain/event/package-info.java new file mode 100644 index 0000000..faa6bf5 --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/domain/event/package-info.java @@ -0,0 +1,4 @@ +/** + * 이벤트 도메인 (향후 구현) + */ +package gc.mda.kcg.domain.event; diff --git a/backend/src/main/java/gc/mda/kcg/domain/news/package-info.java b/backend/src/main/java/gc/mda/kcg/domain/news/package-info.java new file mode 100644 index 0000000..16142ce --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/domain/news/package-info.java @@ -0,0 +1,4 @@ +/** + * 뉴스 도메인 (향후 구현) + */ +package gc.mda.kcg.domain.news; diff --git a/backend/src/main/java/gc/mda/kcg/domain/osint/package-info.java b/backend/src/main/java/gc/mda/kcg/domain/osint/package-info.java new file mode 100644 index 0000000..0a78dff --- /dev/null +++ b/backend/src/main/java/gc/mda/kcg/domain/osint/package-info.java @@ -0,0 +1,4 @@ +/** + * OSINT 도메인 (향후 구현) + */ +package gc.mda.kcg.domain.osint; diff --git a/backend/src/main/resources/application-local.yml.example b/backend/src/main/resources/application-local.yml.example new file mode 100644 index 0000000..0fa5862 --- /dev/null +++ b/backend/src/main/resources/application-local.yml.example @@ -0,0 +1,13 @@ +spring: + datasource: + url: jdbc:postgresql://localhost:5432/kcgdb?currentSchema=kcg + username: kcg_user + password: kcg_pass +app: + jwt: + secret: local-dev-secret-key-32chars-minimum!! + expiration-ms: 86400000 + google: + client-id: YOUR_GOOGLE_CLIENT_ID + auth: + allowed-domain: gcsc.co.kr diff --git a/backend/src/main/resources/application-prod.yml.example b/backend/src/main/resources/application-prod.yml.example new file mode 100644 index 0000000..71c2848 --- /dev/null +++ b/backend/src/main/resources/application-prod.yml.example @@ -0,0 +1,13 @@ +spring: + datasource: + url: ${DB_URL} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} +app: + jwt: + secret: ${JWT_SECRET} + expiration-ms: ${JWT_EXPIRATION_MS:86400000} + google: + client-id: ${GOOGLE_CLIENT_ID} + auth: + allowed-domain: ${AUTH_ALLOWED_DOMAIN:gcsc.co.kr} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..19fc170 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + profiles: + active: ${SPRING_PROFILES_ACTIVE:local} + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + default_schema: kcg +server: + port: 8080 diff --git a/database/init.sql b/database/init.sql new file mode 100644 index 0000000..f9b5509 --- /dev/null +++ b/database/init.sql @@ -0,0 +1,2 @@ +-- KCG 데이터베이스 초기화 +CREATE SCHEMA IF NOT EXISTS kcg; diff --git a/database/migration/001_initial_schema.sql b/database/migration/001_initial_schema.sql new file mode 100644 index 0000000..3b9eadc --- /dev/null +++ b/database/migration/001_initial_schema.sql @@ -0,0 +1,83 @@ +-- 001: 초기 스키마 생성 +-- events, news, osint, users, login_history + +SET search_path TO kcg; + +-- 이벤트 테이블 (GDELT 등 이벤트 데이터) +CREATE TABLE IF NOT EXISTS events ( + id BIGSERIAL PRIMARY KEY, + event_id VARCHAR(64) UNIQUE, + title TEXT NOT NULL, + description TEXT, + source VARCHAR(128), + source_url TEXT, + category VARCHAR(64), + latitude DOUBLE PRECISION, + longitude DOUBLE PRECISION, + timestamp TIMESTAMP NOT NULL, + raw_data JSONB, + created_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events (timestamp); + +-- 뉴스 테이블 +CREATE TABLE IF NOT EXISTS news ( + id BIGSERIAL PRIMARY KEY, + title TEXT NOT NULL, + summary TEXT, + source VARCHAR(128), + source_url TEXT UNIQUE, + category VARCHAR(64), + language VARCHAR(8), + timestamp TIMESTAMP NOT NULL, + raw_data JSONB, + created_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_news_timestamp ON news (timestamp); + +-- OSINT 테이블 +CREATE TABLE IF NOT EXISTS osint ( + id BIGSERIAL PRIMARY KEY, + title TEXT NOT NULL, + content TEXT, + source VARCHAR(128), + source_url TEXT UNIQUE, + category VARCHAR(64), + credibility SMALLINT, + latitude DOUBLE PRECISION, + longitude DOUBLE PRECISION, + timestamp TIMESTAMP NOT NULL, + raw_data JSONB, + created_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_osint_timestamp ON osint (timestamp); +CREATE INDEX IF NOT EXISTS idx_osint_category ON osint (category); + +-- 사용자 테이블 +CREATE TABLE IF NOT EXISTS users ( + id BIGSERIAL PRIMARY KEY, + email VARCHAR(255) NOT NULL UNIQUE, + name VARCHAR(128) NOT NULL, + picture TEXT, + last_login_at TIMESTAMP, + created_at TIMESTAMP NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_users_email ON users (email); + +-- 로그인 이력 테이블 +CREATE TABLE IF NOT EXISTS login_history ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL REFERENCES users(id), + login_at TIMESTAMP NOT NULL DEFAULT NOW(), + ip_address VARCHAR(45), + user_agent TEXT, + success BOOLEAN NOT NULL DEFAULT TRUE, + failure_reason VARCHAR(100) +); + +CREATE INDEX IF NOT EXISTS idx_login_history_user_id ON login_history (user_id); +CREATE INDEX IF NOT EXISTS idx_login_history_login_at ON login_history (login_at); diff --git a/deploy/kcg-backend.service b/deploy/kcg-backend.service new file mode 100644 index 0000000..1932377 --- /dev/null +++ b/deploy/kcg-backend.service @@ -0,0 +1,25 @@ +[Unit] +Description=KCG Monitoring Backend +After=network.target + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/deploy/kcg-backend +ExecStart=/usr/lib/jvm/java-17-openjdk-17.0.18.0.8-1.el9.x86_64/bin/java \ + -Xms2g -Xmx4g \ + -Dspring.profiles.active=prod \ + -Dspring.config.additional-location=file:/deploy/kcg-backend/ \ + -jar /deploy/kcg-backend/kcg.jar + +Restart=on-failure +RestartSec=10 +TimeoutStopSec=30 + +StandardOutput=journal +StandardError=journal +SyslogIdentifier=kcg-backend + +[Install] +WantedBy=multi-user.target diff --git a/deploy/nginx-kcg.conf b/deploy/nginx-kcg.conf new file mode 100644 index 0000000..b86d694 --- /dev/null +++ b/deploy/nginx-kcg.conf @@ -0,0 +1,107 @@ +server { + listen 443 ssl; + server_name kcg.gc-si.dev; + + ssl_certificate /etc/letsencrypt/live/gitea.gc-si.dev/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/gitea.gc-si.dev/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # ── Frontend SPA ── + root /deploy/kcg; + # Static cache + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + # ── Backend API (direct) ── + location /api/ { + proxy_pass http://127.0.0.1:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 30s; + } + + # ── Backend API (dev prefix 호환) ── + location /api/kcg/ { + rewrite ^/api/kcg/(.*) /api/$1 break; + proxy_pass http://127.0.0.1:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 30s; + } + + # ── signal-batch 프록시 (선박 위치 API) ── + location /signal-batch/ { + proxy_pass https://wing.gc-si.dev/signal-batch/; + proxy_set_header Host wing.gc-si.dev; + proxy_ssl_server_name on; + proxy_read_timeout 30s; + } + + # ── 선박 이미지 프록시 ── + location /shipimg/ { + proxy_pass https://wing.gc-si.dev/shipimg/; + proxy_set_header Host wing.gc-si.dev; + proxy_ssl_server_name on; + } + + # ── 외부 API 프록시 (프론트엔드 CORS 우회) ── + location /api/airplaneslive/ { + proxy_pass https://api.airplanes.live/; + proxy_set_header Host api.airplanes.live; + proxy_ssl_server_name on; + } + + location /api/opensky/ { + proxy_pass https://opensky-network.org/; + proxy_set_header Host opensky-network.org; + proxy_ssl_server_name on; + } + + location /api/celestrak/ { + proxy_pass https://celestrak.org/; + proxy_set_header Host celestrak.org; + proxy_ssl_server_name on; + proxy_set_header User-Agent "Mozilla/5.0 (compatible; KCG-Monitor/1.0)"; + } + + location /api/gdelt/ { + proxy_pass https://api.gdeltproject.org/; + proxy_set_header Host api.gdeltproject.org; + proxy_ssl_server_name on; + } + + location /api/rss/ { + proxy_pass https://news.google.com/; + proxy_set_header Host news.google.com; + proxy_ssl_server_name on; + } + + location /api/ais/ { + proxy_pass https://aisapi.maritime.spglobal.com/; + proxy_set_header Host aisapi.maritime.spglobal.com; + proxy_ssl_server_name on; + } + + # gzip + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml; + gzip_min_length 1024; +} + +server { + listen 80; + server_name kcg.gc-si.dev; + return 301 https://$host$request_uri; +} diff --git a/docs/RELEASE-NOTES.md b/docs/RELEASE-NOTES.md new file mode 100644 index 0000000..920f29a --- /dev/null +++ b/docs/RELEASE-NOTES.md @@ -0,0 +1,29 @@ +# Release Notes + +이 문서는 [Keep a Changelog](https://keepachangelog.com/ko/1.0.0/) 형식을 따릅니다. + +## [Unreleased] + +### 추가 +- 프론트엔드 모노레포 이관 (`frontend/` 폴더 구조) +- signal-batch API 연동 (한국 선박 실시간 위치 데이터) +- Tailwind CSS 4 + CSS 변수 테마 시스템 (dark/light) +- i18next 다국어 지원 (ko/en) — 28개 컴포넌트 적용 +- 레이어 패널 트리 구조 재설계 (카테고리별 온/오프, 접이식 범례) +- Google OAuth 로그인 + DEV LOGIN 인증 우회 (개발 모드) +- 선박 이미지 탭 전환 UI (signal-batch / MarineTraffic) +- 백엔드 Spring Boot 3.2 스켈레톤 (Java 17) +- Google OAuth + JWT 인증 API (`@gcsc.co.kr` 도메인 제한) +- 데이터 수집기 placeholder (GDELT, Google News, CENTCOM) +- PostgreSQL 스키마 (events, news, osint, users, login_history) +- Python FastAPI 분석서버 placeholder +- Gitea Actions CI/CD 파이프라인 (main merge 시 자동 배포) +- nginx 설정 (SPA + API 프록시 + 외부 API CORS 프록시) +- systemd 서비스 (kcg-backend, JDK 17, 2~4GB 힙) + +### 변경 +- 외부 API 호출 CORS 프록시 전환 (Airplanes.live, OpenSky, CelesTrak) +- App.css 하드코딩 색상 → CSS 변수 토큰 전환 (테마 반응) +- 선박 분류 체계 AIS shipTy 파싱 개선 +- 한국 선박 데이터 폴링 주기 15초 → 4분 +- 범례 카운트 MT 분류 기준으로 동기화 diff --git a/eslint.config.js b/frontend/eslint.config.js similarity index 100% rename from eslint.config.js rename to frontend/eslint.config.js diff --git a/index.html b/frontend/index.html similarity index 100% rename from index.html rename to frontend/index.html diff --git a/package-lock.json b/frontend/package-lock.json similarity index 62% rename from package-lock.json rename to frontend/package-lock.json index 9296d35..a9a7021 100644 --- a/package-lock.json +++ b/frontend/package-lock.json @@ -1,24 +1,29 @@ { - "name": "iran-airstrike-replay", + "name": "kcg-monitoring", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "iran-airstrike-replay", + "name": "kcg-monitoring", "version": "0.0.0", "dependencies": { + "@rollup/rollup-darwin-arm64": "^4.59.0", + "@tailwindcss/vite": "^4.2.1", "@types/leaflet": "^1.9.21", "date-fns": "^4.1.0", "hls.js": "^1.6.15", + "i18next": "^25.8.18", "leaflet": "^1.9.4", "maplibre-gl": "^5.19.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^16.5.8", "react-leaflet": "^5.0.0", "react-map-gl": "^8.1.0", "recharts": "^3.8.0", - "satellite.js": "^6.0.2" + "satellite.js": "^6.0.2", + "tailwindcss": "^4.2.1" }, "devDependencies": { "@eslint/js": "^9.39.1", @@ -37,7 +42,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", @@ -52,7 +57,7 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/compat-data/-/compat-data-7.29.0.tgz", "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", @@ -62,7 +67,7 @@ }, "node_modules/@babel/core": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/core/-/core-7.29.0.tgz", "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", @@ -94,7 +99,7 @@ }, "node_modules/@babel/generator": { "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", @@ -111,7 +116,7 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", @@ -128,7 +133,7 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", @@ -138,7 +143,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", @@ -152,7 +157,7 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", @@ -170,7 +175,7 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", @@ -180,7 +185,7 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", @@ -190,7 +195,7 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", @@ -200,7 +205,7 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", @@ -210,7 +215,7 @@ }, "node_modules/@babel/helpers": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/helpers/-/helpers-7.28.6.tgz", "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", @@ -224,7 +229,7 @@ }, "node_modules/@babel/parser": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/parser/-/parser-7.29.0.tgz", "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", @@ -240,7 +245,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", @@ -256,7 +261,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", @@ -270,9 +275,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", @@ -287,7 +301,7 @@ }, "node_modules/@babel/traverse": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", @@ -306,7 +320,7 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", @@ -319,13 +333,12 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -336,13 +349,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -353,13 +365,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -370,13 +381,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -387,13 +397,12 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -404,13 +413,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -421,13 +429,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -438,13 +445,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -455,13 +461,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -472,13 +477,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -489,13 +493,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -506,13 +509,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -523,13 +525,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -540,13 +541,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -557,13 +557,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -574,13 +573,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -591,13 +589,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -608,13 +605,12 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -625,13 +621,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -642,13 +637,12 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -659,13 +653,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -676,13 +669,12 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -693,13 +685,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -710,13 +701,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -727,13 +717,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -744,13 +733,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -762,7 +750,7 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", @@ -781,7 +769,7 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", @@ -794,7 +782,7 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", @@ -804,7 +792,7 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/config-array/-/config-array-0.21.2.tgz", "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", @@ -819,7 +807,7 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", @@ -832,7 +820,7 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", @@ -845,7 +833,7 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", @@ -869,7 +857,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", @@ -882,7 +870,7 @@ }, "node_modules/@eslint/js": { "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/js/-/js-9.39.4.tgz", "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", @@ -895,7 +883,7 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", @@ -905,7 +893,7 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", @@ -919,7 +907,7 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", @@ -929,7 +917,7 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", @@ -943,7 +931,7 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", @@ -957,7 +945,7 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", @@ -971,9 +959,8 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -982,9 +969,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -993,9 +979,8 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1003,38 +988,23 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "license": "ISC", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", "engines": { "node": ">= 0.6" @@ -1042,25 +1012,25 @@ }, "node_modules/@mapbox/point-geometry": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", "license": "ISC" }, "node_modules/@mapbox/tiny-sdf": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/tiny-sdf/-/tiny-sdf-2.0.7.tgz", "integrity": "sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==", "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", "license": "BSD-2-Clause" }, "node_modules/@mapbox/vector-tile": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz", "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==", "license": "BSD-3-Clause", "dependencies": { @@ -1071,7 +1041,7 @@ }, "node_modules/@mapbox/whoots-js": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", "license": "ISC", "engines": { @@ -1079,14 +1049,17 @@ } }, "node_modules/@maplibre/geojson-vt": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", - "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", - "license": "ISC" + "version": "6.0.3", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/geojson-vt/-/geojson-vt-6.0.3.tgz", + "integrity": "sha512-tJ8df2SAIacER7pWTiSlDjIULBBAfZnzAURvWb1d8kVzx/pmSJcG0L2p0DTAB6nEu8Lmsx5zAc8JFDcs2DTwaw==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.0.2" + } }, "node_modules/@maplibre/maplibre-gl-style-spec": { "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.7.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.7.0.tgz", "integrity": "sha512-Ed7rcKYU5iELfablg9Mj+TVCsXsPBgdMyXPRAxb2v7oWg9YJnpQdZ5msDs1LESu/mtXy3Z48Vdppv2t/x5kAhw==", "license": "ISC", "dependencies": { @@ -1106,7 +1079,7 @@ }, "node_modules/@maplibre/mlt": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.7.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/mlt/-/mlt-1.1.7.tgz", "integrity": "sha512-HZSsXrgn2V6T3o0qklMwKERfKaAxjO8shmiFnVygCtXTg4SPKWVX+U99RkvxUfCsjYBEcT4ltor8lSlBSCca7Q==", "license": "(MIT OR Apache-2.0)", "dependencies": { @@ -1115,7 +1088,7 @@ }, "node_modules/@maplibre/vt-pbf": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/vt-pbf/-/vt-pbf-4.3.0.tgz", "integrity": "sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==", "license": "MIT", "dependencies": { @@ -1128,9 +1101,15 @@ "supercluster": "^8.0.1" } }, + "node_modules/@maplibre/vt-pbf/node_modules/@maplibre/geojson-vt": { + "version": "5.0.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz", + "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==", + "license": "ISC" + }, "node_modules/@react-leaflet/core": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@react-leaflet/core/-/core-3.0.0.tgz", "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", "license": "Hippocratic-2.1", "peerDependencies": { @@ -1141,7 +1120,7 @@ }, "node_modules/@reduxjs/toolkit": { "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", "license": "MIT", "dependencies": { @@ -1167,7 +1146,7 @@ }, "node_modules/@reduxjs/toolkit/node_modules/immer": { "version": "11.1.4", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/immer/-/immer-11.1.4.tgz", "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", "license": "MIT", "funding": { @@ -1177,19 +1156,18 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1198,12 +1176,11 @@ }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1212,26 +1189,23 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", - "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1240,12 +1214,11 @@ }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1254,12 +1227,11 @@ }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1268,12 +1240,11 @@ }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1282,12 +1253,11 @@ }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1296,12 +1266,11 @@ }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1310,12 +1279,11 @@ }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1324,12 +1292,11 @@ }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1338,12 +1305,11 @@ }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1352,12 +1318,11 @@ }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1366,12 +1331,11 @@ }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1380,12 +1344,11 @@ }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1394,12 +1357,11 @@ }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1408,12 +1370,11 @@ }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1422,12 +1383,11 @@ }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1436,12 +1396,11 @@ }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1450,12 +1409,11 @@ }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1464,12 +1422,11 @@ }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1478,12 +1435,11 @@ }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1492,12 +1448,11 @@ }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1506,12 +1461,11 @@ }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1520,12 +1474,11 @@ }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1534,19 +1487,276 @@ }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, "node_modules/@standard-schema/utils": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@standard-schema/utils/-/utils-0.3.0.tgz", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", @@ -1560,7 +1770,7 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", @@ -1570,7 +1780,7 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", @@ -1581,7 +1791,7 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", @@ -1591,25 +1801,25 @@ }, "node_modules/@types/d3-array": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-array/-/d3-array-3.2.2.tgz", "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { @@ -1618,13 +1828,13 @@ }, "node_modules/@types/d3-path": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-path/-/d3-path-3.1.1.tgz", "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-scale/-/d3-scale-4.0.9.tgz", "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "license": "MIT", "dependencies": { @@ -1633,7 +1843,7 @@ }, "node_modules/@types/d3-shape": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-shape/-/d3-shape-3.1.8.tgz", "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", "license": "MIT", "dependencies": { @@ -1642,39 +1852,38 @@ }, "node_modules/@types/d3-time": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-time/-/d3-time-3.0.4.tgz", "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/geojson": { "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/leaflet": { "version": "1.9.21", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/leaflet/-/leaflet-1.9.21.tgz", "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", "license": "MIT", "dependencies": { @@ -1683,9 +1892,9 @@ }, "node_modules/@types/node": { "version": "24.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/node/-/node-24.12.0.tgz", "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -1694,7 +1903,7 @@ }, "node_modules/@types/react": { "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", @@ -1705,7 +1914,7 @@ }, "node_modules/@types/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", @@ -1715,7 +1924,7 @@ }, "node_modules/@types/supercluster": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/supercluster/-/supercluster-7.1.3.tgz", "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", "license": "MIT", "dependencies": { @@ -1724,22 +1933,22 @@ }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", - "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/type-utils": "8.56.1", - "@typescript-eslint/utils": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" @@ -1752,14 +1961,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.56.1", + "@typescript-eslint/parser": "^8.57.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", @@ -1768,17 +1977,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3" }, "engines": { @@ -1794,14 +2003,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", "debug": "^4.4.3" }, "engines": { @@ -1816,14 +2025,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1834,9 +2043,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", "dev": true, "license": "MIT", "engines": { @@ -1851,15 +2060,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", - "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, @@ -1876,9 +2085,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", "dev": true, "license": "MIT", "engines": { @@ -1890,16 +2099,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1919,7 +2128,7 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", @@ -1929,7 +2138,7 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/brace-expansion/-/brace-expansion-5.0.4.tgz", "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, "license": "MIT", @@ -1942,7 +2151,7 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/minimatch/-/minimatch-10.2.4.tgz", "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "license": "BlueOak-1.0.0", @@ -1958,7 +2167,7 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", @@ -1970,16 +2179,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", - "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1" + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1994,13 +2203,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/types": "8.57.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2013,7 +2222,7 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", @@ -2026,7 +2235,7 @@ }, "node_modules/@vis.gl/react-mapbox": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@vis.gl/react-mapbox/-/react-mapbox-8.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@vis.gl/react-mapbox/-/react-mapbox-8.1.0.tgz", "integrity": "sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==", "license": "MIT", "peerDependencies": { @@ -2042,7 +2251,7 @@ }, "node_modules/@vis.gl/react-maplibre": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@vis.gl/react-maplibre/-/react-maplibre-8.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@vis.gl/react-maplibre/-/react-maplibre-8.1.0.tgz", "integrity": "sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ==", "license": "MIT", "dependencies": { @@ -2061,7 +2270,7 @@ }, "node_modules/@vis.gl/react-maplibre/node_modules/@maplibre/maplibre-gl-style-spec": { "version": "19.3.3", - "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.3.tgz", "integrity": "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==", "license": "ISC", "dependencies": { @@ -2080,14 +2289,14 @@ }, "node_modules/@vis.gl/react-maplibre/node_modules/json-stringify-pretty-compact": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==", "license": "MIT" }, "node_modules/@vitejs/plugin-react": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", - "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "version": "5.2.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", "dev": true, "license": "MIT", "dependencies": { @@ -2102,12 +2311,12 @@ "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", @@ -2121,7 +2330,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", @@ -2131,7 +2340,7 @@ }, "node_modules/ajv": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", @@ -2148,7 +2357,7 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", @@ -2164,14 +2373,14 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "license": "MIT", "engines": { @@ -2180,7 +2389,7 @@ }, "node_modules/assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "license": "MIT", "engines": { @@ -2189,15 +2398,15 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "version": "2.10.8", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2209,7 +2418,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", @@ -2220,7 +2429,7 @@ }, "node_modules/browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ @@ -2255,7 +2464,7 @@ }, "node_modules/bytewise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/bytewise/-/bytewise-1.1.0.tgz", "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", "license": "MIT", "dependencies": { @@ -2265,7 +2474,7 @@ }, "node_modules/bytewise-core": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/bytewise-core/-/bytewise-core-1.2.3.tgz", "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", "license": "MIT", "dependencies": { @@ -2274,7 +2483,7 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", @@ -2283,9 +2492,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001777", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", - "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", + "version": "1.0.30001779", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", + "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", "dev": true, "funding": [ { @@ -2305,7 +2514,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", @@ -2322,7 +2531,7 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { @@ -2331,7 +2540,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", @@ -2344,28 +2553,28 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", @@ -2380,14 +2589,14 @@ }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { @@ -2399,7 +2608,7 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { @@ -2408,7 +2617,7 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { @@ -2417,7 +2626,7 @@ }, "node_modules/d3-format": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-format/-/d3-format-3.1.2.tgz", "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "license": "ISC", "engines": { @@ -2426,7 +2635,7 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { @@ -2438,7 +2647,7 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { @@ -2447,7 +2656,7 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { @@ -2463,7 +2672,7 @@ }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { @@ -2475,7 +2684,7 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { @@ -2487,7 +2696,7 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { @@ -2499,7 +2708,7 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { @@ -2508,7 +2717,7 @@ }, "node_modules/date-fns": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", "funding": { @@ -2518,7 +2727,7 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", @@ -2536,33 +2745,55 @@ }, "node_modules/decimal.js-light": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/earcut": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/earcut/-/earcut-3.0.2.tgz", "integrity": "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==", "license": "ISC" }, "node_modules/electron-to-chromium": { - "version": "1.5.307", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", - "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "version": "1.5.313", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", "dev": true, "license": "ISC" }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-toolkit": { "version": "1.45.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/es-toolkit/-/es-toolkit-1.45.1.tgz", "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==", "license": "MIT", "workspaces": [ @@ -2571,10 +2802,9 @@ ] }, "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, + "version": "0.27.4", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -2584,37 +2814,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" } }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", @@ -2624,7 +2854,7 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", @@ -2637,7 +2867,7 @@ }, "node_modules/eslint": { "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint/-/eslint-9.39.4.tgz", "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", @@ -2698,7 +2928,7 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", @@ -2718,7 +2948,7 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.4.26", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", "dev": true, "license": "MIT", @@ -2728,7 +2958,7 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", @@ -2745,7 +2975,7 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", @@ -2758,7 +2988,7 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", @@ -2776,7 +3006,7 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", @@ -2789,7 +3019,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", @@ -2802,7 +3032,7 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", @@ -2812,7 +3042,7 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", @@ -2822,13 +3052,13 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "license": "MIT", "dependencies": { @@ -2840,30 +3070,29 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -2879,7 +3108,7 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", @@ -2892,7 +3121,7 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", @@ -2909,7 +3138,7 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", @@ -2922,17 +3151,16 @@ } }, "node_modules/flatted": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.0.tgz", - "integrity": "sha512-kC6Bb+ooptOIvWj5B63EQWkF0FEnNjV2ZNkLMLZRDDduIiWeFF4iKnslwhiWxjAdbg4NzTNo6h0qLuvFrcx+Sw==", + "version": "3.4.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", "dev": true, "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2945,7 +3173,7 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", @@ -2953,21 +3181,9 @@ "node": ">=6.9.0" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-value": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "license": "MIT", "engines": { @@ -2976,13 +3192,13 @@ }, "node_modules/gl-matrix": { "version": "3.4.4", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/gl-matrix/-/gl-matrix-3.4.4.tgz", "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", "license": "MIT" }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", @@ -2995,7 +3211,7 @@ }, "node_modules/globals": { "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/globals/-/globals-16.5.0.tgz", "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", @@ -3006,9 +3222,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", @@ -3018,14 +3240,14 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", @@ -3035,13 +3257,54 @@ }, "node_modules/hls.js": { "version": "1.6.15", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/hls.js/-/hls.js-1.6.15.tgz", "integrity": "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==", "license": "Apache-2.0" }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/i18next": { + "version": "25.8.18", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/i18next/-/i18next-25.8.18.tgz", + "integrity": "sha512-lzY5X83BiL5AP77+9DydbrqkQHFN9hUzWGjqjLpPcp5ZOzuu1aSoKaU3xbBLSjWx9dAzW431y+d+aogxOZaKRA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", @@ -3051,7 +3314,7 @@ }, "node_modules/immer": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/immer/-/immer-10.2.0.tgz", "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", "license": "MIT", "funding": { @@ -3061,7 +3324,7 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", @@ -3078,7 +3341,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", @@ -3088,7 +3351,7 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { @@ -3097,7 +3360,7 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "license": "MIT", "engines": { @@ -3106,7 +3369,7 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", @@ -3116,7 +3379,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", @@ -3129,7 +3392,7 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { @@ -3141,30 +3404,39 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", @@ -3177,7 +3449,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", @@ -3190,34 +3462,34 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-pretty-compact": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", @@ -3230,13 +3502,13 @@ }, "node_modules/kdbush": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/kdbush/-/kdbush-4.0.2.tgz", "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", "license": "ISC" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", @@ -3246,14 +3518,14 @@ }, "node_modules/leaflet": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", "license": "BSD-2-Clause", "peer": true }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", @@ -3265,9 +3537,258 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", @@ -3283,14 +3804,14 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -3298,26 +3819,33 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/maplibre-gl": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.19.0.tgz", - "integrity": "sha512-REhYUN8gNP3HlcIZS6QU2uy8iovl31cXsrNDkCcqWSQbCkcpdYLczqDz5PVIwNH42UQNyvukjes/RoHPDrOUmQ==", + "version": "5.20.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/maplibre-gl/-/maplibre-gl-5.20.1.tgz", + "integrity": "sha512-57YIgfRct+rrk78ldoWRuLWRnXV/1vM2Rk0QYfEDQmsXdpgbACwvGoREIOZtyDIaq/GJK/ORYEriaAdVZuNfvw==", "license": "BSD-3-Clause", "peer": true, "dependencies": { - "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^1.1.0", "@mapbox/tiny-sdf": "^2.0.7", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", - "@maplibre/geojson-vt": "^5.0.4", - "@maplibre/maplibre-gl-style-spec": "^24.4.1", - "@maplibre/mlt": "^1.1.6", - "@maplibre/vt-pbf": "^4.2.1", + "@maplibre/geojson-vt": "^6.0.2", + "@maplibre/maplibre-gl-style-spec": "^24.7.0", + "@maplibre/mlt": "^1.1.7", + "@maplibre/vt-pbf": "^4.3.0", "@types/geojson": "^7946.0.16", - "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", @@ -3325,7 +3853,6 @@ "pbf": "^4.0.1", "potpack": "^2.1.0", "quickselect": "^3.0.0", - "supercluster": "^8.0.1", "tinyqueue": "^3.0.0" }, "engines": { @@ -3338,7 +3865,7 @@ }, "node_modules/minimatch": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", @@ -3351,7 +3878,7 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { @@ -3360,22 +3887,21 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/murmurhash-js": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/murmurhash-js/-/murmurhash-js-1.0.0.tgz", "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -3392,21 +3918,21 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/node-releases/-/node-releases-2.0.36.tgz", "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "dev": true, "license": "MIT" }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", @@ -3424,7 +3950,7 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", @@ -3440,7 +3966,7 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", @@ -3456,7 +3982,7 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", @@ -3469,7 +3995,7 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", @@ -3479,7 +4005,7 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", @@ -3489,7 +4015,7 @@ }, "node_modules/pbf": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/pbf/-/pbf-4.0.1.tgz", "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==", "license": "BSD-3-Clause", "dependencies": { @@ -3501,16 +4027,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", "peer": true, "engines": { @@ -3522,9 +4046,8 @@ }, "node_modules/postcss": { "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/postcss/-/postcss-8.5.8.tgz", "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3551,13 +4074,13 @@ }, "node_modules/potpack": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/potpack/-/potpack-2.1.0.tgz", "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", "license": "ISC" }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", @@ -3567,13 +4090,13 @@ }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", @@ -3583,13 +4106,13 @@ }, "node_modules/quickselect": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/quickselect/-/quickselect-3.0.0.tgz", "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "license": "ISC" }, "node_modules/react": { "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", "peer": true, @@ -3599,7 +4122,7 @@ }, "node_modules/react-dom": { "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", "peer": true, @@ -3610,16 +4133,43 @@ "react": "^19.2.4" } }, + "node_modules/react-i18next": { + "version": "16.5.8", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-i18next/-/react-i18next-16.5.8.tgz", + "integrity": "sha512-2ABeHHlakxVY+LSirD+OiERxFL6+zip0PaHo979bgwzeHg27Sqc82xxXWIrSFmfWX0ZkrvXMHwhsi/NGUf5VQg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 25.6.2", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-is/-/react-is-19.2.4.tgz", "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", "license": "MIT", "peer": true }, "node_modules/react-leaflet": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-leaflet/-/react-leaflet-5.0.0.tgz", "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", "license": "Hippocratic-2.1", "dependencies": { @@ -3633,7 +4183,7 @@ }, "node_modules/react-map-gl": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-map-gl/-/react-map-gl-8.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-map-gl/-/react-map-gl-8.1.0.tgz", "integrity": "sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg==", "license": "MIT", "dependencies": { @@ -3657,7 +4207,7 @@ }, "node_modules/react-redux": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", "peer": true, @@ -3681,7 +4231,7 @@ }, "node_modules/react-refresh": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/react-refresh/-/react-refresh-0.18.0.tgz", "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", "dev": true, "license": "MIT", @@ -3691,7 +4241,7 @@ }, "node_modules/recharts": { "version": "3.8.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/recharts/-/recharts-3.8.0.tgz", "integrity": "sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ==", "license": "MIT", "workspaces": [ @@ -3721,14 +4271,14 @@ }, "node_modules/redux": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT", "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/redux-thunk/-/redux-thunk-3.1.0.tgz", "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", "peerDependencies": { @@ -3737,13 +4287,13 @@ }, "node_modules/reselect": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/reselect/-/reselect-5.1.1.tgz", "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", @@ -3753,7 +4303,7 @@ }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "license": "MIT", "dependencies": { @@ -3762,9 +4312,8 @@ }, "node_modules/rollup": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -3807,25 +4356,25 @@ }, "node_modules/rw": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, "node_modules/satellite.js": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/satellite.js/-/satellite.js-6.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/satellite.js/-/satellite.js-6.0.2.tgz", "integrity": "sha512-XWKxtqVF5xiJ1xAeiYeT/oSSzsukoCLWvk6nO/WFy4un0M3g4djAU9TAtOCqJLtYW9vxx9pkPJ1L9ITOc607GA==", "license": "MIT" }, "node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", @@ -3835,7 +4384,7 @@ }, "node_modules/set-value": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "license": "MIT", "dependencies": { @@ -3850,7 +4399,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", @@ -3863,7 +4412,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", @@ -3873,7 +4422,7 @@ }, "node_modules/sort-asc": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/sort-asc/-/sort-asc-0.2.0.tgz", "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==", "license": "MIT", "engines": { @@ -3882,7 +4431,7 @@ }, "node_modules/sort-desc": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/sort-desc/-/sort-desc-0.2.0.tgz", "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==", "license": "MIT", "engines": { @@ -3891,7 +4440,7 @@ }, "node_modules/sort-object": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/sort-object/-/sort-object-3.0.3.tgz", "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", "license": "MIT", "dependencies": { @@ -3908,9 +4457,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3918,7 +4466,7 @@ }, "node_modules/split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "license": "MIT", "dependencies": { @@ -3930,7 +4478,7 @@ }, "node_modules/split-string/node_modules/extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "license": "MIT", "dependencies": { @@ -3943,7 +4491,7 @@ }, "node_modules/split-string/node_modules/is-extendable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "license": "MIT", "dependencies": { @@ -3955,7 +4503,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", @@ -3968,7 +4516,7 @@ }, "node_modules/supercluster": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/supercluster/-/supercluster-8.0.1.tgz", "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", "license": "ISC", "dependencies": { @@ -3977,7 +4525,7 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", @@ -3988,17 +4536,35 @@ "node": ">=8" } }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -4013,13 +4579,13 @@ }, "node_modules/tinyqueue": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/tinyqueue/-/tinyqueue-3.0.0.tgz", "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", "license": "ISC" }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/ts-api-utils/-/ts-api-utils-2.4.0.tgz", "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", @@ -4032,7 +4598,7 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", @@ -4045,9 +4611,9 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "peer": true, "bin": { @@ -4059,16 +4625,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", - "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "version": "8.57.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.56.1", - "@typescript-eslint/parser": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/utils": "8.56.1" + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4084,7 +4650,7 @@ }, "node_modules/typewise": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/typewise/-/typewise-1.0.3.tgz", "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", "license": "MIT", "dependencies": { @@ -4093,20 +4659,20 @@ }, "node_modules/typewise-core": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/typewise-core/-/typewise-core-1.2.0.tgz", "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==", "license": "MIT" }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/union-value": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "license": "MIT", "dependencies": { @@ -4121,7 +4687,7 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ @@ -4152,7 +4718,7 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", @@ -4162,7 +4728,7 @@ }, "node_modules/use-sync-external-store": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { @@ -4171,7 +4737,7 @@ }, "node_modules/victory-vendor": { "version": "37.3.6", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/victory-vendor/-/victory-vendor-37.3.6.tgz", "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", "license": "MIT AND ISC", "dependencies": { @@ -4193,9 +4759,8 @@ }, "node_modules/vite": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/vite/-/vite-7.3.1.tgz", "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4267,9 +4832,18 @@ } } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", @@ -4285,7 +4859,7 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", @@ -4295,14 +4869,14 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", @@ -4315,7 +4889,7 @@ }, "node_modules/zod": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", @@ -4326,7 +4900,7 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "resolved": "https://nexus.gc-si.dev/repository/npm-public/zod-validation-error/-/zod-validation-error-4.0.2.tgz", "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", diff --git a/package.json b/frontend/package.json similarity index 82% rename from package.json rename to frontend/package.json index 0b2149c..05be12b 100644 --- a/package.json +++ b/frontend/package.json @@ -10,17 +10,22 @@ "preview": "vite preview" }, "dependencies": { + "@rollup/rollup-darwin-arm64": "^4.59.0", + "@tailwindcss/vite": "^4.2.1", "@types/leaflet": "^1.9.21", "date-fns": "^4.1.0", "hls.js": "^1.6.15", + "i18next": "^25.8.18", "leaflet": "^1.9.4", "maplibre-gl": "^5.19.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^16.5.8", "react-leaflet": "^5.0.0", "react-map-gl": "^8.1.0", "recharts": "^3.8.0", - "satellite.js": "^6.0.2" + "satellite.js": "^6.0.2", + "tailwindcss": "^4.2.1" }, "devDependencies": { "@eslint/js": "^9.39.1", diff --git a/public/ships/440034000.jpg b/frontend/public/ships/440034000.jpg similarity index 100% rename from public/ships/440034000.jpg rename to frontend/public/ships/440034000.jpg diff --git a/public/ships/440150000.jpg b/frontend/public/ships/440150000.jpg similarity index 100% rename from public/ships/440150000.jpg rename to frontend/public/ships/440150000.jpg diff --git a/public/ships/440272000.jpg b/frontend/public/ships/440272000.jpg similarity index 100% rename from public/ships/440272000.jpg rename to frontend/public/ships/440272000.jpg diff --git a/public/ships/440272000.png b/frontend/public/ships/440272000.png similarity index 100% rename from public/ships/440272000.png rename to frontend/public/ships/440272000.png diff --git a/public/ships/440274000.jpg b/frontend/public/ships/440274000.jpg similarity index 100% rename from public/ships/440274000.jpg rename to frontend/public/ships/440274000.jpg diff --git a/public/ships/440323000.jpg b/frontend/public/ships/440323000.jpg similarity index 100% rename from public/ships/440323000.jpg rename to frontend/public/ships/440323000.jpg diff --git a/public/ships/440384000.jpg b/frontend/public/ships/440384000.jpg similarity index 100% rename from public/ships/440384000.jpg rename to frontend/public/ships/440384000.jpg diff --git a/public/ships/440880000.jpg b/frontend/public/ships/440880000.jpg similarity index 100% rename from public/ships/440880000.jpg rename to frontend/public/ships/440880000.jpg diff --git a/public/ships/441046000.jpg b/frontend/public/ships/441046000.jpg similarity index 100% rename from public/ships/441046000.jpg rename to frontend/public/ships/441046000.jpg diff --git a/public/ships/441345000.jpg b/frontend/public/ships/441345000.jpg similarity index 100% rename from public/ships/441345000.jpg rename to frontend/public/ships/441345000.jpg diff --git a/public/ships/441345000.png b/frontend/public/ships/441345000.png similarity index 100% rename from public/ships/441345000.png rename to frontend/public/ships/441345000.png diff --git a/public/ships/441353000.jpg b/frontend/public/ships/441353000.jpg similarity index 100% rename from public/ships/441353000.jpg rename to frontend/public/ships/441353000.jpg diff --git a/public/ships/441393000.jpg b/frontend/public/ships/441393000.jpg similarity index 100% rename from public/ships/441393000.jpg rename to frontend/public/ships/441393000.jpg diff --git a/public/ships/441423000.jpg b/frontend/public/ships/441423000.jpg similarity index 100% rename from public/ships/441423000.jpg rename to frontend/public/ships/441423000.jpg diff --git a/public/ships/441548000.jpg b/frontend/public/ships/441548000.jpg similarity index 100% rename from public/ships/441548000.jpg rename to frontend/public/ships/441548000.jpg diff --git a/public/ships/441708000.png b/frontend/public/ships/441708000.png similarity index 100% rename from public/ships/441708000.png rename to frontend/public/ships/441708000.png diff --git a/public/ships/441866000.jpg b/frontend/public/ships/441866000.jpg similarity index 100% rename from public/ships/441866000.jpg rename to frontend/public/ships/441866000.jpg diff --git a/public/vite.svg b/frontend/public/vite.svg similarity index 100% rename from public/vite.svg rename to frontend/public/vite.svg diff --git a/src/App.css b/frontend/src/App.css similarity index 81% rename from src/App.css rename to frontend/src/App.css index 92eb9db..46461bf 100644 --- a/src/App.css +++ b/frontend/src/App.css @@ -12,7 +12,7 @@ justify-content: space-between; padding: 8px 20px; background: var(--bg-secondary); - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; } @@ -27,8 +27,8 @@ .map-mode-toggle { display: flex; gap: 4px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid #333; + background: var(--kcg-subtle); + border: 1px solid var(--kcg-border); border-radius: 6px; padding: 3px; } @@ -44,7 +44,7 @@ border-radius: 4px; border: 1px solid transparent; background: transparent; - color: #666; + color: var(--kcg-dim); cursor: pointer; transition: all 0.15s; font-family: 'Courier New', monospace; @@ -52,7 +52,7 @@ .map-mode-btn:hover { color: var(--text-primary); - background: rgba(255, 255, 255, 0.05); + background: var(--kcg-hover); } .map-mode-btn.active { @@ -83,14 +83,40 @@ letter-spacing: 0.5px; padding: 2px 8px; border-radius: 3px; - background: rgba(255, 255, 255, 0.05); - border: 1px solid #333; + background: var(--kcg-hover); + border: 1px solid var(--kcg-border); } .ac-count { color: #22d3ee; border-color: rgba(34, 211, 238, 0.3); } .mil-count { color: #f97316; border-color: rgba(249, 115, 22, 0.3); } .ship-count { color: #fb923c; border-color: rgba(251, 146, 60, 0.3); } -.sat-count { color: #ef4444; border-color: rgba(239, 68, 68, 0.3); } +.sat-count { color: var(--kcg-danger); border-color: rgba(239, 68, 68, 0.3); } + +.header-toggles { + display: flex; + gap: 4px; +} + +.header-toggle-btn { + background: var(--kcg-hover); + border: 1px solid var(--kcg-border-light); + color: var(--kcg-text-secondary); + font-size: 10px; + font-weight: 700; + font-family: 'Courier New', monospace; + letter-spacing: 0.5px; + padding: 2px 8px; + border-radius: 4px; + cursor: pointer; + transition: all 0.15s; + line-height: 1.4; +} + +.header-toggle-btn:hover { + background: var(--kcg-hover-strong); + border-color: var(--kcg-dim); + color: var(--kcg-text); +} .header-status { display: flex; @@ -107,7 +133,7 @@ width: 8px; height: 8px; border-radius: 50%; - background: #555; + background: var(--kcg-border-heavy); } .status-dot.live { @@ -176,12 +202,13 @@ /* Layer Panel */ .layer-panel { - background: rgba(10, 10, 26, 0.92); + background: var(--kcg-glass); backdrop-filter: blur(8px); - border: 1px solid #333; + border: 1px solid var(--kcg-border); border-radius: 8px; padding: 10px; min-width: 180px; + box-shadow: var(--kcg-panel-shadow); } .layer-panel h3 { @@ -207,7 +234,7 @@ border: none; border-radius: 4px; background: transparent; - color: #666; + color: var(--kcg-dim); font-size: 11px; font-weight: 500; cursor: pointer; @@ -216,7 +243,7 @@ } .layer-toggle:hover { - background: rgba(255, 255, 255, 0.05); + background: var(--kcg-hover); } .layer-toggle.active { @@ -232,14 +259,14 @@ .layer-divider { height: 1px; - background: #333; + background: var(--kcg-border); margin: 4px 0; } .layer-stats { margin-top: 8px; padding-top: 8px; - border-top: 1px solid #333; + border-top: 1px solid var(--kcg-border); } .stat-row { @@ -261,14 +288,89 @@ font-weight: 600; } +.stat-header { + font-size: 9px; + font-weight: 700; + letter-spacing: 1px; + color: var(--text-secondary); + padding: 2px 8px; + font-family: 'Courier New', monospace; +} + +/* Layer tree */ +.layer-tree-header { + display: flex; + align-items: center; + gap: 4px; + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 500; + transition: background 0.15s; +} +.layer-tree-header:hover { background: var(--kcg-hover); } +.layer-tree-arrow { + font-size: 8px; + width: 12px; + text-align: center; + color: var(--kcg-dim); + transition: transform 0.15s; +} +.layer-tree-arrow.expanded { transform: rotate(90deg); } +.layer-tree-children { + padding-left: 20px; +} +.category-toggle { + display: flex; + align-items: center; + gap: 6px; + padding: 2px 8px; + font-size: 10px; + cursor: pointer; + border-radius: 3px; + transition: opacity 0.15s; +} +.category-toggle.hidden { opacity: 0.35; } +.category-toggle:hover { background: var(--kcg-hover); } +.category-dot { + width: 7px; + height: 7px; + border-radius: 50%; + flex-shrink: 0; +} +.category-label { + flex: 1; + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.category-count { margin-left: auto; color: var(--kcg-muted); font-size: 9px; } +.legend-toggle { + font-size: 9px; + color: var(--kcg-dim); + cursor: pointer; + padding: 2px 8px; + margin-top: 2px; + background: none; + border: none; + text-align: left; +} +.legend-toggle:hover { color: var(--kcg-muted); } +.legend-content { + padding: 2px 8px 4px; +} + /* Side panel */ .side-panel { width: 300px; background: var(--bg-secondary); - border-left: 1px solid #222; + border-left: 1px solid var(--kcg-border); overflow: hidden; display: flex; flex-direction: column; + box-shadow: var(--kcg-panel-shadow); } /* ═══ Dashboard Tabs in Header ═══ */ @@ -287,7 +389,7 @@ font-size: 11px; font-weight: 700; letter-spacing: 0.5px; - color: #666; + color: var(--kcg-dim); background: transparent; border: none; border-radius: 4px; @@ -297,11 +399,11 @@ white-space: nowrap; } .dash-tab:hover { - color: #aaa; + color: var(--kcg-muted); background: rgba(255,255,255,0.05); } .dash-tab.active { - color: #fff; + color: var(--kcg-text); background: rgba(239,68,68,0.2); } .dash-tab-flag { @@ -313,6 +415,7 @@ display: flex; flex-direction: column; height: 100%; + border-left: 1px solid var(--kcg-border); } .event-log h3 { @@ -322,7 +425,7 @@ letter-spacing: 1.5px; text-transform: uppercase; color: var(--text-secondary); - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); font-family: 'Courier New', monospace; } @@ -349,7 +452,7 @@ } .event-item:hover { - background: rgba(255, 255, 255, 0.03); + background: var(--kcg-subtle); } .event-tag { @@ -358,7 +461,7 @@ letter-spacing: 0.5px; padding: 2px 5px; border-radius: 2px; - color: #fff; + color: var(--kcg-text); white-space: nowrap; height: fit-content; margin-top: 2px; @@ -392,7 +495,7 @@ /* Breaking News Section */ .breaking-news-section { flex-shrink: 0; - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); max-height: 280px; overflow-y: auto; } @@ -413,8 +516,8 @@ font-size: 9px; font-weight: 800; letter-spacing: 1px; - color: #fff; - background: #ef4444; + color: var(--kcg-text); + background: var(--kcg-danger); padding: 2px 6px; border-radius: 2px; font-family: 'Courier New', monospace; @@ -447,11 +550,11 @@ } .breaking-news-item:hover { - background: rgba(255, 255, 255, 0.03); + background: var(--kcg-subtle); } .breaking-news-item.breaking-new { - border-left: 2px solid #ef4444; + border-left: 2px solid var(--kcg-danger); background: rgba(239, 68, 68, 0.05); } @@ -465,7 +568,7 @@ .breaking-cat-tag { font-size: 9px; font-weight: 700; - color: #fff; + color: var(--kcg-text); padding: 1px 6px; border-radius: 2px; white-space: nowrap; @@ -473,20 +576,20 @@ .breaking-news-time { font-size: 9px; - color: #666; + color: var(--kcg-dim); font-family: 'Courier New', monospace; } .breaking-news-headline { font-size: 11px; font-weight: 600; - color: #eee; + color: var(--kcg-text); line-height: 1.4; } .breaking-news-detail { font-size: 10px; - color: #888; + color: var(--kcg-muted); line-height: 1.3; margin-top: 2px; } @@ -497,14 +600,14 @@ align-items: center; gap: 8px; padding: 10px 14px; - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); background: rgba(239, 68, 68, 0.06); flex-shrink: 0; } .osint-live-dot { width: 8px; height: 8px; border-radius: 50%; - background: #ef4444; + background: var(--kcg-danger); animation: osint-pulse 1.5s ease-in-out infinite; } @keyframes osint-pulse { @@ -515,19 +618,19 @@ font-size: 10px; font-weight: 700; letter-spacing: 1.5px; - color: #ef4444; + color: var(--kcg-danger); font-family: 'Courier New', monospace; } .osint-count { margin-left: auto; font-size: 10px; - color: #888; + color: var(--kcg-muted); font-family: 'Courier New', monospace; } .osint-loading { margin-left: auto; font-size: 10px; - color: #666; + color: var(--kcg-dim); font-style: italic; } .osint-list { @@ -550,7 +653,7 @@ background: rgba(255,255,255,0.05); } .osint-item.osint-recent { - border-left-color: #ef4444; + border-left-color: var(--kcg-danger); background: rgba(239,68,68,0.05); } .osint-item-top { @@ -564,7 +667,7 @@ font-weight: 600; padding: 1px 5px; border-radius: 3px; - color: #fff; + color: var(--kcg-text); white-space: nowrap; } .osint-lang-tag { @@ -572,20 +675,20 @@ font-weight: 700; padding: 1px 4px; border-radius: 2px; - background: #2563eb; - color: #fff; + background: var(--kcg-accent-hover); + color: var(--kcg-text); } .osint-time { margin-left: auto; font-size: 9px; - color: #666; + color: var(--kcg-dim); white-space: nowrap; font-family: 'Courier New', monospace; } .osint-item-title { font-size: 11px; font-weight: 600; - color: #ddd; + color: var(--kcg-text-secondary); line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; @@ -593,11 +696,11 @@ overflow: hidden; } .osint-item:hover .osint-item-title { - color: #fff; + color: var(--kcg-text); } .osint-item-source { font-size: 9px; - color: #666; + color: var(--kcg-dim); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; @@ -608,7 +711,7 @@ .kr-ship-summary { padding: 10px 12px; background: rgba(59, 130, 246, 0.06); - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; } @@ -618,7 +721,7 @@ gap: 8px; margin-bottom: 6px; padding-bottom: 6px; - border-bottom: 1px solid rgba(255, 255, 255, 0.06); + border-bottom: 1px solid var(--kcg-hover); } .area-ship-icon { @@ -664,7 +767,7 @@ margin-left: auto; font-size: 14px; font-weight: 700; - color: #3b82f6; + color: var(--kcg-accent); font-family: 'Courier New', monospace; } @@ -755,7 +858,7 @@ .iran-ship-summary { padding: 10px 12px; background: rgba(239, 68, 68, 0.04); - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; } .iran-mil-header { @@ -770,14 +873,14 @@ .iran-mil-title { font-size: 10px; font-weight: 700; - color: #ef4444; + color: var(--kcg-danger); letter-spacing: 0.5px; } .iran-mil-count { margin-left: auto; font-size: 11px; font-weight: 700; - color: #ef4444; + color: var(--kcg-danger); } .iran-mil-list { max-height: 200px; @@ -797,7 +900,7 @@ .iran-mil-flag { font-size: 11px; flex-shrink: 0; } .iran-mil-name { flex: 1; - color: #ccc; + color: var(--kcg-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -819,7 +922,7 @@ .korea-safety { padding: 12px; background: rgba(59, 130, 246, 0.06); - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; } .korea-safety-header { @@ -832,7 +935,7 @@ .korea-safety-title { font-size: 11px; font-weight: 700; - color: #3b82f6; + color: var(--kcg-accent); letter-spacing: 0.5px; } .korea-safety-stats { @@ -855,24 +958,24 @@ font-weight: 800; font-family: 'Courier New', monospace; } -.korea-stat-card.total .korea-stat-num { color: #3b82f6; } -.korea-stat-card.anchored .korea-stat-num { color: #ef4444; } -.korea-stat-card.moving .korea-stat-num { color: #22c55e; } +.korea-stat-card.total .korea-stat-num { color: var(--kcg-accent); } +.korea-stat-card.anchored .korea-stat-num { color: var(--kcg-danger); } +.korea-stat-card.moving .korea-stat-num { color: var(--kcg-success); } .korea-stat-label { font-size: 9px; - color: #888; + color: var(--kcg-muted); margin-top: 2px; font-weight: 600; } .korea-breakdown { padding: 8px 12px; - border-bottom: 1px solid #222; + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; } .korea-breakdown-header { font-size: 10px; font-weight: 700; - color: #888; + color: var(--kcg-muted); letter-spacing: 1px; text-transform: uppercase; margin-bottom: 4px; @@ -891,13 +994,13 @@ padding: 8px 12px; font-size: 10px; font-weight: 700; - color: #aaa; - border-bottom: 1px solid #222; + color: var(--kcg-muted); + border-bottom: 1px solid var(--kcg-border); flex-shrink: 0; font-family: 'Courier New', monospace; } .korea-ship-section-count { - color: #3b82f6; + color: var(--kcg-accent); font-size: 11px; } .korea-ship-detail-list { @@ -914,8 +1017,8 @@ transition: background 0.15s; } .korea-ship-card:hover { background: rgba(255,255,255,0.05); } -.korea-ship-card.anchored { border-left-color: #ef4444; } -.korea-ship-card.moving { border-left-color: #22c55e; } +.korea-ship-card.anchored { border-left-color: var(--kcg-danger); } +.korea-ship-card.moving { border-left-color: var(--kcg-success); } .korea-ship-card-top { display: flex; align-items: center; @@ -925,7 +1028,7 @@ .korea-ship-card-name { font-size: 11px; font-weight: 700; - color: #ddd; + color: var(--kcg-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -940,11 +1043,11 @@ margin-left: 6px; } .korea-ship-status.stat-anchored { - color: #ef4444; + color: var(--kcg-danger); background: rgba(239,68,68,0.15); } .korea-ship-status.stat-moving { - color: #22c55e; + color: var(--kcg-success); background: rgba(34,197,94,0.15); } .korea-ship-card-info { @@ -954,15 +1057,15 @@ align-items: center; } .korea-ship-card-type { font-weight: 600; } -.korea-ship-card-code { color: #666; } +.korea-ship-card-code { color: var(--kcg-dim); } .korea-ship-card-speed { margin-left: auto; - color: #888; + color: var(--kcg-muted); font-family: 'Courier New', monospace; } .korea-ship-card-dest { font-size: 9px; - color: #666; + color: var(--kcg-dim); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; @@ -972,10 +1075,11 @@ /* Charts Panel */ .charts-panel { background: var(--bg-secondary); - border-top: 1px solid #222; + border-top: 1px solid var(--kcg-border); flex-shrink: 0; height: 110px; overflow: hidden; + box-shadow: var(--kcg-panel-shadow); } .sensor-chart h3 { @@ -1007,9 +1111,10 @@ /* Footer / Controls */ .app-footer { background: var(--bg-card); - border-top: 1px solid #333; + border-top: 1px solid var(--kcg-border); padding: 4px 20px 6px; flex-shrink: 0; + box-shadow: var(--kcg-panel-shadow); } /* Replay Controls */ @@ -1027,7 +1132,7 @@ width: 28px; height: 28px; border-radius: 50%; - border: 1px solid #444; + border: 1px solid var(--kcg-border-light); background: var(--bg-secondary); color: var(--text-primary); cursor: pointer; @@ -1061,7 +1166,7 @@ font-size: 10px; font-weight: 700; border-radius: 3px; - border: 1px solid #333; + border: 1px solid var(--kcg-border); background: transparent; color: var(--text-secondary); cursor: pointer; @@ -1070,7 +1175,7 @@ } .speed-btn:hover { - border-color: #555; + border-color: var(--kcg-border-heavy); color: var(--text-primary); } @@ -1100,7 +1205,7 @@ font-size: 10px; font-weight: 700; border-radius: 3px; - border: 1px solid #333; + border: 1px solid var(--kcg-border); background: transparent; color: var(--text-secondary); cursor: pointer; @@ -1109,14 +1214,14 @@ } .range-btn:hover { - border-color: #555; + border-color: var(--kcg-border-heavy); color: var(--text-primary); } .range-btn.active { - border-color: #22c55e; + border-color: var(--kcg-success); background: rgba(34, 197, 94, 0.15); - color: #22c55e; + color: var(--kcg-success); } .custom-btn { @@ -1132,8 +1237,8 @@ bottom: 100%; right: 0; margin-bottom: 6px; - background: rgba(10, 10, 26, 0.95); - border: 1px solid #333; + background: var(--kcg-glass-dense); + border: 1px solid var(--kcg-border); border-radius: 6px; padding: 10px 12px; z-index: 100; @@ -1162,7 +1267,7 @@ .range-picker input[type="datetime-local"] { background: var(--bg-secondary); - border: 1px solid #444; + border: 1px solid var(--kcg-border-light); border-radius: 4px; color: var(--text-primary); padding: 4px 8px; @@ -1187,9 +1292,9 @@ font-weight: 700; letter-spacing: 1px; border-radius: 4px; - border: 1px solid #22c55e; + border: 1px solid var(--kcg-success); background: rgba(34, 197, 94, 0.15); - color: #22c55e; + color: var(--kcg-success); cursor: pointer; font-family: 'Courier New', monospace; transition: all 0.15s; @@ -1223,7 +1328,7 @@ .timeline-track { position: relative; height: 18px; - background: #1a1a2e; + background: var(--kcg-card); border-radius: 3px; cursor: pointer; overflow: visible; @@ -1278,7 +1383,7 @@ width: 7px; transform: translateX(-3px); box-shadow: 0 0 10px var(--marker-color); - border: 1px solid #fff; + border: 1px solid var(--kcg-text); } .tl-marker.in-cluster { @@ -1306,8 +1411,8 @@ display: flex; align-items: center; gap: 5px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid #222; + background: var(--kcg-subtle); + border: 1px solid var(--kcg-border); border-radius: 4px; padding: 3px 8px 3px 6px; cursor: pointer; @@ -1316,12 +1421,12 @@ } .tl-event-card:hover { - background: rgba(255, 255, 255, 0.08); + background: var(--kcg-hover-strong); border-color: var(--card-color); } .tl-event-card.active { - background: rgba(255, 255, 255, 0.06); + background: var(--kcg-hover); border-color: var(--card-color); } @@ -1346,7 +1451,7 @@ .tl-card-time { font-size: 9px; font-weight: 700; - color: #777; + color: var(--kcg-dim); font-family: 'Courier New', monospace; flex-shrink: 0; } @@ -1354,7 +1459,7 @@ .tl-card-source { font-size: 7px; font-weight: 700; - color: #fff; + color: var(--kcg-text); padding: 0 4px; border-radius: 2px; flex-shrink: 0; @@ -1364,7 +1469,7 @@ .tl-card-name { font-size: 9px; font-weight: 600; - color: #ccc; + color: var(--kcg-text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -1373,12 +1478,12 @@ .tl-card-type { font-size: 8px; - color: #555; + color: var(--kcg-border-heavy); flex-shrink: 0; } .tl-card-goto { - color: #555; + color: var(--kcg-border-heavy); flex-shrink: 0; transition: color 0.1s; } @@ -1403,8 +1508,8 @@ .ship-tooltip, .oil-tooltip, .airport-tooltip { - background: rgba(10, 10, 26, 0.85) !important; - border: 1px solid #333 !important; + background: var(--kcg-glass) !important; + border: 1px solid var(--kcg-border) !important; border-radius: 3px !important; padding: 2px 6px !important; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5) !important; @@ -1416,7 +1521,7 @@ .ship-tooltip::before, .oil-tooltip::before, .airport-tooltip::before { - border-right-color: rgba(10, 10, 26, 0.85) !important; + border-right-color: var(--kcg-glass) !important; } /* Aircraft, Satellite, Ship, Impact & Facility icon containers */ @@ -1478,7 +1583,7 @@ /* Impact site tooltip */ .impact-tooltip { background: rgba(40, 0, 0, 0.9) !important; - border: 1px solid #ff0000 !important; + border: 1px solid var(--kcg-event-impact) !important; border-radius: 3px !important; padding: 2px 6px !important; box-shadow: 0 2px 12px rgba(255, 0, 0, 0.4) !important; @@ -1492,9 +1597,9 @@ /* MapLibre GL popup override */ .gl-popup .maplibregl-popup-content, .event-popup .maplibregl-popup-content { - background: rgba(10, 10, 26, 0.96) !important; - color: #e0e0e0 !important; - border: 1px solid #444 !important; + background: var(--kcg-glass-dense) !important; + color: var(--kcg-text) !important; + border: 1px solid var(--kcg-border-light) !important; border-radius: 6px !important; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.8) !important; padding: 10px !important; @@ -1502,12 +1607,12 @@ .gl-popup .maplibregl-popup-tip, .event-popup .maplibregl-popup-tip { - border-top-color: rgba(10, 10, 26, 0.96) !important; + border-top-color: var(--kcg-glass-dense) !important; } .gl-popup .maplibregl-popup-close-button, .event-popup .maplibregl-popup-close-button { - color: #aaa !important; + color: var(--kcg-muted) !important; font-size: 18px; right: 4px; top: 2px; @@ -1515,17 +1620,17 @@ /* Override default white popup background globally */ .maplibregl-popup-content { - background: rgba(10, 10, 26, 0.96) !important; - color: #e0e0e0 !important; - border: 1px solid #444 !important; + background: var(--kcg-glass-dense) !important; + color: var(--kcg-text) !important; + border: 1px solid var(--kcg-border-light) !important; border-radius: 6px !important; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.8) !important; } .maplibregl-popup-tip { - border-top-color: rgba(10, 10, 26, 0.96) !important; + border-top-color: var(--kcg-glass-dense) !important; } .maplibregl-popup-close-button { - color: #aaa !important; + color: var(--kcg-muted) !important; } /* GL marker labels (replaces Leaflet tooltips) */ @@ -1541,8 +1646,8 @@ font-size: 11px; font-family: 'Courier New', monospace; text-shadow: 0 0 3px rgba(0,0,0,0.9), 0 0 6px rgba(0,0,0,0.6); - background: rgba(10, 10, 26, 0.85); - border: 1px solid #333; + background: var(--kcg-glass); + border: 1px solid var(--kcg-border); border-radius: 3px; padding: 1px 5px; } @@ -1554,20 +1659,20 @@ margin-left: 8px; white-space: nowrap; pointer-events: none; - color: #ff0000; + color: var(--kcg-event-impact); font-weight: 700; font-size: 10px; font-family: 'Courier New', monospace; text-shadow: 0 0 4px rgba(0,0,0,0.9), 0 0 8px rgba(0,0,0,0.7); background: rgba(40, 0, 0, 0.85); - border: 1px solid #ff0000; + border: 1px solid var(--kcg-event-impact); border-radius: 3px; padding: 1px 5px; } .gl-new-badge { - background: #ff0000; - color: #fff; + background: var(--kcg-event-impact); + color: var(--kcg-text); padding: 0 3px; border-radius: 2px; font-size: 8px; @@ -1594,20 +1699,20 @@ /* Leaflet popup override (kept for globe mode fallback) */ .leaflet-popup-content-wrapper { - background: rgba(10, 10, 26, 0.95) !important; + background: var(--kcg-glass-dense) !important; color: var(--text-primary) !important; - border: 1px solid #333 !important; + border: 1px solid var(--kcg-border) !important; border-radius: 6px !important; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.6) !important; } .leaflet-popup-tip { - background: rgba(10, 10, 26, 0.95) !important; - border: 1px solid #333 !important; + background: var(--kcg-glass-dense) !important; + border: 1px solid var(--kcg-border) !important; } .leaflet-popup-close-button { - color: #888 !important; + color: var(--kcg-muted) !important; } /* ======================== */ @@ -1616,8 +1721,8 @@ .mode-toggle { display: flex; gap: 4px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid #333; + background: var(--kcg-subtle); + border: 1px solid var(--kcg-border); border-radius: 6px; padding: 3px; } @@ -1633,7 +1738,7 @@ border-radius: 4px; border: 1px solid transparent; background: transparent; - color: #666; + color: var(--kcg-dim); cursor: pointer; transition: all 0.15s; font-family: 'Courier New', monospace; @@ -1641,7 +1746,7 @@ .mode-btn:hover { color: var(--text-primary); - background: rgba(255, 255, 255, 0.05); + background: var(--kcg-hover); } .mode-btn.active { @@ -1651,8 +1756,8 @@ } .mode-btn.active.live { - color: #ef4444; - border-color: #ef4444; + color: var(--kcg-danger); + border-color: var(--kcg-danger); background: rgba(239, 68, 68, 0.12); } @@ -1688,7 +1793,7 @@ width: 10px; height: 10px; border-radius: 50%; - background: #ef4444; + background: var(--kcg-danger); animation: pulse 1s infinite; box-shadow: 0 0 8px rgba(239, 68, 68, 0.6); } @@ -1697,7 +1802,7 @@ font-size: 13px; font-weight: 700; letter-spacing: 2px; - color: #ef4444; + color: var(--kcg-danger); font-family: 'Courier New', monospace; } @@ -1708,8 +1813,8 @@ font-family: 'Courier New', monospace; letter-spacing: 1px; padding: 4px 12px; - background: rgba(255, 255, 255, 0.05); - border: 1px solid #333; + background: var(--kcg-hover); + border: 1px solid var(--kcg-border); border-radius: 4px; } @@ -1737,7 +1842,7 @@ font-size: 10px; font-weight: 700; border-radius: 3px; - border: 1px solid #333; + border: 1px solid var(--kcg-border); background: transparent; color: var(--text-secondary); cursor: pointer; @@ -1746,14 +1851,14 @@ } .history-btn:hover { - border-color: #555; + border-color: var(--kcg-border-heavy); color: var(--text-primary); } .history-btn.active { - border-color: #ef4444; + border-color: var(--kcg-danger); background: rgba(239, 68, 68, 0.15); - color: #ef4444; + color: var(--kcg-danger); } /* Live mode accent on header border */ @@ -1781,12 +1886,12 @@ } ::-webkit-scrollbar-thumb { - background: #333; + background: var(--kcg-border); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { - background: #555; + background: var(--kcg-border-heavy); } /* ═══ News Ticker (OSINT) ═══ */ @@ -1803,7 +1908,7 @@ flex-shrink: 0; font-size: 10px; font-weight: 700; - color: #06b6d4; + color: var(--kcg-info); background: rgba(6, 182, 212, 0.15); padding: 2px 6px; border-radius: 3px; @@ -1846,7 +1951,7 @@ align-items: center; gap: 6px; font-size: 11px; - color: #ccc; + color: var(--kcg-text-secondary); text-decoration: none; cursor: pointer; padding: 1px 0; @@ -1854,7 +1959,7 @@ } .news-ticker-item:hover { - color: #fff; + color: var(--kcg-text); } .news-ticker-cat { @@ -1874,12 +1979,12 @@ .news-ticker-time { font-size: 9px; - color: #666; + color: var(--kcg-dim); flex-shrink: 0; } .news-ticker-item + .news-ticker-item::before { content: '·'; - color: #444; + color: var(--kcg-border-light); margin-right: 6px; } diff --git a/src/App.tsx b/frontend/src/App.tsx similarity index 80% rename from src/App.tsx rename to frontend/src/App.tsx index 5f0cf13..7249338 100644 --- a/src/App.tsx +++ b/frontend/src/App.tsx @@ -23,6 +23,10 @@ import { KOREA_SUBMARINE_CABLES } from './services/submarineCable'; import type { OsintItem } from './services/osint'; import { propagateAircraft, propagateShips } from './services/propagation'; import type { GeoEvent, SensorLog, Aircraft, Ship, Satellite, SatellitePosition, LayerVisibility, AppMode } from './types'; +import { useTheme } from './hooks/useTheme'; +import { useAuth } from './hooks/useAuth'; +import { useTranslation } from 'react-i18next'; +import LoginPage from './components/auth/LoginPage'; import './App.css'; // MarineTraffic-style ship classification @@ -74,6 +78,32 @@ function getMarineTrafficCategory(typecode?: string, category?: string): string } function App() { + const { user, isLoading: authLoading, isAuthenticated, login, devLogin, logout } = useAuth(); + + if (authLoading) { + return ( +
+ Loading... +
+ ); + } + + if (!isAuthenticated) { + return ; + } + + return ; +} + +interface AuthenticatedAppProps { + user: { email: string; name: string; picture?: string } | null; + onLogout: () => Promise; +} + +function AuthenticatedApp(_props: AuthenticatedAppProps) { const [appMode, setAppMode] = useState('live'); const [events, setEvents] = useState([]); const [sensorData, setSensorData] = useState([]); @@ -100,6 +130,47 @@ function App() { militaryOnly: false, }); + // Korea tab layer visibility (lifted from KoreaMap) + const [koreaLayers, setKoreaLayers] = useState>({ + ships: true, + aircraft: true, + satellites: true, + infra: true, + cables: true, + cctv: true, + airports: true, + coastGuard: true, + navWarning: true, + osint: true, + eez: true, + piracy: true, + militaryOnly: false, + }); + + const toggleKoreaLayer = useCallback((key: string) => { + setKoreaLayers(prev => ({ ...prev, [key]: !prev[key] })); + }, []); + + // Category filter state (shared across tabs) + const [hiddenAcCategories, setHiddenAcCategories] = useState>(new Set()); + const [hiddenShipCategories, setHiddenShipCategories] = useState>(new Set()); + + const toggleAcCategory = useCallback((cat: string) => { + setHiddenAcCategories(prev => { + const next = new Set(prev); + if (next.has(cat)) { next.delete(cat); } else { next.add(cat); } + return next; + }); + }, []); + + const toggleShipCategory = useCallback((cat: string) => { + setHiddenShipCategories(prev => { + const next = new Set(prev); + if (next.has(cat)) { next.delete(cat); } else { next.add(cat); } + return next; + }); + }, []); + const [flyToTarget, setFlyToTarget] = useState(null); // 1시간마다 전체 데이터 강제 리프레시 (호르무즈 해협 실시간 정보 업데이트) @@ -125,6 +196,11 @@ function App() { const replay = useReplay(); const monitor = useMonitor(); + const { theme, toggleTheme } = useTheme(); + const { t, i18n } = useTranslation(); + const toggleLang = useCallback(() => { + i18n.changeLanguage(i18n.language === 'ko' ? 'en' : 'ko'); + }, [i18n]); const isLive = appMode === 'live'; @@ -211,7 +287,7 @@ function App() { return () => clearInterval(interval); }, [appMode, refreshKey]); - // Fetch Korea region ship data (separate pipeline) + // Fetch Korea region ship data (signal-batch, 4-min cycle) useEffect(() => { const load = async () => { try { @@ -220,7 +296,7 @@ function App() { } catch { /* keep previous */ } }; load(); - const interval = setInterval(load, 15_000); + const interval = setInterval(load, 240_000); return () => clearInterval(interval); }, [appMode, refreshKey]); @@ -376,6 +452,24 @@ function App() { [baseShipsKorea, currentTime, isLive], ); + // Category-filtered data for map rendering + const visibleAircraft = useMemo( + () => aircraft.filter(a => !hiddenAcCategories.has(a.category)), + [aircraft, hiddenAcCategories], + ); + const visibleShips = useMemo( + () => ships.filter(s => !hiddenShipCategories.has(getMarineTrafficCategory(s.typecode, s.category))), + [ships, hiddenShipCategories], + ); + const visibleAircraftKorea = useMemo( + () => aircraftKorea.filter(a => !hiddenAcCategories.has(a.category)), + [aircraftKorea, hiddenAcCategories], + ); + const visibleKoreaShips = useMemo( + () => koreaShips.filter(s => !hiddenShipCategories.has(getMarineTrafficCategory(s.typecode, s.category))), + [koreaShips, hiddenShipCategories], + ); + const toggleLayer = useCallback((key: keyof LayerVisibility) => { setLayers(prev => ({ ...prev, [key]: !prev[key] })); }, []); @@ -398,12 +492,17 @@ function App() { () => aircraft.filter(a => a.category !== 'civilian' && a.category !== 'unknown').length, [aircraft], ); + const koreaMilitaryCount = useMemo( + () => aircraftKorea.filter(a => a.category !== 'civilian' && a.category !== 'unknown').length, + [aircraftKorea], + ); - // Ship stats + // Ship stats — MT classification (matches map icon colors) const shipsByCategory = useMemo(() => { const counts: Record = {}; for (const s of ships) { - counts[s.category] = (counts[s.category] || 0) + 1; + const mtCat = getMarineTrafficCategory(s.typecode, s.category); + counts[mtCat] = (counts[mtCat] || 0) + 1; } return counts; }, [ships]); @@ -424,12 +523,21 @@ function App() { const koreaChineseShips = useMemo(() => koreaShips.filter(s => s.flag === 'CN'), [koreaShips]); const koreaShipsByCategory = useMemo(() => { const counts: Record = {}; - for (const s of koreaKoreanShips) { + for (const s of koreaShips) { const mtCat = getMarineTrafficCategory(s.typecode, s.category); counts[mtCat] = (counts[mtCat] || 0) + 1; } return counts; - }, [koreaKoreanShips]); + }, [koreaShips]); + + // Korea aircraft stats + const koreaAircraftByCategory = useMemo(() => { + const counts: Record = {}; + for (const ac of aircraftKorea) { + counts[ac.category] = (counts[ac.category] || 0) + 1; + } + return counts; + }, [aircraftKorea]); // Korea filtered ships by monitoring mode (independent toggles, additive highlight) const anyFilterOn = koreaFilters.illegalFishing || koreaFilters.illegalTransship || koreaFilters.darkVessel || koreaFilters.cableWatch || koreaFilters.dokdoWatch || koreaFilters.ferryWatch; @@ -701,8 +809,8 @@ function App() { }, [koreaShips, koreaFilters.dokdoWatch, currentTime]); const koreaFilteredShips = useMemo(() => { - if (!anyFilterOn) return koreaShips; - return koreaShips.filter(s => { + if (!anyFilterOn) return visibleKoreaShips; + return visibleKoreaShips.filter(s => { const mtCat = getMarineTrafficCategory(s.typecode, s.category); if (koreaFilters.illegalFishing && mtCat === 'fishing' && s.flag !== 'KR') return true; if (koreaFilters.illegalTransship && transshipSuspects.has(s.mmsi)) return true; @@ -712,7 +820,7 @@ function App() { if (koreaFilters.ferryWatch && getMarineTrafficCategory(s.typecode, s.category) === 'passenger') return true; return false; }); - }, [koreaShips, koreaFilters, anyFilterOn, transshipSuspects, darkVesselSet, cableWatchSet, dokdoWatchSet]); + }, [visibleKoreaShips, koreaFilters, anyFilterOn, transshipSuspects, darkVesselSet, cableWatchSet, dokdoWatchSet]); return (
@@ -724,28 +832,22 @@ function App() { onClick={() => setDashboardTab('iran')} > 🇮🇷 - 이란 상황 + {t('tabs.iran')}
{/* Mode Toggle */} {dashboardTab === 'iran' && (
-
- ⚔️ +
+ ⚔️ D+{Math.floor((currentTime - new Date('2026-03-01T00:00:00Z').getTime()) / (1000 * 60 * 60 * 24))}
)} @@ -770,50 +872,50 @@ function App() {
)} @@ -825,35 +927,43 @@ function App() { onClick={() => setMapMode('flat')} > - FLAT MAP + {t('mapMode.flat')} )}
- {aircraft.length} AC - {militaryCount} MIL - {ships.length} SHIP - {satPositions.length} SAT + {dashboardTab === 'iran' ? aircraft.length : aircraftKorea.length} AC + {dashboardTab === 'iran' ? militaryCount : koreaMilitaryCount} MIL + {dashboardTab === 'iran' ? ships.length : koreaShips.length} SHIP + {dashboardTab === 'iran' ? satPositions.length : satPositionsKorea.length} SAT +
+
+ +
- {isLive ? 'LIVE' : replay.state.isPlaying ? 'REPLAYING' : 'PAUSED'} + {isLive ? t('header.live') : replay.state.isPlaying ? t('header.replaying') : t('header.paused')}
@@ -870,9 +980,9 @@ function App() { key="map-iran" events={isLive ? [] : mergedEvents} currentTime={currentTime} - aircraft={aircraft} + aircraft={visibleAircraft} satellites={satPositions} - ships={ships} + ships={visibleShips} layers={layers} flyToTarget={flyToTarget} onFlyToDone={() => setFlyToTarget(null)} @@ -881,32 +991,41 @@ function App() { ) : ( )}
} + onToggle={toggleLayer as (key: string) => void} aircraftByCategory={aircraftByCategory} - shipsByCategory={shipsByCategory} + aircraftTotal={aircraft.length} + shipsByMtCategory={shipsByCategory} + shipTotal={ships.length} + satelliteCount={satPositions.length} + extraLayers={[ + { key: 'events', label: t('layers.events'), color: '#a855f7' }, + { key: 'koreanShips', label: `\u{1F1F0}\u{1F1F7} ${t('layers.koreanShips')}`, color: '#00e5ff', count: koreanShips.length }, + { key: 'airports', label: t('layers.airports'), color: '#f59e0b' }, + { key: 'oilFacilities', label: t('layers.oilFacilities'), color: '#d97706' }, + { key: 'sensorCharts', label: t('layers.sensorCharts'), color: '#22c55e' }, + ]} + hiddenAcCategories={hiddenAcCategories} + hiddenShipCategories={hiddenShipCategories} + onAcCategoryToggle={toggleAcCategory} + onShipCategoryToggle={toggleShipCategory} />
@@ -983,7 +1102,45 @@ function App() { <>
- + +
+ +