Files
zeekayandHanzo Dev 5313260909 Every docs site wears the same chrome
One app carried the Hanzo shell and twenty did not, so a reader crossing from
base.hanzo.ai to zen.hanzo.ai left the ecosystem and landed somewhere that only
resembled it. Five of those twenty had hand-rolled a footer of their own —
sixteen lines of copyright and a repo link, written five separate times.

Each app now loads the brand tokens before its own sheet, reports through
docs-analytics under its own product name, and renders HanzoFooter from
@hanzogui/shell — the same 6-column ecosystem footer, defined once, that
apps/docs already used.

A footer written inside a layout was chrome pretending to be content, and it is
gone. A footer written inside a page is content pretending to be chrome: those
keep their words and become sections, so each page has one contentinfo landmark
instead of two.

Three manifests listed @hanzo/font twice in the same object.

Builds verified across the four shapes this repo has: a static export, a
next.config.mjs app, a single-page app with no route groups, and one that
already reported analytics. Every one renders exactly one footer.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-29 14:29:19 -07:00

47 lines
1.5 KiB
TypeScript

// Brand tokens load before the app's own sheet so the theme can override
// where the two meet.
import '@hanzo/brand/styles/variables.css';
import './global.css';
import type { Metadata, Viewport } from 'next';
import type { ReactNode } from 'react';
import { Zen, ZenMono } from '@hanzo/font';
import { Analytics } from '@hanzo/docs-analytics';
import { Footer } from '@/components/footer';
export const metadata: Metadata = {
title: 'Hanzo Cloud — AI Infrastructure Platform',
description:
'Unified AI infrastructure platform. AI API, usage analytics, team management, and API key provisioning.',
openGraph: {
title: 'Hanzo Cloud — AI Infrastructure Platform',
description:
'Unified AI infrastructure platform with AI API, analytics, and team management.',
url: 'https://cloud.hanzo.ai',
siteName: 'Hanzo Cloud',
type: 'website',
},
twitter: {
card: 'summary_large_image',
site: '@hanikidev',
creator: '@hanikidev',
},
metadataBase: new URL('https://cloud.hanzo.ai'),
};
export const viewport: Viewport = {
themeColor: [
{ media: '(prefers-color-scheme: dark)', color: '#0A0A0A' },
{ media: '(prefers-color-scheme: light)', color: '#0A0A0A' },
],
};
export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en" className={`${Zen.variable} ${ZenMono.variable} dark`}>
<body className="antialiased">{children}
<Footer />
<Analytics product="cloud" /></body>
</html>
);
}