Files
beenvoice-web/src/app/page.tsx
T
soconnor 0e46fdafb2 feat: add administration page and account role management
- Implemented `AdministrationContent` component for managing account roles.
- Created `AdministrationPage` to serve as the main entry point for administration tasks.
- Added PDF preview functionality with `PdfPreviewFrame` component for invoice generation.
- Introduced `InputColor` component for advanced color selection with various formats.
- Established color conversion utilities in `color-converter.ts` for handling color formats.
- Defined appearance-related schemas and types in `appearance.ts` for consistent theme management.
2026-04-30 10:50:50 -04:00

109 lines
4.2 KiB
TypeScript

import Link from "next/link";
import { ArrowRight, FileText, UserRound } from "lucide-react";
import { AuthRedirect } from "~/components/AuthRedirect";
import { Logo } from "~/components/branding/logo";
import { Button } from "~/components/ui/button";
import { env } from "~/env";
import { brand } from "~/lib/branding";
export default function HomePage() {
const allowRegistration = env.DISABLE_SIGNUPS !== true;
return (
<main className="bg-background text-foreground min-h-screen">
<AuthRedirect />
<div className="mx-auto flex min-h-screen w-full max-w-5xl flex-col px-5 py-5 sm:px-6 lg:px-8">
<header className="flex items-center justify-between gap-4 border-b py-4">
<Logo animated={false} />
<nav className="flex items-center gap-2">
<Link href="/auth/signin">
<Button variant="ghost" size="sm">
Sign in
</Button>
</Link>
{allowRegistration && (
<Link href="/auth/register">
<Button size="sm">Create account</Button>
</Link>
)}
</nav>
</header>
<section className="grid flex-1 items-center gap-10 py-14 md:grid-cols-[1fr_320px] md:py-20">
<div className="max-w-2xl space-y-7">
<div className="space-y-4">
<p className="text-muted-foreground text-sm font-medium">
Personal invoicing
</p>
<h1 className="font-heading text-4xl leading-tight font-bold tracking-normal sm:text-5xl">
{brand.name} is a place to make and track invoices.
</h1>
<p className="text-muted-foreground max-w-xl text-base leading-7 sm:text-lg">
Built for one person managing real clients, real work, and the
small admin loop around getting paid.
</p>
</div>
<div className="flex flex-col gap-3 sm:flex-row">
<Link href="/auth/signin">
<Button size="lg" className="h-11 px-5">
Open workspace
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</Link>
{allowRegistration && (
<Link href="/auth/register">
<Button variant="outline" size="lg" className="h-11 px-5">
Create account
</Button>
</Link>
)}
</div>
</div>
<div className="border-border bg-card text-card-foreground rounded-xl border p-5 shadow-sm">
<div className="space-y-5">
<div className="flex items-start gap-3">
<div className="bg-primary/10 text-primary rounded-md p-2">
<UserRound className="h-4 w-4" />
</div>
<div>
<h2 className="text-sm font-semibold">Clients</h2>
<p className="text-muted-foreground mt-1 text-sm leading-6">
Keep the people and businesses you invoice in one place.
</p>
</div>
</div>
<div className="flex items-start gap-3 border-t pt-5">
<div className="bg-primary/10 text-primary rounded-md p-2">
<FileText className="h-4 w-4" />
</div>
<div>
<h2 className="text-sm font-semibold">Invoices</h2>
<p className="text-muted-foreground mt-1 text-sm leading-6">
Draft, send, mark paid, and export the PDF when you need it.
</p>
</div>
</div>
</div>
</div>
</section>
<footer className="text-muted-foreground flex flex-col gap-3 border-t py-5 text-sm sm:flex-row sm:items-center sm:justify-between">
<span>© 2026 {brand.name}</span>
<div className="flex gap-5">
<Link href="/privacy" className="hover:text-foreground">
Privacy
</Link>
<Link href="/terms" className="hover:text-foreground">
Terms
</Link>
</div>
</footer>
</div>
</main>
);
}