mirror of
https://github.com/hanzo-apps/industries.git
synced 2026-10-30 14:47:50 +00:00
The site rendered in the system fallback: @hanzo/design 0.5.x replaced Geist with Zen, and this app pinned 0.4.6, so the family every surface asked for was one nothing declared any more. Bumping design alone strands it — @hanzo/ui inlines a copy of that token block — so the pair moves together, to @hanzo/design 0.5.21 and @hanzo/ui 8.3.4. @hanzo/ui depends on none of its @hanzogui/* peers; it declares them, so this app installs them. With only @hanzo/gui declared, pnpm resolved @hanzogui/lucide-icons-2 a generation behind, which dragged a second @hanzogui/core, and every @hanzo/ui component carrying an icon then read a theme context no provider fills — prerender died on "Missing theme.". Declaring the cohort, as hanzo.ai and the console already do, collapses it to one core. The old font test matched /geist|system-ui|sans-serif/, so it passed on the fallback: the exact failure it existed to catch. Both checks ask the font loader now. shots.mjs asks for Zen Mono only where a page renders mono, because a face loads when a glyph wants it; mutation-checked by aborting **/*.woff2. CommandPalette was controlled, nothing ever owned it, and its global handler could only close — so Cmd+K opened nothing and its test had never passed. A palette is the thing Cmd+K opens, so it owns the shortcut and mounts itself. 51 pages, 414/414 gui classes covered, 36/36 e2e, 60/60 routes across phone+desktop x light+dark. Co-authored-by: Hanzo Dev <[email protected]>
63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import type { Metadata, Viewport } from 'next'
|
|
import site from '@/site.config'
|
|
import { Providers } from './providers'
|
|
import './globals.css'
|
|
|
|
// Zen and Zen Mono arrive self-hosted with @hanzo/design (globals.css), so there
|
|
// is no build-time fetch from a font host and no second place the typeface is
|
|
// named.
|
|
|
|
export const metadata: Metadata = {
|
|
metadataBase: new URL(site.brand.url),
|
|
title: {
|
|
template: site.seo.titleTemplate,
|
|
default: site.seo.defaultTitle,
|
|
},
|
|
description: site.brand.description,
|
|
openGraph: {
|
|
// `/opengraph-image` is Next's file-convention route and this app has no
|
|
// such file — it 404'd, so every share card was blank. The real asset is
|
|
// `site.seo.ogImage`, which was declared and never used. 2400x1258.
|
|
images: [{ url: site.seo.ogImage, width: 2400, height: 1258, alt: site.seo.defaultTitle }],
|
|
siteName: site.brand.name,
|
|
title: site.seo.defaultTitle,
|
|
type: 'website',
|
|
url: site.brand.url,
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title: site.seo.defaultTitle,
|
|
description: site.brand.description,
|
|
images: [site.seo.ogImage],
|
|
},
|
|
// Declared explicitly, so `app/icon.svg`'s file convention is not silently
|
|
// overridden by a partial `icons` block — that is how this site ended up
|
|
// announcing a 696px opaque PNG as its only icon while serving a broken .ico.
|
|
icons: {
|
|
icon: [
|
|
{ url: site.seo.icons.ico, sizes: '16x16 32x32 48x48 64x64 128x128 256x256' },
|
|
{ url: site.seo.icons.svg, type: 'image/svg+xml' },
|
|
],
|
|
apple: site.seo.icons.appleTouch,
|
|
shortcut: site.seo.icons.ico,
|
|
},
|
|
}
|
|
|
|
export const viewport: Viewport = {
|
|
themeColor: site.seo.themeColor,
|
|
}
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<body>
|
|
<Providers>{children}</Providers>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|