diff --git a/src/app/auth/register/page.tsx b/src/app/auth/register/page.tsx index d3b71b6..0310c3f 100644 --- a/src/app/auth/register/page.tsx +++ b/src/app/auth/register/page.tsx @@ -49,23 +49,25 @@ function RegisterForm() { } return ( -
+
{/* Logo and Welcome */}
-

Join beenvoice

-

+

+ Join beenvoice +

+

Create your account to get started

{/* Registration Form */} - + - + Create Account @@ -75,7 +77,7 @@ function RegisterForm() {
- +
- +
- +
- +
-

+

Must be at least 6 characters

@@ -150,10 +152,12 @@ function RegisterForm() {
- Already have an account? + + Already have an account?{" "} + Sign in here @@ -163,8 +167,10 @@ function RegisterForm() { {/* Features */}
-

Start invoicing like a pro

-
+

+ Start invoicing like a pro +

+
✓ Free to start ✓ No credit card ✓ Cancel anytime @@ -179,15 +185,17 @@ export default function RegisterPage() { return ( +
-

+

Join beenvoice

-

Loading...

+

+ Loading... +

diff --git a/src/app/auth/signin/page.tsx b/src/app/auth/signin/page.tsx index c192228..d5f923d 100644 --- a/src/app/auth/signin/page.tsx +++ b/src/app/auth/signin/page.tsx @@ -42,30 +42,34 @@ function SignInForm() { } return ( -
+
{/* Logo and Welcome */}
-

Welcome back

-

+

+ Welcome back +

+

Sign in to your beenvoice account

{/* Sign In Form */} - + - Sign In + + Sign In +
- +
- +
- + Don't have an account?{" "} Create one now @@ -120,10 +124,10 @@ function SignInForm() { {/* Features */}
-

+

Simple invoicing for freelancers and small businesses

-
+
✓ Easy client management ✓ Professional invoices ✓ Payment tracking @@ -138,15 +142,17 @@ export default function SignInPage() { return ( +
-

+

Welcome back

-

Loading...

+

+ Loading... +

diff --git a/src/app/dashboard/_components/dashboard-components.tsx b/src/app/dashboard/_components/dashboard-components.tsx index 5e1a335..e578211 100644 --- a/src/app/dashboard/_components/dashboard-components.tsx +++ b/src/app/dashboard/_components/dashboard-components.tsx @@ -3,21 +3,26 @@ import { api } from "~/trpc/react"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Button } from "~/components/ui/button"; -import { - Users, - FileText, - TrendingUp, +import { + Users, + FileText, + TrendingUp, Calendar, Plus, - ArrowRight + ArrowRight, } from "lucide-react"; import Link from "next/link"; -import { DashboardStatsSkeleton, DashboardActivitySkeleton } from "~/components/ui/skeleton"; +import { + DashboardStatsSkeleton, + DashboardActivitySkeleton, +} from "~/components/ui/skeleton"; // Client component for dashboard stats export function DashboardStats() { - const { data: clients, isLoading: clientsLoading } = api.clients.getAll.useQuery(); - const { data: invoices, isLoading: invoicesLoading } = api.invoices.getAll.useQuery(); + const { data: clients, isLoading: clientsLoading } = + api.clients.getAll.useQuery(); + const { data: invoices, isLoading: invoicesLoading } = + api.invoices.getAll.useQuery(); if (clientsLoading || invoicesLoading) { return ; @@ -25,8 +30,12 @@ export function DashboardStats() { const totalClients = clients?.length ?? 0; const totalInvoices = invoices?.length ?? 0; - const totalRevenue = invoices?.reduce((sum, invoice) => sum + invoice.totalAmount, 0) ?? 0; - const pendingInvoices = invoices?.filter(invoice => invoice.status === "sent" || invoice.status === "draft").length ?? 0; + const totalRevenue = + invoices?.reduce((sum, invoice) => sum + invoice.totalAmount, 0) ?? 0; + const pendingInvoices = + invoices?.filter( + (invoice) => invoice.status === "sent" || invoice.status === "draft", + ).length ?? 0; // Calculate month-over-month changes (simplified) const lastMonthClients = 0; // This would need historical data @@ -34,62 +43,85 @@ export function DashboardStats() { const lastMonthRevenue = 0; return ( -
- +
+ - Total Clients -
- + + Total Clients + +
+
-
{totalClients}
-

- {totalClients > lastMonthClients ? "+" : ""}{totalClients - lastMonthClients} from last month +

+ {totalClients} +
+

+ {totalClients > lastMonthClients ? "+" : ""} + {totalClients - lastMonthClients} from last month

- - + + - Total Invoices -
- + + Total Invoices + +
+
-
{totalInvoices}
-

- {totalInvoices > lastMonthInvoices ? "+" : ""}{totalInvoices - lastMonthInvoices} from last month +

+ {totalInvoices} +
+

+ {totalInvoices > lastMonthInvoices ? "+" : ""} + {totalInvoices - lastMonthInvoices} from last month

- - + + - Revenue -
- + + Revenue + +
+
-
${totalRevenue.toFixed(2)}
-

- {totalRevenue > lastMonthRevenue ? "+" : ""}{((totalRevenue - lastMonthRevenue) / (lastMonthRevenue || 1) * 100).toFixed(1)}% from last month +

+ ${totalRevenue.toFixed(2)} +
+

+ {totalRevenue > lastMonthRevenue ? "+" : ""} + {( + ((totalRevenue - lastMonthRevenue) / (lastMonthRevenue || 1)) * + 100 + ).toFixed(1)} + % from last month

- - + + - Pending Invoices -
- + + Pending Invoices + +
+
-
{pendingInvoices}
-

+

+ {pendingInvoices} +
+

Due this month

@@ -101,34 +133,34 @@ export function DashboardStats() { // Client component for dashboard cards export function DashboardCards() { return ( -
- +
+ - -
+ +
Manage Clients
-

+

Add new clients and manage your existing client relationships.

- - -
-
+
{/* Client Information Card */}
- + - + Contact Information {/* Basic Info */} -
+
{client.email && (
-
+
-

Email

-

{client.email}

+

+ Email +

+

+ {client.email} +

)} - + {client.phone && (
-
+
-

Phone

-

{client.phone}

+

+ Phone +

+

+ {client.phone} +

)} @@ -99,19 +123,23 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps {(client.addressLine1 ?? client.city ?? client.state) && (
-
+
-

Address

+

+ Address +

-
+
{client.addressLine1 &&

{client.addressLine1}

} {client.addressLine2 &&

{client.addressLine2}

} {(client.city ?? client.state ?? client.postalCode) && (

- {[client.city, client.state, client.postalCode].filter(Boolean).join(", ")} + {[client.city, client.state, client.postalCode] + .filter(Boolean) + .join(", ")}

)} {client.country &&

{client.country}

} @@ -121,12 +149,16 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps {/* Client Since */}
-
+
-

Client Since

-

{formatDate(client.createdAt)}

+

+ Client Since +

+

+ {formatDate(client.createdAt)} +

@@ -135,9 +167,9 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps {/* Stats Card */}
- + - + Invoice Summary @@ -147,17 +179,27 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps

{formatCurrency(totalInvoiced)}

-

Total Invoiced

+

+ Total Invoiced +

- +
-

{paidInvoices}

-

Paid

+

+ {paidInvoices} +

+

+ Paid +

-

{pendingInvoices}

-

Pending

+

+ {pendingInvoices} +

+

+ Pending +

@@ -165,24 +207,38 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps {/* Recent Invoices */} {client.invoices && client.invoices.length > 0 && ( - + - Recent Invoices + + Recent Invoices +
{client.invoices.slice(0, 3).map((invoice) => ( -
+
-

{invoice.invoiceNumber}

-

{formatDate(invoice.issueDate)}

+

+ {invoice.invoiceNumber} +

+

+ {formatDate(invoice.issueDate)} +

-

{formatCurrency(invoice.totalAmount)}

- + {formatCurrency(invoice.totalAmount)} +

+ @@ -200,4 +256,4 @@ export default async function ClientDetailPage({ params }: ClientDetailPageProps
); -} \ No newline at end of file +} diff --git a/src/app/dashboard/invoices/[id]/page.tsx b/src/app/dashboard/invoices/[id]/page.tsx index 7221284..424266e 100644 --- a/src/app/dashboard/invoices/[id]/page.tsx +++ b/src/app/dashboard/invoices/[id]/page.tsx @@ -27,14 +27,14 @@ export default async function InvoicePage({

Invoice Details

-

+

View and manage invoice information.

-
+
@@ -43,7 +43,7 @@ export default async function InvoicePage({ className={`relative z-10 rounded-md px-3 py-2 transition-all duration-200 ${ mode === "view" ? "text-emerald-600" - : "text-gray-600 hover:bg-gray-50 hover:text-gray-800" + : "text-gray-600 hover:bg-gray-50 hover:text-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-300" }`} > @@ -53,7 +53,7 @@ export default async function InvoicePage({ className={`relative z-10 rounded-md px-3 py-2 transition-all duration-200 ${ mode === "edit" ? "text-emerald-600" - : "text-gray-600 hover:bg-gray-50 hover:text-gray-800" + : "text-gray-600 hover:bg-gray-50 hover:text-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-300" }`} > diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index f1a6a07..a92e589 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -16,7 +16,7 @@ export default async function DashboardPage() {

Welcome back, {session?.user?.name?.split(" ")[0] ?? "User"}!

-

+

Here's what's happening with your invoicing business

diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0a04d00..7e907d9 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -8,7 +8,8 @@ import { Toaster } from "~/components/ui/toaster"; export const metadata: Metadata = { title: "beenvoice - Invoicing Made Simple", - description: "Simple and efficient invoicing for freelancers and small businesses", + description: + "Simple and efficient invoicing for freelancers and small businesses", icons: [{ rel: "icon", url: "/favicon.ico" }], }; @@ -21,8 +22,8 @@ export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode }>) { return ( - - + + {children} diff --git a/src/app/page.tsx b/src/app/page.tsx index 344db74..ce727d0 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -23,19 +23,26 @@ import { export default function HomePage() { return ( -
+
{/* Header */} -
+
- + - +
@@ -45,23 +52,33 @@ export default function HomePage() { {/* Hero Section */}
-

+

Simple Invoicing for - Freelancers + + {" "} + Freelancers +

-

+

Create professional invoices, manage clients, and get paid faster with beenvoice. The invoicing app that works as hard as you do.

- - @@ -70,28 +87,30 @@ export default function HomePage() {
{/* Features Section */} -
+
-

+

Everything you need to invoice like a pro

-

+

Powerful features designed for freelancers and small businesses

- + - - Client Management - + + + Client Management + + Keep all your client information organized in one place -
    +
    • Store contact details and addresses @@ -108,16 +127,18 @@ export default function HomePage() { - + - - Professional Invoices - + + + Professional Invoices + + Create beautiful, detailed invoices with line items -
        +
        • Add multiple line items with dates @@ -134,16 +155,18 @@ export default function HomePage() { - + - - Payment Tracking - + + + Payment Tracking + + Monitor invoice status and track payments -
            +
            • Track draft, sent, paid, and overdue status @@ -164,19 +187,21 @@ export default function HomePage() {
{/* Benefits Section */} -
+
-

+

Why choose beenvoice?

- +
-

Lightning Fast

-

+

+ Lightning Fast +

+

Create invoices in seconds, not minutes. Our streamlined interface gets you back to work faster.

@@ -184,12 +209,12 @@ export default function HomePage() {
- +
-

+

Secure & Private

-

+

Your data is encrypted and secure. We never share your information with third parties.

@@ -199,12 +224,12 @@ export default function HomePage() {
- +
-

+

Professional Quality

-

+

Generate invoices that look professional and build trust with your clients.

@@ -212,10 +237,12 @@ export default function HomePage() {
- +
-

Save Time

-

+

+ Save Time +

+

Automated calculations, templates, and client management save you hours every month.

@@ -227,39 +254,49 @@ export default function HomePage() {
{/* CTA Section */} -
+

Ready to get started?

-

+

Join thousands of freelancers who trust beenvoice for their invoicing needs.

- -

+

No credit card required • Cancel anytime

{/* Footer */} -