70 lines
2.6 KiB
TypeScript
70 lines
2.6 KiB
TypeScript
import type { Metadata, Viewport } from 'next'
|
|
import { Geist, Geist_Mono } from 'next/font/google'
|
|
import { Analytics } from '@vercel/analytics/next'
|
|
import './globals.css'
|
|
import { ClientThemeShell } from '@/components/suite/client-theme-shell'
|
|
import { ThemeInitScript } from '@/components/theme-init-script'
|
|
import { FirstLaunchSplash } from '@/components/first-launch-splash'
|
|
import { QueryProvider } from '@/lib/api/query-provider'
|
|
import { AuthProvider } from '@/components/auth/auth-provider'
|
|
import { SessionGuard } from '@/components/auth/session-guard'
|
|
import { NativeBridgeProvider } from '@/components/mobile/native-bridge-provider'
|
|
import { NativeAuthGate } from '@/components/mobile/native-auth-gate'
|
|
import { NativeShellChrome } from '@/components/mobile/native-shell-chrome'
|
|
import { MobileLayoutRoot } from '@/components/mobile/mobile-layout-root'
|
|
import { MailToaster } from '@/components/gmail/mail-toaster'
|
|
import { suiteRootMetadata } from '@/lib/suite/page-metadata'
|
|
|
|
const geistSans = Geist({ subsets: ['latin'], variable: '--font-geist-sans' })
|
|
const geistMono = Geist_Mono({ subsets: ['latin'], variable: '--font-geist-mono' })
|
|
|
|
const isMobileBuild = process.env.NEXT_PUBLIC_MOBILE === '1'
|
|
|
|
export const metadata: Metadata = suiteRootMetadata()
|
|
|
|
/** Fit visible viewport on tablet/mobile; disable pinch/double-tap zoom on the shell. */
|
|
export const viewport: Viewport = {
|
|
width: 'device-width',
|
|
initialScale: 1,
|
|
maximumScale: 1,
|
|
userScalable: false,
|
|
viewportFit: 'cover',
|
|
}
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode
|
|
}>) {
|
|
return (
|
|
<html
|
|
lang="fr"
|
|
suppressHydrationWarning
|
|
className={`${geistSans.variable} ${geistMono.variable} h-dvh max-h-dvh overflow-hidden`}
|
|
>
|
|
<body className="h-dvh max-h-dvh overflow-hidden bg-background font-sans antialiased touch-manipulation">
|
|
{isMobileBuild ? (
|
|
<MobileLayoutRoot>{children}</MobileLayoutRoot>
|
|
) : (
|
|
<ClientThemeShell>
|
|
<ThemeInitScript />
|
|
<QueryProvider>
|
|
<AuthProvider>
|
|
<SessionGuard />
|
|
<NativeBridgeProvider>
|
|
<NativeShellChrome />
|
|
<NativeAuthGate>
|
|
<FirstLaunchSplash>{children}</FirstLaunchSplash>
|
|
</NativeAuthGate>
|
|
</NativeBridgeProvider>
|
|
</AuthProvider>
|
|
</QueryProvider>
|
|
<MailToaster />
|
|
{process.env.NODE_ENV === 'production' && <Analytics />}
|
|
</ClientThemeShell>
|
|
)}
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|