SPB Git forge
3commits 1branches 0releases
417.0 KBsize
maindefault branch
10 days agolast push
TypeScript 66.5% Python 30.9% JavaScript 1.4% CSS 0.7%
2.1 KB · 50 lines tsx
Raw Blame History
1import type { Metadata, Viewport } from 'next';2import './globals.css';3import { MobileTabBar } from '@/components/layout/mobile-tab-bar';4import { SearchProvider } from '@/components/layout/search-context';5import { SearchDialog } from '@/components/layout/search-dialog';6import { SiteFooter } from '@/components/layout/site-footer';7import { SiteHeader } from '@/components/layout/site-header';8import { fontMono, fontUi } from '@/lib/fonts';9import { DESCRIPTION, SITE_NAME, SITE_URL, TAGLINE } from '@/lib/site';1011export const metadata: Metadata = {12  metadataBase: new URL(SITE_URL),13  title: { default: `${SITE_NAME} — ${TAGLINE}`, template: `%s | ${SITE_NAME}` },14  description: DESCRIPTION,15  applicationName: SITE_NAME,16  robots: { index: true, follow: true },17  alternates: { canonical: '/' },18  openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },19  twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },20  icons: { icon: [{ url: '/icon.svg', type: 'image/svg+xml' }], apple: [{ url: '/apple-icon', sizes: '180x180', type: 'image/png' }] },21};2223export const viewport: Viewport = {24  width: 'device-width',25  initialScale: 1,26  viewportFit: 'cover',27  themeColor: '#060912',28};2930export default function RootLayout({ children }: { children: React.ReactNode }) {31  return (32    <html lang="en" className={`${fontUi.variable} ${fontMono.variable} h-full antialiased`}>33      <body className="flex min-h-full flex-col pb-[calc(var(--tabbar-h)+env(safe-area-inset-bottom,0px))] md:pb-0">34        <a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-3 focus:top-3 focus:z-[200] focus:rounded-sm focus:bg-accent focus:px-3 focus:py-2 focus:text-sm focus:text-accent-ink">35          Skip to content36        </a>37        <SearchProvider>38          <SiteHeader />39          <main id="main" className="flex-1">40            {children}41          </main>42          <SiteFooter />43          <MobileTabBar />44          <SearchDialog />45        </SearchProvider>46      </body>47    </html>48  );49}50