- Per-page titles, descriptions, canonicals, Open Graph/Twitter tags via a shared pageMetadata() helper; metadataBase on the root layout - Sitemap generated from a route list on the canonical non-www host; robots.txt points to it; /services removed - One H1 per page; decorative images get empty alt text - JSON-LD: site-wide ComputerRepairService, FAQPage on the homepage, Service on each service page - FAQ answers are now server-rendered (forceMount) so the schema matches the HTML; fixed the nested payment FAQ item - Drop web design (page, nav link, homepage card and FAQs); 301 the old URL - Remove GA, Facebook Pixel and Vercel Analytics/Speed Insights - Fix tel: links (+640211... -> +64211...) - Add og-image.png and logo.png Co-Authored-By: Claude Opus 5.5 <[email protected]>
39 lines
1.0 KiB
JavaScript
39 lines
1.0 KiB
JavaScript
import localFont from "next/font/local";
|
|
import "./globals.css";
|
|
import Navbar from "./components/Navbar";
|
|
import Footer from "./components/Footer";
|
|
import ChatwootWidget from "./components/ChatwootWidget";
|
|
import JsonLd from "./components/JsonLd";
|
|
import { SITE_URL, business, localBusinessSchema } from "@/lib/site";
|
|
|
|
const geistSans = localFont({
|
|
src: "./fonts/GeistVF.woff",
|
|
variable: "--font-geist-sans",
|
|
weight: "100 900",
|
|
});
|
|
const geistMono = localFont({
|
|
src: "./fonts/GeistMonoVF.woff",
|
|
variable: "--font-geist-mono",
|
|
weight: "100 900",
|
|
});
|
|
|
|
// Pages set their own title, description and canonical via pageMetadata().
|
|
export const metadata = {
|
|
metadataBase: new URL(SITE_URL),
|
|
title: business.name,
|
|
};
|
|
|
|
export default function RootLayout({ children }) {
|
|
return (
|
|
<html lang="en-NZ">
|
|
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
|
<JsonLd data={localBusinessSchema()} />
|
|
<ChatwootWidget />
|
|
<Navbar />
|
|
{children}
|
|
<Footer />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|