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:
Mr¤KayJayDee
2025-06-22 15:00:35 +02:00
commit cc7368b550
122 changed files with 11938 additions and 0 deletions

77
src/composables/useSeo.ts Normal file
View 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
}
}