import type { Metadata, Viewport } from "next"; import { Inter, Geist_Mono } from "next/font/google"; import { ThemeProvider } from "@/components/theme-provider"; import { Toaster } from "@multica/ui/components/ui/sonner"; import { cn } from "@multica/ui/lib/utils"; import { WebProviders } from "@/components/web-providers"; import { LocaleSync } from "@/components/locale-sync"; import "./globals.css"; // Font stack: Inter for Latin UI text + system Chinese fonts for zh content. // Desktop app uses the same stack via apps/desktop/src/renderer/src/globals.css — // keep the CJK fallback tail in sync across both files. The Inter primary family // differs by design: next/font produces `__Inter_xxx` (with a synthetic size-adjusted // fallback face to prevent FOUT layout shift); desktop uses fontsource's "Inter Variable". // Both resolve to Inter glyphs, so rendering is identical in practice. // Currently covers English + Simplified Chinese. When ja/ko i18n lands, extend // the tail with Hiragino Kaku Gothic ProN / Yu Gothic / Apple SD Gothic Neo / Malgun Gothic. // Per-character fallback: Latin chars render with Inter, Chinese chars with // PingFang SC (macOS) / Microsoft YaHei (Windows) / Noto Sans CJK SC (Linux). const inter = Inter({ subsets: ["latin"], variable: "--font-sans", fallback: [ "-apple-system", "BlinkMacSystemFont", "Segoe UI", "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", "sans-serif", ], }); // Mono font has no explicit CJK fallback: CJK chars in code blocks are inherently // non-aligned with a mono grid (Chinese is proportional), so listing CJK fonts // here would falsely signal alignment guarantees. Browser default fallback handles // the rare mixed case correctly. const geistMono = Geist_Mono({ subsets: ["latin"], variable: "--font-mono", fallback: ["ui-monospace", "SFMono-Regular", "Menlo", "Consolas", "monospace"], }); export const viewport: Viewport = { width: "device-width", initialScale: 1, themeColor: [ { media: "(prefers-color-scheme: light)", color: "#ffffff" }, { media: "(prefers-color-scheme: dark)", color: "#05070b" }, ], }; export const metadata: Metadata = { metadataBase: new URL("https://www.multica.ai"), title: { default: "Multica — Project Management for Human + Agent Teams", template: "%s | Multica", }, description: "Open-source platform that turns coding agents into real teammates. Assign tasks, track progress, compound skills.", icons: { icon: [{ url: "/favicon.svg", type: "image/svg+xml" }], shortcut: ["/favicon.svg"], }, openGraph: { type: "website", siteName: "Multica", locale: "en_US", }, twitter: { card: "summary_large_image", site: "@multica_hq", creator: "@multica_hq", }, alternates: { canonical: "/", }, robots: { index: true, follow: true, }, }; export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( {children} ); }