Improve SEO metadata and structured data

هذا الالتزام موجود في:
2026-05-03 15:54:35 +03:00
الأصل 811b3ca794
التزام bd1bb5c2a8
10 ملفات معدلة مع 300 إضافات و55 حذوفات

عرض الملف

@@ -1,5 +1,6 @@
import Image from "next/image";
import Link from "next/link";
import { JsonLd } from "@/components/json-ld";
import { ProjectCard } from "@/components/project-card";
import { SectionHeading } from "@/components/section-heading";
import { SiteShell } from "@/components/site-shell";
@@ -11,12 +12,14 @@ import {
sharedProfile,
type Language,
} from "@/data/portfolio";
import { getHomeStructuredData } from "@/data/seo";
export function HomePage({ language }: { language: Language }) {
const dir = getDirection(language);
const t = portfolioContent[language];
const founderName = language === "ar" ? sharedProfile.founderNameAr : sharedProfile.founderNameEn;
const address = language === "ar" ? sharedProfile.addressAr : sharedProfile.address;
const structuredData = getHomeStructuredData(language);
const heroImageAlt =
language === "ar"
? "لوحة بورتفوليو لمجمع إعلامي ومبنى التلفزيون"
@@ -50,6 +53,7 @@ export function HomePage({ language }: { language: Language }) {
return (
<SiteShell language={language}>
<JsonLd data={structuredData} />
<div className="top-wash pointer-events-none absolute inset-x-0 top-0 h-[720px]" />
<main className="site-container flex flex-col gap-12 py-6 md:gap-14 md:py-8 lg:gap-16 lg:py-10">

7
components/json-ld.tsx Normal file
عرض الملف

@@ -0,0 +1,7 @@
type JsonLdProps = {
data: Record<string, unknown> | Array<Record<string, unknown>>;
};
export function JsonLd({ data }: JsonLdProps) {
return <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }} />;
}

عرض الملف

@@ -1,16 +1,20 @@
import Link from "next/link";
import { JsonLd } from "@/components/json-ld";
import { SectionHeading } from "@/components/section-heading";
import { SiteShell } from "@/components/site-shell";
import { portfolioContent, resumeFile, sharedProfile, type Language } from "@/data/portfolio";
import { getResumeStructuredData } from "@/data/seo";
export function ResumePageContent({ language }: { language: Language }) {
const t = portfolioContent[language];
const brandName = language === "ar" ? sharedProfile.brandNameAr : sharedProfile.brandNameEn;
const address = language === "ar" ? sharedProfile.addressAr : sharedProfile.address;
const hasResume = resumeFile.available;
const structuredData = getResumeStructuredData(language);
return (
<SiteShell language={language}>
<JsonLd data={structuredData} />
<main className="site-container flex flex-col gap-10 py-8 md:py-10 lg:gap-12 lg:py-12">
<section className="section-shell hero-glow">
<div className="section-padding grid gap-8 lg:grid-cols-[1fr_auto] lg:items-end">