Repository Public
1/**2 * =============================================================================3 * Job·Ka — Groupe KA4 * Auteur : Simon-Pierre Boucher5 * Contact : contact@spboucher.ai6 * Fichier : frontend/src/App.tsx7 * Rôle : Gabarit global (en-tête, navigation, routes, pied de page)8 * Créé : 2026-08-17 Modifié : 2026-08-179 * =============================================================================10 */11import { lazy, Suspense } from "react";12import { NavLink, Route, Routes } from "react-router-dom";13import Home from "./pages/Home";14import JobPage from "./pages/Job";15import Sources from "./pages/Sources";16import Stats from "./pages/Stats";1718// MapLibre pèse ~700 kB : chargé uniquement quand on visite /carte19const MapPage = lazy(() => import("./pages/MapPage"));2021export default function App() {22 return (23 <>24 <header className="site">25 <div className="container">26 <NavLink to="/" className="logo">Job<em>·</em>Ka</NavLink>27 <nav className="main">28 <NavLink to="/" end className={({ isActive }) => (isActive ? "active" : "")}>Offres</NavLink>29 <NavLink to="/carte" className={({ isActive }) => (isActive ? "active" : "")}>Carte</NavLink>30 <NavLink to="/sources" className={({ isActive }) => (isActive ? "active" : "")}>Employeurs</NavLink>31 <NavLink to="/stats" className={({ isActive }) => (isActive ? "active" : "")}>Statistiques</NavLink>32 </nav>33 </div>34 </header>35 <Routes>36 <Route path="/" element={<Home />} />37 <Route path="/carte" element={38 <Suspense fallback={<div className="container empty">Chargement de la carte…</div>}>39 <MapPage />40 </Suspense>41 } />42 <Route path="/emploi/:uid" element={<JobPage />} />43 <Route path="/sources" element={<Sources />} />44 <Route path="/stats" element={<Stats />} />45 <Route path="*" element={<div className="container empty"><h2>Page introuvable</h2></div>} />46 </Routes>47 <footer className="site">48 <div className="container">49 <span>50 Une plateforme du <a href="https://www.groupe-ka.com">Groupe KA</a> —{" "}51 <a href="mailto:contact@spboucher.ai">contact@spboucher.ai</a>52 </span>53 <span>54 Chaque offre est traçable à sa source originale. Zéro boîte noire.55 </span>56 </div>57 </footer>58 </>59 );60}61