From 289e2af4ec1c574129abf2b6a6c54b07b641afa7 Mon Sep 17 00:00:00 2001 From: TriHuynh Date: Sun, 7 Dec 2025 19:36:19 +0700 Subject: [PATCH 1/3] fix(frontend): fix frontend docker, device management wizard, and backend dependencies --- docker-compose.yaml | 11 -- src/backend/MIGRATION_SUMMARY.md | 138 ------------------ src/backend/requirements.txt | 6 - src/frontend/Dockerfile | 1 + src/frontend/nginx.conf | 5 - .../feature/devices/DeviceWizard.tsx | 3 +- src/frontend/tsconfig.app.json | 5 - src/frontend/tsconfig.json | 5 - src/frontend/tsconfig.node.json | 5 - 9 files changed, 2 insertions(+), 177 deletions(-) delete mode 100644 src/backend/MIGRATION_SUMMARY.md diff --git a/docker-compose.yaml b/docker-compose.yaml index c53e540..d6136d3 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -111,17 +111,6 @@ services: timeout: 10s retries: 5 - # Documentation Site - docs: - build: ./docs - container_name: docs - hostname: docs - networks: - - fiware_default - ports: - - "3000:80" - restart: unless-stopped - # SUMO Simulation with GUI (choose scenario via environment variable) sumo-simulation: build: diff --git a/src/backend/MIGRATION_SUMMARY.md b/src/backend/MIGRATION_SUMMARY.md deleted file mode 100644 index 68c075f..0000000 --- a/src/backend/MIGRATION_SUMMARY.md +++ /dev/null @@ -1,138 +0,0 @@ - - -# Backend Structure Summary - -## βœ… SUMO RL Integration Complete - -### πŸ“ Final Structure - -``` -src/backend/ -β”œβ”€β”€ app/ -β”‚ β”œβ”€β”€ api/ -β”‚ β”‚ └── routers/ -β”‚ β”‚ └── traffic_light_router.py # FastAPI endpoints -β”‚ β”œβ”€β”€ sumo_rl/ # ⭐ NEW MODULE -β”‚ β”‚ β”œβ”€β”€ agents/ -β”‚ β”‚ β”‚ β”œβ”€β”€ ai_agent.py # AI decision-making -β”‚ β”‚ β”‚ └── iot_agent.py # SUMO control -β”‚ β”‚ β”œβ”€β”€ models/ -β”‚ β”‚ β”‚ β”œβ”€β”€ dqn_model.py # DQN architecture -β”‚ β”‚ β”‚ └── dqn_model.keras # Trained model (334KB) -β”‚ β”‚ β”œβ”€β”€ training/ -β”‚ β”‚ β”‚ └── train_dqn_production.py # Training script -β”‚ β”‚ β”œβ”€β”€ evaluation/ -β”‚ β”‚ β”‚ β”œβ”€β”€ evaluate_dqn.py # Evaluation -β”‚ β”‚ β”‚ └── baseline.py # Baseline comparison -β”‚ β”‚ β”œβ”€β”€ environment/ # SUMO wrappers -β”‚ β”‚ β”œβ”€β”€ sumo_files/ # SUMO scenarios (3 cities) -β”‚ β”‚ β”œβ”€β”€ config.py # Configuration -β”‚ β”‚ └── README.md # Documentation -β”‚ └── main.py # βœ… Updated with SUMO RL router -β”œβ”€β”€ docs/ -β”‚ └── sumo_rl/ # Documentation -β”‚ β”œβ”€β”€ DEMO_GUIDE.md -β”‚ β”œβ”€β”€ FINAL_VERDICT.md -β”‚ β”œβ”€β”€ RESULTS_SUMMARY.md -β”‚ └── evaluation_results_*.png -β”œβ”€β”€ requirements.txt # βœ… Updated with TensorFlow, numpy -└── .env.example # βœ… Updated with SUMO RL config -``` - -### πŸ“Š Statistics - -- **Total Files:** 83 -- **Module Size:** 3.6 MB -- **Python Files:** 10 -- **SUMO Scenarios:** 3 (Nga4ThuDuc, NguyenThaiSon, QuangTrung) -- **Model Size:** 334 KB (25,538 parameters) - -### πŸ—‘οΈ Removed - -- ❌ `SUMO_RL/` folder (root level) β†’ Integrated into backend -- ❌ `SUMO_RL_INTEGRATION.md` β†’ Replaced by `app/sumo_rl/README.md` -- ❌ `app/services/sumo_rl_service.py` β†’ Replaced by agents pattern -- ❌ `__pycache__/` directories β†’ Cleaned -- ❌ Duplicate READMEs in scenario folders - -### βœ… What Was Migrated - -**From SUMO_RL β†’ app/sumo_rl:** - -1. **Core Components:** - - `ai_greenwave_agent.py` β†’ `agents/ai_agent.py` (Flask β†’ FastAPI) - - `iot_agent.py` β†’ `agents/iot_agent.py` - - DQN model β†’ `models/dqn_model.py` + `dqn_model.keras` - -2. **Training & Evaluation:** - - `train_dqn_production.py` β†’ `training/` - - `evaluate_dqn.py` β†’ `evaluation/` - - `baseline.py` β†’ `evaluation/` - -3. **SUMO Files:** - - `sumo_files/` β†’ Complete copy with 3 scenarios - -4. **Documentation:** - - `DEMO_GUIDE.md` β†’ `docs/sumo_rl/` - - `FINAL_VERDICT.md` β†’ `docs/sumo_rl/` - - `RESULTS_SUMMARY.md` β†’ `docs/sumo_rl/` - - `evaluation_results_*.png` β†’ `docs/sumo_rl/` - -### πŸ”§ API Endpoints (Now Available) - -``` -GET /sumo-rl/status # System status -GET /sumo-rl/model-info # Model information -POST /sumo-rl/ai/notify # AI agent notifications -POST /sumo-rl/iot/notify # IoT agent notifications -GET /sumo-rl/proxy/orion/* # Proxy to Orion-LD -``` - -### πŸš€ Ready to Use - -1. **Backend Server:** - ```bash - cd src/backend - uvicorn app.main:app --reload --port 8000 - ``` - -2. **Training (Optional):** - ```bash - cd src/backend - python3 -m app.sumo_rl.training.train_dqn_production - ``` - -3. **Evaluation:** - ```bash - cd src/backend - python3 -m app.sumo_rl.evaluation.evaluate_dqn - ``` - -### πŸ“ Configuration - -Environment variables in `.env`: -```bash -SUMO_RL_ORION_URL=http://localhost:1026/ngsi-ld/v1 -SUMO_RL_TLS_ID=4066470692 -SUMO_RL_NUM_PHASES=2 -SUMO_RL_MODEL_PATH=app/sumo_rl/models/dqn_model.keras -``` - -### 🎯 Performance - -- **DQN Score:** 1383.03 -- **Baseline Score:** 1590.90 -- **Improvement:** 13% better -- **PM2.5 Reduction:** 53% -- **CO2 Reduction:** 48% - ---- - -**Status:** βœ… Production Ready -**Architecture:** Modular, Open Source Ready -**Integration:** Complete (FastAPI + FIWARE + SUMO) diff --git a/src/backend/requirements.txt b/src/backend/requirements.txt index 9d9f155..f28d4a8 100644 --- a/src/backend/requirements.txt +++ b/src/backend/requirements.txt @@ -1,9 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - - fastapi==0.104.1 uvicorn[standard]==0.24.0 httpx==0.25.1 diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 97f6b1e..7a607ca 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -26,6 +26,7 @@ ENV VITE_WS_URL=$VITE_WS_URL ENV VITE_ORION_URL=$VITE_ORION_URL # Build application +RUN npm install RUN npm run build # Production stage diff --git a/src/frontend/nginx.conf b/src/frontend/nginx.conf index 067bc2e..6129a74 100644 --- a/src/frontend/nginx.conf +++ b/src/frontend/nginx.conf @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - server { listen 80; server_name localhost; diff --git a/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx b/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx index 46abf37..2bfab99 100644 --- a/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx +++ b/src/frontend/src/presentation/components/feature/devices/DeviceWizard.tsx @@ -522,7 +522,7 @@ export const DeviceWizard: React.FC = ({ setDeviceData({ ...deviceData, @@ -549,7 +549,6 @@ export const DeviceWizard: React.FC = ({ setDeviceData({ ...deviceData, httpConfig: { - ipAddress: "", // Default ipAddress if missing ...deviceData.httpConfig, rtspUrl: e.target.value, ipAddress: deviceData.httpConfig?.ipAddress || "", diff --git a/src/frontend/tsconfig.app.json b/src/frontend/tsconfig.app.json index 3bb6b3e..2f416e5 100644 --- a/src/frontend/tsconfig.app.json +++ b/src/frontend/tsconfig.app.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index 5c1560d..1ffef60 100644 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "files": [], "references": [ diff --git a/src/frontend/tsconfig.node.json b/src/frontend/tsconfig.node.json index b34645b..3439137 100644 --- a/src/frontend/tsconfig.node.json +++ b/src/frontend/tsconfig.node.json @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - { "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", From 1e9601608306df416cfd4e0ec08c7fa9ccde3796 Mon Sep 17 00:00:00 2001 From: TriHuynh Date: Sun, 7 Dec 2025 19:42:52 +0700 Subject: [PATCH 2/3] chores: delete copyright unnecessary --- src/backend/pyproject.toml | 5 ----- src/backend/requirements-dev.txt | 5 ----- 2 files changed, 10 deletions(-) diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index fc5af56..5e49a5d 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - [tool.black] line-length = 88 target-version = ['py39'] diff --git a/src/backend/requirements-dev.txt b/src/backend/requirements-dev.txt index f70c94f..40cb797 100644 --- a/src/backend/requirements-dev.txt +++ b/src/backend/requirements-dev.txt @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - fastapi==0.104.1 uvicorn[standard]==0.24.0 httpx==0.25.1 From 206d5c92af8e37f15a2f00e568cf81bfff72c1fd Mon Sep 17 00:00:00 2001 From: TriHuynh Date: Sun, 7 Dec 2025 20:36:05 +0700 Subject: [PATCH 3/3] feat: Add SUMO simulation configurations for multiple intersections and initial frontend components with Docker setup. --- .../api/routers/sumo_control_router.py.backup | 5 - .../sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml | 7 -- .../sumo_files/Nga4ThuDuc/Nga4ThuDuc.net.xml | 7 -- .../sumo_files/Nga4ThuDuc/Nga4ThuDuc.sumocfg | 7 -- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_0.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_1.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_2.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_3.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_4.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1_5.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1i_0.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1i_1.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1i_2.xml | 88 +-------------- .../sumo_rl/sumo_files/Nga4ThuDuc/e1i_3.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e1i_4.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e2_0.xml | 9 +- .../sumo_rl/sumo_files/Nga4ThuDuc/e2_2.xml | 9 +- .../app/sumo_rl/sumo_files/Nga4ThuDuc/eed.xml | 7 -- .../sumo_rl/sumo_files/Nga4ThuDuc/probes.xml | 7 -- .../sumo_files/Nga4ThuDuc/routes.rou.xml | 7 -- .../sumo_files/Nga4ThuDuc/trips.trips.xml | 7 -- .../NguyenThaiSon/Nga6NguyenThaiSon.add.xml | 7 -- .../NguyenThaiSon/Nga6NguyenThaiSon.net.xml | 7 -- .../NguyenThaiSon/Nga6NguyenThaiSon.sumocfg | 7 -- .../sumo_rl/sumo_files/NguyenThaiSon/e1_0.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_1.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_2.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_3.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_4.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_5.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_6.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e1_7.xml | 9 +- .../sumo_files/NguyenThaiSon/e1i_0.xml | 11 +- .../sumo_files/NguyenThaiSon/e1i_1.xml | 9 +- .../sumo_files/NguyenThaiSon/e1i_2.xml | 9 +- .../sumo_files/NguyenThaiSon/e1i_3.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e2_0.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e2_1.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e2_2.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/e2_4.xml | 9 +- .../sumo_rl/sumo_files/NguyenThaiSon/eed.xml | 7 -- .../sumo_files/NguyenThaiSon/probes.xml | 7 -- .../sumo_files/NguyenThaiSon/routes.rou.xml | 7 -- .../sumo_files/NguyenThaiSon/trips.trips.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e1_0.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e1_1.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e1_2.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e1i_0.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e2_0.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/e2_2.xml | 7 -- .../app/sumo_rl/sumo_files/QuangTrung/eed.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/probes.xml | 7 -- .../sumo_files/QuangTrung/quangtrung.net.xml | 7 -- .../QuangTrung/quangtrungcar.add.xml | 7 -- .../QuangTrung/quangtrungcar.sumocfg | 7 -- .../sumo_files/QuangTrung/routes.rou.xml | 7 -- .../sumo_rl/sumo_files/QuangTrung/trips.xml | 7 -- src/backend/app/sumo_rl/sumo_files/RL.add.xml | 7 -- src/frontend/.dockerignore | 6 ++ src/frontend/Dockerfile | 1 - src/frontend/nginx.conf | 1 + .../feature/landing/HeroSection.tsx | 101 +++++++++--------- .../feature/landing/TeamSection.tsx | 46 ++++---- .../src/presentation/i18n/locales/en.json | 6 +- .../src/presentation/i18n/locales/vi.json | 6 +- 65 files changed, 115 insertions(+), 595 deletions(-) create mode 100644 src/frontend/.dockerignore diff --git a/src/backend/app/api/routers/sumo_control_router.py.backup b/src/backend/app/api/routers/sumo_control_router.py.backup index a97e20d..9352eb8 100644 --- a/src/backend/app/api/routers/sumo_control_router.py.backup +++ b/src/backend/app/api/routers/sumo_control_router.py.backup @@ -1,8 +1,3 @@ -// Copyright (c) 2025 Green Wave Team -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - """ SUMO Control Router API endpoints để control SUMO simulation vΓ  lαΊ₯y real-time data diff --git a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml index ca8099c..7f161ea 100644 --- a/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml +++ b/src/backend/app/sumo_rl/sumo_files/Nga4ThuDuc/Nga4ThuDuc.add.xml @@ -1,10 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml index ae809a7..e6463a7 100644 --- a/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml +++ b/src/backend/app/sumo_rl/sumo_files/NguyenThaiSon/e1i_1.xml @@ -1,13 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/frontend/.dockerignore b/src/frontend/.dockerignore new file mode 100644 index 0000000..117d285 --- /dev/null +++ b/src/frontend/.dockerignore @@ -0,0 +1,6 @@ +node_modules +dist +.git +.env +.DS_Store +coverage diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile index 7a607ca..97f6b1e 100644 --- a/src/frontend/Dockerfile +++ b/src/frontend/Dockerfile @@ -26,7 +26,6 @@ ENV VITE_WS_URL=$VITE_WS_URL ENV VITE_ORION_URL=$VITE_ORION_URL # Build application -RUN npm install RUN npm run build # Production stage diff --git a/src/frontend/nginx.conf b/src/frontend/nginx.conf index 6129a74..19449bd 100644 --- a/src/frontend/nginx.conf +++ b/src/frontend/nginx.conf @@ -13,6 +13,7 @@ server { # SPA routing location / { try_files $uri $uri/ /index.html; + add_header Cache-Control "no-store, no-cache, must-revalidate"; } # Cache static assets diff --git a/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx b/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx index 0b67752..6ef382d 100644 --- a/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx +++ b/src/frontend/src/presentation/components/feature/landing/HeroSection.tsx @@ -1,33 +1,33 @@ // Copyright (c) 2025 Green Wave Team -// +// // This software is released under the MIT License. // https://opensource.org/licenses/MIT -import React, { useState, useEffect } from "react"; -import { ArrowRight, Github, BookOpen, Car, Zap } from "lucide-react"; -import { useTranslation } from "react-i18next"; -import ParticleBackground from "./ParticleBackground"; -import ThreeDVisualization from "./ThreeDVisualization"; -import LandingImage from "../../../../assets/landing.png"; +import React, { useState, useEffect } from 'react' +import { ArrowRight, Github, BookOpen, Car, Zap } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import ParticleBackground from './ParticleBackground' +import ThreeDVisualization from './ThreeDVisualization' +import LandingImage from '../../../../assets/landing.png' export const HeroSection: React.FC = () => { - const { t } = useTranslation("landing"); - const [scrollY, setScrollY] = useState(0); - const [isHovered, setIsHovered] = useState(false); + const { t } = useTranslation('landing') + const [scrollY, setScrollY] = useState(0) + const [isHovered, setIsHovered] = useState(false) useEffect(() => { - const handleScroll = () => setScrollY(window.scrollY); - window.addEventListener("scroll", handleScroll); - return () => window.removeEventListener("scroll", handleScroll); - }, []); + const handleScroll = () => setScrollY(window.scrollY) + window.addEventListener('scroll', handleScroll) + return () => window.removeEventListener('scroll', handleScroll) + }, []) const handleGetStarted = () => { - window.location.href = "/"; - }; + window.location.href = '/' + } const handleViewGithub = () => { - window.open("https://github.com/sonmessia/GreenWave.git", "_blank"); - }; + window.open('https://github.com/sonmessia/GreenWave.git', '_blank') + } return (
@@ -41,22 +41,21 @@ export const HeroSection: React.FC = () => { style={{ background: `linear-gradient(45deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)`, transform: `translateY(${scrollY * 0.5}px) scale(1.1)`, - filter: "blur(100px)", + filter: 'blur(100px)', }} />
@@ -67,10 +66,10 @@ export const HeroSection: React.FC = () => {
@@ -83,14 +82,14 @@ export const HeroSection: React.FC = () => { className="w-24 h-24 object-contain mr-2" />

- {t("title")} + {t('title')}

- {t("subtitle")} + {t('subtitle')}

- {t("description")} + {t('description')}

@@ -101,17 +100,17 @@ export const HeroSection: React.FC = () => { className="group relative px-6 py-3 sm:px-8 sm:py-4 rounded-full font-semibold text-base sm:text-lg transition-all duration-300 transform hover:scale-105 whitespace-nowrap" style={{ background: - "linear-gradient(135deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)", - boxShadow: "0 10px 30px -10px rgba(16, 124, 65, 0.5)", + 'linear-gradient(135deg, var(--color-greenwave-primary-light) 0%, var(--color-traffic-info) 100%)', + boxShadow: '0 10px 30px -10px rgba(16, 124, 65, 0.5)', }} > - {t("getStarted")} + {t('getStarted')}
@@ -119,26 +118,24 @@ export const HeroSection: React.FC = () => { onClick={handleViewGithub} className="px-6 py-3 sm:px-8 sm:py-4 rounded-full font-semibold text-base sm:text-lg border-2 transition-all duration-300 hover:bg-white hover:bg-opacity-10 flex items-center gap-2 whitespace-nowrap" style={{ - borderColor: "rgba(255, 255, 255, 0.2)", - color: "var(--color-text-main-dark)", + borderColor: 'rgba(255, 255, 255, 0.2)', + color: 'var(--color-text-main-dark)', }} > - {t("viewGithub")} + {t('viewGithub')}
@@ -149,7 +146,7 @@ export const HeroSection: React.FC = () => { {/* Pollution Smoke Effect */}
@@ -168,7 +165,7 @@ export const HeroSection: React.FC = () => { {/* GreenWave Team Car (The Hero) */}
@@ -183,7 +180,7 @@ export const HeroSection: React.FC = () => { {/* Background Traffic (Atmosphere) */}
@@ -191,7 +188,7 @@ export const HeroSection: React.FC = () => { {/* Green Wave Effect */}
{isHovered && ( @@ -200,7 +197,7 @@ export const HeroSection: React.FC = () => { className="absolute top-0 left-0 w-full h-full wave-sweep" style={{ background: - "linear-gradient(90deg, transparent 0%, rgba(16, 124, 65, 0.8) 45%, rgba(59, 130, 246, 0.6) 50%, rgba(16, 124, 65, 0.8) 55%, transparent 100%)", + 'linear-gradient(90deg, transparent 0%, rgba(16, 124, 65, 0.8) 45%, rgba(59, 130, 246, 0.6) 50%, rgba(16, 124, 65, 0.8) 55%, transparent 100%)', }} /> )} @@ -211,11 +208,9 @@ export const HeroSection: React.FC = () => { src={LandingImage} alt="GreenWave Traffic System" className={`w-full h-full object-cover rounded-2xl transition-all duration-1000 ${ - isHovered - ? "brightness-110 contrast-125 saturate-130 scale-102" - : "" + isHovered ? 'brightness-110 contrast-125 saturate-130 scale-102' : '' }`} - style={{ filter: "brightness(0.8) contrast(1.1)" }} + style={{ filter: 'brightness(0.8) contrast(1.1)' }} />
@@ -228,5 +223,5 @@ export const HeroSection: React.FC = () => {
- ); -}; + ) +} diff --git a/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx b/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx index e0ebc16..9767953 100644 --- a/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx +++ b/src/frontend/src/presentation/components/feature/landing/TeamSection.tsx @@ -1,40 +1,40 @@ // Copyright (c) 2025 Green Wave Team -// +// // This software is released under the MIT License. // https://opensource.org/licenses/MIT -import React from "react"; -import thaiAnhAI from "../../../../assets/team/thaianh.png"; -import sonCloud from "../../../../assets/team/son.jpg"; -import huynhMinhTri from "../../../../assets/team/tri.jpg"; -import { useTranslation } from "react-i18next"; +import React from 'react' +import thaiAnhAI from '../../../../assets/team/thaianh.png' +import sonCloud from '../../../../assets/team/son.jpg' +import huynhMinhTri from '../../../../assets/team/tri.jpg' +import { useTranslation } from 'react-i18next' export const TeamSection: React.FC = () => { - const { t } = useTranslation("landing"); + const { t } = useTranslation('landing') const teamMembers = [ { - name: "ThΓ‘i Anh 36", - role: t("team.roles.aiData"), + name: 'HoΓ ng ThΓ‘i Anh', + role: t('team.roles.aiData'), imageUrl: thaiAnhAI, }, { - name: "HoΓ ng SΖ‘n", - role: t("team.roles.backend"), + name: 'Nguyα»…n VΓ΅ HoΓ ng SΖ‘n', + role: t('team.roles.backend'), imageUrl: sonCloud, }, { - name: "Huα»³nh Minh TrΓ­", - role: t("team.roles.frontend"), + name: 'Huα»³nh Minh TrΓ­', + role: t('team.roles.frontend'), imageUrl: huynhMinhTri, }, - ]; + ] return (

- {t("team.title")} + {t('team.title')}

@@ -43,27 +43,25 @@ export const TeamSection: React.FC = () => { key={index} className="glass-card p-8 rounded-2xl text-center group" style={{ - background: "rgba(255, 255, 255, 0.03)", - backdropFilter: "blur(10px)", - border: "1px solid rgba(255, 255, 255, 0.1)", + background: 'rgba(255, 255, 255, 0.03)', + backdropFilter: 'blur(10px)', + border: '1px solid rgba(255, 255, 255, 0.1)', }} >
Avatar Member
-

- {member.name} -

+

{member.name}

{member.role}

))}
- ); -}; + ) +} diff --git a/src/frontend/src/presentation/i18n/locales/en.json b/src/frontend/src/presentation/i18n/locales/en.json index 3889a27..782dfdb 100644 --- a/src/frontend/src/presentation/i18n/locales/en.json +++ b/src/frontend/src/presentation/i18n/locales/en.json @@ -164,9 +164,9 @@ "team": { "title": "Development Team", "roles": { - "aiData": "AI & Data Engineer", - "backend": "Backend & Architect", - "frontend": "Frontend & Mascot" + "aiData": "AI Engineer", + "backend": "Backend", + "frontend": "Frontend" } }, "architecture": { diff --git a/src/frontend/src/presentation/i18n/locales/vi.json b/src/frontend/src/presentation/i18n/locales/vi.json index 13c527a..b619bbe 100644 --- a/src/frontend/src/presentation/i18n/locales/vi.json +++ b/src/frontend/src/presentation/i18n/locales/vi.json @@ -164,9 +164,9 @@ "team": { "title": "Đội ngΕ© PhΓ‘t triển", "roles": { - "aiData": "AI & Data Engineer", - "backend": "Backend & Architect", - "frontend": "Frontend & Mascot" + "aiData": "AI Engineer", + "backend": "Backend", + "frontend": "Frontend" } }, "architecture": {