2026-06-23 20:36:07 -04:00
|
|
|
|
import type { Metadata } from "next"
|
|
|
|
|
|
import { Geist, Geist_Mono } from "next/font/google"
|
2026-07-02 13:42:34 -04:00
|
|
|
|
import { Toaster } from "@/components/ui/toaster"
|
|
|
|
|
|
import { UmamiAnalytics } from "@/components/analytics/umami"
|
2026-06-23 20:36:07 -04:00
|
|
|
|
import "./globals.css"
|
|
|
|
|
|
|
|
|
|
|
|
const geistSans = Geist({
|
|
|
|
|
|
variable: "--font-geist-sans",
|
|
|
|
|
|
subsets: ["latin"],
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
const geistMono = Geist_Mono({
|
|
|
|
|
|
variable: "--font-geist-mono",
|
|
|
|
|
|
subsets: ["latin"],
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
export const metadata: Metadata = {
|
2026-07-02 13:42:34 -04:00
|
|
|
|
metadataBase: new URL(process.env.NEXT_PUBLIC_APP_URL ?? "https://propertymanagement.network"),
|
|
|
|
|
|
applicationName: "Property Management Network",
|
2026-06-23 20:36:07 -04:00
|
|
|
|
title: {
|
|
|
|
|
|
default: "Property Management Network — Built for Independent Landlords",
|
|
|
|
|
|
template: "%s | Property Management Network",
|
|
|
|
|
|
},
|
|
|
|
|
|
description:
|
|
|
|
|
|
"Manage your rental properties, tenants, rent, maintenance, and leases from one dashboard. Built for independent landlords with 1–20 properties.",
|
|
|
|
|
|
keywords: ["property management", "landlord software", "rent tracker", "tenant management"],
|
|
|
|
|
|
openGraph: {
|
|
|
|
|
|
title: "Property Management Network — Built for Independent Landlords",
|
|
|
|
|
|
description: "One dashboard to manage all your rental properties.",
|
|
|
|
|
|
type: "website",
|
2026-07-02 13:42:34 -04:00
|
|
|
|
url: "/",
|
|
|
|
|
|
siteName: "Property Management Network",
|
|
|
|
|
|
locale: "en_US",
|
|
|
|
|
|
},
|
|
|
|
|
|
twitter: {
|
|
|
|
|
|
card: "summary_large_image",
|
|
|
|
|
|
title: "Property Management Network — Built for Independent Landlords",
|
|
|
|
|
|
description: "One dashboard to manage all your rental properties.",
|
|
|
|
|
|
creator: "@propertymgmtnet",
|
|
|
|
|
|
site: "@propertymgmtnet",
|
|
|
|
|
|
},
|
|
|
|
|
|
robots: {
|
|
|
|
|
|
index: true,
|
|
|
|
|
|
follow: true,
|
|
|
|
|
|
googleBot: {
|
|
|
|
|
|
index: true,
|
|
|
|
|
|
follow: true,
|
|
|
|
|
|
"max-image-preview": "large",
|
|
|
|
|
|
"max-snippet": -1,
|
|
|
|
|
|
"max-video-preview": -1,
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
verification: {
|
|
|
|
|
|
// Set GOOGLE_SITE_VERIFICATION in the environment to emit the
|
|
|
|
|
|
// <meta name="google-site-verification"> tag. Left undefined => tag omitted.
|
|
|
|
|
|
google: process.env.GOOGLE_SITE_VERIFICATION,
|
2026-06-23 20:36:07 -04:00
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default function RootLayout({
|
|
|
|
|
|
children,
|
|
|
|
|
|
}: Readonly<{
|
|
|
|
|
|
children: React.ReactNode
|
|
|
|
|
|
}>) {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<html
|
|
|
|
|
|
lang="en"
|
|
|
|
|
|
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
|
|
|
|
|
|
>
|
|
|
|
|
|
<body suppressHydrationWarning className="min-h-full flex flex-col bg-[#09090b] text-white">
|
|
|
|
|
|
{children}
|
2026-07-02 13:42:34 -04:00
|
|
|
|
<Toaster />
|
|
|
|
|
|
<UmamiAnalytics />
|
2026-06-23 20:36:07 -04:00
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|