"use client" import Link from "next/link" import { motion, animate, useMotionValue, useInView } from "framer-motion" import { ArrowRight, Building2, Wrench, CheckCircle2, Bell } from "lucide-react" import { useRef, useEffect } from "react" // ── Animated counter ───────────────────────────────────────────── function Counter({ to, prefix = "", suffix = "" }: { to: number; prefix?: string; suffix?: string }) { const ref = useRef(null) const inView = useInView(ref, { once: true, margin: "-80px" }) useEffect(() => { if (!inView) return const ctrl = animate(0, to, { duration: 2, ease: "easeOut", onUpdate: (v) => { if (ref.current) { ref.current.textContent = prefix + Math.floor(v).toLocaleString() + suffix } }, }) return ctrl.stop }, [inView, to, prefix, suffix]) return {prefix}0{suffix} } // ── Word-by-word text reveal ───────────────────────────────────── function WordReveal({ text, className = "", delay = 0 }: { text: string; className?: string; delay?: number }) { const words = text.split(" ") return ( {words.map((word, i) => ( {word} ))} ) } // ── Gradient border CTA button ─────────────────────────────────── function GradientBorderBtn({ href, children }: { href: string; children: React.ReactNode }) { return (
{children}
) } // ── Mini dashboard mockup ──────────────────────────────────────── const DASHBOARD_CARDS = [ { label: "Rent collected", value: "$12,400", sub: "This month", color: "text-emerald-400", dot: "bg-emerald-400" }, { label: "Open requests", value: "3", sub: "Maintenance", color: "text-amber-400", dot: "bg-amber-400" }, { label: "Occupancy", value: "94%", sub: "12/13 units", color: "text-indigo-400", dot: "bg-indigo-400" }, ] const STATS = [ { prefix: "", to: 200, suffix: "+", label: "Active landlords" }, { prefix: "", to: 5000, suffix: "+", label: "Units managed" }, { prefix: "$", to: 2, suffix: "M+", label: "Rent tracked / mo" }, { prefix: "", to: 98, suffix: "%", label: "Collection rate" }, ] function DashboardMockup() { return (
{/* Browser chrome */}
app.propertymanagement.network/dashboard

Good morning 👋

Dashboard Overview

2 alerts
{DASHBOARD_CARDS.map((c) => (
{c.label}

{c.value}

{c.sub}

))}

Recent Payments

{[ { name: "Sarah J.", amount: "$1,800", status: "paid", color: "text-emerald-400 bg-emerald-500/10" }, { name: "Marcus L.", amount: "$1,350", status: "overdue", color: "text-red-400 bg-red-500/10" }, { name: "Priya P.", amount: "$2,200", status: "pending", color: "text-amber-400 bg-amber-500/10" }, ].map((row) => (
{row.name[0]}
{row.name}
{row.amount} {row.status}
))}
{/* Floating cards */}
Rent received

$1,800

Unit 1A · Sarah J.

New request

Leaking faucet

Unit 2B · 2 min ago

) } // ── Hero ────────────────────────────────────────────────────────── export function Hero() { return (
{/* Aurora background */}
{/* Grid */}
{/* Noise */}
{/* Left — copy */}
{/* Badge */} Trusted by 200+ landlords worldwide {/* Headline with word reveal */}

{" "}

Track rent, manage maintenance, monitor leases, and keep expenses organised — all in one dashboard built for independent landlords. {/* CTAs */} {/* Gradient border primary CTA */}
Start for free
See how it works
{/* Trust signals */} {["Free plan forever", "No credit card required", "Setup in 5 minutes"].map((t) => (
{t}
))}
{/* Animated stats */} {STATS.map(({ prefix, to, suffix, label }) => (

{label}

))}
{/* Right — dashboard mockup */}
) }