TypeScript 50.6%
JavaScript 46.1%
SQL 2.1%
Shell 0.6%
CSS 0.5%
1import type { Metadata, Viewport } from "next";2import { Inter } from "next/font/google";3import "./globals.css";4import { dbAvailable, meta } from "@/lib/db";5import { SiteHeader } from "@/components/site-header";6import { SiteFooter } from "@/components/site-footer";7import { MobileNav } from "@/components/mobile-nav";89const inter = Inter({ subsets: ["latin"], variable: "--font-inter", display: "swap" });1011export async function generateMetadata(): Promise<Metadata> {12 const n = dbAvailable() ? Number(meta("listings_sale")) + Number(meta("listings_rent")) : 0;13 const count = n ? `${n.toLocaleString("fr-CA")} propriétés à vendre et à louer au Québec` : "Propriétés à vendre et à louer au Québec";14 return {15 metadataBase: new URL("https://www.toveli.ca"),16 title: { default: `Toveli — ${count}`, template: "%s · Toveli" },17 description: `${count}, réunies en un seul endroit : annonces, carte, estimation de valeur avec fourchette et confiance, comparables, marché, financement.`,18 applicationName: "Toveli",19 openGraph: { type: "website", locale: "fr_CA", siteName: "Toveli", url: "https://www.toveli.ca", title: `Toveli — ${count}`, description: "L'immobilier, enfin réuni. Acheter, louer, estimer, comparer, financer." },20 twitter: { card: "summary_large_image" },21 robots: { index: true, follow: true },22 };23}2425export const viewport: Viewport = { themeColor: "#e0263c", width: "device-width", initialScale: 1 };2627export default function RootLayout({ children }: { children: React.ReactNode }) {28 return (29 <html lang="fr-CA" className={inter.variable}>30 <body className="min-h-dvh flex flex-col pb-16 md:pb-0">31 <SiteHeader />32 <main className="flex-1">{children}</main>33 <SiteFooter />34 <MobileNav />35 </body>36 </html>37 );38}39