font-sans points at a CSS variable that v0 sets in its own layout.tsx, which you didn't copy. Add this to app/layout.tsx:
import { Geist } from "next/font/google";
const geist = Geist({ subsets: ["latin"], variable: "--font-sans" });
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" className={geist.variable}>
<body className="font-sans antialiased">{children}</body>
</html>
);
}and make sure Tailwind's fontFamily.sans uses var(--font-sans). Remove the Google Fonts <link>, next/font self-hosts the font which is faster.
Serif as fallback means font-sans resolves to nothing at all, so check the Tailwind config part too.