83 lines
3.6 KiB
HTML
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>
|