HTML 77.2%
TypeScript 10.5%
Python 9.6%
JavaScript 2.5%
1import type { Metadata, Viewport } from 'next';2import Script from 'next/script';3import './globals.css';4import { EvidenceDrawer } from '@/components/evidence/evidence-drawer';5import { EvidenceProvider } from '@/components/evidence/evidence-context';6import { MobileTabBar } from '@/components/layout/mobile-tab-bar';7import { SearchProvider } from '@/components/layout/search-context';8import { SearchDialog } from '@/components/layout/search-dialog';9import { SiteFooter } from '@/components/layout/site-footer';10import { SiteHeader } from '@/components/layout/site-header';11import { fontMono, fontUi } from '@/lib/fonts';12import { PREPAINT_SCRIPT } from '@/lib/prepaint';13import { DESCRIPTION, SITE_NAME, SITE_URL, TAGLINE, THEME_DARK, THEME_LIGHT } from '@/lib/site';1415export const metadata: Metadata = {16 metadataBase: new URL(SITE_URL),17 title: { default: `${SITE_NAME} — ${TAGLINE}`, template: `%s | ${SITE_NAME}` },18 description: DESCRIPTION,19 applicationName: SITE_NAME,20 robots: { index: true, follow: true },21 alternates: { canonical: '/' },22 openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },23 twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },24 icons: { icon: [{ url: '/icon.svg', type: 'image/svg+xml' }], apple: [{ url: '/apple-icon', sizes: '180x180', type: 'image/png' }] },25};2627export const viewport: Viewport = {28 width: 'device-width',29 initialScale: 1,30 viewportFit: 'cover',31 themeColor: [32 { media: '(prefers-color-scheme: light)', color: THEME_LIGHT },33 { media: '(prefers-color-scheme: dark)', color: THEME_DARK },34 ],35};3637export default function RootLayout({ children }: { children: React.ReactNode }) {38 return (39 <html lang="en" className={`${fontUi.variable} ${fontMono.variable} h-full antialiased`} suppressHydrationWarning>40 <head>41 <Script id="aia-theme" strategy="beforeInteractive" dangerouslySetInnerHTML={{ __html: PREPAINT_SCRIPT }} />42 </head>43 <body className="flex min-h-full flex-col pb-[calc(var(--tabbar-h)+env(safe-area-inset-bottom,0px))] lg:pb-0">44 <a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-3 focus:top-3 focus:z-[200] focus:bg-accent focus:px-3 focus:py-2 focus:text-sm focus:text-accent-ink">45 Skip to content46 </a>47 <SearchProvider>48 <EvidenceProvider>49 <SiteHeader />50 <main id="main" className="flex-1">51 {children}52 </main>53 <SiteFooter />54 <MobileTabBar />55 <SearchDialog />56 <EvidenceDrawer />57 </EvidenceProvider>58 </SearchProvider>59 </body>60 </html>61 );62}63