first commit
This commit is contained in:
161
src/components/tour-operations.tsx
Normal file
161
src/components/tour-operations.tsx
Normal file
@@ -0,0 +1,161 @@
|
||||
import Image from "next/image";
|
||||
import type { ReactNode } from "react";
|
||||
import { ButtonLink } from "@/components/button";
|
||||
import { Reveal } from "@/components/reveal";
|
||||
|
||||
type Feature = { title: string; description: string; icon: ReactNode };
|
||||
|
||||
const features: Feature[] = [
|
||||
{
|
||||
title: "Fleet Management",
|
||||
description: "Manage vehicles, availability, assignments, utilization and operational status.",
|
||||
icon: (
|
||||
<>
|
||||
<path d="M4 10C4 6.229 4 4.343 5.172 3.172 6.343 2 8.229 2 12 2s5.657 0 6.828 1.172C20 4.343 20 6.229 20 10v2c0 3.771 0 5.657-1.172 6.828C17.657 20 15.771 20 12 20s-5.657 0-6.828-1.172C4 17.657 4 15.771 4 12z" />
|
||||
<path d="M4 13h16M15.5 16H17M7 16h1.5" />
|
||||
<path d="M6 19.5V21a1 1 0 0 0 1 1h1.5a1 1 0 0 0 1-1v-1M18 19.5V21a1 1 0 0 1-1 1h-1.5a1 1 0 0 1-1-1v-1" />
|
||||
<path d="M20 9h1a1 1 0 0 1 1 1v1a1 1 0 0 1-.4.8L20 13M4 9H3a1 1 0 0 0-1 1v1a1 1 0 0 0 .4.8L4 13M19.5 5h-15" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Scheduling",
|
||||
description: "Coordinate departures, routes, vehicles, drivers and staff.",
|
||||
icon: (
|
||||
<>
|
||||
<path d="M2 12c0-3.77 0-5.66 1.17-6.83C4.34 4 6.23 4 10 4h4c3.77 0 5.66 0 6.83 1.17C22 6.34 22 8.23 22 12v2c0 3.77 0 5.66-1.17 6.83C19.66 22 17.77 22 14 22h-4c-3.77 0-5.66 0-6.83-1.17C2 19.66 2 17.77 2 14z" />
|
||||
<path d="M7 4V2.5M17 4V2.5M2.5 9h19" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Driver Management",
|
||||
description: "Assign drivers and keep operational information connected.",
|
||||
icon: (
|
||||
<>
|
||||
<path d="M8 9v6M12 9v6" />
|
||||
<path d="M8 12h5c.93 0 1.4 0 1.77-.15.49-.2.88-.6 1.08-1.09.15-.37.15-.83.15-1.76" />
|
||||
<rect x="2" y="2" width="20" height="20" rx="5" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Staff Assignment",
|
||||
description: "Coordinate teams across tours, transportation services and daily operations.",
|
||||
icon: (
|
||||
<>
|
||||
<circle cx="9" cy="6" r="4" />
|
||||
<path d="M15 9c1.66 0 3-1.34 3-3s-1.34-3-3-3" />
|
||||
<ellipse cx="9" cy="17" rx="7" ry="4" />
|
||||
<path d="M18 14c1.75.38 3 1.36 3 2.5 0 1.03-1.01 1.92-2.5 2.37" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Pickup Management",
|
||||
description: "Manage pickup locations, times, passenger information and communications.",
|
||||
icon: (
|
||||
<>
|
||||
<circle cx="12" cy="12" r="3" />
|
||||
<path d="M13.77 2.15C13.4 2 12.93 2 12 2s-1.4 0-1.77.15a2.4 2.4 0 0 0-1.08 1.08c-.09.22-.13.48-.14.86a1.8 1.8 0 0 1-.91 1.5c-.48.28-1.07.27-1.56 0-.34-.18-.58-.27-.82-.3-.53-.07-1.06.07-1.48.4-.31.24-.55.65-1.01 1.45-.47.81-.7 1.21-.75 1.61-.07.53.07 1.06.4 1.48.14.19.35.35.67.55.47.3.77.8.77 1.36 0 .56-.3 1.06-.77 1.36-.32.2-.53.36-.67.55-.32.42-.46.95-.4 1.48.05.4.28.8.75 1.6.46.8.69 1.21 1 1.45.42.32.95.46 1.48.4.24-.03.48-.13.82-.3.49-.27 1.08-.27 1.56 0 .48.28.77.8.79 1.36.01.38.05.64.14.86.2.5.6.88 1.08 1.08.37.15.83.15 1.77.15.93 0 1.4 0 1.77-.15a2.4 2.4 0 0 0 1.08-1.08c.09-.22.13-.48.14-.86a1.8 1.8 0 0 1 .91-1.5c.48-.28 1.07-.27 1.56 0 .34.18.58.27.82.3.53.07 1.06-.07 1.48-.4.31-.24.55-.65 1-1.45.47-.8.7-1.21.75-1.6a1.9 1.9 0 0 0-.4-1.48c-.14-.19-.35-.35-.67-.55A1.6 1.6 0 0 1 19.56 12c0-.56.3-1.06.77-1.36.32-.2.53-.36.67-.55.32-.42.46-.95.4-1.48-.05-.4-.28-.8-.75-1.6-.46-.8-.69-1.21-1-1.45a1.9 1.9 0 0 0-1.48-.4c-.24.03-.48.12-.82.3-.49.27-1.08.28-1.56 0a1.8 1.8 0 0 1-.91-1.5c-.01-.38-.05-.64-.14-.86a2.4 2.4 0 0 0-1.08-1.08z" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Operational Alerts",
|
||||
description: "Identify issues and exceptions before they become problems.",
|
||||
icon: (
|
||||
<>
|
||||
<path d="M5.31 10.76C8.23 5.59 9.69 3 12 3s3.77 2.59 6.69 7.76l.36.65c2.43 4.3 3.64 6.45 2.54 8.02C20.5 21 17.79 21 12.36 21h-.73c-5.43 0-8.14 0-9.23-1.57-1.1-1.57.11-3.72 2.54-8.02z" />
|
||||
<path d="M12 8v5" />
|
||||
<circle cx="12" cy="16" r="1" fill="currentColor" stroke="none" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "Utilization",
|
||||
description: "Understand how your vehicles, staff and capacity are being used.",
|
||||
icon: (
|
||||
<>
|
||||
<path d="M17.41 10.41C18 9.83 18 8.89 18 7s0-2.83-.59-3.41M17.41 10.41C16.83 11 15.89 11 14 11h-4c-1.89 0-2.83 0-3.41-.59M17.41 3.59C16.83 3 15.89 3 14 3h-4C8.11 3 7.17 3 6.59 3.59M6.59 3.59C6 4.17 6 5.11 6 7s0 2.83.59 3.41" />
|
||||
<path d="M13 7a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z" />
|
||||
<path d="M18 6c-1.66 0-3-1.34-3-3M18 8c-1.66 0-3 1.34-3 3M6 6c1.66 0 3-1.34 3-3M6 8c1.66 0 3 1.34 3 3" />
|
||||
<path d="M5 20.39h2.26c1.01 0 2.03.1 3.02.31 1.74.35 3.57.4 5.33.11.87-.14 1.72-.36 2.49-.73.7-.34 1.55-.81 2.12-1.34.57-.53 1.17-1.4 1.59-2.08.36-.58.19-1.29-.39-1.73-.64-.48-1.58-.48-2.22 0l-1.8 1.36c-.7.53-1.47 1.02-2.38 1.16a4 4 0 0 1-.34.03m-1.92.01c.68.07 1.29.05 1.81 0l.11-.01m0 0c.15-.03.29-.12.43-.24.64-.56.68-1.5.12-2.13a2.7 2.7 0 0 0-.45-.4c-2.8-1.67-7.15-.4-9.78 1.46" />
|
||||
<rect x="2" y="14" width="3" height="8" rx="1.5" />
|
||||
</>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
function FeatureIcon({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="#0160d4" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" aria-hidden className="size-6 shrink-0">
|
||||
{children}
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
|
||||
function FeatureCard({ f }: { f: Feature }) {
|
||||
return (
|
||||
<div className="group flex h-full flex-col justify-center gap-2 rounded-3xl border border-[#0160d4]/12 bg-white px-6 py-4 transition-all duration-300 hover:-translate-y-1 hover:border-transparent hover:shadow-lg">
|
||||
<FeatureIcon>{f.icon}</FeatureIcon>
|
||||
<h3 className="text-xl font-medium text-foreground">{f.title}</h3>
|
||||
<p className="text-sm leading-relaxed text-foreground/70">{f.description}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function TourOperations() {
|
||||
return (
|
||||
<section className="relative overflow-hidden py-20 lg:py-28">
|
||||
<div className="mx-auto grid max-w-6xl gap-12 px-4 sm:px-6 lg:grid-cols-[7fr_5fr] lg:gap-16">
|
||||
<Reveal className="order-2 flex flex-col gap-8 lg:order-1">
|
||||
<div className="flex flex-col gap-6">
|
||||
<h2 className="text-4xl font-medium tracking-tight text-foreground sm:text-5xl">
|
||||
Tour Operations & Fleet Management Software
|
||||
</h2>
|
||||
<span className="w-fit items-center rounded-2xl bg-[#0160D4]/10 px-4 py-3 font-bold text-[#0160D4] text-xl">
|
||||
From Booking to Operation. Automatically{" "}
|
||||
<em className="font-normal italic">Connected</em>.
|
||||
</span>
|
||||
<p className="max-w-xl text-sm text-muted sm:text-base">
|
||||
Know exactly what's happening across your business with
|
||||
connected scheduling, fleet, driver, staff and pickup management.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid gap-4 sm:grid-cols-2">
|
||||
{features.map((f, i) => (
|
||||
<Reveal key={f.title} delay={i * 80}>
|
||||
<FeatureCard f={f} />
|
||||
</Reveal>
|
||||
))}
|
||||
<Reveal
|
||||
delay={features.length * 80}
|
||||
className="flex flex-col items-center justify-center gap-4 rounded-3xl border border-[#0160d4]/12 bg-white px-6 py-4 text-center"
|
||||
>
|
||||
<p className="text-xl font-medium text-foreground">
|
||||
Lets see the
|
||||
</p>
|
||||
<ButtonLink href="#operations">Operations</ButtonLink>
|
||||
</Reveal>
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
<Reveal
|
||||
delay={120}
|
||||
className="order-1 mx-auto w-full max-w-sm lg:order-2 lg:mx-0"
|
||||
>
|
||||
<Image
|
||||
src="/tourOperationPhone.png"
|
||||
alt="VOYAGER mobile app showing today's revenue, bookings, departures, vehicles operating and staff assigned"
|
||||
width={400}
|
||||
height={520}
|
||||
sizes="(min-width: 1024px) 380px, 70vw"
|
||||
className="h-auto w-full object-contain transition-transform duration-500 hover:-translate-y-1"
|
||||
/>
|
||||
</Reveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user