Openstatus www.openstatus.dev
at 4c0f4c00a38753a5d0dfd7e7b7b7706dec6f1503 89 lines 2.6 kB view raw
1import "@/styles/globals.css"; 2 3import { OpenPanelComponent } from "@openpanel/nextjs"; 4import type { Metadata } from "next"; 5import { Inter } from "next/font/google"; 6import LocalFont from "next/font/local"; 7 8import { 9 defaultMetadata, 10 ogMetadata, 11 twitterMetadata, 12} from "@/app/shared-metadata"; 13import { ThemeProvider } from "@/components/theme-provider"; 14import { Toaster } from "@/components/ui/sonner"; 15import { env } from "@/env"; 16import { TRPCReactQueryProvider } from "@/trpc/rq-client"; 17import PlausibleProvider from "next-plausible"; 18import { NuqsAdapter } from "nuqs/adapters/next/app"; 19 20const inter = Inter({ subsets: ["latin"] }); 21 22const calSans = LocalFont({ 23 src: "../public/fonts/CalSans-SemiBold.ttf", 24 variable: "--font-cal", 25}); 26 27export const metadata: Metadata = { 28 ...defaultMetadata, 29 twitter: { 30 ...twitterMetadata, 31 }, 32 openGraph: { 33 ...ogMetadata, 34 }, 35}; 36 37export default function RootLayout({ 38 children, 39}: { 40 children: React.ReactNode; 41}) { 42 return ( 43 <html lang="en" suppressHydrationWarning> 44 <body 45 className={`${ 46 inter.className 47 // biome-ignore lint/nursery/useSortedClasses: <explanation> 48 } ${calSans.variable}`} 49 > 50 <PlausibleProvider domain="openstatus.dev"> 51 <ThemeProvider attribute="class" defaultTheme="light" enableSystem> 52 <NuqsAdapter> 53 <TRPCReactQueryProvider>{children}</TRPCReactQueryProvider> 54 </NuqsAdapter> 55 </ThemeProvider> 56 </PlausibleProvider> 57 {env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID && ( 58 <OpenPanelComponent 59 clientId={env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID} 60 trackScreenViews 61 trackOutgoingLinks 62 trackAttributes 63 /> 64 )} 65 <Toaster 66 toastOptions={{ 67 classNames: { 68 toast: 69 "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg rounded-none!", 70 description: "group-[.toast]:text-muted-foreground", 71 actionButton: 72 "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground rounded-none!", 73 cancelButton: 74 "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground", 75 closeButton: "group-[.toast]:text-muted-foreground", 76 }, 77 }} 78 icons={{ 79 success: null, 80 error: null, 81 warning: null, 82 info: null, 83 loading: null, 84 }} 85 /> 86 </body> 87 </html> 88 ); 89}