diff --git a/README.md b/README.md index 271e220..8e8535c 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,14 @@ nébuleuses, ceinture d'astéroïdes (une balise lumineuse par projet) et portai - Progressive enhancement : le même markup rend une page normale empilée sans JS, sans WebGL ou avec `prefers-reduced-motion` (la classe `html.cinema` n'est jamais posée). +## Métadonnées NDS toujours à jour + +`src/lib/ndsMeta.ts` : la liste des composants (et leur nombre) est parsée depuis +l'index d'exports du paquet installé, et la version est récupérée sur le registre +npm **au moment du build** (fallback : version installée si hors-ligne). La forge, +les textes de la home et la fiche projet NDS lisent tous cette source — plus aucun +chiffre en dur à maintenir. + ## /docs — la documentation technique Une page dédiée (`/docs`, FR/EN) documente tout le fonctionnement du site en 13 chapitres, @@ -88,7 +96,10 @@ Toutes épinglées (section haute + stage sticky), pilotées par `scrub.ts`, fal ## À faire côté déploiement -1. **`public/og-fr.png` et `public/og-en.png`** (1200×630) — visuels de partage. +1. **Désactiver « Email Address Obfuscation »** dans Cloudflare (Scrape Shield) : + sinon CF injecte `email-decode.min.js`, casse le mailto sans JS et affiche + « [email protected] » aux crawlers de recruteurs. +2. **`public/og-fr.png` et `public/og-en.png`** (1200×630) — visuels de partage. 2. Brancher le workflow **Gitea Actions** existant (`npm ci && npm run build`, publier `dist/`). 3. `/about` et `/contact` redirigent vers `/#about` et `/#contact` (config Astro) — les anciennes URL indexées ne cassent pas. diff --git a/astro.config.mjs b/astro.config.mjs index f218a4c..5217ead 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,6 +3,26 @@ import { defineConfig } from 'astro/config'; import sitemap from '@astrojs/sitemap'; import { fileURLToPath } from 'node:url'; +/** + * NDS's _typography.scss ships a Google Fonts `@import` which lands mid-file + * in the bundled CSS - invalid per spec (W3C error) and a hidden render + * blocker. The fonts are loaded via in BaseLayout instead, and this + * plugin strips the stray @import from every emitted CSS asset. + */ +const stripFontImport = { + name: 'strip-google-fonts-import', + generateBundle(_, bundle) { + for (const chunk of Object.values(bundle)) { + if (chunk.type === 'asset' && chunk.fileName.endsWith('.css') && typeof chunk.source === 'string') { + chunk.source = chunk.source.replace( + /@import url\((['"]?)https:\/\/fonts\.googleapis\.com[^)]*\);?/g, + '', + ); + } + } + }, +}; + const ndsTokens = fileURLToPath( new URL('./node_modules/@unkn0wndo3s/nova-design-system/src/styles/tokens', import.meta.url), ); @@ -38,6 +58,11 @@ export default defineConfig({ ], vite: { + plugins: [stripFontImport], + build: { + // Source maps help debugging in prod and satisfy Lighthouse's audit. + sourcemap: true, + }, css: { preprocessorOptions: { scss: { diff --git a/src/components/BrandIcon.astro b/src/components/BrandIcon.astro new file mode 100644 index 0000000..18bdca4 --- /dev/null +++ b/src/components/BrandIcon.astro @@ -0,0 +1,31 @@ +--- +/** + * Minimal, valid brand icon: one fill, no