Anti-flash dark (color-scheme + applyDocumentTheme), scroll pages publiques, prompts wizard/slides moins génériques, cron agents rattrapage nextRun null, slides carnet via notebookId, graphiques à 2 crédits + hint, audit dashboard, packs Stripe marqués non configurés sans price ID.
30 lines
1.3 KiB
TypeScript
30 lines
1.3 KiB
TypeScript
import { headers } from 'next/headers'
|
||
import { detectUserLanguage, parseAcceptLanguage } from '@/lib/i18n/detect-user-language'
|
||
import { loadTranslations } from '@/lib/i18n/load-translations'
|
||
import { PublicProviders } from '@/components/public-providers'
|
||
|
||
/**
|
||
* Le body racine est en hauteur d’écran avec débordement masqué
|
||
* (pour l’application connectée). Les pages publiques (accueil, tarifs,
|
||
* notes publiées) doivent pouvoir défiler : on crée un conteneur de
|
||
* défilement qui couvre tout l’écran, indépendant du body.
|
||
*/
|
||
export default async function PublicLayout({ children }: { children: React.ReactNode }) {
|
||
const headersList = await headers()
|
||
const browserLang = parseAcceptLanguage(headersList.get('accept-language'))
|
||
const initialLanguage = await detectUserLanguage(browserLang)
|
||
const initialTranslations = await loadTranslations(initialLanguage)
|
||
|
||
return (
|
||
<PublicProviders initialLanguage={initialLanguage} initialTranslations={initialTranslations}>
|
||
<div
|
||
data-public-scroll-root
|
||
className="fixed inset-0 z-[1] h-[100dvh] w-full overflow-y-auto overflow-x-hidden overscroll-y-contain"
|
||
style={{ WebkitOverflowScrolling: 'touch', touchAction: 'pan-y' }}
|
||
>
|
||
{children}
|
||
</div>
|
||
</PublicProviders>
|
||
)
|
||
}
|