Copie du kit kit-site (empreinte vérifiée) : logotype dans l'en-tête, signe §, favicons et icônes, og-default (?v=3), frise du pied de page, 61 oiseaux. Les shadoks positionnés à la main (HomeShadoks et les règles des 10 pages) cèdent la place à UiOiseauPose : chaque oiseau se pose sur une arête réelle (perché, marge gauche ou droite, derrière une carte, libre), currentColor, largeur 72 px au moins, opacité 0,18-0,28 près du texte et 0,10-0,14 derrière, jamais deux fois sur une page, calligraphe et typographe jamais en miroir. Sous 768 px, un oiseau par page au plus ; seuls ceux derrière une carte dérivent un peu, et plus du tout en mouvement réduit. Consignes d'Yvv du 03/11 inscrites dans docs/consignes-yvv.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
/**
|
|
* Applique toutes les balises SEO (og:*, Twitter Cards, canonical, description)
|
|
* à partir du contenu YAML d'une page.
|
|
*
|
|
* Usage dans les pages :
|
|
* useSeoPage({ title: content.value?.meta?.title, description: content.value?.description })
|
|
*
|
|
* L'og:image par défaut est /og-default.png (logo §).
|
|
* Chaque section peut surcharger avec son propre image via le champ seo.image du YAML.
|
|
*/
|
|
export function useSeoPage(opts: {
|
|
title?: string | null
|
|
description?: string | null
|
|
image?: string | null
|
|
type?: 'website' | 'article' | 'book'
|
|
}) {
|
|
const config = useRuntimeConfig()
|
|
const route = useRoute()
|
|
const siteUrl = (config.public.siteUrl as string) || 'https://librodrome.org'
|
|
|
|
const title = opts.title || 'Le Librodrome'
|
|
const description = opts.description
|
|
|| 'Autonomie numérique, économique et citoyenne. Un livre et des chansons sur l\'économie du don.'
|
|
const rawImage = opts.image || '/og-default.png?v=3'
|
|
const image = rawImage.startsWith('http') ? rawImage : `${siteUrl}${rawImage}`
|
|
const canonical = `${siteUrl}${route.path}`
|
|
const type = opts.type || 'website'
|
|
|
|
useSeoMeta({
|
|
// Open Graph
|
|
ogTitle: title,
|
|
ogDescription: description,
|
|
ogImage: image,
|
|
ogImageWidth: 1200,
|
|
ogImageHeight: 630,
|
|
ogUrl: canonical,
|
|
ogType: type,
|
|
ogSiteName: 'Le Librodrome',
|
|
ogLocale: 'fr_FR',
|
|
// Twitter Cards
|
|
twitterCard: 'summary_large_image',
|
|
twitterTitle: title,
|
|
twitterDescription: description,
|
|
twitterImage: image,
|
|
// Standard
|
|
description,
|
|
})
|
|
|
|
useHead({
|
|
link: [{ rel: 'canonical', href: canonical }],
|
|
})
|
|
}
|