feat: add multiple project info pages with metadata and structured data

- Created new project pages for LazyBot, Learn, Linktree, Moon Phases, FocusPomodoro, Portfolio, QCU Physique-Chimie, QRCode, ReduceLink, Sudoku, and Visio.
- Each page includes detailed descriptions, features, use cases, tech stack, FAQs, and images.
- Implemented JSON-LD structured data for SEO optimization.
- Added a sitemap generation for better indexing of project pages.
- Introduced a reusable JsonLd component for structured data rendering.
- Configured Tailwind CSS for styling across the application.
This commit is contained in:
Puechberty Arthur
2026-03-30 19:35:58 +02:00
parent 925454bc15
commit 13c171e466
96 changed files with 1657 additions and 166 deletions
+53 -7
View File
@@ -1,5 +1,7 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import Link from "next/link";
import JsonLd from "@/components/JsonLd";
import "./globals.css";
const geistSans = Geist({
@@ -13,8 +15,26 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
title: "ArthurP.fr Hub de projets et outils",
description: "Découvre tous les outils, bots Discord, QCM, générateurs et ressources créés par ArthurP. Un point daccès unique pour tout ce que je développe et partage.",
metadataBase: new URL("https://arthurp.fr"),
openGraph: {
title: "ArthurP.fr Hub de projets et outils",
description: "Découvre tous les outils, bots Discord, QCM, générateurs et ressources créés par ArthurP.",
url: "https://arthurp.fr",
siteName: "ArthurP.fr",
locale: "fr_FR",
type: "website",
},
twitter: {
card: "summary_large_image",
title: "ArthurP.fr Hub de projets et outils",
description: "Découvre tous les outils, bots Discord, QCM, générateurs et ressources créés par ArthurP.",
},
robots: {
index: true,
follow: true,
},
};
export default function RootLayout({
@@ -23,11 +43,37 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
<html lang="fr">
<body className={`${geistSans.variable} ${geistMono.variable} antialiased bg-white text-zinc-900`}>
<JsonLd
data={{
"@context": "https://schema.org",
"@type": "WebSite",
name: "ArthurP.fr",
url: "https://arthurp.fr",
description:
"Découvre tous les outils, bots Discord, QCM, générateurs et ressources créés par ArthurP.",
inLanguage: "fr-FR",
author: {
"@type": "Person",
name: "ArthurP",
url: "https://arthurp.fr",
},
}}
/>
<div className="min-h-screen flex flex-col">
<div className="flex-1">
{children}
</div>
<footer className="w-full border-t border-zinc-200 bg-zinc-50 py-4 text-center text-sm text-zinc-500">
<nav aria-label="Liens légaux" className="flex flex-wrap justify-center gap-4">
<Link href="/legal/mentions-legales" className="hover:underline">Mentions légales</Link>
<Link href="/legal/confidentialite" className="hover:underline">Confidentialité</Link>
<Link href="/legal/cgu" className="hover:underline">CGU</Link>
</nav>
<div className="mt-2">© {new Date().getFullYear()} ArthurP</div>
</footer>
</div>
</body>
</html>
);