mirror of
https://github.com/hanzo-docs/docs.git
synced 2026-10-26 10:55:57 +00:00
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]>
47 lines
1.5 KiB
TypeScript
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>
|
|
);
|
|
}
|