Refactor Root layout theme and fonts. Encapsulate functions into separate files. Fix default theme handling when cookie is not set by fall-backing to the selected theme mode. (#103)
This commit is contained in:
committed by
GitHub
parent
b8e1bf3c18
commit
5a4bbb1716
@@ -1,23 +1,25 @@
|
||||
import { cookies } from 'next/headers';
|
||||
|
||||
import { Toaster } from '@kit/ui/sonner';
|
||||
import { cn } from '@kit/ui/utils';
|
||||
|
||||
import { RootProviders } from '~/components/root-providers';
|
||||
import { heading, sans } from '~/lib/fonts';
|
||||
import { getFontsClassName } from '~/lib/fonts';
|
||||
import { createI18nServerInstance } from '~/lib/i18n/i18n.server';
|
||||
import { generateRootMetadata } from '~/lib/root-metdata';
|
||||
import { getRootTheme } from '~/lib/root-theme';
|
||||
|
||||
import '../styles/globals.css';
|
||||
|
||||
export const generateMetadata = () => {
|
||||
return generateRootMetadata();
|
||||
};
|
||||
|
||||
export default async function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
const { language } = await createI18nServerInstance();
|
||||
const theme = await getTheme();
|
||||
const className = getClassName(theme);
|
||||
const theme = await getRootTheme();
|
||||
const className = getFontsClassName(theme);
|
||||
|
||||
return (
|
||||
<html lang={language} className={className}>
|
||||
@@ -31,29 +33,3 @@ export default async function RootLayout({
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
function getClassName(theme?: string) {
|
||||
const dark = theme === 'dark';
|
||||
const light = !dark;
|
||||
|
||||
const font = [sans.variable, heading.variable].reduce<string[]>(
|
||||
(acc, curr) => {
|
||||
if (acc.includes(curr)) return acc;
|
||||
|
||||
return [...acc, curr];
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
return cn('min-h-screen bg-background antialiased', ...font, {
|
||||
dark,
|
||||
light,
|
||||
});
|
||||
}
|
||||
|
||||
async function getTheme() {
|
||||
const cookiesStore = await cookies();
|
||||
return cookiesStore.get('theme')?.value as 'light' | 'dark' | 'system';
|
||||
}
|
||||
|
||||
export const generateMetadata = generateRootMetadata;
|
||||
|
||||
Reference in New Issue
Block a user