86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import type { Metadata } from 'next';
|
|
import Script from "next/script";
|
|
import { Suspense } from 'react';
|
|
import '@/styles/globals.css';
|
|
import { Providers } from '@/components/Providers';
|
|
import AdSenseScript from '@/components/ads/AdSenseScript';
|
|
import FacebookPixel from '@/components/analytics/FacebookPixel';
|
|
import MicrosoftClarity from '@/components/analytics/MicrosoftClarity';
|
|
|
|
const isIndexable = process.env.NEXT_PUBLIC_INDEXABLE === 'true';
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL('https://www.qrmaster.net'),
|
|
title: {
|
|
default: 'QR Master - Smart QR Generator & Analytics',
|
|
template: '%s | QR Master',
|
|
},
|
|
description: 'Create dynamic QR codes, track scans, and scale campaigns with secure analytics. Free advanced features, bulk generation, and custom branding available.',
|
|
keywords: 'QR code, QR generator, dynamic QR, QR tracking, QR analytics, branded QR, bulk QR generator',
|
|
robots: isIndexable
|
|
? { index: true, follow: true }
|
|
: { index: false, follow: false },
|
|
icons: {
|
|
icon: [
|
|
|
|
{ url: '/favicon.svg', type: 'image/svg+xml' },
|
|
{ url: '/favicon.ico', sizes: '16x16 32x32', type: 'image/x-icon' },
|
|
],
|
|
shortcut: '/favicon.ico',
|
|
apple: '/logo.svg',
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
site: '@qrmaster',
|
|
images: ['https://www.qrmaster.net/og-image.png'],
|
|
},
|
|
openGraph: {
|
|
type: 'website',
|
|
siteName: 'QR Master',
|
|
title: 'QR Master - Smart QR Generator & Analytics',
|
|
description: 'Create dynamic QR codes, track scans, and scale campaigns with secure analytics. Free advanced features, bulk generation, and custom branding available.',
|
|
url: 'https://www.qrmaster.net',
|
|
images: [
|
|
{
|
|
url: 'https://www.qrmaster.net/og-image.png',
|
|
width: 1200,
|
|
height: 630,
|
|
alt: 'QR Master - Dynamic QR Code Generator and Analytics Platform',
|
|
},
|
|
],
|
|
locale: 'en_US',
|
|
},
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
return (
|
|
<html lang="en">
|
|
<body className="font-sans">
|
|
<Suspense fallback={null}>
|
|
<Providers>
|
|
<AdSenseScript />
|
|
<Suspense fallback={null}>
|
|
<FacebookPixel />
|
|
</Suspense>
|
|
<MicrosoftClarity />
|
|
{children}
|
|
{process.env.NEXT_PUBLIC_UMAMI_SRC && process.env.NEXT_PUBLIC_UMAMI_ID && (
|
|
<Script
|
|
defer
|
|
src={process.env.NEXT_PUBLIC_UMAMI_SRC}
|
|
data-website-id={process.env.NEXT_PUBLIC_UMAMI_ID}
|
|
strategy="afterInteractive"
|
|
/>
|
|
)}
|
|
</Providers>
|
|
</Suspense>
|
|
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|