Axil_Accountants/src/components/sections/home/ProcessSection.tsx
Vadym Samoilenko 28b999b1ae fix: align all CTAs with concept — every CTA leads to contact form
- ProcessSection: 'Get started' href /services → /contact
- BlogPreviewSection: fix invalid <Link> nested inside <Button> (was <button><a>)
- ContactPage: 'Book free consultation' sidebar button now href="#contact-form"
  with matching id on the form element (was unclickable — no href)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 12:51:57 +00:00

101 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import { Phone, Zap, FileCheck, TrendingUp, ArrowUpRight } from 'lucide-react';
import { Button } from '@/components/ui/Button';
import { SpotlightCard } from '@/components/ui/SpotlightCard';
import { FadeIn } from '@/components/ui/FadeIn';
interface ProcessItem {
icon: React.ElementType;
title: string;
description: string;
}
const PROCESS_ITEMS: ProcessItem[] = [
{
icon: Phone,
title: 'Free Consultation',
description:
'Tell us about your business, current finances and goals. No pressure, no commitment — just an honest conversation.',
},
{
icon: Zap,
title: 'Quick Onboarding',
description:
'We migrate your accounts and set up your Axil dashboard in under a week, with zero disruption to your business.',
},
{
icon: FileCheck,
title: 'We Handle Everything',
description:
'Bookkeeping, tax, payroll, VAT — handled every month with zero input from you, filed on time, every time.',
},
{
icon: TrendingUp,
title: 'You Focus on Growth',
description:
'Monthly reports, proactive tax advice, and a dedicated account manager who knows your business inside out.',
},
];
function ProcessCard({ icon: Icon, title, description }: ProcessItem) {
return (
<SpotlightCard
className="group relative w-full cursor-pointer p-6 transition-all duration-300"
glowColor="green"
customSize
>
{/* Decorative connector line — visible on larger screens */}
<div className="group-hover:bg-emerald/60 absolute top-1/2 -left-px hidden h-1/2 w-px -translate-y-1/2 bg-black/8 transition-colors md:block" />
<div className="group-hover:bg-emerald/60 absolute top-0 left-1/2 h-px w-1/2 -translate-x-1/2 bg-black/8 transition-colors md:hidden" />
{/* Icon container */}
<div className="rounded-card bg-bg text-emerald group-hover:bg-emerald mb-4 flex h-12 w-12 items-center justify-center border border-black/8 shadow-sm transition-colors duration-300 group-hover:text-white">
<Icon className="h-6 w-6" />
</div>
<div className="flex flex-col">
<h3 className="font-display text-charcoal mb-1 text-lg font-semibold">{title}</h3>
<p className="text-muted text-sm leading-relaxed">{description}</p>
</div>
</SpotlightCard>
);
}
export function ProcessSection() {
return (
<section className="w-full bg-white py-16 md:py-24">
<div className="mx-auto grid grid-cols-1 gap-12 px-4 sm:px-6 md:grid-cols-3 md:gap-8 lg:gap-16 lg:px-8 xl:max-w-[1440px] xl:px-16">
{/* Left: heading + description + CTA */}
<FadeIn className="flex flex-col items-start justify-center text-center md:col-span-1 md:text-left">
<span className="text-emerald mb-2 text-sm font-semibold tracking-widest uppercase">
How we do it
</span>
<h2 className="font-display text-charcoal mb-4 text-3xl font-bold tracking-tight md:text-4xl">
From sign-up to sorted in days
</h2>
<p className="text-muted mb-6 text-base leading-relaxed">
We&apos;ve made switching accountants effortless. Most clients are fully onboarded
within a week then we handle everything so you never have to think about tax again.
</p>
<Button
size="lg"
href="/contact"
className="transition-transform duration-300 hover:scale-[1.04]"
>
Get started
<ArrowUpRight className="ml-2 h-5 w-5" />
</Button>
</FadeIn>
{/* Right: 2×2 grid of SpotlightCards */}
<div className="grid grid-cols-1 gap-x-8 gap-y-10 sm:grid-cols-2 md:col-span-2">
{PROCESS_ITEMS.map((item, i) => (
<FadeIn key={item.title} delay={i * 0.1}>
<ProcessCard {...item} />
</FadeIn>
))}
</div>
</div>
</section>
);
}