feat(metadata): Update page metadata and enhance video presentation

- Set metadataBase for consistent URL structure across pages
- Add Open Graph and Twitter metadata for improved social sharing
- Implement canonical links and robots directives for SEO optimization
- Replace static image with video previews for a more dynamic user experience
This commit is contained in:
AmirReza Jamali
2026-04-16 11:01:38 +03:30
parent 1bf3b91c12
commit 635ca32b3a
6 changed files with 89 additions and 10 deletions
+8 -1
View File
@@ -19,9 +19,17 @@ const geistMono = Geist_Mono({
}); });
export const metadata: Metadata = { export const metadata: Metadata = {
metadataBase: new URL("https://opplens.com"),
title: "Opp lens - AI-Powered Tender Management", title: "Opp lens - AI-Powered Tender Management",
description: description:
"Democratizing Tender Access for SMEs with AI-Powered Tender Management.", "Democratizing Tender Access for SMEs with AI-Powered Tender Management.",
alternates: {
canonical: "/",
},
robots: {
index: true,
follow: true,
},
icons: { icons: {
icon: "/fav-icon.svg", icon: "/fav-icon.svg",
}, },
@@ -151,7 +159,6 @@ export default async function RootLayout({
alt="Opp lens logo" alt="Opp lens logo"
width={180} width={180}
height={30} height={30}
priority
/> />
<div> <div>
<p className="text-black my-2"> <p className="text-black my-2">
+38 -4
View File
@@ -11,10 +11,24 @@ export const metadata: Metadata = {
openGraph: { openGraph: {
title: "Opp lens - AI-Powered Tender Management", title: "Opp lens - AI-Powered Tender Management",
description: "Win more tenders automatically with our AI-powered platform", description: "Win more tenders automatically with our AI-powered platform",
url: "https://opplens.com/",
type: "website", type: "website",
locale: "en_US", locale: "en_US",
siteName: "Opp lens", siteName: "Opp lens",
}, },
twitter: {
card: "summary_large_image",
title: "Opp lens - AI-Powered Tender Management",
description: "Win more tenders automatically with our AI-powered platform",
images: ["/images/opp-lens-mobile.jpg"],
},
alternates: {
canonical: "https://opplens.com/",
},
robots: {
index: true,
follow: true,
},
icons: { icons: {
icon: "/fav-icon.svg", icon: "/fav-icon.svg",
}, },
@@ -60,7 +74,7 @@ export default function Home() {
</p> </p>
</div> </div>
</div> </div>
<div className="mx-12 md:mx-52 lg:mx-28 -z-20 relative flex justify-center h-[650px] lg:h-[505px]"> <div className="mx-12 md:mx-52 lg:mx-28 -z-20 relative flex justify-center h-[650px] lg:h-[510px]">
<span className="opacity-0 lg:opacity-100"> <span className="opacity-0 lg:opacity-100">
<Image <Image
src={"/dynamic-island.svg"} src={"/dynamic-island.svg"}
@@ -79,14 +93,34 @@ export default function Home() {
className="absolute top-4 left-1/2 -translate-x-1/2" className="absolute top-4 left-1/2 -translate-x-1/2"
/> />
</span> </span>
<Image {/* <Image
className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full" className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full"
src="/mobile.gif" src="/mobile.gif"
width={300} width={300}
height={920} height={920}
loading="lazy" sizes="(max-width: 1024px) 60vw, 300px"
alt="phone" priority
alt="Opp lens application preview on a mobile phone"
/> */}
<div className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full">
<video
className="max-h-full w-full object-cover"
autoPlay
loop
muted
playsInline
preload="auto"
aria-label="Opp lens application preview on a mobile phone">
<source
src="/mobile.webm"
type="video/webm"
/> />
<source
src="/mobile.mp4"
type="video/mp4"
/>
</video>
</div>
</div> </div>
</section> </section>
<section className="flex flex-col gap-6 bg-gradient-to-b from-[#011132] to-[#012B80] text-white rounded-[56px] relative py-13 px-14 -mt-36 z-20 md:grid lg:grid-cols-3 lg:flex-row"> <section className="flex flex-col gap-6 bg-gradient-to-b from-[#011132] to-[#012B80] text-white rounded-[56px] relative py-13 px-14 -mt-36 z-20 md:grid lg:grid-cols-3 lg:flex-row">
+21 -2
View File
@@ -81,14 +81,33 @@ export default async function Home({ params }: IProps) {
height={22} height={22}
className="absolute top-4 left-1/2 -translate-x-1/2" className="absolute top-4 left-1/2 -translate-x-1/2"
/> />
<Image <div className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full">
<video
className="max-h-full w-full object-cover"
autoPlay
loop
muted
playsInline
preload="auto"
aria-label="Opp lens application preview on a mobile phone">
<source
src="/mobile.webm"
type="video/webm"
/>
<source
src="/mobile.mp4"
type="video/mp4"
/>
</video>
</div>
{/* <Image
className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full" className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full"
src="/mobile.gif" src="/mobile.gif"
width={300} width={300}
height={920} height={920}
loading="lazy" loading="lazy"
alt="phone" alt="phone"
/> /> */}
</div> </div>
</section> </section>
<section className="text-left flex flex-col gap-6 bg-gradient-to-b from-[#011132] to-[#012B80] text-white rounded-[56px] relative p-6 lg:p-14 -mt-16 z-20 lg:ml-28 "> <section className="text-left flex flex-col gap-6 bg-gradient-to-b from-[#011132] to-[#012B80] text-white rounded-[56px] relative p-6 lg:p-14 -mt-16 z-20 lg:ml-28 ">
+21 -2
View File
@@ -157,14 +157,33 @@ export default function Home() {
height={22} height={22}
className="absolute top-4 left-1/2 -translate-x-1/2" className="absolute top-4 left-1/2 -translate-x-1/2"
/> />
<Image <div className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full">
<video
className="max-h-full w-full object-cover"
autoPlay
loop
muted
playsInline
preload="auto"
aria-label="Opp lens application preview on a mobile phone">
<source
src="/mobile.webm"
type="video/webm"
/>
<source
src="/mobile.mp4"
type="video/mp4"
/>
</video>
</div>
{/* <Image
className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full" className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full"
src="/mobile.gif" src="/mobile.gif"
width={300} width={300}
height={920} height={920}
loading="lazy" loading="lazy"
alt="phone" alt="phone"
/> /> */}
</div> </div>
</section> </section>
BIN
View File
Binary file not shown.
Binary file not shown.