Files
zeekayandHanzo Dev 532ce68471 Give zoolabs.io a header, sections and a footer
The chat was the whole site: a reader who did not type had nowhere to go
and no way to learn what Zoo Labs is. The hero keeps the page, and Open
Source, Research and Foundation now sit under it.

One header and one footer, in the layout, so the chat and the repository
listing wear the same chrome instead of each carrying its own. The chat's
inner header went with that — two wordmarks on one screen was the reason
to share it.

The ecosystem column pointed at other organisations' sites; the footer
now names only Zoo's own.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-31 13:28:37 -07:00

45 lines
1.2 KiB
TypeScript

import type { Metadata } from 'next';
import { Zen } from '@hanzo/font/sans';
import { ZenMono } from '@hanzo/font/mono';
import './globals.css';
import { Header } from '@/components/header';
import { Footer } from '@/components/footer';
import { config } from '@/lib/config';
export const metadata: Metadata = {
metadataBase: new URL('https://zoolabs.io'),
title: config.meta.title,
description: config.meta.description,
openGraph: {
title: config.meta.title,
description: config.meta.description,
url: 'https://zoolabs.io',
siteName: config.org.name,
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: config.meta.title,
description: config.meta.description,
creator: '@zoolabs',
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
// The Zen variables ride on <html> so they resolve on the same element as the
// --font-sans/--font-mono in globals.css that reference them.
return (
<html lang="en" className={`dark ${Zen.variable} ${ZenMono.variable}`}>
<body className="antialiased">
<Header />
{children}
<Footer />
</body>
</html>
);
}