Openstatus
www.openstatus.dev
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}