🐼
Next.js(AppRouter)と panda css でWebフォントを利用するサンプルコード
layout.tsx
の設定
app/layout.tsx
import { Noto_Sans_JP } from 'next/font/google';
import './global.css';
export const NotoSansJP = Noto_Sans_JP({
weight: 'variable',
display: 'swap',
subsets: ['latin'],
variable: '--font-noto-sans-jp',
});
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="ja" className={NotoSansJP.variable}>
<body>
{children}
</body>
</html>
);
}
ポイント
-
className={NotoSansJP.variable}
は公式ドキュメントに書いてあるように、body
タグではなくhtml
タグにつける。 -
NotoSansJP.className
にしてもよいが、pandacssでユーティリティcssとして管理したいのであればNotoSansJP.variable
にする。 - 複数フォントを使うのであれば、
NotoSansJP.variable
にする
Note 🚨: By default, Next.js attaches the className for the fonts to the <body> element, for panda to appropriately load fonts, update the code to attach the className to the <html> element.
className
とvariable
の違い
className
は直接font-family
を指定する。
variable
はcss変数--font-noto-sans-jp
に代入するだけ。
もしvariable
を使用しながら、全体のフォントファミリーのデフォルト設定をしたい場合は、次の設定が必要
panda.config.ts
の設定
panda.config.ts
import { defineConfig } from '@pandacss/dev';
export default defineConfig({
// Whether to use css reset
preflight: true,
// Where to look for your css declarations
include: ['./app/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {
tokens: {
fonts: {
noto: { value: 'var(--font-noto-sans-jp), sans-serif' },
},
},
},
},
// The output directory for your css system
outdir: 'styled-system',
globalCss: {
':root': {
'--global-font-body': 'var(--font-noto-sans-jp)',
},
},
});
tokenで設定すれば、fontFamily
に指定できるようになる。
<p
className={css({
color: 'primary',
fontFamily: 'noto'
})}
>
Hello World
</p>
--global-font-body
変数に'var(--font-noto-sans-jp)'
を設定することで、デフォルトでNotoSansJPを使用してくれるようになる。
Discussion