Gwadaking
6bf6762dac
fix: ne pas injecter afai:null dans les propriétés GeoJSON
...
MapLibre considère null comme "propriété présente" → le filtre !has
ne prenait pas le relais → tous les polygones étaient masqués.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 16:36:57 -04:00
Gwadaking
3f1e49bb3b
fix: masquer les zones d'observation sans sargasses (afaiIndex = 0)
...
Passe afaiIndex en propriété GeoJSON et applique un filtre MapLibre
sur les layers observation : seules les features avec afai > 0 sont
affichées. Fallback : si la propriété est absente, affichage normal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 16:21:15 -04:00
Gwadaking
7169dffc67
feat: refonte visuelle cartoon — fond OpenFreeMap, marqueurs SVG, légende comic, SpotPanel clair
...
- Fond cartoon : OpenFreeMap bright transformé (îles #7ec850, océan #3ab5e6, bordure #4a7c2f)
- Overlay vagues SVG subtil sur toute la carte (opacity 6%)
- Marqueurs spots SVG expressifs : ★ (ok), ! (risque), ✕ (impact) — animation bounce sur impact
- Sargasses #f4a020 avec texture dots MapLibre + contour épais 3.5px
- Légende comic : fond #fffbf0, bordure 3px, ombre dure 4px 4px 0 #333 , Fredoka One
- SpotPanel blanc cassé avec ombre dure cartoon, gauge coloré pastel (vert/jaune/rouge)
- Topbar #1a1a2e avec boutons bleus ombre dure + hover translate(-2px,-2px)
- Timeline : step actif avec ombre dure cartoon
- Police Fredoka One chargée via Google Fonts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 15:25:17 -04:00
Gwadaking
1078a3459b
fix: supprimer le width 1126px du #root qui bridait la map en desktop
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 15:05:13 -04:00
Gwadaking
6fe6252a25
feat: refonte UX front — topbar, navigation île, marqueurs colorés, gauge score, fade layers
...
- Topbar glassmorphism : logo + boutons île (Guadeloupe/Martinique/Barbade/St-Martin/Dominique) + timeline intégrée
- flyTo() animé par île, vue initiale centrée sur Guadeloupe
- Marqueurs spots colorés par niveau d'impact (vert/jaune/rouge) chargés progressivement
- Score remplacé par un gauge : valeur en grand + barre de progression animée
- Légende flottante bas-gauche (observations / prévisions / niveaux)
- Transition fade 350ms sur les layers MapLibre au changement d'horizon temporel
- NavigationControl déplacé en bas à droite
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 00:06:40 -04:00
Gwadaking
e8e82c4b5a
feat: display current date in timeline slider
2026-04-01 23:31:34 -04:00
Gwadaking
bb6ca7b563
fix: use spot.latitude/longitude for feedback (geometry no longer serialized)
2026-04-01 22:58:19 -04:00
Gwadaking
1485339aec
fix: expose lat/lng from CoastalPoint, fix getCoords in map
2026-04-01 22:37:14 -04:00
Gwadaking
2cef3725e9
feat: Phase 3 complete — push alerts, feedback scoring, S3 fallback, SPA routing, mobile CSS
...
- ImpactScoreService: implement getFeedbackBonus() (ST_Distance query on UserFeedback within 20km/6h)
- ImpactScoreService: trigger PushNotificationService when score >= 70
- PushNotificationService: send VAPID WebPush to spot subscribers, clean expired subs
- PushController: GET vapid-public-key, POST/DELETE subscribe with rate limiting
- SentinelHubClient: add optional $collection param, add Sentinel-3 OLCI FAI evalscript (MCI)
- IngestionService: add $collection param + HighCloudCoverageException for fallback logic
- IngestionService: add ingestWithFallback() — tries S2, falls back to S3 on high cloud
- IngestSentinelCommand: --source=auto (default) triggers ingestWithFallback
- FeedbackController: rate limiting via apiFeedbackLimiter
- Migration: push_subscription table
- rate_limiter.yaml: api_read(120/min), api_feedback(10/min), api_push(5/min)
- sw.js: service worker handling push events + notificationclick
- usePushSubscription hook: subscribe/unsubscribe lifecycle with VAPID
- SpotPanel: PushButton component integrated
- SpotPanel.css + TimelineSlider.css: mobile responsive (bottom-sheet on small screens)
- Caddyfile: SPA served at / with try_files fallback, sw.js served from root scope
- vite.config.js: build outDir → backend/public (not /spa)
- deploy/post-receive.sh: full deploy script (composer, npm build, migrations, cache, docker up)
- docs/roadmap.md: all Phase 3 + transversal items marked done
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-01 03:43:56 -04:00
Gwadaking
94bb6f5e8c
Phase 2 : dérive, ImpactScore, slider temporel
...
Backend :
- OpenMeteoClient : vent horaire 72h (gratuit, sans clé)
- DriftSimulationService : échantillonnage ST_GeneratePoints,
déplacement itératif Stokes 3%, reconstruction ST_ConcaveHull,
4 horizons H+6/12/24/48, confiance décroissante
- ImpactScoreService : score 4 composantes (distance/densité/
vitesse/tendance), cache Redis TTL 3h, invalidation à chaque calcul
- ComputeForecastsCommand : traite les observations sans forecast
- SpotScoreController : score courant + horizons depuis forecasts
Frontend :
- TimelineSlider : navigation Now/+6h/+12h/+24h/+48h
- SargassesMap : couche observations (orange) vs forecasts (violet)
rechargée à chaque changement d'étape
- SpotPanel : affichage score par horizon actif + indicateur confiance
- Build → backend/public/spa/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-01 03:23:21 -04:00
Gwadaking
0c1deb93cb
Phase 1 : seed CoastalPoints + frontend React complet
...
Backend :
- SeedCoastalPointsCommand : 29 points Antilles (idempotent)
Martinique, Guadeloupe, Sainte-Lucie, Barbade, Saint-Martin
Frontend :
- api/client.js : wrapper fetch pour spots, observations, feedback
- SargassesMap : MapLibre GL JS, marqueurs spots, couche observations
GeoJSON avec rechargement bbox dynamique à chaque mouvement carte
- SpotPanel : Spot Mode (score/niveau/distance/trend), bouton feedback
terrain anonyme, gestion état loading/error/null
- App.jsx : composition map + panel, état selectedSpot
- vite.config.js : proxy /api → Symfony dev, build → backend/public/spa
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-01 03:17:43 -04:00
Gwadaking
f685c96ed6
Phase 0 : scaffolding complet
...
- Structure monorepo (backend Symfony, frontend React/Vite)
- Docker : FrankenPHP + PostgreSQL/PostGIS + Redis + Traefik labels
- Caddyfile, Dockerfile, .env.example, .gitignore
- MapLibre GL JS + react-map-gl installés
- Roadmap mise à jour
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-01 02:23:10 -04:00