Bind cms page
This commit is contained in:
+283
-168
@@ -1,8 +1,11 @@
|
||||
import ApexChart from "@/app/_components/ApexChart";
|
||||
import FooterForm from "@/app/_components/FooterForm";
|
||||
import ImageWithFallback from "@/app/_components/ImageWithFallback";
|
||||
import { cmsService } from "@/hooks/useCmsQueries";
|
||||
import { CmsResponse } from "@/types/TCms";
|
||||
import { Metadata } from "next";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Opp lens - Marketing",
|
||||
@@ -63,182 +66,294 @@ export default async function Home({ params }: IProps) {
|
||||
|
||||
return (
|
||||
<>
|
||||
<section className="block lg:flex justify-around items-center">
|
||||
<div className="flex gap-4 w-full lg:w-1/2 font-bold text-4xl text-center flex-col bg-gray-400/10 p-10 rounded-[40px] h-fit mb-16 backdrop-blur-2xl">
|
||||
<div className="flex flex-col gap-8">
|
||||
<h2>
|
||||
<span>$</span>
|
||||
<span>{cmsData?.data.chart.missedAmount ?? 1672}</span>
|
||||
</h2>
|
||||
<h2 className="capitalize text-2xl font-bold lg:text-3xl">
|
||||
total tender amount you missed today
|
||||
</h2>
|
||||
</div>
|
||||
<ApexChart cmsData={cmsData?.data} />
|
||||
</div>
|
||||
<div className="m-auto w-xs lg:m-0 lg:w-auto -z-20 relative flex justify-center h-[650px] lg:h-[750px]">
|
||||
<header className="flex justify-center pt-8 lg:justify-between items-center pb-4 container px-4 py-4 m-auto">
|
||||
<Link
|
||||
href="/"
|
||||
aria-label="Opp lens home">
|
||||
<Image
|
||||
src={"/dynamic-island.svg"}
|
||||
alt="dynamic island"
|
||||
width={75}
|
||||
height={22}
|
||||
className="absolute top-4 left-1/2 -translate-x-1/2"
|
||||
src="/main-logo.svg"
|
||||
alt="Opp lens logo"
|
||||
width={180}
|
||||
height={30}
|
||||
priority
|
||||
/>
|
||||
<Image
|
||||
className="-z-10 border-8 border-black rounded-4xl overflow-hidden h-full w-full"
|
||||
src="/mobile.gif"
|
||||
width={300}
|
||||
height={920}
|
||||
loading="lazy"
|
||||
alt="phone"
|
||||
/>
|
||||
</div>
|
||||
</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 ">
|
||||
<hgroup>
|
||||
<h1 className="capitalize font-extrabold text-4xl mb-6 md:text-5xl">
|
||||
democratizing the world of tenders
|
||||
</h1>
|
||||
<p className="text-[16px] text-[#dadada]">
|
||||
Opplens is your dedicated AI-powered partner, leveling the playing
|
||||
field so you can win the public and private contracts you deserve.
|
||||
<br />
|
||||
Compete on your true strengths.
|
||||
</p>
|
||||
</hgroup>
|
||||
<div className="flex justify-end">
|
||||
<button className="w-full lg:w-fit capitalize bg-(--primary) rounded-4xl py-4 px-6">
|
||||
Get early access
|
||||
</button>
|
||||
</div>
|
||||
</section>
|
||||
<article className="mt-40">
|
||||
<hgroup>
|
||||
<h4 className="capitalize font-bold text-2xl lg:text-4xl">
|
||||
your in-house tender department, powered by
|
||||
<span className="uppercase">ai</span>
|
||||
</h4>
|
||||
<small className="text-gray-600 mt-3">
|
||||
Opplens is the end-to-end solution that gives you the power to
|
||||
compete and win.
|
||||
</small>
|
||||
</hgroup>
|
||||
</article>
|
||||
<section className="flex flex-col gap-4 lg:flex-row">
|
||||
{centerFrames.map((frame, index) => (
|
||||
<article
|
||||
key={frame.description}
|
||||
className="bg-[#F7FAFF] border border-(--primary)/30 rounded-3xl my-4 py-10 px-6 flex flex-col gap-5 transition duration-300 transform scale-90 hover:bg-[#0164FF30] hover:scale-110">
|
||||
<Image
|
||||
src={frame.src}
|
||||
alt={frame.alt}
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
<h3 className="text-2xl font-bold">{frame.title}</h3>
|
||||
<p className="text-gray-600">{frame.description}</p>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
<section className="mt-36 bg-[#F7FAFF] px-4 py-6 rounded-4xl flex flex-col gap-9 lg:p-16">
|
||||
<div className="flex flex-col gap-4">
|
||||
<h2 className=" font-bold text-4xl">
|
||||
Tired of Complex Tenders & Lost Opportunities?
|
||||
</h2>
|
||||
<p className="font-normal text-sm">
|
||||
The procurement market is tough for SMEs. We get it. You're facing
|
||||
an uphill battle.
|
||||
</p>
|
||||
</div>
|
||||
<ul className="flex flex-col gap-4 lg:flex-row lg:justify-between">
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<Image
|
||||
src={"/clock.svg"}
|
||||
alt="clock icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Resource Drain</h2>
|
||||
<p>
|
||||
Lacking the time, dedicated staff, and expertise to constantly
|
||||
monitor the market and prepare high-quality bids.
|
||||
</p>
|
||||
</li>
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<Image
|
||||
src={"/clipboard.svg"}
|
||||
alt="clipboard icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Overwhelming Complexity</h2>
|
||||
<p>
|
||||
Navigating complex requirements and processes designed for large
|
||||
corporations with dedicated tender departments.
|
||||
</p>
|
||||
</li>
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<Image
|
||||
src={"/arrow-up.svg"}
|
||||
alt="arrow-up icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Low Win Rates</h2>
|
||||
<p>
|
||||
Did you know 68% of SMEs in Sweden rarely or never win public
|
||||
tenders? It's time to change that.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section className="flex flex-col mt-36 gap-10 px-2 lg:w-3/4 m-auto">
|
||||
<div>
|
||||
<h2 className="font-bold text-2xl lg:text-4xl">
|
||||
The Opplens Advantage
|
||||
</h2>
|
||||
</div>
|
||||
<section className="flex flex-col gap-10 lg:flex-row">
|
||||
<div className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl lg:pb-20">
|
||||
<Image
|
||||
src={"/people.svg"}
|
||||
width={48}
|
||||
height={48}
|
||||
alt="people icon"
|
||||
/>
|
||||
<div className="flex flex-col gap-4">
|
||||
<h2 className="font-bold text-xl">A True Partnership Model</h2>
|
||||
<p>
|
||||
Lower your risk with our performance-based options. Our success
|
||||
is directly tied to yours, making us a dedicated partner
|
||||
invested in your growth, not just a software provider.
|
||||
</p>
|
||||
</Link>
|
||||
</header>
|
||||
<main className="container px-4 py-4 m-auto flex-grow">
|
||||
<section className="block lg:flex justify-around items-center">
|
||||
<div className="flex gap-4 w-full lg:w-1/2 font-bold text-4xl text-center flex-col bg-gray-400/10 p-10 rounded-[40px] h-fit mb-16 backdrop-blur-2xl">
|
||||
<div className="flex flex-col gap-8">
|
||||
<h2>
|
||||
<span>$</span>
|
||||
<span>{cmsData?.data.chart.missedAmount ?? 1672}</span>
|
||||
</h2>
|
||||
<h2 className="capitalize text-2xl font-bold lg:text-3xl">
|
||||
total tender amount you missed today
|
||||
</h2>
|
||||
</div>
|
||||
<ApexChart cmsData={cmsData?.data} />
|
||||
</div>
|
||||
<div className="flex flex-col gap-7 bg-[#E5EFFF] p-10 rounded-3xl lg:pb-20">
|
||||
<div className="m-auto w-xs lg:m-0 lg:w-auto -z-20 relative flex justify-center h-[650px] lg:h-[750px]">
|
||||
<Image
|
||||
src={"/shield-tick.svg"}
|
||||
width={48}
|
||||
height={48}
|
||||
alt="shield icon"
|
||||
src={"/dynamic-island.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}
|
||||
height={920}
|
||||
loading="lazy"
|
||||
alt="phone"
|
||||
/>
|
||||
<div className="flex flex-col gap-4">
|
||||
<h2 className="font-bold text-xl">Unmatched Data Security</h2>
|
||||
<p>
|
||||
Your business data is critical. Our unique on premise AI engine
|
||||
ensures your information remains 100% private and secure, unlike
|
||||
cloud based services. Fully GDPR compliant by design.
|
||||
</p>
|
||||
</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 ">
|
||||
<hgroup>
|
||||
<h1 className="capitalize font-extrabold text-4xl mb-6 md:text-5xl">
|
||||
{cmsData?.data.hero.Title}
|
||||
</h1>
|
||||
<p className="text-[16px] text-[#dadada]">
|
||||
{cmsData?.data.hero.Description}
|
||||
</p>
|
||||
</hgroup>
|
||||
<div className="flex justify-end">
|
||||
<Link
|
||||
className="w-full lg:w-fit capitalize bg-(--primary) rounded-4xl py-4 px-6"
|
||||
href={cmsData?.data.hero.ButtonLink ?? "#"}>
|
||||
{cmsData?.data.hero.ButtonText}
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
<article className="mt-40">
|
||||
<hgroup>
|
||||
<h4 className="capitalize font-bold text-2xl lg:text-4xl">
|
||||
your in-house tender department, powered by
|
||||
<span className="uppercase">ai</span>
|
||||
</h4>
|
||||
<small className="text-gray-600 mt-3">
|
||||
Opplens is the end-to-end solution that gives you the power to
|
||||
compete and win.
|
||||
</small>
|
||||
</hgroup>
|
||||
</article>
|
||||
<section className="flex flex-col gap-4 lg:flex-row">
|
||||
{centerFrames.map((frame, index) => (
|
||||
<article
|
||||
key={frame.description}
|
||||
className="bg-[#F7FAFF] border border-(--primary)/30 rounded-3xl my-4 py-10 px-6 flex flex-col gap-5 transition duration-300 transform scale-90 hover:bg-[#0164FF30] hover:scale-110">
|
||||
<Image
|
||||
src={frame.src}
|
||||
alt={frame.alt}
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
<h3 className="text-2xl font-bold">{frame.title}</h3>
|
||||
<p className="text-gray-600">{frame.description}</p>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
<section className="mt-36 bg-[#F7FAFF] px-4 py-6 rounded-4xl flex flex-col gap-9 lg:p-16">
|
||||
<div className="flex flex-col gap-4">
|
||||
<h2 className=" font-bold text-4xl">
|
||||
Tired of Complex Tenders & Lost Opportunities?
|
||||
</h2>
|
||||
<p className="font-normal text-sm">
|
||||
The procurement market is tough for SMEs. We get it. You're facing
|
||||
an uphill battle.
|
||||
</p>
|
||||
</div>
|
||||
<ul className="flex flex-col gap-4 lg:flex-row lg:justify-between">
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<Image
|
||||
src={"/clock.svg"}
|
||||
alt="clock icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Resource Drain</h2>
|
||||
<p>
|
||||
Lacking the time, dedicated staff, and expertise to constantly
|
||||
monitor the market and prepare high-quality bids.
|
||||
</p>
|
||||
</li>
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<ImageWithFallback
|
||||
src={"/clipboard.svg"}
|
||||
alt="clipboard icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Overwhelming Complexity</h2>
|
||||
<p>
|
||||
Navigating complex requirements and processes designed for large
|
||||
corporations with dedicated tender departments.
|
||||
</p>
|
||||
</li>
|
||||
<li className="flex flex-col gap-4 lg:w-80">
|
||||
<div className="p-4">
|
||||
<ImageWithFallback
|
||||
src={"/arrow-up.svg"}
|
||||
alt="arrow-up icon"
|
||||
width={36}
|
||||
height={36}
|
||||
/>
|
||||
</div>
|
||||
<h2 className="font-bold">Low Win Rates</h2>
|
||||
<p>
|
||||
Did you know 68% of SMEs in Sweden rarely or never win public
|
||||
tenders? It's time to change that.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
<section className="flex flex-col mt-36 gap-10 px-2 lg:w-3/4 m-auto">
|
||||
<div>
|
||||
<h2 className="font-bold text-2xl lg:text-4xl">
|
||||
{cmsData?.data.advantages.Title}
|
||||
</h2>
|
||||
</div>
|
||||
<section className="flex flex-col gap-10 lg:flex-row">
|
||||
{cmsData?.data.advantages.Cards.map((card) => (
|
||||
<div
|
||||
className="flex flex-col gap-7 bg-[#FFF7EB] p-10 rounded-3xl lg:pb-20"
|
||||
key={card.Title}>
|
||||
<ImageWithFallback
|
||||
src={card.Icon ?? "/people.svg"}
|
||||
width={48}
|
||||
height={48}
|
||||
alt="people icon"
|
||||
unoptimized
|
||||
/>
|
||||
<div className="flex flex-col gap-4">
|
||||
<h2 className="font-bold text-xl">{card.Title}</h2>
|
||||
<p>{card.Description}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</section>
|
||||
</section>
|
||||
</main>
|
||||
<footer className="relative h-full bg-[url('/footer-bg.svg')] bg-cover bg-no-repeat mt-96">
|
||||
<div
|
||||
className="absolute w-full -top-[355px] lg:-top-72 h-[600px] z-[-10] bg-[url('/bottom-bg.svg')] bg-contain bg-no-repeat bg-right"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
|
||||
<FooterForm />
|
||||
|
||||
<div className="relative z-10 container px-4 py-4 m-auto flex flex-col justify-center items-center mt-80 ">
|
||||
<div className="flex justify-between flex-col lg:flex-row gap-14 w-full lg:w-1/2">
|
||||
<div className="flex flex-col gap-10">
|
||||
<Image
|
||||
src={"/footer-logo.svg"}
|
||||
alt="Opp lens logo"
|
||||
width={180}
|
||||
height={30}
|
||||
priority
|
||||
/>
|
||||
<div>
|
||||
<p className="text-white my-2">
|
||||
{cmsData?.data.footer.Tagline}
|
||||
</p>
|
||||
<small className="text-white my-2">
|
||||
{cmsData?.data.footer.Copyright}
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<address className="not-italic">
|
||||
<ul>
|
||||
<li className="flex gap-3 my-3 text-white">
|
||||
<Image
|
||||
src={"/Phone.svg"}
|
||||
width={24}
|
||||
height={24}
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<a href={`tel:${cmsData?.data.footer.Phone}`}>
|
||||
{cmsData?.data.footer.Phone}
|
||||
</a>
|
||||
</li>
|
||||
<li className="flex gap-3 my-3 text-white">
|
||||
<Image
|
||||
src={"/Message.svg"}
|
||||
width={24}
|
||||
height={24}
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<a href={`mailto:${cmsData?.data.footer.Email}`}>
|
||||
{cmsData?.data.footer.Email}
|
||||
</a>
|
||||
</li>
|
||||
<li className="flex gap-3 my-3 text-white">
|
||||
<Image
|
||||
src={"/Location.svg"}
|
||||
width={24}
|
||||
height={24}
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<p>{cmsData?.data.footer.Location}</p>
|
||||
</li>
|
||||
</ul>
|
||||
</address>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</>
|
||||
);
|
||||
}
|
||||
function ContactInfo({
|
||||
icon,
|
||||
contact,
|
||||
href,
|
||||
ariaLabel,
|
||||
contactIconSrc,
|
||||
}: {
|
||||
icon: string;
|
||||
contact: string;
|
||||
href?: string;
|
||||
ariaLabel: string;
|
||||
contactIconSrc?: string;
|
||||
}) {
|
||||
return (
|
||||
<li className="flex gap-3 my-3 text-white">
|
||||
<Image
|
||||
src={icon}
|
||||
width={24}
|
||||
height={24}
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
/>
|
||||
{href ? (
|
||||
<a
|
||||
href={href}
|
||||
className="cursor-pointer min-w-fit"
|
||||
aria-label={ariaLabel}>
|
||||
{contact}
|
||||
</a>
|
||||
) : (
|
||||
<p className="flex gap-3">
|
||||
{!!contactIconSrc && (
|
||||
<Image
|
||||
src={contactIconSrc}
|
||||
width={20}
|
||||
height={20}
|
||||
alt="flag"
|
||||
/>
|
||||
)}
|
||||
{contact}
|
||||
</p>
|
||||
)}
|
||||
</li>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user