Sifa professional network frontend (Next.js, React, TailwindCSS)
sifa.id/
1import type { Metadata } from 'next';
2import Script from 'next/script';
3import { NextIntlClientProvider } from 'next-intl';
4import { getLocale, getMessages } from 'next-intl/server';
5import { ThemeProvider } from '@/components/theme-provider';
6import { KonamiRickroll } from '@/components/konami-rickroll';
7import { StaleDeploymentDetector } from '@/components/stale-deployment-detector';
8import { Toaster } from 'sonner';
9import './globals.css';
10
11export const metadata: Metadata = {
12 metadataBase: new URL('https://sifa.id'),
13 title: {
14 default: 'Sifa ID',
15 template: '%s | Sifa ID',
16 },
17 description: 'Professional identity on the AT Protocol',
18 openGraph: {
19 siteName: 'Sifa ID',
20 type: 'website',
21 },
22 twitter: {
23 card: 'summary_large_image',
24 },
25};
26
27export default async function RootLayout({
28 children,
29}: Readonly<{
30 children: React.ReactNode;
31}>) {
32 const locale = await getLocale();
33 const messages = await getMessages();
34
35 return (
36 <html lang={locale} suppressHydrationWarning>
37 <head>
38 <Script
39 src="/u/script.js"
40 data-website-id="7f659ec9-5d5f-4ee4-96e0-10d8bcefd69d"
41 strategy="afterInteractive"
42 />
43 </head>
44 <body className="antialiased">
45 <NextIntlClientProvider locale={locale} messages={messages}>
46 <ThemeProvider
47 attribute="class"
48 defaultTheme="system"
49 enableSystem
50 disableTransitionOnChange
51 >
52 {children}
53 <KonamiRickroll />
54 <StaleDeploymentDetector />
55 <Toaster position="bottom-left" closeButton />
56 </ThemeProvider>
57 </NextIntlClientProvider>
58 </body>
59 </html>
60 );
61}