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 ( - - -