- Map Justine tokens to shadcn CSS variables (--vibn-* aliases) - Switch fonts to Inter + Lora via next/font (IBM Plex Mono for code) - Base typography: body Inter, h1–h3 Lora; marketing hero + wordmark serif - Project shell and global chrome use semantic colors - Replace Outfit/Newsreader references across TSX inline styles Made-with: Cursor
72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { Inter, Lora, IBM_Plex_Mono } from "next/font/google";
|
|
import "./globals.css";
|
|
import { Toaster } from "@/components/ui/sonner";
|
|
import { Providers } from "@/app/components/Providers";
|
|
|
|
const inter = Inter({
|
|
variable: "--font-inter",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
});
|
|
|
|
const lora = Lora({
|
|
variable: "--font-lora",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
style: ["normal", "italic"],
|
|
});
|
|
|
|
const ibmPlexMono = IBM_Plex_Mono({
|
|
variable: "--font-ibm-plex-mono",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500"],
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "VIBN — Build with Vibn",
|
|
description: "Chat with Vibn to define your product, then let AI build it.",
|
|
manifest: "/manifest.json",
|
|
appleWebApp: {
|
|
capable: true,
|
|
statusBarStyle: "black-translucent",
|
|
title: "VIBN",
|
|
},
|
|
other: {
|
|
"mobile-web-app-capable": "yes",
|
|
"msapplication-TileColor": "#1a1510",
|
|
},
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<head>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
<meta name="theme-color" content="#1a1510" />
|
|
<link rel="apple-touch-icon" href="/vibn-logo-circle.png" />
|
|
<link rel="manifest" href="/manifest.json" />
|
|
</head>
|
|
<body
|
|
className={`${inter.variable} ${lora.variable} ${ibmPlexMono.variable} antialiased`}
|
|
>
|
|
<Providers>
|
|
{children}
|
|
<Toaster />
|
|
</Providers>
|
|
<script dangerouslySetInnerHTML={{ __html: `
|
|
if ('serviceWorker' in navigator) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker.register('/sw.js').catch(() => {});
|
|
});
|
|
}
|
|
`}} />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|