teecup/frontend/app/layout.tsx
Erol Haagenrud 5355aba75d Ekte i18n (next-intl) + hjelpeside/FAQ + Spillere-tabellen slått videre sammen (ADR-094)
Grunnmur for oversettelse (cookie-basert, ingen URL-endring), ny
/hjelp-side med oversikt+FAQ på norsk og engelsk, og Deltakere+
Rundedeltakelse slått sammen til én bred tabell i Spillere-steget.
Resten av appens ~2200 strenger og 479 backend-feilkoder er bevisst
utsatt til senere, avgrensede runder -- se FEATURE_BACKLOG.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 07:54:07 +02:00

79 lines
2.4 KiB
TypeScript

import type { Metadata, Viewport } from 'next'
import { Nunito } from 'next/font/google'
import { NextIntlClientProvider } from 'next-intl'
import { getLocale } from 'next-intl/server'
import { SwRegister } from '@/components/sw-register'
import { LocaleBootstrap } from '@/components/locale-bootstrap'
import './globals.css'
const nunito = Nunito({
subsets: ['latin'],
variable: '--font-nunito',
display: 'swap',
})
export const metadata: Metadata = {
// Trengs for at relative og:image-URL-er (MinIO-runden, ikke bygget ennå)
// skal løses til en fullstendig URL -- uten denne advarer Next.js ved
// build og faller tilbake til en gjettet verdi.
metadataBase: new URL('https://teecup.golf'),
title: 'TeeCup — Logg inn',
description: 'Logg inn på TeeCup, din golfturnerings-app. Passordløs innlogging med magisk lenke.',
generator: 'v0.app',
icons: {
icon: [
{
url: '/icon-light-32x32.png',
media: '(prefers-color-scheme: light)',
},
{
url: '/icon-dark-32x32.png',
media: '(prefers-color-scheme: dark)',
},
{
url: '/icon.svg',
type: 'image/svg+xml',
},
],
apple: '/apple-icon.png',
},
// PWA-installasjon (ADR-028). iOS Safari leser ikke manifest.json for
// «Legg til på hjemskjerm»-oppførsel -- disse Apple-spesifikke metafeltene
// trengs i tillegg til selve manifestet (app/manifest.ts).
appleWebApp: {
capable: true,
statusBarStyle: 'default',
title: 'TeeCup',
},
}
export const viewport: Viewport = {
colorScheme: 'light dark',
themeColor: [
{ media: '(prefers-color-scheme: light)', color: '#f3f6ec' },
{ media: '(prefers-color-scheme: dark)', color: '#131a0f' },
],
}
export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode
}>) {
// i18n (ADR-094) -- locale kommer fra en cookie (se i18n/request.ts),
// ALDRI fra URL-en. LocaleBootstrap synker inn brukerens preferred_locale
// fra /auth/me på klienten dersom ingen cookie er satt ennå.
const locale = await getLocale()
return (
<html lang={locale} className={`${nunito.variable} bg-background`}>
<body className="font-sans antialiased">
<NextIntlClientProvider>
<SwRegister />
<LocaleBootstrap />
{children}
</NextIntlClientProvider>
</body>
</html>
)
}