Structure du projet
Organisation des sources du frontend (Vite + Vue 3 <script setup lang="ts">).
Arborescence
src/
api/ # couche HTTP (voir architecture/api.md)
generated/ # client fetch + SDK + types générés depuis api.json —
# versionnés, régénérés via `npm run api:generate`
client.ts # config du client fetch généré + jeton
auth.ts # login / logout / utilisateur courant, erreurs (ApiError)
device-name.ts # nom d'appareil lisible et unique par session
components/
ui/ # primitives shadcn-vue (ajoutées via la CLI)
auth/ # composants liés à l'authentification
LoginForm.vue # formulaire de connexion
RoleSwitcher.vue # sélecteur de casquette (réutilisable)
superadmin/ # tableau de bord super-admin (barre latérale, cockpit…)
region/ # tableau de bord région (barre latérale, vue d'ensemble…)
reseller/ # tableau de bord revendeur (barre latérale, vue d'ensemble…)
LocaleSwitcher.vue # sélecteur de langue (FR / DE / EN)
composables/ # logique réactive réutilisable
useDashboardSection.ts # lie la section active du portail à l'URL (:section)
useOrganizationAccess.ts # sonde d'accès : détecte une organisation suspendue
usePasswordComplexityRules.ts # règles de complexité de mot de passe (Regle)
views/ # écrans routés (équivalent du dossier pages/ de la référence)
Login.vue # écran de connexion
Dashboard.vue # /dashboard : rend le portail de la casquette active
SuperadminDashboard.vue # portail super-admin (rendu par Dashboard.vue)
TravellerDashboard.vue # portail voyageur (rendu par Dashboard.vue)
RegionDashboard.vue # portail région (rendu par Dashboard.vue)
ResellerDashboard.vue # portail revendeur (rendu par Dashboard.vue)
PortalUnavailable.vue # repli (casquettes sans portail dédié)
OrganizationSuspended.vue # organisation suspendue (remplace le portail d'org)
stores/ # état applicatif Pinia (voir architecture/etat.md)
auth.ts # session (utilisateur + jeton + casquette active)
hats.ts # casquettes (rôles) dérivées de l'utilisateur
router/ # routeur + gardes (voir architecture/routage.md)
index.ts # routes, historique web, garde globale
guards.ts # logique pure des gardes (auth + resolveHomeRoute)
i18n/ # internationalisation (vue-i18n)
index.ts # config, détection et persistance de la langue
locales/ # catalogues fr.ts (référence), de.ts, en.ts
lib/
utils.ts # helper cn()
regle.ts # useRegle configuré (validation Regle + messages vue-i18n)
test/
setup.ts # polyfills jsdom (localStorage, matchMedia) pour Vitest
main.ts # point d'entrée : monte App.vue avec Pinia, le routeur et i18n
App.vue # coquille : ne rend que <RouterView/>À la racine du dépôt : api.json (contrat OpenAPI 3.1 récupéré du backend, versionné) et openapi-ts.config.ts (config de génération de src/api/generated/) — voir Couche API.
Conventions de dossiers
L'organisation reflète celle du dépôt de référence .lovable-ref/ (voir le skill inspiration-to-vue) : un dossier components/<feature>/ par domaine fonctionnel, les écrans routés dans views/. Les primitives shadcn-vue vivent dans components/ui/ et sont ajoutées via la CLI, jamais écrites à la main.
Routeur
src/router/ utilise createWebHistory : les URL reflètent la navigation (/login, /, /dashboard) et les liens profonds fonctionnent. Tous les portails partagent l'URL /dashboard ; c'est Dashboard.vue qui rend la vue de la casquette active. Les gardes d'authentification et la redirection d'accueil sont décrites dans Routage & gardes.

