chore(initial): ajout de la structure de base du projet avec Vite et Vue 3
- Création des fichiers de configuration pour ESLint, Prettier, et Tailwind CSS - Ajout de la configuration de l'éditeur avec .editorconfig - Mise en place de la structure de répertoires pour les composants, les pages, et les données - Intégration de la gestion des langues avec vue-i18n - Ajout de la configuration de Vite et des dépendances nécessaires - Création des fichiers de localisation pour l'anglais et le français - Ajout de la structure de base pour le portfolio avec des exemples de projets - Mise en place des composants de base pour l'interface utilisateur
This commit is contained in:
77
src/composables/useSeo.ts
Normal file
77
src/composables/useSeo.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import { onMounted, onUnmounted } from 'vue'
|
||||
|
||||
interface SeoOptions {
|
||||
title?: string
|
||||
description?: string
|
||||
ogTitle?: string
|
||||
ogDescription?: string
|
||||
ogImage?: string
|
||||
}
|
||||
|
||||
export function useSeo(options: SeoOptions = {}) {
|
||||
const originalTitle = document.title
|
||||
const metaElements: HTMLMetaElement[] = []
|
||||
|
||||
const setTitle = (title: string) => {
|
||||
document.title = title
|
||||
}
|
||||
|
||||
const setMetaTag = (name: string, content: string, property?: boolean) => {
|
||||
let meta = document.querySelector(`meta[${property ? 'property' : 'name'}="${name}"]`) as HTMLMetaElement
|
||||
|
||||
if (!meta) {
|
||||
meta = document.createElement('meta')
|
||||
if (property) {
|
||||
meta.setAttribute('property', name)
|
||||
} else {
|
||||
meta.setAttribute('name', name)
|
||||
}
|
||||
document.head.appendChild(meta)
|
||||
metaElements.push(meta)
|
||||
}
|
||||
|
||||
meta.setAttribute('content', content)
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (options.title) {
|
||||
setTitle(options.title)
|
||||
}
|
||||
|
||||
if (options.description) {
|
||||
setMetaTag('description', options.description)
|
||||
}
|
||||
|
||||
if (options.ogTitle) {
|
||||
setMetaTag('og:title', options.ogTitle, true)
|
||||
}
|
||||
|
||||
if (options.ogDescription) {
|
||||
setMetaTag('og:description', options.ogDescription, true)
|
||||
}
|
||||
|
||||
if (options.ogImage) {
|
||||
setMetaTag('og:image', options.ogImage, true)
|
||||
}
|
||||
|
||||
// Set default Open Graph type
|
||||
setMetaTag('og:type', 'website', true)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
// Restore original title
|
||||
document.title = originalTitle
|
||||
|
||||
// Remove meta tags we added
|
||||
metaElements.forEach(meta => {
|
||||
if (meta.parentNode) {
|
||||
meta.parentNode.removeChild(meta)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
return {
|
||||
setTitle,
|
||||
setMetaTag
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user