diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..a5215d3 Binary files /dev/null and b/public/logo.png differ diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx index 22b332d..9036a1f 100644 --- a/src/app/(auth)/layout.tsx +++ b/src/app/(auth)/layout.tsx @@ -1,10 +1,63 @@ "use client"; +import Image from "next/image"; +import Link from "next/link"; + export default function AuthLayout({ children }: { children: React.ReactNode }) { return ( -
-
- {children} +
+ {/* Left brand panel — hidden on mobile */} +
+ {/* Decorative blurs */} +
+
+ + {/* Subtle grid */} +
+ +
+ + Casera + + Casera + + +
+ +
+

+ Home maintenance,
+ simplified. +

+

+ Track tasks, organize contractors, and store important + documents — all in one place built for homeowners. +

+
+ +

+ © {new Date().getFullYear()} Casera +

+
+ + {/* Right form area */} +
+
+ {children} +
); diff --git a/src/app/app/contractors/page.tsx b/src/app/app/contractors/page.tsx index 3d7eaf9..181f95c 100644 --- a/src/app/app/contractors/page.tsx +++ b/src/app/app/contractors/page.tsx @@ -104,9 +104,9 @@ export default function ContractorsPage() { return (
router.push(`${basePath}/contractors/new`)} > + +
+ {[ + { + icon: CheckSquare, + title: "Track tasks", + body: "Repairs, maintenance, projects — all in one place.", + }, + { + icon: HardHat, + title: "Save your pros", + body: "Never lose a good contractor\u2019s number again.", + }, + { + icon: FileText, + title: "Store documents", + body: "Warranties, manuals, receipts — easy to find.", + }, + ].map((tip) => ( +
+ +

{tip.title}

+

+ {tip.body} +

+
+ ))} +
+
+ ); + } + + /* ─── Main dashboard ─── */ + return ( +
+ {/* Greeting */} +
+

+ {greeting} +

+ {statusMsg && ( +

{statusMsg}

+ )} +
+ + {/* Your Homes — the main content */} +
+
+

Your Homes

+ + + Add + +
+ +
+ {homes.map((home) => ( + + ))} +
+
+ + {/* Coming Up — clean task list */} + + + {/* Quick actions — subtle pills at the bottom */} +
); } diff --git a/src/app/app/residences/page.tsx b/src/app/app/residences/page.tsx index 2e0fe47..39e10a0 100644 --- a/src/app/app/residences/page.tsx +++ b/src/app/app/residences/page.tsx @@ -19,9 +19,9 @@ export default function ResidencesPage() { return (
router.push(`${basePath}/residences/new`)} /> @@ -37,9 +37,9 @@ export default function ResidencesPage() { {!isLoading && !error && Array.isArray(residences) && residences.length === 0 && ( router.push(`${basePath}/residences/new`)} /> )} diff --git a/src/app/app/settings/layout.tsx b/src/app/app/settings/layout.tsx index 84fcaa4..541fd6a 100644 --- a/src/app/app/settings/layout.tsx +++ b/src/app/app/settings/layout.tsx @@ -21,17 +21,21 @@ export default function SettingsLayout({ children }: { children: React.ReactNode return (
-

Settings

+
+

Settings

+

Manage your account preferences.

+
-
); diff --git a/src/components/residences/residence-card.tsx b/src/components/residences/residence-card.tsx index 69a45af..ab27e9a 100644 --- a/src/components/residences/residence-card.tsx +++ b/src/components/residences/residence-card.tsx @@ -3,7 +3,6 @@ import Link from "next/link"; import { MapPin } from "lucide-react"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { useDataProvider } from "@/lib/demo/data-provider-context"; import type { MyResidenceResponse } from "@/lib/api/residences"; @@ -21,36 +20,36 @@ export function ResidenceCard({ data }: ResidenceCardProps) { .join(", "); return ( - - - - {residence.name} + +
+
+

+ {residence.name} +

{address && ( -
+
)} - - -
- {task_summary.overdue > 0 && ( - - {task_summary.overdue} overdue - - )} - {task_summary.due_soon > 0 && ( - - {task_summary.due_soon} due soon - - )} - - {task_summary.total} {task_summary.total === 1 ? "task" : "tasks"} +
+
+ {task_summary.overdue > 0 && ( + + {task_summary.overdue} overdue -
-
- + )} + {task_summary.due_soon > 0 && ( + + {task_summary.due_soon} due soon + + )} + + {task_summary.total} {task_summary.total === 1 ? "task" : "tasks"} + +
+
); } diff --git a/src/components/shared/empty-state.tsx b/src/components/shared/empty-state.tsx index f936133..a595105 100644 --- a/src/components/shared/empty-state.tsx +++ b/src/components/shared/empty-state.tsx @@ -11,12 +11,16 @@ interface EmptyStateProps { export function EmptyState({ icon: Icon, title, description, actionLabel, onAction }: EmptyStateProps) { return ( -
-
-

{title}

-

{description}

+
+
+ +
+

{title}

+

{description}

{actionLabel && onAction && ( - + )}
); diff --git a/src/components/shared/error-banner.tsx b/src/components/shared/error-banner.tsx index 8cc7f27..e5095b1 100644 --- a/src/components/shared/error-banner.tsx +++ b/src/components/shared/error-banner.tsx @@ -9,10 +9,12 @@ interface ErrorBannerProps { export function ErrorBanner({ message = "Something went wrong. Please try again.", onRetry }: ErrorBannerProps) { return ( -
-