feat(landing): enhance hero section and update page backgrounds

This commit introduces a significant visual overhaul to the landing page to create a more dynamic and engaging user experience.

Key changes include:
- Replaced the static mobile phone SVG in the hero section with an animated GIF, complete with a "dynamic island" overlay for a more modern look.
- Updated the main page background from a full cover image to a more subtle header background image (`header-bg.svg`).
- Added a new background layer (`bottom-bg.svg`) near the footer to create more visual depth and separation for the contact section.
- Numbered the three main feature descriptions ("1. Discover", "2. Prepare", "3. Win") for improved clarity and flow.
This commit is contained in:
AmirReza Jamali
2025-10-21 15:17:04 +03:30
parent e2a0df5fc4
commit b556ceed98
6 changed files with 110 additions and 30 deletions
+15 -6
View File
@@ -95,7 +95,7 @@ export default async function RootLayout({
return ( return (
<html lang="en"> <html lang="en">
<body <body
className={`${geistSans.variable} ${geistMono.variable} antialiased flex flex-col min-h-screen bg-[url('/main-bg.svg')] bg-cover bg-no-repeat`}> className={`${geistSans.variable} ${geistMono.variable} antialiased flex flex-col min-h-screen bg-[url('/header-bg.svg')] bg-top-right bg-no-repeat bg-contain`}>
<header className="flex justify-between items-center pb-4 container px-4 py-4 m-auto"> <header className="flex justify-between items-center pb-4 container px-4 py-4 m-auto">
<Link <Link
href="/" href="/"
@@ -109,7 +109,9 @@ export default async function RootLayout({
/> />
</Link> </Link>
</header> </header>
{/* <div className="-z-30 w-screen h-screen absolute border">
</div> */}
<ToastContainer <ToastContainer
position="top-right" position="top-right"
autoClose={2500} autoClose={2500}
@@ -124,14 +126,19 @@ export default async function RootLayout({
/> />
<main className="container px-4 py-4 m-auto flex-grow">{children}</main> <main className="container px-4 py-4 m-auto flex-grow">{children}</main>
<footer className="relative h-full bg-[url('/footer-bg.svg')] bg-cover bg-no-repeat mt-96"> <footer className="relative h-full bg-[url('/footer-bg.svg')] bg-cover bg-no-repeat mt-96">
<div className="absolute w-full -top-[420px] md:-top-72"> <div
className="absolute w-full -top-[420px] md:-top-72 h-[600px] z-[-10] bg-[url('/bottom-bg.svg')] bg-contain bg-no-repeat bg-right"
aria-hidden="true"
/>
<div className="absolute w-full -top-[420px] md:-top-72 z-10">
<ContactUs /> <ContactUs />
</div> </div>
<div className="container px-4 py-4 m-auto flex flex-col justify-center items-center mt-96 ">
<div className="relative z-10 container px-4 py-4 m-auto flex flex-col justify-center items-center mt-96 ">
<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">
<div> <div className="flex flex-col gap-10">
<Image <Image
src={"/footer-logo.svg"} src={"/footer-logo.svg"}
alt="Opp lens logo" alt="Opp lens logo"
@@ -139,12 +146,14 @@ export default async function RootLayout({
height={30} height={30}
priority priority
/> />
<div>
<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"> <p 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> </p>
</div>
</div> </div>
<div> <div>
{contactInfo.map((contact, index) => ( {contactInfo.map((contact, index) => (
+33 -24
View File
@@ -24,21 +24,21 @@ export default function Home() {
const centerFrames = [ const centerFrames = [
{ {
src: "/magnifier.svg", src: "/magnifier.svg",
title: "Discover with AI", title: "1. Discover with AI",
alt: "Magnifier", alt: "Magnifier",
description: description:
"Our intelligent platform scours thousands of sources to find the perfect, most relevant tender opportunities for your specific business and expertise", "Our intelligent platform scours thousands of sources to find the perfect, most relevant tender opportunities for your specific business and expertise",
}, },
{ {
src: "/clipboard.svg", src: "/clipboard.svg",
title: "Prepare with Experts", title: "2. Prepare with Experts",
alt: "Clipboard", alt: "Clipboard",
description: description:
"Gain access to expert support and powerful tools to craft compelling, competitive, and high-quality bids that stand out from the competition.", "Gain access to expert support and powerful tools to craft compelling, competitive, and high-quality bids that stand out from the competition.",
}, },
{ {
src: "/thumbs-up.svg", src: "/thumbs-up.svg",
title: "Win with a Partner", title: "3. Win with a Partner",
alt: "thumbs-up", alt: "thumbs-up",
description: description:
"We operate on a partnership model. We only succeed when you win. This aligns our goals and makes us a true partner in your growth.", "We operate on a partnership model. We only succeed when you win. This aligns our goals and makes us a true partner in your growth.",
@@ -55,12 +55,19 @@ export default function Home() {
<h2 className="capitalize">total tender amount you missed today</h2> <h2 className="capitalize">total tender amount you missed today</h2>
<ApexChart /> <ApexChart />
</div> </div>
<div className="mr-8 -z-20"> <div className="mr-8 -z-20 relative flex justify-center h-[750px]">
<Image <Image
className="-z-10 " src={"/dynamic-island.svg"}
src="/mobile.svg" alt="dynamic island"
width={75}
height={22}
className="absolute top-4 left-1/2 -translate-x-1/2"
/>
<Image
className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full"
src="/mobile.gif"
width={300} width={300}
height={820} height={920}
loading="lazy" loading="lazy"
alt="phone" alt="phone"
/> />
@@ -68,14 +75,14 @@ export default function Home() {
</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> <hgroup>
<h1 className="capitalize font-extrabold text-5xl "> <h1 className="capitalize font-extrabold text-5xl ">
democratizing the world of tenders democratizing the world of tenders
</h1> </h1>
<p className="text-xs"> <p className="text-xs">
Opplens is your dedicated AI-powered partner, leveling the playing Opplens is your dedicated AI-powered partner, leveling the playing
field so you can win the public and private contracts you deserve. field so you can win the public and private contracts you deserve.
Compete on your true strengths. Compete on your true strengths.
</p> </p>
</hgroup> </hgroup>
<div className="flex justify-end"> <div className="flex justify-end">
<button className="bg-(--primary) rounded-4xl py-4 px-6"> <button className="bg-(--primary) rounded-4xl py-4 px-6">
@@ -85,19 +92,21 @@ export default function Home() {
</section> </section>
<article className="mt-40"> <article className="mt-40">
<hgroup> <hgroup>
<h4 className="capitalize font-bold text-4xl"> <h4 className="capitalize font-bold 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> </h4>
<small className="text-gray-600 mt-3"> <small className="text-gray-600 mt-3">
Opplens is the end-to-end solution that gives you the power to compete Opplens is the end-to-end solution that gives you the power to
and win. compete and win.
</small> </small>
</hgroup> </hgroup>
</article> </article>
<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 key={frame.description} className="bg-[#F7FAFF] border border-(--primary)/30 rounded-3xl my-4 py-10 px-6"> <article
key={frame.description}
className="bg-[#F7FAFF] border border-(--primary)/30 rounded-3xl my-4 py-10 px-6 flex flex-col gap-5">
<Image <Image
src={frame.src} src={frame.src}
alt={frame.alt} alt={frame.alt}

Before

Width:  |  Height:  |  Size: 566 B

After

Width:  |  Height:  |  Size: 566 B

+62
View File
@@ -0,0 +1,62 @@
<svg width="75" height="22" viewBox="0 0 75 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M64.1061 21.679H10.8436C4.85652 21.679 0 16.8279 0 10.8315C0 4.85113 4.85652 0 10.8436 0H64.1061C70.0932 0 74.9497 4.85113 74.9497 10.8315C74.9497 16.812 70.0932 21.679 64.1061 21.679Z" fill="black"/>
<g clip-path="url(#clip0_4423_8560)">
<path d="M60.9749 17.0202C64.2942 17.0202 66.985 14.3294 66.985 11.0101C66.985 7.69081 64.2942 5 60.9749 5C57.6557 5 54.9648 7.69081 54.9648 11.0101C54.9648 14.3294 57.6557 17.0202 60.9749 17.0202Z" fill="url(#paint0_linear_4423_8560)"/>
<path d="M60.9754 14.4392C62.869 14.4392 64.404 12.9042 64.404 11.0106C64.404 9.11706 62.869 7.58203 60.9754 7.58203C59.0819 7.58203 57.5469 9.11706 57.5469 11.0106C57.5469 12.9042 59.0819 14.4392 60.9754 14.4392Z" fill="url(#paint1_linear_4423_8560)"/>
<path d="M63.9808 11.0089C63.9808 12.6627 62.6295 14.014 60.9757 14.014C59.322 14.014 57.9707 12.6829 57.9707 11.0089C57.9707 9.335 59.3018 8.00391 60.9757 8.00391C62.6497 8.00391 63.9808 9.335 63.9808 11.0089Z" fill="url(#paint2_linear_4423_8560)"/>
<path style="mix-blend-mode:multiply" d="M63.9808 11.0089C63.9808 12.6627 62.6295 14.014 60.9757 14.014C59.322 14.014 57.9707 12.6829 57.9707 11.0089C57.9707 9.335 59.3018 8.00391 60.9757 8.00391C62.6497 8.00391 63.9808 9.335 63.9808 11.0089Z" fill="url(#paint3_radial_4423_8560)"/>
<path style="mix-blend-mode:screen" d="M63.6984 12.5611C63.6984 11.9762 63.2143 11.4922 62.6295 11.4922C62.0446 11.4922 61.5605 11.9762 61.5605 12.5611C61.5605 13.146 62.0446 13.63 62.6295 13.63C63.2143 13.63 63.6984 13.146 63.6984 12.5611Z" fill="url(#paint4_radial_4423_8560)"/>
</g>
<defs>
<linearGradient id="paint0_linear_4423_8560" x1="60.9749" y1="16.637" x2="60.9749" y2="4.81849" gradientUnits="userSpaceOnUse">
<stop stop-color="#666666"/>
<stop offset="1" stop-color="#010104"/>
</linearGradient>
<linearGradient id="paint1_linear_4423_8560" x1="60.9956" y1="7.78371" x2="60.9956" y2="14.54" gradientUnits="userSpaceOnUse">
<stop stop-color="#0B131C"/>
<stop offset="1" stop-color="#354039"/>
</linearGradient>
<linearGradient id="paint2_linear_4423_8560" x1="63.1136" y1="13.1266" x2="58.8581" y2="8.87113" gradientUnits="userSpaceOnUse">
<stop stop-color="#231F20"/>
<stop offset="0.08" stop-color="#212226"/>
<stop offset="0.2" stop-color="#1F2C37"/>
<stop offset="0.33" stop-color="#1A3C53"/>
<stop offset="0.47" stop-color="#13537B"/>
<stop offset="0.62" stop-color="#0A70AE"/>
<stop offset="0.78" stop-color="#0095EE"/>
<stop offset="0.8" stop-color="#0387D6"/>
<stop offset="0.84" stop-color="#0D689F"/>
<stop offset="0.88" stop-color="#154D71"/>
<stop offset="0.91" stop-color="#1B394E"/>
<stop offset="0.95" stop-color="#1F2A34"/>
<stop offset="0.98" stop-color="#222225"/>
<stop offset="1" stop-color="#231F20"/>
</linearGradient>
<radialGradient id="paint3_radial_4423_8560" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(60.9757 11.0089) scale(3.00504)">
<stop stop-color="#231F20"/>
<stop offset="0.2" stop-color="#165068"/>
<stop offset="0.38" stop-color="#0C78A1"/>
<stop offset="0.54" stop-color="#0594CB"/>
<stop offset="0.66" stop-color="#01A6E4"/>
<stop offset="0.73" stop-color="#00ADEE"/>
<stop offset="0.76" stop-color="#01A5E3"/>
<stop offset="0.81" stop-color="#0693C8"/>
<stop offset="0.87" stop-color="#0D749B"/>
<stop offset="0.94" stop-color="#184A5E"/>
<stop offset="1" stop-color="#231F20"/>
</radialGradient>
<radialGradient id="paint4_radial_4423_8560" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(62.6295 12.5611) scale(1.06891)">
<stop stop-color="#CCCCCC"/>
<stop offset="0.02" stop-color="#C4C4C4"/>
<stop offset="0.22" stop-color="#898989"/>
<stop offset="0.41" stop-color="#585858"/>
<stop offset="0.59" stop-color="#313131"/>
<stop offset="0.75" stop-color="#161616"/>
<stop offset="0.89" stop-color="#050505"/>
<stop offset="1"/>
</radialGradient>
<clipPath id="clip0_4423_8560">
<rect width="12" height="12" fill="white" transform="translate(54.9844 5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB