feat(seo): implement SEO audit remediations

- Add dynamic sitemap.ts, robots.ts, and llms.txt route
- Add metadataBase and JSON-LD Organization schema to layout
- Set canonical alternates for all routes
- Migrate raw img tags to next/image for LCP optimization
- Add SEO dictionary strings to tr.json and en.json
This commit is contained in:
mstfyldz
2026-06-04 12:29:19 +03:00
parent 4996ec38e6
commit e1d8bae5a4
17 changed files with 233 additions and 28 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
import Link from "next/link";
import Image from "next/image";
import { MapPin, Phone, Mail } from "lucide-react";
import { Locale } from "../dictionaries";
@@ -9,7 +10,7 @@ export default function Footer({ lang, dict }: { lang: Locale; dict: any }) {
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-12 mb-12">
{/* Brand */}
<div className="space-y-4">
<img src="/logo.png" alt="Moy Group Logo" className="h-12 w-auto mb-6" />
<Image src="/logo.png" alt="Moy Group Logo" width={180} height={48} className="h-12 w-auto mb-6" />
<p className="text-gray-400 text-sm leading-relaxed">
{dict.description}
</p>
+2 -1
View File
@@ -2,6 +2,7 @@
import { useState, useEffect } from "react";
import Link from "next/link";
import Image from "next/image";
import { usePathname } from "next/navigation";
import { Menu, X, Globe } from "lucide-react";
import { motion, AnimatePresence } from "framer-motion";
@@ -53,7 +54,7 @@ export default function Navbar({ lang, dict }: { lang: Locale; dict: any }) {
<div className="flex justify-between items-center">
{/* Logo */}
<Link href={`/${lang}`} className="flex-shrink-0">
<img src="/logo.png" alt="Moy Group Logo" className="h-10 w-auto" />
<Image src="/logo.png" alt="Moy Group Logo" width={160} height={40} className="h-10 w-auto" priority />
</Link>
{/* Desktop Nav */}
+5 -2
View File
@@ -1,5 +1,7 @@
"use client";
import * as React from "react"
import Image from "next/image"
import { motion } from "framer-motion";
import { cn } from "@/lib/utils";
@@ -43,10 +45,11 @@ export function ImageCard({ src, alt, title, subtitle, badge, className }: Image
return (
<Card className={cn("group cursor-pointer", className)}>
<div className="relative h-64 overflow-hidden">
<img
<Image
src={src}
alt={alt}
className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-108"
fill
className="object-cover transition-transform duration-700 group-hover:scale-105"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/50 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-400" />
{badge && (