Files
industries/app/layout.tsx
zeekay fcecf7f854 fix: switch analytics to Hanzo Analytics (Umami) with GDPR privacy attrs
- Replace insights.hanzo.ai (PostHog) with analytics.hanzo.ai (Umami)
- Add data-do-not-track and data-exclude-search attributes for GDPR/DNT compliance
- Use NEXT_PUBLIC_ANALYTICS_SITE_ID env var for site UUID
2026-02-28 11:10:51 -08:00

58 lines
1.7 KiB
TypeScript

import type { Metadata, Viewport } from 'next'
import { Geist, Geist_Mono } from 'next/font/google'
import { ThemeProvider } from '@/components/ThemeProvider'
import site from '@/site.config'
import './globals.css'
const geist = Geist({ variable: '--font-geist-sans', subsets: ['latin'] })
const mono = Geist_Mono({ variable: '--font-geist-mono', subsets: ['latin'] })
export const metadata: Metadata = {
metadataBase: new URL(site.brand.url),
title: {
template: site.seo.titleTemplate,
default: site.seo.defaultTitle,
},
description: site.brand.description,
openGraph: {
images: [{ url: '/opengraph-image', width: 1200, height: 630, alt: site.seo.defaultTitle }],
siteName: site.brand.tagline,
type: 'website',
url: site.brand.url,
},
twitter: {
card: 'summary_large_image',
title: site.brand.name,
description: site.brand.description,
images: ['/opengraph-image'],
},
icons: { icon: site.seo.faviconPath },
}
export const viewport: Viewport = {
themeColor: site.seo.themeColor,
}
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" className={`${geist.variable} ${mono.variable}`} suppressHydrationWarning>
<body className="antialiased bg-background text-foreground">
<ThemeProvider
attribute="class"
defaultTheme="light"
enableSystem
disableTransitionOnChange
>
{children}
</ThemeProvider>
{/* Hanzo Analytics — privacy-first, respects DNT, no cookies */}
<script defer src={site.analytics.scriptUrl} data-website-id={site.analytics.siteId} data-do-not-track="true" data-exclude-search="true" />
</body>
</html>
)
}