anything-vs-anything/src/app/layout.tsx
2025-07-03 00:34:50 +08:00

125 lines
4.0 KiB
TypeScript

import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
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 = {
title: "Anything vs Anything - AI-Powered Comparison Tool",
description: "Compare any two things with our AI-powered analysis tool. Get detailed comparisons of products, services, concepts, and more. Free online comparison generator with intelligent insights.",
keywords: "comparison tool, AI comparison, product comparison, service comparison, vs tool, compare anything, analysis tool, decision making",
authors: [{ name: "Anything vs Anything" }],
creator: "Anything vs Anything",
publisher: "Anything vs Anything",
formatDetection: {
email: false,
address: false,
telephone: false,
},
metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL || 'https://anything-vs-anything.com'),
alternates: {
canonical: '/',
},
openGraph: {
title: "Anything vs Anything - AI-Powered Comparison Tool",
description: "Compare any two things with our AI-powered analysis tool. Get detailed comparisons of products, services, concepts, and more.",
url: '/',
siteName: "Anything vs Anything",
locale: 'en_US',
type: 'website',
images: [
{
url: '/og-image.png',
width: 1200,
height: 630,
alt: 'Anything vs Anything - AI Comparison Tool',
},
],
},
twitter: {
card: 'summary_large_image',
title: "Anything vs Anything - AI-Powered Comparison Tool",
description: "Compare any two things with our AI-powered analysis tool. Get detailed comparisons of products, services, concepts, and more.",
images: ['/og-image.png'],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
verification: {
google: process.env.GOOGLE_SITE_VERIFICATION,
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#3B82F6" />
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Anything vs Anything",
"description": "AI-powered comparison tool that helps you compare any two things with detailed analysis and insights",
"url": process.env.NEXT_PUBLIC_SITE_URL || "https://anything-vs-anything.com",
"applicationCategory": "Utility",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"author": {
"@type": "Organization",
"name": "Anything vs Anything"
}
})
}}
/>
<script defer src="https://umami.frytea.com/script.js" data-website-id="9d16d648-a83d-4616-94d6-ec3bb1f8e0b7"></script>
<script
src="https://rybbit.frytea.com/api/script.js"
data-site-id="13"
defer
></script>
<script
async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7296634171837358"
crossOrigin="anonymous"
></script>
</head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
</body>
</html>
);
}