feat(02-03): add per-route SEO metadata and JSON-LD to all page stubs
- useSeoMeta() with localized title/description/og tags on all 6 pages - Homepage JSON-LD with Person + ProfessionalService schema - og:image absolute URL on every page - Stub templates with max-w-7xl wrapper and h1 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.about.title'),
|
||||||
|
description: () => t('seo.about.description'),
|
||||||
|
ogTitle: () => t('seo.about.title'),
|
||||||
|
ogDescription: () => t('seo.about.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
|
<h1 class="text-2xl font-bold">{{ t('nav.about') }}</h1>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.contact.title'),
|
||||||
|
description: () => t('seo.contact.description'),
|
||||||
|
ogTitle: () => t('seo.contact.title'),
|
||||||
|
ogDescription: () => t('seo.contact.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
|
<h1 class="text-2xl font-bold">{{ t('nav.contact') }}</h1>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.fiverr.title'),
|
||||||
|
description: () => t('seo.fiverr.description'),
|
||||||
|
ogTitle: () => t('seo.fiverr.title'),
|
||||||
|
ogDescription: () => t('seo.fiverr.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
|
<h1 class="text-2xl font-bold">{{ t('nav.fiverr') }}</h1>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.formation.title'),
|
||||||
|
description: () => t('seo.formation.description'),
|
||||||
|
ogTitle: () => t('seo.formation.title'),
|
||||||
|
ogDescription: () => t('seo.formation.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
|
<h1 class="text-2xl font-bold">{{ t('nav.formation') }}</h1>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
+51
-3
@@ -1,6 +1,54 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.home.title'),
|
||||||
|
description: () => t('seo.home.description'),
|
||||||
|
ogTitle: () => t('seo.home.title'),
|
||||||
|
ogDescription: () => t('seo.home.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
script: [
|
||||||
|
{
|
||||||
|
type: 'application/ld+json',
|
||||||
|
innerHTML: JSON.stringify({
|
||||||
|
'@context': 'https://schema.org',
|
||||||
|
'@graph': [
|
||||||
|
{
|
||||||
|
'@type': 'Person',
|
||||||
|
name: 'Killian Dalcin',
|
||||||
|
url: 'https://killiandalcin.fr',
|
||||||
|
jobTitle: 'Developpeur Full Stack Freelance',
|
||||||
|
email: 'contact@killiandalcin.fr',
|
||||||
|
sameAs: [
|
||||||
|
'https://linkedin.com/in/killian-dal-cin',
|
||||||
|
'https://www.fiverr.com/users/mr_kayjaydee',
|
||||||
|
'https://gitea.kamisama.ovh/kayjaydee',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'@type': 'ProfessionalService',
|
||||||
|
name: 'Killian Dalcin - Developpeur Full Stack',
|
||||||
|
url: 'https://killiandalcin.fr',
|
||||||
|
logo: 'https://killiandalcin.fr/images/logo.webp',
|
||||||
|
priceRange: '$$$',
|
||||||
|
areaServed: 'Worldwide',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
<h1>Portfolio Killian Dalcin</h1>
|
<h1 class="text-2xl font-bold">{{ t('nav.home') }}</h1>
|
||||||
<p>Nuxt 4 Foundation</p>
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
useSeoMeta({
|
||||||
|
title: () => t('seo.projects.title'),
|
||||||
|
description: () => t('seo.projects.description'),
|
||||||
|
ogTitle: () => t('seo.projects.title'),
|
||||||
|
ogDescription: () => t('seo.projects.description'),
|
||||||
|
ogImage: 'https://killiandalcin.fr/og-image.png',
|
||||||
|
ogImageWidth: 1200,
|
||||||
|
ogImageHeight: 630,
|
||||||
|
ogType: 'website',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
||||||
|
<h1 class="text-2xl font-bold">{{ t('nav.projects') }}</h1>
|
||||||
|
<p class="text-gray-600 dark:text-gray-400 mt-4">Phase 3 content placeholder</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
Reference in New Issue
Block a user