mirror of
https://github.com/hanzoai/bootnode.git
synced 2026-10-25 02:31:30 +00:00
Names the two halves for what they are. The repo already holds both (12407e9 merged bootnode/bootnode into this history); this makes the frontend directory say so, so the layout reads the way the owner describes the system: backend and frontend separate, one repo. git mv throughout — 187 renames, history preserved. Every path reference follows: hanzo.yml build context and dockerfile, compose.yml, compose.prod.yml, start.sh, LLM.md, infra/k8s/web-deployments.yaml, infra/cloud/deploy.sh, and the Dockerfile's own COPY paths. Image and container names (bootnode-web, the -web tag suffix) are deliberately NOT renamed here: those are a deploy contract the App CR and ingress bind to on port 3001, and breaking them is a separate, staged change. Console builds green after the move; the Go tree builds. Co-authored-by: Hanzo Dev <[email protected]>
64 lines
2.5 KiB
TypeScript
64 lines
2.5 KiB
TypeScript
import type { Metadata } from "next"
|
|
import { GeistSans } from "geist/font/sans"
|
|
import { GeistMono } from "geist/font/mono"
|
|
import { ThemeProvider } from "@/components/theme-provider"
|
|
import { AuthProvider } from "@/lib/auth"
|
|
import { Providers } from "@/app/providers"
|
|
import { Toaster } from "@/components/ui/sonner"
|
|
import { BrandProvider } from "@/components/brand-provider"
|
|
import { getBrand } from "@/lib/brand"
|
|
import "@/app/globals.css"
|
|
|
|
// `output: "export"` prerenders this at build time, where there is no request
|
|
// and therefore no Host header — so the static <head> can only carry the
|
|
// default brand, and the real one is resolved from the hostname after
|
|
// hydration by BrandProvider (which sets document.title and the favicon).
|
|
//
|
|
// This is the one honest way to white-label a static export. Baking a brand in
|
|
// at build time via NEXT_PUBLIC_BRAND is the alternative, and it is what this
|
|
// app used to do: it produced four near-identical images, three of which were
|
|
// wrong for whichever host they happened to be serving.
|
|
const fallback = getBrand("")
|
|
|
|
export const metadata: Metadata = {
|
|
title: { default: `${fallback.name} — ${fallback.tagline}`, template: `%s | ${fallback.name}` },
|
|
description: fallback.description,
|
|
keywords: ["blockchain", "RPC", "API", "Web3", "NFT", "DeFi", "smart contracts", "developer tools"],
|
|
openGraph: {
|
|
type: "website",
|
|
locale: "en_US",
|
|
url: `https://${fallback.domain}`,
|
|
siteName: fallback.name,
|
|
title: `${fallback.name} — ${fallback.tagline}`,
|
|
description: fallback.description,
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: `${fallback.name} — ${fallback.tagline}`,
|
|
description: fallback.description,
|
|
},
|
|
icons: { icon: fallback.favicon, apple: fallback.favicon, shortcut: fallback.favicon },
|
|
}
|
|
|
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning className={`${GeistSans.variable} ${GeistMono.variable}`}>
|
|
<body className="min-h-screen bg-background font-sans antialiased">
|
|
<Providers>
|
|
{/* BrandProvider wraps ThemeProvider: the brand owns the default
|
|
colour scheme, so the theme cannot be resolved before the brand
|
|
is. */}
|
|
<BrandProvider>
|
|
<AuthProvider>
|
|
<ThemeProvider>
|
|
{children}
|
|
<Toaster />
|
|
</ThemeProvider>
|
|
</AuthProvider>
|
|
</BrandProvider>
|
|
</Providers>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|