Documentation complète : DOCUMENTATION.md.
Interface web du serveur Tetrago : portail communautaire du serveur (comptes utilisateurs, bibliothèque de récits/journaux, fiches de civilisations, etc.). Application React consommant l'API Shard-API.
- React 19 + React Router
- Vite (build & dev server)
- Tailwind CSS 4 + DaisyUI pour les composants UI
- Axios /
fetchpour les appels API - Font Awesome pour les icônes
- SweetAlert2 pour les popups
- react-markdown +
remark-gfmpour le rendu Markdown
- Node.js (version récente, ≥ 18 recommandé)
- npm
- Une instance de Shard-API accessible (locale ou distante)
npm installCopier .env.example en .env à la racine du projet (non versionné) et renseigner les valeurs :
cp .env.example .envVITE_API_BASE_URL: URL de base de Shard-API (les appels sont faits sur${VITE_API_BASE_URL}/api). Vide, les appels sont relatifs (/api/...) sur l'origine du site — utile derrière le proxy du serveur de développement.VITE_SERVER_URL: adresse du serveur Minecraft, affichée sur l'accueil.VITE_SAISON_LANCEMENT(optionnel) : remplace l'accueil par l'annonce du lancement de la saison 3. Une date ISO (2026-10-17T20:00:00+02:00) affiche un compte à rebours et rend l'accueil habituel une fois passée ; tout autre texte (prochainement) affiche l'annonce sans date. Aperçu sur/lancement.VITE_MAPS_BASE_URL(optionnel) : URL de ShardUI-2-Maps, utilisée par les cartes intégrées, les liens du site et l'éditeur (par défauthttps://map.beta.tetrago.fr, voir src/config/maps.js). En développement,.env.developmentla fixe àhttp://localhost:3005. Le jeton de connexion est transmis à l'éditeur parpostMessage: l'API utilisée par la carte doit être la même queVITE_API_BASE_URL.
npm run dev # Lance le serveur de développement Vite
npm run start # Lance le serveur de dev, accessible sur le réseau (0.0.0.0:5173)
npm run build # Build de production dans dist/
npm run preview # Prévisualise le build de production
npm run lint # Lint du code avec ESLintsrc/
├── components/
│ ├── ui/ # Générique et réutilisable : titres, Stat, ListCard, Skeleton, éditeurs de texte…
│ ├── layout/ # Navbar, Footer, Hero / ImageHero / GrimoireHero
│ ├── modals/ # Moteur de modales (DynamicModal, FormModal) + fields/ (champs dynamiques)
│ ├── users/ # Comptes et profils : Login, Register, Profil, UsersList…
│ ├── membres/ # Appartenance à une entité RP : MemberButton, JoinHint, TransferFounderModal
│ ├── bibliotheque/ # Étagères de journaux/livres, chapitres
│ ├── civilisations/ # Ville, religions d'une ville, résidents
│ ├── personnages/ # Avatar et chip de personnage
│ ├── conflits/ # Alliances et guerres (ConflictsSection)
│ └── carte/ # Intégration de ShardUI-2-Maps (MapEmbed)
├── config/ # Données de configuration, sans JSX
│ ├── modals/ # Un fichier par formulaire (civilisation.js, ville.js…), lu par DynamicModal
│ ├── navbar.js # Entrées de la barre de navigation
│ ├── maps.js # MAPS_BASE_URL : adresse de ShardUI-2-Maps
│ └── fontawesome.icons.js # Généré par `npm run icons` — ne pas modifier à la main
├── pages/ # Une page par route ; dossier en minuscules, fichier = nom de l'export (*Page.jsx)
│ ├── home/ users/ bibliotheque/ civilisations/ religions/ commerces/
│ ├── alliances/ guerres/ personnages/ codex/ admin/ template/ not-found/
├── services/
│ ├── api.js # Appels HTTP vers Shard-API (auth, users, bibliothèque, civilisations…)
│ ├── authorisation.js # Gestion des droits/rôles
│ ├── session.js # Utilisateur courant et jeton stockés côté navigateur
│ └── mapEditor.js # Pont d'authentification avec l'éditeur de carte
├── utils/ # Fonctions utilitaires (jeton, fetch, modales, couleurs, dates…)
├── App.jsx / App.css # Déclaration des routes
└── main.jsx / main.css # Point d'entrée
- Imports internes en alias
@/—@pointe sursrc/(déclaré dans vite.config.js et jsconfig.json). On écritimport Navbar from "@/components/layout/Navbar", jamais../../components/.... La règle est sans exception — y compris pour un CSS voisin (import "@/components/layout/Navbar.css") — pour que déplacer un fichier ne casse jamais ses imports. - Dossiers en minuscules, fichiers de composants en
PascalCase, fichiers de données/utilitaires encamelCaseoukebab-case. - Une page = un fichier
*Page.jsxdont le nom correspond exactement à l'export par défaut. components/ne contient que des composants. Toute donnée de configuration va dansconfig/, toute fonction sans rendu dansutils/.- Un composant partagé par plusieurs domaines va dans
components/ui/; sinon il reste dans le dossier de son domaine.
Déclarées dans src/App.jsx. Les accès indiqués sont ceux de l'affichage : c'est l'API qui fait foi.
| Route | Description | Accès |
|---|---|---|
/ |
Accueil, adresse du serveur | Public |
/codex |
Règles du serveur | Public |
/roadmap |
Feuille de route : fonctionnalités disponibles, en chantier et à venir | Public |
/login, /register |
Connexion, inscription, connexion par compte externe | Public |
/auth/:provider/callback |
Retour de Discord ou Microsoft | Public |
/profil |
Mon profil : informations, comptes liés, adhésions, personnages | Connecté |
/profil/:user_id |
Profil public | Public |
/users, /users/:user_id |
Liste et édition des utilisateurs | Administrateur |
/bibliotheque |
Étagères des journaux et des livres | Public |
/bibliotheque/journal/:id, /bibliotheque/livre/:id |
Détail d'un journal / livre | Public |
/civilisations, /civilisation/:id |
Liste et fiche de civilisation | Public |
/civilisation/:civ_id/ville/:id, /quartier/:id |
Ville, quartier | Public |
/religions, /religion/:id |
Liste et fiche de religion | Public |
/commerces, /commerce/:id |
Liste et fiche de commerce | Public |
/alliances, /alliance/:id |
Liste et fiche d'alliance | Public |
/guerres, /guerre/:id |
Liste, fiche, chronologie, camps, zones | Public |
/personnages, /personnage/:id |
Liste et fiche de personnage | Public |
/admin/dimensions, /admin/monde |
Dimensions de la carte, statistiques du monde | Administrateur |
/admin/personnages |
Espèces et classes | Administrateur ou modérateur RP |
* |
Page 404 | — |
Les routes au singulier sans identifiant (/civilisation, /religion, /commerce, /alliance, /guerre,
/personnage, /bibliotheque/journal, /bibliotheque/livre) redirigent vers la liste correspondante.
Le détail de chaque page figure dans DOCUMENTATION.md.
npm run buildLe résultat est généré dans dist/ et peut être servi par n'importe quel serveur statique (nginx, etc.). Le build est découpé en chunks (react-vendor, ui-vendor, vendor-fontawesome, vendor-misc) pour optimiser le chargement — voir vite.config.js.
- Shard-API — API backend consommée par cette interface
- ShardUI-2-Maps — Application de cartographie du serveur