import React, { useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Phone, ShieldCheck, Building2, Warehouse, ShoppingBag, Hospital, ChevronRight, Clock, Star, LineChart } from "lucide-react";/** * CCTV Focus UK – Commercial Landing Mock * Brand palette: blue (#1e40af), white (#ffffff), silver/grey (#e5e7eb / #9ca3af) * Sections: * - Sticky header CTA * - Hero with 3-field lead form + callback SLA + trust badges * - Sector grid (Offices, Retail, Warehousing, Healthcare) * - Proof tiles (mini case studies) * - Risk Score micro-commitment (3-question quiz with progress) * - How it works (3 steps) * - Footer CTA * * Notes: * - Pure Tailwind (no external UI deps) + framer-motion for subtle motion * - Form is functional (client-side only) with minimal UX validation */const brand = { blue: "#1e40af", // Tailwind blue-800 silver: "#e5e7eb", // gray-200 silverDark: "#9ca3af", // gray-400 };function StickyCTA() { return ( ); }function TrustBadges() { return (
NSI/SSAIB approved*
Install in 7–14 days
4.9★ Google rating
1,200+ cameras installed
); }function LeadForm({ onSubmit }: { onSubmit: (data: any) => void }) { const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [error, setError] = useState(null);function validate() { if (!name.trim() || !email.trim() || !phone.trim()) { return "Please complete all three fields."; } if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { return "Please enter a valid work email."; } if (!/^[0-9+()\-\s]{7,}$/.test(phone)) { return "Please enter a valid phone number."; } return null; }function handleSubmit(e: React.FormEvent) { e.preventDefault(); const err = validate(); if (err) return setError(err); setError(null); onSubmit({ name, email, phone }); }return (

Get my free risk survey (takes 20s)

We’ll call within 15 minutes (Mon–Fri 8–6).

setName(e.target.value)} className="mt-1 w-full rounded-xl border border-gray-300 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-700" placeholder="Your name" />
setEmail(e.target.value)} className="mt-1 w-full rounded-xl border border-gray-300 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-700" placeholder="name@company.com" />
setPhone(e.target.value)} className="mt-1 w-full rounded-xl border border-gray-300 px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-700" placeholder="Mobile or landline" />
{error &&
{error}
}
By continuing you agree to our privacy policy. We never sell your data.
); }function SectorGrid() { const sectors = [ { title: "Offices", icon: Building2, points: ["Visitor & car park monitoring", "GDPR-compliant retention", "Staff safety"] }, { title: "Retail", icon: ShoppingBag, points: ["Reduce shrinkage", "HD evidence for incidents", "Lone-worker support"] }, { title: "Warehousing", icon: Warehouse, points: ["Perimeter & loading bay", "ANPR for gates", "Health & safety"] }, { title: "Healthcare", icon: Hospital, points: ["CQC-compliant oversight", "Restricted areas", "Incident review tools"] }, ]; return (
{sectors.map(({ title, icon: Icon, points }) => (

{title}

    {points.map(p =>
  • {p}
  • )}
Book a risk survey
))}
); }function ProofTiles() { const tiles = [ { kpi: "-32%", label: "shrinkage in 90 days", blurb: "Regional retail chain after camera reposition & analytics." }, { kpi: "6.5 mo", label: "ROI payback", blurb: "Warehouse gate ANPR + perimeter alerts." }, { kpi: "4.9★", label: "Google rating", blurb: "Consistent aftercare & remote support." }, ]; return (
{tiles.map(t => (
{t.kpi}
{t.label}

{t.blurb}

))}
); }function HowItWorks() { const steps = [ { n: 1, title: "Site survey", copy: "Engineer visit or video walk-through to assess risks & coverage." }, { n: 2, title: "Plan & quote", copy: "You’ll receive a clear plan, camera map & price range." }, { n: 3, title: "Install & aftercare", copy: "Certified install, training, and ongoing monitoring options." }, ]; return (

How it works

{steps.map(s => (
Step {s.n}
{s.title}

{s.copy}

))}
); }function ProgressBar({ step }: { step: number }) { const pct = (step / 3) * 100; return (
); }function RiskScoreModal({ open, onClose, prefill }: { open: boolean; onClose: () => void; prefill: any }) { const [step, setStep] = useState(1); const [answers, setAnswers] = useState({ siteType: "", camsOnSite: "", pain: "" });function next() { setStep(s => Math.min(3, s + 1)); } function back() { setStep(s => Math.max(1, s - 1)); }function done() { // In production: submit answers + prefill to backend; then route to calendar onClose(); alert(`Thanks ${prefill?.name || ""}! Step 1/3 complete. We’ll tailor your plan next.`); }return ( {open && (

Quick Risk Score

{step === 1 && (
{["Office","Retail","Warehouse","Healthcare","Other"].map(o => ( ))}
)} {step === 2 && (
{["Yes","No"].map(o => ( ))}
)} {step === 3 && (
setAnswers(a=>({...a, pain:e.target.value}))} className="w-full rounded-xl border border-gray-300 px-3 py-2" placeholder="e.g., theft in loading bay, vandalism, health & safety" />
)}
Step {step} of 3
{step < 3 ? ( ) : ( )}
)}
); }export default function App() { const [modalOpen, setModalOpen] = useState(false); const [prefill, setPrefill] = useState({});function handleLeadSubmit(data: any) { setPrefill(data); setModalOpen(true); // Kick off the Risk Score quiz (FITD + endowed progress) }return (
{/* HERO */}
{/* HERO CONTENT */}

Stop shrinkage & safety incidents before they start.

Enterprise-grade CCTV for Offices, Retail, Warehousing & Healthcare — designed, installed and maintained across the West Midlands.

{/* SECTORS */}

Solutions by sector

{/* PROOF */}

Results our clients care about

{/* HOW IT WORKS */}
{/* FOOTER CTA */}
Ready for a tailored plan?
Book a free risk survey — we’ll call within 15 minutes (Mon–Fri 8–6).
Get my risk survey
setModalOpen(false)} prefill={prefill} />
); }