portfolio-website/index.html
2025-10-02 18:36:32 +02:00

83 lines
3.6 KiB
HTML

<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- DNS Prefetch & Preconnect pour les domaines tiers -->
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
<!-- GTM sera chargé dynamiquement après consentement -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Alexandre Pommier - Portfolio</title>
<meta name="description" content="Alexandre Pommier, étudiant en informatique à 42, développeur passionné par les technologies web et systèmes." />
<meta name="author" content="Alexandre Pommier" />
<meta property="og:title" content="Alexandre Pommier - Portfolio" />
<meta property="og:description" content="Portfolio d'Alexandre Pommier, étudiant développeur à l'école 42" />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@lovable_dev" />
<meta name="twitter:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
<!-- Preload des ressources critiques pour optimiser le chemin critique -->
<!-- Preload du CSS principal (inline dans le HTML généré par Vite) -->
<link rel="modulepreload" href="/src/main.tsx">
<!-- Google Fonts - Optimisé avec display=swap et chargement asynchrone -->
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Montserrat:wght@400;500;600;700&display=swap">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Montserrat:wght@400;500;600;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'">
<noscript>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Montserrat:wght@400;500;600;700&display=swap" rel="stylesheet">
</noscript>
<!-- Google Tag Manager sera chargé dynamiquement après consentement pour optimiser LCP/FCP -->
<!-- Voir src/utils/gtm.ts et src/main.tsx pour l'implémentation -->
<!-- Optimisation du rendu initial -->
<style>
/* Critical CSS pour éviter le FOUC (Flash of Unstyled Content) */
#root {
min-height: 100vh;
background: hsl(222.2 84% 4.9%); /* Couleur de fond dark par défaut */
}
/* Spinner de chargement inline pour un feedback immédiat */
.initial-loader {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 48px;
height: 48px;
border: 3px solid rgba(139, 92, 246, 0.2);
border-top-color: rgb(139, 92, 246);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: translate(-50%, -50%) rotate(360deg); }
}
</style>
</head>
<body>
<!-- Google Tag Manager (noscript) - Chargé uniquement sans JavaScript -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5V6TCG4C"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<div id="root">
<!-- Loader initial visible immédiatement -->
<div class="initial-loader"></div>
</div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>