Property Management Network — Next.js 16 (App Router), Better Auth, Drizzle ORM over PostgreSQL, Stripe, OpenAI, Resend. Includes: - Security hardening: access-control/IDOR fixes, TLS-by-default DB layer, constant-time cron auth, strict security headers, atomic AI quota gating, HTML/email output encoding, demo-backdoor disabled in production. - Superadmin dashboard at /admin (overview/MRR, server-paginated users with ban/impersonate/plan/delete, billing, platform activity + admin audit log, AI usage, system health) via the Better Auth admin plugin. - Seed/migration utility scripts under scripts/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
113 lines
6.5 KiB
TypeScript
113 lines
6.5 KiB
TypeScript
import Link from "next/link"
|
|
import { Building2, CheckCircle2, Smartphone, Bell, FileText, ArrowRight } from "lucide-react"
|
|
|
|
export const metadata = {
|
|
title: "Tenant Portal — Property Management Network",
|
|
description: "Give your tenants a dedicated portal to pay rent, submit maintenance requests, and view lease details.",
|
|
}
|
|
|
|
const FEATURES = [
|
|
{ icon: CheckCircle2, color: "text-emerald-400", bg: "bg-emerald-500/10 border-emerald-500/20", title: "Online Rent Payment", desc: "Tenants pay rent securely via Stripe — card or bank transfer. Auto-receipts sent by email." },
|
|
{ icon: FileText, color: "text-indigo-400", bg: "bg-indigo-500/10 border-indigo-500/20", title: "Lease Documents", desc: "View and download lease agreements, addendums, and move-in checklists anytime." },
|
|
{ icon: Building2, color: "text-violet-400", bg: "bg-violet-500/10 border-violet-500/20", title: "Maintenance Requests", desc: "Submit maintenance issues with photos. Track status from open → in progress → resolved." },
|
|
{ icon: Bell, color: "text-amber-400", bg: "bg-amber-500/10 border-amber-500/20", title: "Smart Notifications", desc: "Rent due reminders, request updates, and landlord messages via email or WhatsApp." },
|
|
{ icon: Smartphone, color: "text-blue-400", bg: "bg-blue-500/10 border-blue-500/20", title: "Mobile Friendly", desc: "Works perfectly on any device — no app download needed, just a secure link." },
|
|
{ icon: FileText, color: "text-rose-400", bg: "bg-rose-500/10 border-rose-500/20", title: "Payment History", desc: "Full history of all payments and receipts. Great for tenant records and disputes." },
|
|
]
|
|
|
|
export default function TenantPortalInfoPage() {
|
|
return (
|
|
<div className="bg-[#09090b] text-white min-h-screen">
|
|
{/* Hero */}
|
|
<div className="relative overflow-hidden pt-32 pb-20">
|
|
<div className="absolute top-0 left-1/2 -translate-x-1/2 h-[400px] w-[700px] rounded-full bg-indigo-600/15 blur-[100px] -z-10" />
|
|
<div className="mx-auto max-w-4xl px-6 text-center">
|
|
<div className="inline-flex items-center gap-2 rounded-full border border-indigo-500/30 bg-indigo-500/10 px-4 py-1.5 text-xs font-medium text-indigo-300 mb-6">
|
|
<span className="h-1.5 w-1.5 rounded-full bg-indigo-400" />
|
|
For Tenants & Landlords
|
|
</div>
|
|
<h1 className="text-3xl sm:text-4xl lg:text-5xl font-bold leading-tight mb-6">
|
|
A dedicated portal<br />
|
|
<span className="bg-gradient-to-r from-indigo-400 via-violet-400 to-indigo-400 bg-clip-text text-transparent">
|
|
your tenants will actually use
|
|
</span>
|
|
</h1>
|
|
<p className="text-lg text-white/50 max-w-2xl mx-auto leading-relaxed mb-10">
|
|
Send tenants a secure link — no account required. They can pay rent, submit maintenance requests,
|
|
and access their lease documents in seconds.
|
|
</p>
|
|
<div className="flex flex-wrap gap-3 justify-center">
|
|
<Link
|
|
href="/signup"
|
|
className="flex items-center gap-2 rounded-xl bg-indigo-600 px-6 py-3 text-sm font-semibold text-white hover:bg-indigo-500 transition-all hover:shadow-lg hover:shadow-indigo-500/25"
|
|
>
|
|
Get started free <ArrowRight className="h-4 w-4" />
|
|
</Link>
|
|
<Link
|
|
href="/login"
|
|
className="flex items-center gap-2 rounded-xl border border-white/10 bg-white/[0.04] px-6 py-3 text-sm font-medium text-white/70 hover:text-white hover:bg-white/[0.08] transition-all"
|
|
>
|
|
Sign in to dashboard
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Features grid */}
|
|
<div className="mx-auto max-w-6xl px-6 pb-24">
|
|
<div className="text-center mb-12">
|
|
<h2 className="text-2xl font-bold text-white sm:text-3xl">Everything tenants need, nothing they don't</h2>
|
|
<p className="mt-3 text-white/40">Clean, fast, and works on any device.</p>
|
|
</div>
|
|
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
|
|
{FEATURES.map((f) => (
|
|
<div key={f.title} className={`rounded-2xl border p-6 ${f.bg} transition-all hover:scale-[1.02]`}>
|
|
<div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-black/20 mb-4`}>
|
|
<f.icon className={`h-5 w-5 ${f.color}`} />
|
|
</div>
|
|
<h3 className="font-semibold text-white mb-2">{f.title}</h3>
|
|
<p className="text-sm text-white/50 leading-relaxed">{f.desc}</p>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
{/* How it works */}
|
|
<div className="border-t border-white/[0.06] py-24">
|
|
<div className="mx-auto max-w-4xl px-6">
|
|
<div className="text-center mb-12">
|
|
<h2 className="text-2xl font-bold text-white sm:text-3xl">How it works</h2>
|
|
</div>
|
|
<div className="grid grid-cols-1 sm:grid-cols-3 gap-6">
|
|
{[
|
|
{ step: "01", title: "Add your tenant", desc: "Enter your tenant's name and email in your Property Management Network dashboard." },
|
|
{ step: "02", title: "Send the link", desc: "Property Management Network generates a secure, unique portal link and emails it automatically." },
|
|
{ step: "03", title: "Tenant accesses portal", desc: "No sign-up needed. Tenant clicks the link and has instant access to their portal." },
|
|
].map((s) => (
|
|
<div key={s.step} className="relative">
|
|
<div className="text-5xl font-black text-white/[0.04] mb-3">{s.step}</div>
|
|
<h3 className="font-semibold text-white mb-2">{s.title}</h3>
|
|
<p className="text-sm text-white/50 leading-relaxed">{s.desc}</p>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* CTA */}
|
|
<div className="border-t border-white/[0.06] py-20">
|
|
<div className="mx-auto max-w-2xl px-6 text-center">
|
|
<h2 className="text-2xl font-bold text-white mb-4">Ready to give tenants a better experience?</h2>
|
|
<p className="text-white/40 mb-8">Free plan includes up to 2 properties and unlimited tenant portal access.</p>
|
|
<Link
|
|
href="/signup"
|
|
className="inline-flex items-center gap-2 rounded-xl bg-indigo-600 px-8 py-3.5 text-sm font-semibold text-white hover:bg-indigo-500 transition-all hover:shadow-lg hover:shadow-indigo-500/25"
|
|
>
|
|
Start for free <ArrowRight className="h-4 w-4" />
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|