diff --git a/apps/landing/astro.config.mjs b/apps/landing/astro.config.mjs
index cc95d9e..c7d057e 100644
--- a/apps/landing/astro.config.mjs
+++ b/apps/landing/astro.config.mjs
@@ -26,6 +26,26 @@ export default defineConfig({
integrations: [
react(),
],
+ build: {
+ /**
+ * Inline TOUS les dans le HTML. Élimine 80 ms
+ * de render-blocking sur le critical path LCP en faisant disparaître
+ * la requête `/_astro/Layout..css` (~42 KiB) du chemin critique
+ * — cf. audit Lighthouse render-blocking-resources.
+ *
+ * Tradeoff assumé : le HTML pèse +42 KiB par page (mais ~10 KiB
+ * gzippé) au lieu d'avoir une feuille séparée cacheable. Pour une
+ * landing à 5 pages prerendered c'est négligeable, et sur SSR le
+ * gain LCP est plus important que la mutualisation cross-page (le
+ * cache HTTP côté Traefik garde déjà les pages prêtes).
+ *
+ * `"auto"` aurait été plus conservateur mais le seuil par défaut
+ * (`vite.build.assetsInlineLimit` = 4 KiB) est inférieur à la taille
+ * de Layout.css → la feuille restait externe et le render-blocking
+ * persistait.
+ */
+ inlineStylesheets: "always",
+ },
vite: {
plugins: [tailwindcss()],
},
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro
index 398e612..048d6ba 100644
--- a/apps/landing/src/layouts/Layout.astro
+++ b/apps/landing/src/layouts/Layout.astro
@@ -14,6 +14,20 @@ import "../styles/app.css";
import { SiteHeader } from "../components/SiteHeader";
import { SiteFooter } from "../components/SiteFooter";
+/**
+ * URLs hashées (au build) des deux woff2 latin que la quasi-totalité du
+ * contenu utilise — Inter (body) + Bricolage Grotesque (display). Le
+ * suffix `?url` Vite retourne le path final après hashing, donc le
+ * preload reste valide même après un rebuild qui change le hash.
+ *
+ * Préchargées en HEAD pour casser la chaîne `HTML → CSS → fonts` du
+ * critical path (cf. audit Lighthouse network-dependency-tree, ~50 ms
+ * gagnés sur le LCP). On NE preload PAS les latin-ext / vietnamese /
+ * cyrillic / greek : poids inutile pour 99% du trafic FR/latin.
+ */
+import interLatinWoff2 from "@fontsource-variable/inter/files/inter-latin-wght-normal.woff2?url";
+import bricolageLatinWoff2 from "@fontsource-variable/bricolage-grotesque/files/bricolage-grotesque-latin-wght-normal.woff2?url";
+
const SITE_URL = "https://rubis.pro";
/**
@@ -105,6 +119,14 @@ const jsonLdArray = jsonLd ? (Array.isArray(jsonLd) ? jsonLd : [jsonLd]) : [];
+ {/* Preload des fonts critiques (latin uniquement) — coupe la chaîne
+ HTML→CSS→woff2 en faisant démarrer le téléchargement au plus tôt.
+ crossorigin="anonymous" est obligatoire pour matcher la requête
+ woff2 que Vite émet derrière (sans cred), sinon le browser refait
+ un round-trip et le preload est ignoré. */}
+
+
+
{/* Favicons */}