refactor(seo): Improve page metadata and HTML semantics
This commit updates the page metadata (title and description) from the default Next.js placeholders to be descriptive of the Opp lens application, improving SEO. Additionally, it refactors the HTML structure for better semantics and accessibility: - Replaced generic `div` and fragment tags with appropriate semantic elements like `main`, `article`, `li`, and `small`. - Corrected the heading hierarchy for better document structure. - Fixed image source paths by making them absolute to prevent broken images.
This commit is contained in:
@@ -16,8 +16,8 @@ const geistMono = Geist_Mono({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Create Next App",
|
title: "Opp lens - AI-Powered Tender Management",
|
||||||
description: "Generated by create next app",
|
description: "Democratizing Tender Access for SMEs with AI-Powered Tender Management.",
|
||||||
icons: {
|
icons: {
|
||||||
icon: "/fav-icon.svg",
|
icon: "/fav-icon.svg",
|
||||||
},
|
},
|
||||||
@@ -130,7 +130,7 @@ export default async function RootLayout({
|
|||||||
pauseOnHover
|
pauseOnHover
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<main className="container px-4 py-4 m-auto flex-grow">{children}</main>
|
<div className="container px-4 py-4 m-auto flex-grow">{children}</div>
|
||||||
<footer className="relative h-full bg-[url('/footer-bg.svg')] bg-cover bg-no-repeat mt-40">
|
<footer className="relative h-full bg-[url('/footer-bg.svg')] bg-cover bg-no-repeat mt-40">
|
||||||
<div className="relative z-10 container px-4 py-4 m-auto flex flex-col justify-center items-center mt-24 ">
|
<div className="relative z-10 container px-4 py-4 m-auto flex flex-col justify-center items-center mt-24 ">
|
||||||
<div className="flex justify-between flex-col md:flex-row gap-14 w-full md:w-1/2">
|
<div className="flex justify-between flex-col md:flex-row gap-14 w-full md:w-1/2">
|
||||||
|
|||||||
+9
-9
@@ -42,7 +42,7 @@ export default function Home() {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
return (
|
return (
|
||||||
<>
|
<main>
|
||||||
<section className="md:flex md:flex-row justify-around items-center">
|
<section className="md:flex md:flex-row justify-around items-center">
|
||||||
<div className=" md:ml-28 w-full md:w-1/2 flex flex-col gap-10">
|
<div className=" md:ml-28 w-full md:w-1/2 flex flex-col gap-10">
|
||||||
<h1 className="font-black text-8xl text-[#013280]">AI-Powered</h1>
|
<h1 className="font-black text-8xl text-[#013280]">AI-Powered</h1>
|
||||||
@@ -81,20 +81,20 @@ export default function Home() {
|
|||||||
</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 md:p-14 -mt-16 z-20 md: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 md:p-14 -mt-16 z-20 md:ml-28">
|
||||||
<hgroup className="md:flex gap-5 text-center">
|
<div className="md:flex gap-5 text-center">
|
||||||
{advItems.map((item) => (
|
{advItems.map((item) => (
|
||||||
<div
|
<article
|
||||||
key={item.title}
|
key={item.title}
|
||||||
className="flex flex-col gap-4">
|
className="flex flex-col gap-4">
|
||||||
<h3 className="font-black text-[90px]">{item.amount}</h3>
|
<p className="font-black text-[90px]">{item.amount}</p>
|
||||||
<h4 className="font-semibold text-3xl capitalize text-[#99dde5]">
|
<h3 className="font-semibold text-3xl capitalize text-[#99dde5]">
|
||||||
{item.title}
|
{item.title}
|
||||||
</h4>
|
</h3>
|
||||||
<p className="font-normal text-[16px]">{item.description}</p>
|
<p className="font-normal text-[16px]">{item.description}</p>
|
||||||
</div>
|
</article>
|
||||||
))}
|
))}
|
||||||
</hgroup>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</>
|
</main>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ export default function Home() {
|
|||||||
<section className="flex flex-col gap-10 md:flex-row">
|
<section className="flex flex-col gap-10 md:flex-row">
|
||||||
<div className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl md:pb-20">
|
<div className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl md:pb-20">
|
||||||
<Image
|
<Image
|
||||||
src={"people.svg"}
|
src={"/people.svg"}
|
||||||
width={48}
|
width={48}
|
||||||
height={48}
|
height={48}
|
||||||
alt="people icon"
|
alt="people icon"
|
||||||
@@ -207,7 +207,7 @@ export default function Home() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-7 bg-[#E5EFFF] p-10 rounded-3xl md:pb-20">
|
<div className="flex flex-col gap-7 bg-[#E5EFFF] p-10 rounded-3xl md:pb-20">
|
||||||
<Image
|
<Image
|
||||||
src={"shield-tick.svg"}
|
src={"/shield-tick.svg"}
|
||||||
width={48}
|
width={48}
|
||||||
height={48}
|
height={48}
|
||||||
alt="shield icon"
|
alt="shield icon"
|
||||||
|
|||||||
+21
-18
@@ -16,8 +16,9 @@ const geistMono = Geist_Mono({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Create Next App",
|
title: "Opp lens - AI-Powered Tender Management",
|
||||||
description: "Generated by create next app",
|
description:
|
||||||
|
"Democratizing Tender Access for SMEs with AI-powered tender discovery and preparation.",
|
||||||
icons: {
|
icons: {
|
||||||
icon: "/fav-icon.svg",
|
icon: "/fav-icon.svg",
|
||||||
},
|
},
|
||||||
@@ -37,7 +38,7 @@ function ContactInfo({
|
|||||||
contactIconSrc?: string;
|
contactIconSrc?: string;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<div className="flex gap-3 my-3 text-white">
|
<li className="flex gap-3 my-3 text-white">
|
||||||
<Image
|
<Image
|
||||||
src={icon}
|
src={icon}
|
||||||
width={24}
|
width={24}
|
||||||
@@ -65,7 +66,7 @@ function ContactInfo({
|
|||||||
{contact}
|
{contact}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,23 +150,25 @@ export default async function RootLayout({
|
|||||||
<p className="text-white my-2">
|
<p className="text-white my-2">
|
||||||
Democratizing Tender Access for SMEs.
|
Democratizing Tender Access for SMEs.
|
||||||
</p>
|
</p>
|
||||||
<p className="text-white my-2">
|
<small className="text-white my-2">
|
||||||
© 2025 Opplens.com by PBL Partners AB. All Rights Reserved.
|
© 2025 Opplens.com by PBL Partners AB. All Rights Reserved.
|
||||||
</p>
|
</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<address className="not-italic">
|
||||||
{contactInfo.map((contact, index) => (
|
<ul>
|
||||||
<ContactInfo
|
{contactInfo.map((contact, index) => (
|
||||||
key={index}
|
<ContactInfo
|
||||||
icon={contact.icon}
|
key={index}
|
||||||
contact={contact.contact}
|
icon={contact.icon}
|
||||||
href={contact.href}
|
contact={contact.contact}
|
||||||
ariaLabel={contact.ariaLabel}
|
href={contact.href}
|
||||||
contactIconSrc={contact.contactIconSrc}
|
ariaLabel={contact.ariaLabel}
|
||||||
/>
|
contactIconSrc={contact.contactIconSrc}
|
||||||
))}
|
/>
|
||||||
</div>
|
))}
|
||||||
|
</ul>
|
||||||
|
</address>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
+24
-24
@@ -59,7 +59,9 @@ export default function Home() {
|
|||||||
</p>
|
</p>
|
||||||
</hgroup>
|
</hgroup>
|
||||||
<div className="flex justify-start text-white">
|
<div className="flex justify-start text-white">
|
||||||
<button className="w-2/3 md:w-fit capitalize bg-(--primary) rounded-4xl py-4 px-6">
|
<button
|
||||||
|
type="button"
|
||||||
|
className="w-2/3 md:w-fit capitalize bg-(--primary) rounded-4xl py-4 px-6">
|
||||||
Get early access
|
Get early access
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,18 +85,18 @@ export default function Home() {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<article className="mt-10">
|
<section className="mt-10 text-center">
|
||||||
<hgroup>
|
<hgroup>
|
||||||
<h4 className="capitalize font-bold text-2xl md:text-4xl">
|
<h2 className="capitalize font-bold text-2xl md:text-4xl">
|
||||||
your in-house tender department, powered by
|
your in-house tender department, powered by
|
||||||
<span className="uppercase">ai</span>
|
<span className="uppercase">ai</span>
|
||||||
</h4>
|
</h2>
|
||||||
<small className="text-gray-600 mt-3">
|
<p className="text-gray-600 mt-3">
|
||||||
Opplens is the end-to-end solution that gives you the power to
|
Opplens is the end-to-end solution that gives you the power to
|
||||||
compete and win.
|
compete and win.
|
||||||
</small>
|
</p>
|
||||||
</hgroup>
|
</hgroup>
|
||||||
</article>
|
</section>
|
||||||
<section className="flex flex-col gap-4 md:flex-row">
|
<section className="flex flex-col gap-4 md:flex-row">
|
||||||
{centerFrames.map((frame, index) => (
|
{centerFrames.map((frame, index) => (
|
||||||
<article
|
<article
|
||||||
@@ -131,7 +133,7 @@ export default function Home() {
|
|||||||
height={36}
|
height={36}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<h2 className="font-bold">Resource Drain</h2>
|
<h3 className="font-bold">Resource Drain</h3>
|
||||||
<p>
|
<p>
|
||||||
Lacking the time, dedicated staff, and expertise to constantly
|
Lacking the time, dedicated staff, and expertise to constantly
|
||||||
monitor the market and prepare high-quality bids.
|
monitor the market and prepare high-quality bids.
|
||||||
@@ -146,7 +148,7 @@ export default function Home() {
|
|||||||
height={36}
|
height={36}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<h2 className="font-bold">Overwhelming Complexity</h2>
|
<h3 className="font-bold">Overwhelming Complexity</h3>
|
||||||
<p>
|
<p>
|
||||||
Navigating complex requirements and processes designed for large
|
Navigating complex requirements and processes designed for large
|
||||||
corporations with dedicated tender departments.
|
corporations with dedicated tender departments.
|
||||||
@@ -161,7 +163,7 @@ export default function Home() {
|
|||||||
height={36}
|
height={36}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<h2 className="font-bold">Low Win Rates</h2>
|
<h3 className="font-bold">Low Win Rates</h3>
|
||||||
<p>
|
<p>
|
||||||
Did you know 68% of SMEs in Sweden rarely or never win public
|
Did you know 68% of SMEs in Sweden rarely or never win public
|
||||||
tenders? It's time to change that.
|
tenders? It's time to change that.
|
||||||
@@ -169,14 +171,12 @@ export default function Home() {
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section className="flex flex-col mt-36 gap-10 px-2 md:w-3/4 m-auto">
|
<section className="flex flex-col mt-36 gap-10 px-2 md:w-3/4 m-auto text-center">
|
||||||
<div>
|
<h2 className="font-bold text-2xl md:text-4xl">
|
||||||
<h2 className="font-bold text-2xl md:text-4xl">
|
The Opplens Advantage
|
||||||
The Opplens Advantage
|
</h2>
|
||||||
</h2>
|
<div className="flex flex-col gap-10 md:flex-row">
|
||||||
</div>
|
<article className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl md:pb-20">
|
||||||
<section className="flex flex-col gap-10 md:flex-row">
|
|
||||||
<div className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl md:pb-20">
|
|
||||||
<Image
|
<Image
|
||||||
src={"people.svg"}
|
src={"people.svg"}
|
||||||
width={48}
|
width={48}
|
||||||
@@ -184,15 +184,15 @@ export default function Home() {
|
|||||||
alt="people icon"
|
alt="people icon"
|
||||||
/>
|
/>
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-4">
|
||||||
<h2 className="font-bold text-xl">A True Partnership Model</h2>
|
<h3 className="font-bold text-xl">A True Partnership Model</h3>
|
||||||
<p>
|
<p>
|
||||||
Lower your risk with our performance-based options. Our success
|
Lower your risk with our performance-based options. Our success
|
||||||
is directly tied to yours, making us a dedicated partner
|
is directly tied to yours, making us a dedicated partner
|
||||||
invested in your growth, not just a software provider.
|
invested in your growth, not just a software provider.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</article>
|
||||||
<div className="flex flex-col gap-7 bg-[#E5EFFF] p-10 rounded-3xl md:pb-20">
|
<article className="flex flex-col gap-7 bg-[#E5EFFF] p-10 rounded-3xl md:pb-20">
|
||||||
<Image
|
<Image
|
||||||
src={"shield-tick.svg"}
|
src={"shield-tick.svg"}
|
||||||
width={48}
|
width={48}
|
||||||
@@ -200,15 +200,15 @@ export default function Home() {
|
|||||||
alt="shield icon"
|
alt="shield icon"
|
||||||
/>
|
/>
|
||||||
<div className="flex flex-col gap-4">
|
<div className="flex flex-col gap-4">
|
||||||
<h2 className="font-bold text-xl">Unmatched Data Security</h2>
|
<h3 className="font-bold text-xl">Unmatched Data Security</h3>
|
||||||
<p>
|
<p>
|
||||||
Your business data is critical. Our unique on premise AI engine
|
Your business data is critical. Our unique on premise AI engine
|
||||||
ensures your information remains 100% private and secure, unlike
|
ensures your information remains 100% private and secure, unlike
|
||||||
cloud based services. Fully GDPR compliant by design.
|
cloud based services. Fully GDPR compliant by design.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</article>
|
||||||
</section>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user