From dc3822da1e0e10b6708b8d5c8dd35bad7e777693 Mon Sep 17 00:00:00 2001 From: jessy-david-dev Date: Tue, 27 Jan 2026 17:43:08 +0100 Subject: [PATCH 1/7] feat(legal): add mentions legales and privacy policy pages --- app/mentions-legales/page.tsx | 277 +++++++++++++ app/politique-de-confidentialite/page.tsx | 470 ++++++++++++++++++++++ 2 files changed, 747 insertions(+) create mode 100644 app/mentions-legales/page.tsx create mode 100644 app/politique-de-confidentialite/page.tsx diff --git a/app/mentions-legales/page.tsx b/app/mentions-legales/page.tsx new file mode 100644 index 0000000..6899cff --- /dev/null +++ b/app/mentions-legales/page.tsx @@ -0,0 +1,277 @@ +"use client"; + +import { motion } from "framer-motion"; +import { ArrowLeft, FileText, Scale, User } from "lucide-react"; +import Link from "next/link"; + +export default function MentionsLegales() { + return ( +
+ {/* Grid Background */} +
+ + {/* Decorative blobs */} +
+
+ +
+ {/* Back button */} + + + + Retour à l'accueil + + + + {/* Header */} + +
+ + + Informations légales + +
+

+ Mentions Légales +

+

+ Conformément à la loi n° 2004-575 du 21 juin 2004 pour la confiance + dans l'économie numérique +

+
+ + {/* Content */} + + {/* Éditeur du site */} +
+
+
+ +
+

+ 1. Éditeur du site +

+
+
+

+ Nom : Jessy DAVID +

+

+ Adresse : Angers, France +

+

+ Email :{" "} + + contact@jessy-david.dev + +

+

+ Site web :{" "} + + https://jessy-david.dev + +

+
+
+ + {/* Hébergeur */} +
+
+
+ +
+

2. Hébergeur

+
+
+

+ Nom : QuantumCraft Studios +

+

+ Adresse : 58 RUE DE MONCEAU 75008 PARIS, FRANCE +

+

+ Site web :{" "} + + https://quantumcraft-studios.com + +

+
+
+ + {/* Propriété intellectuelle */} +
+

+ 3. Propriété intellectuelle +

+
+

+ L'ensemble du contenu de ce site (textes, images, vidéos, + logos, graphismes, etc.) est la propriété exclusive de Jessy + DAVID, sauf mention contraire. Toute reproduction, + représentation, modification, publication, adaptation de tout ou + partie des éléments du site, quel que soit le moyen ou le + procédé utilisé, est interdite sans l'autorisation écrite + préalable de Jessy DAVID. +

+

+ Toute exploitation non autorisée du site ou de l'un + quelconque des éléments qu'il contient sera considérée + comme constitutive d'une contrefaçon et poursuivie + conformément aux dispositions des articles L.335-2 et suivants + du Code de Propriété Intellectuelle. +

+
+
+ + {/* Limitation de responsabilité */} +
+

+ 4. Limitation de responsabilité +

+
+

+ Jessy DAVID s'efforce d'assurer au mieux de ses + possibilités l'exactitude et la mise à jour des + informations diffusées sur ce site, dont il se réserve le droit + de corriger, à tout moment et sans préavis, le contenu. + Toutefois, Jessy DAVID ne peut garantir l'exactitude, la + précision ou l'exhaustivité des informations mises à + disposition sur ce site. +

+

+ En conséquence, Jessy DAVID décline toute responsabilité pour + toute imprécision, inexactitude ou omission portant sur des + informations disponibles sur ce site. +

+
+
+ + {/* Liens hypertextes */} +
+

+ 5. Liens hypertextes +

+
+

+ Le site jessy-david.dev peut contenir des liens hypertextes vers + d'autres sites. Jessy DAVID n'exerce aucun contrôle + sur ces sites et décline toute responsabilité quant à leur + contenu. La décision d'activer les liens appartient + exclusivement aux visiteurs du site. +

+
+
+ + {/* Protection des données */} +
+

+ 6. Protection des données personnelles +

+
+

+ Conformément au Règlement Général sur la Protection des Données + (RGPD) et à la loi n° 78-17 du 6 janvier 1978 modifiée (loi + Informatique et Libertés), vous disposez d'un droit + d'accès, de rectification, de suppression et + d'opposition aux données personnelles vous concernant. +

+

+ Pour plus d'informations sur la collecte et le traitement + de vos données, veuillez consulter la{" "} + + Politique de Confidentialité + + . +

+

+ Pour exercer vos droits, vous pouvez me contacter à + l'adresse suivante :{" "} + + contact@jessy-david.dev + +

+
+
+ + {/* Cookies */} +
+

7. Cookies

+
+

+ Ce site utilise des cookies pour améliorer l'expérience + utilisateur. Pour plus d'informations sur + l'utilisation des cookies, veuillez consulter la{" "} + + Politique de Confidentialité + + . +

+
+
+ + {/* Loi applicable */} +
+

+ 8. Droit applicable et juridiction +

+
+

+ Les présentes mentions légales sont régies par le droit + français. En cas de litige, les tribunaux français seront seuls + compétents. +

+
+
+ + {/* Date de mise à jour */} +
+ Dernière mise à jour : Janvier 2026 +
+
+
+
+ ); +} diff --git a/app/politique-de-confidentialite/page.tsx b/app/politique-de-confidentialite/page.tsx new file mode 100644 index 0000000..97f55fe --- /dev/null +++ b/app/politique-de-confidentialite/page.tsx @@ -0,0 +1,470 @@ +"use client"; + +import { motion } from "framer-motion"; +import { + ArrowLeft, + Cookie, + Database, + Eye, + Lock, + Mail, + Shield, + UserCheck, +} from "lucide-react"; +import Link from "next/link"; + +export default function PolitiqueDeConfidentialite() { + return ( +
+ {/* Grid Background */} +
+ + {/* Decorative blobs */} +
+
+ +
+ {/* Back button */} + + + + Retour à l'accueil + + + + {/* Header */} + +
+ + + Protection de vos données + +
+

+ Politique de Confidentialité +

+

+ Conformément au RGPD et à la loi n° 78-17 du 6 janvier 1978 modifiée +

+
+ + {/* Content */} + + {/* Introduction */} +
+
+
+ +
+

1. Introduction

+
+
+

+ La présente politique de confidentialité a pour but + d'informer les utilisateurs du site jessy-david.dev de la + manière dont leurs données personnelles sont collectées, + traitées et protégées, conformément au Règlement Général sur la + Protection des Données (RGPD - Règlement UE 2016/679) et à la + loi n° 78-17 du 6 janvier 1978 relative à l'informatique, + aux fichiers et aux libertés, modifiée par la loi n° 2004-801 du + 6 août 2004. +

+

+ Responsable du traitement : Jessy DAVID +
+ Email :{" "} + + contact@jessy-david.dev + +

+
+
+ + {/* Données collectées */} +
+
+
+ +
+

+ 2. Données personnelles collectées +

+
+
+

+ Je collecte les données personnelles suivantes dans le cadre de + l'utilisation de ce site : +

+
+

+ Via le formulaire de contact : +

+
    +
  • + Nom et prénom - pour vous identifier +
  • +
  • + Adresse email - pour vous répondre +
  • +
  • + Message - pour comprendre votre demande +
  • +
+
+
+

+ Données techniques automatiquement collectées : +

+
    +
  • Adresse IP (anonymisée)
  • +
  • Type de navigateur et système d'exploitation
  • +
  • Pages visitées et durée de visite
  • +
  • + Source de trafic (moteur de recherche, lien direct, etc.) +
  • +
+
+
+
+ + {/* Finalités */} +
+
+
+ +
+

+ 3. Finalités du traitement +

+
+
+

+ Les données personnelles sont collectées pour les finalités + suivantes : +

+
    +
  • + Répondre à vos demandes de contact - Base + légale : consentement +
  • +
  • + Améliorer l'expérience utilisateur - + Base légale : intérêt légitime +
  • +
  • + Analyser les statistiques de fréquentation - + Base légale : consentement (cookies) +
  • +
  • + Assurer la sécurité du site (protection + anti-spam via Cloudflare Turnstile) - Base légale : intérêt + légitime +
  • +
+
+
+ + {/* Durée de conservation */} +
+

+ 4. Durée de conservation des données +

+
+

+ Vos données personnelles sont conservées pour une durée limitée + : +

+
    +
  • + Données du formulaire de contact : 3 ans à + compter du dernier contact +
  • +
  • + Cookies analytiques : 13 mois maximum +
  • +
  • + Logs de sécurité : 12 mois +
  • +
+

+ À l'expiration de ces délais, vos données sont supprimées + ou anonymisées. +

+
+
+ + {/* Destinataires */} +
+

+ 5. Destinataires des données +

+
+

+ Vos données personnelles sont strictement confidentielles et ne + sont communiquées qu'aux destinataires suivants : +

+
    +
  • + Jessy DAVID - Responsable du traitement +
  • +
  • + Hébergeur (QuantumCraft Studios) - pour le + stockage technique +
  • +
  • + Cloudflare - pour la protection anti-spam + (Turnstile) +
  • +
  • + Fournisseur d'emails - pour l'envoi + des messages de contact +
  • +
+

+ Je ne vends, ne loue, ni ne partage vos données personnelles + avec des tiers à des fins commerciales. +

+
+
+ + {/* Transferts hors UE */} +
+

+ 6. Transferts de données hors UE +

+
+

+ Certains de mes prestataires (hébergeur, Cloudflare) peuvent + être situés en dehors de l'Union Européenne. Dans ce cas, + je m'assure que ces transferts sont encadrés par des + garanties appropriées conformément au RGPD (Clauses + Contractuelles Types, Data Privacy Framework, etc.). +

+
+
+ + {/* Cookies */} +
+
+
+ +
+

+ 7. Cookies et traceurs +

+
+
+

+ Ce site utilise des cookies pour assurer son bon fonctionnement + et améliorer votre expérience de navigation. +

+ +
+

+ Cookies strictement nécessaires (exemptés de consentement) : +

+
    +
  • + Session - Maintien de la session de + navigation +
  • +
  • + Sécurité (Cloudflare Turnstile) - + Protection anti-spam +
  • +
  • + Préférences cookies - Mémorisation de vos + choix +
  • +
+
+ +
+

+ Cookies analytiques (soumis à consentement) : +

+
    +
  • + Google Analytics - Analyse du trafic et + comportement des visiteurs +
  • +
+
+ +

+ Vous pouvez à tout moment modifier vos préférences en matière de + cookies via la bannière de gestion des cookies accessible depuis + le bas de page. +

+
+
+ + {/* Droits des utilisateurs */} +
+
+
+ +
+

8. Vos droits

+
+
+

+ Conformément au RGPD et à la loi Informatique et Libertés, vous + disposez des droits suivants sur vos données personnelles : +

+
    +
  • + Droit d'accès - Obtenir une copie de vos + données +
  • +
  • + Droit de rectification - Corriger des données + inexactes +
  • +
  • + Droit à l'effacement - Demander la + suppression de vos données +
  • +
  • + Droit à la limitation - Limiter le traitement + de vos données +
  • +
  • + Droit d'opposition - Vous opposer au + traitement +
  • +
  • + Droit à la portabilité - Recevoir vos données + dans un format structuré +
  • +
  • + Droit de retirer votre consentement - À tout + moment +
  • +
+
+

+ + + Pour exercer vos droits, contactez-moi à :{" "} + + contact@jessy-david.dev + +
+ Je répondrai à votre demande dans un délai maximum de 30 + jours. +
+

+
+
+
+ + {/* Réclamation CNIL */} +
+

+ 9. Réclamation auprès de la CNIL +

+
+

+ Si vous estimez que le traitement de vos données personnelles + constitue une violation de vos droits, vous pouvez introduire + une réclamation auprès de la Commission Nationale de + l'Informatique et des Libertés (CNIL) : +

+
+

+ CNIL +

+

3 Place de Fontenoy - TSA 80715

+

75334 PARIS CEDEX 07

+

+ Site web :{" "} + + www.cnil.fr + +

+
+
+
+ + {/* Sécurité */} +
+

+ 10. Sécurité des données +

+
+

+ Je mets en œuvre toutes les mesures techniques et + organisationnelles appropriées pour garantir un niveau de + sécurité adapté au risque : +

+
    +
  • Chiffrement SSL/TLS des communications
  • +
  • Protection contre les attaques (Cloudflare)
  • +
  • Accès restreint aux données personnelles
  • +
  • Mises à jour régulières de sécurité
  • +
+
+
+ + {/* Modifications */} +
+

+ 11. Modifications de la politique +

+
+

+ Je me réserve le droit de modifier cette politique de + confidentialité à tout moment. En cas de modification + substantielle, je vous en informerai par une notification + visible sur ce site. La date de dernière mise à jour sera + toujours indiquée en bas de cette page. +

+
+
+ + {/* Date de mise à jour */} +
+ Dernière mise à jour : Janvier 2026 +
+
+
+
+ ); +} -- 2.47.3 From 78009ff3b05d703a878eb3baec10458cc092aec1 Mon Sep 17 00:00:00 2001 From: jessy-david-dev Date: Tue, 27 Jan 2026 17:59:13 +0100 Subject: [PATCH 2/7] feat(cookies): add GDPR-compliant cookie consent banner --- component/ui/CookieBanner.tsx | 294 ++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 component/ui/CookieBanner.tsx diff --git a/component/ui/CookieBanner.tsx b/component/ui/CookieBanner.tsx new file mode 100644 index 0000000..b338e13 --- /dev/null +++ b/component/ui/CookieBanner.tsx @@ -0,0 +1,294 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { Cookie, X, Check, Settings } from "lucide-react"; +import Link from "next/link"; +import { useState, useEffect } from "react"; + +type CookiePreferences = { + necessary: boolean; + analytics: boolean; +}; + +const COOKIE_CONSENT_KEY = "cookie-consent"; +const COOKIE_PREFERENCES_KEY = "cookie-preferences"; + +function getInitialPreferences(): CookiePreferences { + if (typeof window === "undefined") { + return { necessary: true, analytics: false }; + } + const savedPreferences = localStorage.getItem(COOKIE_PREFERENCES_KEY); + if (savedPreferences) { + try { + return JSON.parse(savedPreferences); + } catch { + return { necessary: true, analytics: false }; + } + } + return { necessary: true, analytics: false }; +} + +export default function CookieBanner() { + const [showBanner, setShowBanner] = useState(false); + const [showSettings, setShowSettings] = useState(false); + const [preferences, setPreferences] = useState( + getInitialPreferences, + ); + + useEffect(() => { + // Vérifier si l'utilisateur a déjà donné son consentement + const consent = localStorage.getItem(COOKIE_CONSENT_KEY); + if (!consent) { + // Délai pour ne pas afficher immédiatement au chargement + const timer = setTimeout(() => setShowBanner(true), 1000); + return () => clearTimeout(timer); + } else { + // Appliquer les préférences sauvegardées au chargement + const savedPreferences = localStorage.getItem(COOKIE_PREFERENCES_KEY); + if (savedPreferences) { + try { + const prefs = JSON.parse(savedPreferences); + if (prefs.analytics) { + // @ts-expect-error - gtag n'est pas typé + window.gtag?.("consent", "update", { + analytics_storage: "granted", + }); + } + } catch { + // Ignorer les erreurs de parsing + } + } + } + }, []); + + const handleAcceptAll = () => { + const newPreferences = { necessary: true, analytics: true }; + saveConsent(newPreferences); + }; + + const handleRejectAll = () => { + const newPreferences = { necessary: true, analytics: false }; + saveConsent(newPreferences); + }; + + const handleSavePreferences = () => { + saveConsent(preferences); + }; + + const saveConsent = (prefs: CookiePreferences) => { + localStorage.setItem(COOKIE_CONSENT_KEY, "true"); + localStorage.setItem(COOKIE_PREFERENCES_KEY, JSON.stringify(prefs)); + setPreferences(prefs); + setShowBanner(false); + setShowSettings(false); + + // Activer/désactiver Google Analytics selon le consentement + if (prefs.analytics) { + enableAnalytics(); + } else { + disableAnalytics(); + } + }; + + const enableAnalytics = () => { + // Active Google Analytics via GTM Consent Mode + if (typeof window !== "undefined") { + // @ts-expect-error - gtag n'est pas typé + window.gtag?.("consent", "update", { + analytics_storage: "granted", + }); + // Envoyer un événement pour GTM + // @ts-expect-error - dataLayer n'est pas typé + window.dataLayer?.push({ event: "cookie_consent_analytics" }); + } + }; + + const disableAnalytics = () => { + // Désactive Google Analytics via GTM Consent Mode + if (typeof window !== "undefined") { + // @ts-expect-error - gtag n'est pas typé + window.gtag?.("consent", "update", { + analytics_storage: "denied", + }); + } + }; + + // Fonction pour rouvrir la bannière (appelable depuis le footer) + useEffect(() => { + const handleOpenCookieSettings = () => { + setShowBanner(true); + setShowSettings(true); + }; + + window.addEventListener("openCookieSettings", handleOpenCookieSettings); + return () => + window.removeEventListener( + "openCookieSettings", + handleOpenCookieSettings, + ); + }, []); + + return ( + + {showBanner && ( + +
+
+ {/* Header */} +
+
+
+ +
+

+ Gestion des cookies +

+
+ +
+ + {/* Content */} +
+ {!showSettings ? ( + <> +

+ Ce site utilise des cookies pour améliorer votre + expérience. Les cookies nécessaires sont essentiels au bon + fonctionnement du site. Vous pouvez choisir + d'accepter ou de refuser les cookies analytiques.{" "} + + En savoir plus + +

+ + {/* Boutons */} +
+ + + +
+ + ) : ( + <> +

+ Personnalisez vos préférences de cookies ci-dessous. +

+ + {/* Options de cookies */} +
+ {/* Cookies nécessaires */} +
+
+

+ Cookies nécessaires +

+

+ Essentiels au fonctionnement du site (session, + sécurité, préférences). +

+
+
+
+
+ +
+
+
+
+ + {/* Cookies analytiques */} +
+
+

+ Cookies analytiques +

+

+ Google Analytics pour comprendre comment vous + utilisez ce site. +

+
+
+ +
+
+
+ + {/* Boutons */} +
+ + +
+ + )} +
+
+
+
+ )} +
+ ); +} -- 2.47.3 From 301b1d876ee9a253cc7c23b9be4a30bfe935e969 Mon Sep 17 00:00:00 2001 From: jessy-david-dev Date: Tue, 27 Jan 2026 18:00:42 +0100 Subject: [PATCH 3/7] feat(contact): add RGPD consent checkbox to contact form --- component/sections/Contact.tsx | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/component/sections/Contact.tsx b/component/sections/Contact.tsx index 5ac1eb3..99a326e 100644 --- a/component/sections/Contact.tsx +++ b/component/sections/Contact.tsx @@ -291,6 +291,35 @@ export default function Contact() { /> + {/* Consentement RGPD */} +
+ + +
+ {/* Message d'erreur */} {error && ( Date: Tue, 27 Jan 2026 18:01:12 +0100 Subject: [PATCH 4/7] feat(footer): add legal links and cookie settings button --- component/layout/Footer.tsx | 49 ++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/component/layout/Footer.tsx b/component/layout/Footer.tsx index 2dbfe14..03365b4 100644 --- a/component/layout/Footer.tsx +++ b/component/layout/Footer.tsx @@ -2,7 +2,15 @@ import { siteConfig } from "@/config/site"; import { motion, type Variants } from "framer-motion"; -import { Github, Heart, Linkedin, Mail } from "lucide-react"; +import { + Cookie, + Github, + Heart, + Linkedin, + Mail, + Scale, + Shield, +} from "lucide-react"; import Image from "next/image"; import Link from "next/link"; @@ -16,6 +24,19 @@ const socials = [ { name: "Email", href: "mailto:contact@jessy-david.dev", icon: Mail }, ]; +const legalLinks = [ + { + name: "Mentions légales", + href: "/mentions-legales", + icon: Scale, + }, + { + name: "Politique de confidentialité", + href: "/politique-de-confidentialite", + icon: Shield, + }, +]; + const containerVariants: Variants = { hidden: { opacity: 0 }, visible: { @@ -112,6 +133,32 @@ export default function Footer() { QuantumCraft Studios + + {/* Liens légaux */} + + {legalLinks.map((item) => ( + + + {item.name} + + ))} + + {/* Copyright */} -- 2.47.3 From c6e064b621b0450ca8105659f90f23ea64ea506a Mon Sep 17 00:00:00 2001 From: jessy-david-dev Date: Tue, 27 Jan 2026 18:01:42 +0100 Subject: [PATCH 5/7] feat(analytics): integrate GTM with consent mode and cookie banner --- app/layout.tsx | 412 +++++++++++++++++++++++++++---------------------- 1 file changed, 227 insertions(+), 185 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index be7a855..6d755e5 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,6 @@ import Footer from "@/component/layout/Footer"; import NavBar from "@/component/layout/NavBar"; +import CookieBanner from "@/component/ui/CookieBanner"; import GridBackground from "@/component/ui/GridBackground"; import type { Metadata, Viewport } from "next"; import { Inter } from "next/font/google"; @@ -7,216 +8,257 @@ import { ReactNode } from "react"; import "./globals.css"; const inter = Inter({ - subsets: ["latin"], - display: "swap", - variable: "--font-inter", + subsets: ["latin"], + display: "swap", + variable: "--font-inter", }); const siteConfig = { - name: "Jessy David", - title: "Jessy David | Développeur Web Full-Stack", - description: - "Développeur Web Full-Stack passionné, spécialisé en React, Next.js et Node.js. Création de sites web modernes, applications web performantes et solutions digitales sur mesure.", - url: "https://jessy-david.dev", - ogImage: "https://jessy-david.dev/og-image.jpg", - author: "Jessy David", - keywords: [ - "développeur web", - "développeur full-stack", - "React", - "Next.js", - "Node.js", - "TypeScript", - "JavaScript", - "création site web", - "freelance", - "France", - "portfolio", - "Jessy David", - ], - twitterHandle: "@jessydavid", + name: "Jessy David", + title: "Jessy David | Développeur Web Full-Stack", + description: + "Développeur Web Full-Stack passionné, spécialisé en React, Next.js et Node.js. Création de sites web modernes, applications web performantes et solutions digitales sur mesure.", + url: "https://jessy-david.dev", + ogImage: "https://jessy-david.dev/og-image.jpg", + author: "Jessy David", + keywords: [ + "développeur web", + "développeur full-stack", + "React", + "Next.js", + "Node.js", + "TypeScript", + "JavaScript", + "création site web", + "freelance", + "France", + "portfolio", + "Jessy David", + ], + twitterHandle: "@jessydavid", }; export const metadata: Metadata = { - title: { - default: siteConfig.title, - template: `%s | ${siteConfig.name}`, + title: { + default: siteConfig.title, + template: `%s | ${siteConfig.name}`, + }, + description: siteConfig.description, + keywords: siteConfig.keywords, + authors: [{ name: siteConfig.author, url: siteConfig.url }], + creator: siteConfig.author, + publisher: siteConfig.author, + + metadataBase: new URL(siteConfig.url), + alternates: { + canonical: "/", + languages: { + "fr-FR": "/", }, + }, + + robots: { + index: true, + follow: true, + nocache: false, + googleBot: { + index: true, + follow: true, + noimageindex: false, + "max-video-preview": -1, + "max-image-preview": "large", + "max-snippet": -1, + }, + }, + + openGraph: { + type: "website", + locale: "fr_FR", + url: siteConfig.url, + siteName: siteConfig.name, + title: siteConfig.title, description: siteConfig.description, - keywords: siteConfig.keywords, - authors: [{ name: siteConfig.author, url: siteConfig.url }], - creator: siteConfig.author, - publisher: siteConfig.author, + images: [ + { + url: siteConfig.ogImage, + width: 1200, + height: 630, + alt: `${siteConfig.name} - Portfolio Développeur Web`, + type: "image/jpeg", + }, + ], + }, - metadataBase: new URL(siteConfig.url), - alternates: { - canonical: "/", - languages: { - "fr-FR": "/", - }, - }, + twitter: { + card: "summary_large_image", + title: siteConfig.title, + description: siteConfig.description, + creator: siteConfig.twitterHandle, + images: [siteConfig.ogImage], + }, - robots: { - index: true, - follow: true, - nocache: false, - googleBot: { - index: true, - follow: true, - noimageindex: false, - "max-video-preview": -1, - "max-image-preview": "large", - "max-snippet": -1, - }, - }, + icons: { + icon: [ + { url: "/favicon.ico", sizes: "any" }, + { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, + { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, + ], + apple: [ + { + url: "/apple-touch-icon.png", + sizes: "180x180", + type: "image/png", + }, + ], + }, - openGraph: { - type: "website", - locale: "fr_FR", - url: siteConfig.url, - siteName: siteConfig.name, - title: siteConfig.title, - description: siteConfig.description, - images: [ - { - url: siteConfig.ogImage, - width: 1200, - height: 630, - alt: `${siteConfig.name} - Portfolio Développeur Web`, - type: "image/jpeg", - }, - ], - }, + manifest: "/site.webmanifest", - twitter: { - card: "summary_large_image", - title: siteConfig.title, - description: siteConfig.description, - creator: siteConfig.twitterHandle, - images: [siteConfig.ogImage], - }, + category: "technology", - icons: { - icon: [ - { url: "/favicon.ico", sizes: "any" }, - { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" }, - { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" }, - ], - apple: [ - { - url: "/apple-touch-icon.png", - sizes: "180x180", - type: "image/png", - }, - ], - }, + verification: { + google: "ton-code-google-search-console", + }, - manifest: "/site.webmanifest", - - category: "technology", - - verification: { - google: "ton-code-google-search-console", - }, - - other: { - "msapplication-TileColor": "#0f172a", - "theme-color": "#0f172a", - }, + other: { + "msapplication-TileColor": "#0f172a", + "theme-color": "#0f172a", + }, }; export const viewport: Viewport = { - themeColor: [ - { media: "(prefers-color-scheme: light)", color: "#ffffff" }, - { media: "(prefers-color-scheme: dark)", color: "#0f172a" }, - ], - width: "device-width", - initialScale: 1, - maximumScale: 5, - userScalable: true, - colorScheme: "dark", + themeColor: [ + { media: "(prefers-color-scheme: light)", color: "#ffffff" }, + { media: "(prefers-color-scheme: dark)", color: "#0f172a" }, + ], + width: "device-width", + initialScale: 1, + maximumScale: 5, + userScalable: true, + colorScheme: "dark", }; const jsonLd = { - "@context": "https://schema.org", - "@graph": [ - { - "@type": "WebSite", - "@id": `${siteConfig.url}/#website`, - url: siteConfig.url, - name: siteConfig.name, - description: siteConfig.description, - inLanguage: "fr-FR", - }, - { - "@type": "Person", - "@id": `${siteConfig.url}/#person`, - name: siteConfig.name, - url: siteConfig.url, - image: siteConfig.ogImage, - jobTitle: "Développeur Web Full-Stack", - description: siteConfig.description, - sameAs: [ - "https://github.com/jessydavid-dev", - "https://linkedin.com/in/jessy-david", - "https://twitter.com/jessydavid", - ], - knowsAbout: [ - "React", - "Next.js", - "TypeScript", - "Node.js", - "JavaScript", - "Tailwind CSS", - "PostgreSQL", - "MongoDB", - ], - }, - { - "@type": "ProfilePage", - "@id": `${siteConfig.url}/#profilepage`, - url: siteConfig.url, - name: `Portfolio de ${siteConfig.name}`, - description: siteConfig.description, - mainEntity: { "@id": `${siteConfig.url}/#person` }, - inLanguage: "fr-FR", - }, - ], + "@context": "https://schema.org", + "@graph": [ + { + "@type": "WebSite", + "@id": `${siteConfig.url}/#website`, + url: siteConfig.url, + name: siteConfig.name, + description: siteConfig.description, + inLanguage: "fr-FR", + }, + { + "@type": "Person", + "@id": `${siteConfig.url}/#person`, + name: siteConfig.name, + url: siteConfig.url, + image: siteConfig.ogImage, + jobTitle: "Développeur Web Full-Stack", + description: siteConfig.description, + sameAs: [ + "https://github.com/jessydavid-dev", + "https://linkedin.com/in/jessy-david", + "https://twitter.com/jessydavid", + ], + knowsAbout: [ + "React", + "Next.js", + "TypeScript", + "Node.js", + "JavaScript", + "Tailwind CSS", + "PostgreSQL", + "MongoDB", + ], + }, + { + "@type": "ProfilePage", + "@id": `${siteConfig.url}/#profilepage`, + url: siteConfig.url, + name: `Portfolio de ${siteConfig.name}`, + description: siteConfig.description, + mainEntity: { "@id": `${siteConfig.url}/#person` }, + inLanguage: "fr-FR", + }, + ], }; export default function RootLayout({ - children, + children, }: Readonly<{ - children: ReactNode; + children: ReactNode; }>) { - return ( - - -