🗼 Documentation

week-end in Paris — Guide technique complet

Source : Notion → 01. Documentation — week-end in Paris

📋

Présentation du projet

Weekend in Paris est un site de tourisme parisien proposant un agenda d'événements culturels, sportifs et gastronomiques, une carte des attractions incontournables et une sélection de restaurants. Le site est multilingue (FR / EN / ZH) et entièrement responsive.

🌐 https://weekend-in-paris.vercel.app

ÉlémentValeur
URLhttps://weekend-in-paris.vercel.app
FrameworkNext.js 14 (Pages Router)
Base de donnéesSupabase (PostgreSQL)
Cartes interactivesMapbox GL 3
HébergementVercel (plan Hobby)
Dépôt GitHubfl3m-ia
Email GitHub / Vercelfl3m.ia@gmail.com
Langues supportées🇫🇷 Français, 🇬🇧 Anglais, 🇨🇳 Chinois
Nombre d'événements50 (avril – juin 2026)
🏗️

Architecture & Stack technique

Vue d'ensemble

Weekend in Paris est développé avec Next.js 14 (Pages Router) et déployé sur Vercel. Il présente les événements, attractions et restaurants de Paris avec des cartes interactives et un système multilingue.

⚛️ Front-end

Next.js 14
Framework React avec rendu hybride (SSG + ISR)
React 18
Bibliothèque UI
Tailwind CSS 3
Design responsive, couleurs personnalisées
Mapbox GL 3
Cartes interactives (événements + attractions)

🗄️ Back-end / Data

Supabase
Base de données PostgreSQL hébergée + client JS
Données statiques
Événements codés dans pages/index.jsx
Données dynamiques
Attractions & restaurants via getStaticProps + ISR
Vercel
Hébergement + CI/CD automatique sur push GitHub

Structure des dossiers

01_weekend_in_paris/
├── components/          # Composants React réutilisables
│   ├── Header.jsx       # Navigation + logo bannière
│   ├── Footer.jsx       # Pied de page
│   ├── AttractionCard.jsx
│   ├── Gallery.jsx      # Galerie photo
│   ├── Map.jsx          # Carte Mapbox (attractions)
│   └── MapEvents.jsx    # Carte Mapbox (événements)
├── context/
│   └── LanguageContext.jsx  # Gestion i18n (FR / EN / ZH)
├── data/
│   └── parisImages.js   # URLs d'images (Pexels/Pixabay)
├── lib/
│   └── supabaseClient.js   # Client Supabase + fonctions CRUD
├── pages/               # Pages Next.js
│   ├── _app.jsx
│   ├── _document.jsx
│   ├── index.jsx        # Accueil — événements + galerie + carte
│   ├── attractions.jsx
│   ├── restaurants.jsx
│   └── api/seed.js
├── public/
│   ├── locales/         # Fichiers de traduction (fr, en, zh)
│   ├── logo_banner.jpg  # Logo paysage (header du site)
│   └── logo_portrait.jpg # Logo portrait (Instagram)
├── scripts/
│   └── seedDatabase.js  # Peuplement Supabase
├── .env.local           # Variables d'environnement
├── next.config.js
└── tailwind.config.js

Couleurs du thème (Tailwind)

NomHexUsage
paris-gold#D4AF37Boutons, badges, accents
paris-dark#1a1a1aTexte principal
paris-light#f5f5f5Fonds clairs
📄

Pages du site

/pages/index.jsx

Accueil

  • Hero sectionTitre en grand avec fond photographique Paris
  • Bannière événementsGradient rose→violet avec titre et sous-titre i18n
  • Filtres par catégorie11 catégories : culturel, musique, cinéma, festival…
  • Carte Mapbox interactiveGéolocalisation de tous les événements filtrés
  • Grille d'événementsAffichage en 3 colonnes avec image, dates, lieu, tarif
  • Galerie photoComposant Gallery.jsx avec images de Paris
ℹ️ Les données d'événements sont codées en dur dans index.jsx (tableau EVENT_DATA de 50 événements couvrant avril–juin 2026). Les libellés sont internationalisés via le système i18n.
/attractionspages/attractions.jsx

Attractions

  • Hero section — gradient bleu→violet
  • Carte Mapbox — localisation de toutes les attractions
  • Filtres — monument, musée, parc, shopping
  • Grille d'attractions — composant AttractionCard
ℹ️ Données Supabase (table attractions), récupérées via getStaticProps avec revalidation ISR toutes les heures.
/restaurantspages/restaurants.jsx

Restaurants

  • Hero section — gradient orange→rouge
  • Filtres par cuisine — français, asiatique, italien, fusion
  • Grille de restaurants — nom, description, localisation, cuisine, note, fourchette de prix
ℹ️ Données Supabase (table restaurants), même pattern ISR.

Composants principaux

ComposantRôle
Header.jsxNavigation sticky, logo bannière, sélecteur de langue
Footer.jsxPied de page avec liens et infos
AttractionCard.jsxCarte d'une attraction touristique
Gallery.jsxGalerie photo interactive
Map.jsxCarte Mapbox pour la page Attractions
MapEvents.jsxCarte Mapbox pour la page Accueil (événements)

Catégories d'événements

EmojiCatégorieDescription
🎭culturelExpositions, musées, danse
🎵musiqueConcerts, opéras
🎬cinémaProjections, rétrospectives
🎪festivalFestivals thématiques
🍽️gastronomieSalons, marchés, fêtes culinaires
🏃sportMarathons, rollers, compétitions
🎮pop cultureComic Con, jeux vidéo
🎡loisirsMarchés, croisières, parcs
🏛️patrimoineMonuments, nuit des musées
spécialÉvénements uniques (Fashion Week, etc.)
🗄️

Base de données Supabase

Le projet utilise Supabase comme base de données PostgreSQL et comme API REST. Le client est initialisé dans lib/supabaseClient.js.

Table attractions

ColonneTypeDescription
idBIGINT (PK, auto)Identifiant unique
nameVARCHAR(255)Nom de l'attraction
descriptionTEXTDescription
locationVARCHAR(255)Adresse courte
latitudeDECIMAL(10,8)Latitude GPS
longitudeDECIMAL(11,8)Longitude GPS
image_urlVARCHAR(500)URL de l'image
ratingDECIMAL(2,1)Note (ex: 4.8)
categoryVARCHAR(50)monument / musée / parc / shopping
opening_hoursVARCHAR(255)Horaires d'ouverture
entrance_feeVARCHAR(100)Tarif d'entrée
websiteVARCHAR(500)Site officiel
created_atTIMESTAMPDate de création

Table restaurants

ColonneTypeDescription
idBIGINT (PK, auto)Identifiant unique
nameVARCHAR(255)Nom du restaurant
descriptionTEXTDescription
locationVARCHAR(255)Adresse
latitudeDECIMAL(10,8)Latitude GPS
longitudeDECIMAL(11,8)Longitude GPS
imageVARCHAR(500)URL de l'image
cuisineVARCHAR(50)français / asiatique / italien / fusion
ratingDECIMAL(2,1)Note
price_rangeVARCHAR(50)Ex: €€€€
phoneVARCHAR(20)Téléphone
websiteVARCHAR(500)Site officiel
created_atTIMESTAMPDate de création

Table contacts

ColonneTypeDescription
idBIGINT (PK, auto)Identifiant unique
nameVARCHAR(255)Nom de l'expéditeur
emailVARCHAR(255)Email
subjectVARCHAR(255)Sujet
messageTEXTMessage
submitted_atTIMESTAMPDate d'envoi
created_atTIMESTAMPDate de création

Fonctions disponibles

Fichier : lib/supabaseClient.js

// Récupérer toutes les attractions triées par note
getAttractions()

// Récupérer une attraction par son ID
getAttractionById(id)

// Récupérer tous les restaurants
getRestaurants()

// Soumettre un formulaire de contact
submitContact(contactData)

Seeding de la base

⚠️ Important : Le seeding doit être exécuté depuis la machine locale (pas depuis Vercel). Il lit .env.local pour se connecter à Supabase.

# Depuis le dossier du projet
cd /Users/fl3m/Documents/Claude/Projects/01_weekend_in_paris
node scripts/seedDatabase.js
🌍

Internationalisation (i18n)

Le site supporte 3 langues. La langue par défaut est le français. Le choix est persisté dans localStorage.

CodeLangueFichier
fr🇫🇷 Françaispublic/locales/fr.json
en🇬🇧 Anglaispublic/locales/en.json
zh🇨🇳 Chinoispublic/locales/zh.json

Implémentation

Le système est géré par context/LanguageContext.jsx qui expose :

  • LanguageProvider — wrapper à placer dans _app.jsx, charge le fichier JSON de la langue sélectionnée
  • useLanguage() — hook donnant accès à language et switchLanguage(lang)
  • useTranslation() — hook qui retourne la fonction t(key)
import { useTranslation } from '../context/LanguageContext';

export default function MyComponent() {
  const { t } = useTranslation();

  return <h1>{t('home.hero_title')}</h1>;
}

Structure des fichiers de traduction

{
  "home": {
    "title": "...",
    "hero_title": "...",
    "hero_subtitle": "..."
  },
  "evenements": {
    "hero_title": "...",
    "all": "Tous",
    "culturel": "Culturel",
    "events": {
      "foire_du_trone": {
        "title": "...",
        "dates": "...",
        "lieu": "...",
        "address": "...",
        "description": "...",
        "tarif": "..."
      }
    }
  }
}

ℹ️ Chaque événement dans EVENT_DATA a un slug qui correspond à une clé dans evenements.events. Les 50 événements sont tous traduits en FR, EN et ZH.

🚀

Déploiement (Vercel + GitHub)

ÉlémentValeur
URL de productionhttps://weekend-in-paris.vercel.app
PlateformeVercel (plan Hobby)
Branche suiviemain
Compte GitHubfl3m-ia
Email GitHub/Vercelfl3m.ia@gmail.com
Framework détectéNext.js

Processus de déploiement

Development (local)
       ↓
   git push origin main
       ↓
   GitHub (fl3m-ia/weekend-in-paris)
       ↓
   Vercel (détection automatique)
       ↓
   Build Next.js (npm run build)
       ↓
   Production : https://weekend-in-paris.vercel.app

Commandes git importantes

⚠️ Utiliser uniquement fl3m.ia@gmail.com comme email git. Un autre email provoque le blocage du déploiement par Vercel.

# Configuration obligatoire avant tout commit
git config user.email 'fl3m.ia@gmail.com'
git config user.name 'fl3m-ia'

# Déployer une modification
git add <fichiers>
git commit -m "description du changement"
git push origin main

Variables d'environnement (Vercel)

VariableDescription
NEXT_PUBLIC_SUPABASE_URLURL du projet Supabase
NEXT_PUBLIC_SUPABASE_ANON_KEYClé anonyme Supabase
NEXT_PUBLIC_MAPBOX_TOKENToken d'accès Mapbox GL
💻

Guide de développement local

Prérequis

  • Node.js 18+
  • npm
  • Un compte Supabase (gratuit)
  • Un token Mapbox (gratuit)

Installation

# 1. Se placer dans le dossier du projet
cd /Users/fl3m/Documents/Claude/Projects/01_weekend_in_paris

# 2. Installer les dépendances
npm install

# 3. Lancer le serveur de développement
npm run dev

# 4. Ouvrir dans le navigateur
open http://localhost:3000

Fichier .env.local

NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIs...
NEXT_PUBLIC_MAPBOX_TOKEN=pk.eyJ1IjoiZmwz...

Scripts npm

CommandeDescription
npm run devLance le serveur de développement (port 3000)
npm run buildCompile l'application pour la production
npm run startLance le serveur de production en local
npm run lintVérifie le code avec ESLint

Ajouter un nouvel événement

1. Ajouter l'objet dans le tableau EVENT_DATA de pages/index.jsx :

{
  id: 51,
  slug: 'mon_evenement',
  category: 'culturel',
  dateStart: '2026-07-14',
  icon: '🇫🇷',
  image: parisImages.art,
  longitude: 2.3376,
  latitude: 48.8606,
  link: 'https://...'
}

2. Ajouter les traductions dans les 3 fichiers de locales sous la clé evenements.events.mon_evenement :

"mon_evenement": {
  "title": "Mon Événement",
  "dates": "14 juillet 2026",
  "lieu": "Champs-Élysées",
  "address": "Avenue des Champs-Élysées, 75008 Paris",
  "description": "Description de l'événement...",
  "tarif": "Gratuit"
}

3. Committer et pousser → Vercel redéploie automatiquement.

Documentation synchronisée depuis Notion — Dernière mise à jour : avril 2026