diff --git a/app/about/page.tsx b/app/about/page.tsx index bfd84d4..adf8a6a 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,4 +1,29 @@ -import React from 'react' +import React from 'react'; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "About", + description: "Learn more about Djoufson Che Bene, a passionate Full Stack Developer and Software Engineer. Discover my background, experience, skills in React, Next.js, .NET, and journey in software development.", + keywords: [ + "About Djoufson", + "Software Engineer Background", + "Full Stack Developer Experience", + "Professional Profile", + "Career Journey", + "Technical Skills", + "Software Development Experience" + ], + openGraph: { + title: "About | Djoufson Che Bene", + description: "Learn more about Djoufson Che Bene, a passionate Full Stack Developer and Software Engineer.", + url: "https://djoufson.com/about", + type: "profile", + }, + twitter: { + title: "About | Djoufson Che Bene", + description: "Learn more about Djoufson Che Bene, a passionate Full Stack Developer and Software Engineer.", + }, +}; export default function About() { return ( diff --git a/app/blog/page.tsx b/app/blog/page.tsx index 7ebedcd..8916bcb 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -35,5 +35,29 @@ export default async function BlogPage() { export const metadata = { title: "Blog", - description: "Read the latest blog posts and articles.", + description: "Technical blog posts about software development, web technologies, .NET, React, TypeScript, and programming best practices. Learn from real-world experiences and tutorials.", + keywords: [ + "Technical Blog", + "Software Development", + "Programming Tutorials", + "Web Development", + "React", + "Next.js", + ".NET", + "C#", + "TypeScript", + "JavaScript", + "Entity Framework", + "Best Practices" + ], + openGraph: { + title: "Technical Blog | Djoufson Che Bene", + description: "Technical blog posts about software development, web technologies, and programming best practices.", + url: "https://djoufson.com/blog", + type: "website", + }, + twitter: { + title: "Technical Blog | Djoufson Che Bene", + description: "Technical blog posts about software development, web technologies, and programming best practices.", + }, }; diff --git a/app/globals.css b/app/globals.css index 7c684c5..49ddade 100644 --- a/app/globals.css +++ b/app/globals.css @@ -105,7 +105,21 @@ } .prose a { - @apply text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-300 transition-colors; + color: #089cd8; + text-decoration: underline; + transition: color 0.2s ease-in-out; +} + +.prose a:hover { + color: #067ba3; +} + +.dark .prose a { + color: #4db3e6; +} + +.dark .prose a:hover { + color: #089cd8; } .prose ul { @@ -164,7 +178,40 @@ } .link { - @apply text-blue-500 hover:text-blue-700; + color: var(--custom-blue); + transition: color 0.2s ease-in-out; +} + +.link:hover { + color: var(--custom-blue-hover); +} + +/* Custom blue link classes */ +.custom-blue-link { + color: var(--custom-blue); + transition: color 0.2s ease-in-out; +} + +.custom-blue-link:hover { + color: var(--custom-blue-hover); +} + +.custom-blue-link-active { + color: var(--custom-blue); +} + +.dark .custom-blue-link-active { + color: var(--custom-blue-light); +} + +/* Project card hover effects */ +.project-card-border { + border-color: var(--border); + transition: border-color 0.2s ease-in-out; +} + +.project-card-border:hover { + border-color: var(--custom-blue); } @layer components { @@ -254,6 +301,11 @@ --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); + + /* Custom blue theme colors */ + --custom-blue: #089cd8; + --custom-blue-hover: #067ba3; + --custom-blue-light: #4db3e6; } .dark { diff --git a/app/layout.tsx b/app/layout.tsx index 1ea45bc..c82c260 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -6,10 +6,76 @@ import GoogleAnalytics from "@/components/google/GoogleAnalytics"; import GoogleAdSense from "@/components/google/GoogleAdSense"; import BackToTop from "@/components/BackToTop"; import { ThemeProvider } from "@/components/theme-provider"; +import StructuredData from "@/components/StructuredData"; export const metadata: Metadata = { - title: "Djoufson's Amazing World 🌍", - description: "Generated by create next app", + metadataBase: new URL('https://djoufson.com'), + title: { + default: "Djoufson Che Bene - Full Stack Developer & Software Engineer", + template: "%s | Djoufson Che Bene" + }, + description: "Full Stack Developer and Software Engineer passionate about building modern web applications with React, Next.js, .NET, and cloud technologies. Explore my projects, read my technical blog, and connect with me.", + keywords: [ + "Full Stack Developer", + "Software Engineer", + "React", + "Next.js", + "TypeScript", + "JavaScript", + ".NET", + "C#", + "Node.js", + "Web Development", + "Frontend Development", + "Backend Development", + "Cloud Computing", + "Technical Blog", + "Portfolio", + "Djoufson", + "Che Bene" + ], + authors: [{ name: "Djoufson Che Bene" }], + creator: "Djoufson Che Bene", + publisher: "Djoufson Che Bene", + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + 'max-video-preview': -1, + 'max-image-preview': 'large', + 'max-snippet': -1, + }, + }, + openGraph: { + type: 'website', + locale: 'en_US', + url: 'https://djoufson.com', + siteName: 'Djoufson Che Bene - Full Stack Developer', + title: 'Djoufson Che Bene - Full Stack Developer & Software Engineer', + description: 'Full Stack Developer and Software Engineer passionate about building modern web applications. Explore my projects, read my technical blog, and connect with me.', + images: [ + { + url: '/assets/djouf.png', + width: 1200, + height: 630, + alt: 'Djoufson Che Bene - Full Stack Developer', + } + ], + }, + twitter: { + card: 'summary_large_image', + title: 'Djoufson Che Bene - Full Stack Developer & Software Engineer', + description: 'Full Stack Developer and Software Engineer passionate about building modern web applications. Explore my projects, read my technical blog, and connect with me.', + site: '@djouf_legran', + creator: '@djouf_legran', + images: ['/assets/djouf.png'], + }, + verification: { + google: process.env.GOOGLE_SITE_VERIFICATION, + }, + category: 'technology', }; export default function RootLayout({ @@ -22,6 +88,7 @@ export default function RootLayout({ + p.category === 'open-source'); diff --git a/app/robots.ts b/app/robots.ts new file mode 100644 index 0000000..dad8a75 --- /dev/null +++ b/app/robots.ts @@ -0,0 +1,13 @@ +import { MetadataRoute } from 'next'; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: '*', + allow: '/', + disallow: ['/api/', '/_next/', '/admin/'], + }, + sitemap: 'https://djoufson.com/sitemap.xml', + host: 'https://djoufson.com', + }; +} \ No newline at end of file diff --git a/app/sitemap.ts b/app/sitemap.ts new file mode 100644 index 0000000..13d4028 --- /dev/null +++ b/app/sitemap.ts @@ -0,0 +1,47 @@ +import { MetadataRoute } from 'next'; +import { getAllPostSlugs } from '@/lib/blog'; + +export default function sitemap(): MetadataRoute.Sitemap { + const baseUrl = 'https://djoufson.com'; + + // Get all blog post slugs + const blogSlugs = getAllPostSlugs(); + + // Static pages + const staticPages = [ + { + url: baseUrl, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 1, + }, + { + url: `${baseUrl}/about`, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 0.8, + }, + { + url: `${baseUrl}/projects`, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 0.9, + }, + { + url: `${baseUrl}/blog`, + lastModified: new Date(), + changeFrequency: 'weekly' as const, + priority: 0.8, + }, + ]; + + // Blog post pages + const blogPages = blogSlugs.map((slug) => ({ + url: `${baseUrl}/blog/${slug}`, + lastModified: new Date(), + changeFrequency: 'monthly' as const, + priority: 0.6, + })); + + return [...staticPages, ...blogPages]; +} \ No newline at end of file diff --git a/app/widgets/HeroSection.tsx b/app/widgets/HeroSection.tsx index 727b1f9..7cd4aec 100644 --- a/app/widgets/HeroSection.tsx +++ b/app/widgets/HeroSection.tsx @@ -24,7 +24,7 @@ export default function HeroSection() {

Experienced backend engineer, Founder of{" "}

diff --git a/components/ProjectCard.tsx b/components/ProjectCard.tsx index 9004baf..e377b03 100644 --- a/components/ProjectCard.tsx +++ b/components/ProjectCard.tsx @@ -10,7 +10,7 @@ interface ProjectCardProps { export default function ProjectCard({ project }: ProjectCardProps) { return (
-
+
{project.imageUrl && (
)}
-

+

{project.title}

diff --git a/components/StructuredData.tsx b/components/StructuredData.tsx new file mode 100644 index 0000000..437060b --- /dev/null +++ b/components/StructuredData.tsx @@ -0,0 +1,106 @@ +export default function StructuredData() { + const structuredData = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Person", + "@id": "https://djoufson.com/#person", + "name": "Djoufson Che Bene", + "alternateName": "Djoufson", + "url": "https://djoufson.com", + "image": { + "@type": "ImageObject", + "url": "https://djoufson.com/assets/djouf.png", + "width": 400, + "height": 400 + }, + "sameAs": [ + "https://github.com/djoufson", + "https://linkedin.com/in/djoufson", + "https://x.com/djouf_legran" + ], + "jobTitle": "Full Stack Developer", + "worksFor": { + "@type": "Organization", + "name": "Freelance" + }, + "knowsAbout": [ + "JavaScript", + "TypeScript", + "React", + "Next.js", + "Node.js", + ".NET", + "C#", + "Web Development", + "Full Stack Development", + "Software Engineering" + ], + "alumniOf": { + "@type": "EducationalOrganization", + "name": "University" + } + }, + { + "@type": "WebSite", + "@id": "https://djoufson.com/#website", + "url": "https://djoufson.com", + "name": "Djoufson Che Bene - Full Stack Developer", + "description": "Full Stack Developer and Software Engineer passionate about building modern web applications", + "publisher": { + "@id": "https://djoufson.com/#person" + }, + "potentialAction": { + "@type": "SearchAction", + "target": { + "@type": "EntryPoint", + "urlTemplate": "https://djoufson.com/blog?search={search_term_string}" + }, + "query-input": "required name=search_term_string" + } + }, + { + "@type": "WebPage", + "@id": "https://djoufson.com/#webpage", + "url": "https://djoufson.com", + "name": "Home - Djoufson Che Bene", + "isPartOf": { + "@id": "https://djoufson.com/#website" + }, + "about": { + "@id": "https://djoufson.com/#person" + }, + "description": "Welcome to Djoufson Che Bene's portfolio. Full Stack Developer specializing in React, Next.js, .NET, and modern web technologies.", + "breadcrumb": { + "@type": "BreadcrumbList", + "itemListElement": [ + { + "@type": "ListItem", + "position": 1, + "name": "Home", + "item": "https://djoufson.com" + } + ] + } + }, + { + "@type": "Blog", + "@id": "https://djoufson.com/blog#blog", + "url": "https://djoufson.com/blog", + "name": "Technical Blog - Djoufson Che Bene", + "description": "Technical blog posts about software development, web technologies, and programming best practices", + "publisher": { + "@id": "https://djoufson.com/#person" + }, + "inLanguage": "en-US" + } + ] + }; + + return ( +