カラーモード
Yamada UIには、アプリケーションのカラーモードを管理するためのサポートが組み込まれています。
Yamada UIのすべてのコンポーネントは、ダークモードをサポートしています。シナリオによっては、コンポーネントをカラーモードに対応させる必要がある場合があります。
セットアップ
ダークモードを正しく動作させるには、次の2つのことを行う必要があります。
- コンフィグに
initialColorMode
を設定する。 ColorModeScript
をアプリケーションに追加する。
コンフィグをカスタマイズする
カラーモードは、デフォルトのコンフィグに設定されています。
実際に定義されている値はこちらです。
config.ts
export const config: ThemeConfig = {initialColorMode: "light",}
-
initialColorMode
: ユーザーが初めてアプリケーションにアクセスしたとき(またはストレージがリセットされた後)のカラーモードの初期値です。3つ値を受け入れます。light
: ライトモード。dark
: ダークモード。system
: オペレーションシステム(OS)からカラーモードを取得します。
import { UIProvider, extendConfig } from "@yamada-ui/react"export const config: ThemeConfig = {initialColorMode: "system",}const customConfig = extendConfig(config)const App = () => {return (<UIProvider config={customConfig}><YourApplication /></UIProvider>)}
ColorModeScript
を追加する
カラーモードを正常に動作させるために、head
やbody
内にColorModeScript
を追加する必要があります。
理由は、カラーモードがlocalStorage
やcookies
を用いて実装されており、ページの読み込み時に同期を正しく機能させるためです。
Create React Appの場合
index.tsx
import { createRoot } from "react-dom/client"import { App } from "./app"import { UIProvider, getColorModeScript, defaultConfig } from "@yamada-ui/react"const injectColorModeScript = () => {const scriptContent = getColorModeScript({initialColorMode: defaultConfig.initialColorMode,})const script = document.createElement("script")script.textContent = scriptContentdocument.head.appendChild(script)}injectColorModeScript()const container = document.getElementById("app")const root = createRoot(container!)root.render(<UIProvider><App /></UIProvider>,)
props
のinitialColorMode
は、コンフィグと同じinitialColorMode
を渡してください。もし、あなたのコンフィグがある場合は、そちらのinitialColorMode
を渡してください。
Next.jsの場合
_document.tsx
import { Html, Head, Main, NextScript } from "next/document"import { ColorModeScript, defaultConfig } from "@yamada-ui/react"export default function Document() {return (<Html lang="en"><Head /><body><ColorModeScript initialColorMode={defaultConfig.initialColorMode} /><Main /><NextScript /></body></Html>)}
プロジェクトによっては、cookies
から値を取得する場合があるかもしれません。その場合は、createColorModeManager("cookie")
を使用します。
_document.tsx
import { Html, Head, Main, NextScript } from "next/document"import { ColorModeScript, defaultConfig } from "@yamada-ui/react"export default function Document() {return (<Html lang="en"><Head /><body><ColorModeScripttype="cookie"nonce="testing"initialColorMode={defaultConfig.initialColorMode}/><Main /><NextScript /></body></Html>)}
_app.tsx
import type { AppProps } from "next/app"import { UIProvider, createColorModeManager } from "@yamada-ui/react"const colorModeManager = createColorModeManager("cookie")export default function App({ Component, pageProps }: AppProps) {return (<UIProvider colorModeManager={colorModeManager}><Component {...pageProps} /></UIProvider>)}
props
のinitialColorMode
は、コンフィグと同じinitialColorMode
を渡してください。もし、あなたのコンフィグがある場合は、そちらのinitialColorMode
を渡してください。
App Routerの場合は、こちらをご覧ください。
colorModeManager
を追加する
Next.jsなどのサーバー側でレンダリングされるサイトの場合は、カラーモードがハイドレーション中に変更することを避けるために、リクエストにカラーモードを含めたい場合があります。
サーバーサイドレンダリングを使用しない場合は、こちら手順をする必要はありません。Yamada UIは、デフォルトでlocalStorage
を使用しています。
getServerSideProps
を用意する
複数のページでgetServerSideProps
を共通化するために、getServerSideCommonProps
を定義します。
import { GetServerSidePropsContext } from "next"export const getServerSideCommonProps = ({req,}: GetServerSidePropsContext) => {return {props: {cookies: req.headers.cookie ?? "",},}}
colorModeManager
にcookies
を設定する
createColorModeManager
にssr
とcookies
を設定します。
_app.tsx
import type { AppProps } from "next/app"import { UIProvider, createColorModeManager } from "@yamada-ui/react"export default function App({ Component, pageProps }: AppProps) {const { cookies } = pagePropsconst colorModeManager = createColorModeManager("ssr", cookies)return (<UIProvider colorModeManager={colorModeManager}><Component {...pageProps} /></UIProvider>)}
getServerSideProps
を追加する
先ほど作成したgetServerSideCommonProps
を各ページに追加します。
index.tsx
import { getServerSideCommonProps } from "../get-server-side-props.ts"import { Button } from "@yamada-ui/react"export default function Index() {return <Button>Click me!</Button>}export const getServerSideProps = getServerSideCommonProps
カラーモードの構文
カラーモードのスタイルを設定する場合は、スタイルのprops
に配列を渡すだけでカラーモードに対応します。
- 第1引数にライトモードに設定したいスタイルの値を定義します。
- 第2引数にダークモードに設定したいスタイルの値を定義します。
編集可能な例
<Box w="full" p="md" bg={["primary", "secondary"]} color="white"> This is Box </Box>
カラーモードを切り替える
アプリケーション内でカラーモードを変更したい場合は、changeColorMode
かtoggleColorMode
を使用します。
changeColorMode
: 任意のカラーモードを設定します。toggleColorMode
: ライトモードならダークモードへ、ダークモードならライトモードへ切り替えます。
編集可能な例
const { colorMode, changeColorMode, toggleColorMode } = useColorMode() return ( <Wrap gap="md"> <Button onClick={() => changeColorMode("light")}>ライトモード</Button> <Button onClick={() => changeColorMode("dark")}>ダークモード</Button> <Button onClick={() => changeColorMode("system")}>システム</Button> <Button onClick={toggleColorMode}> {colorMode === "light" ? "ダーク" : "ライト"}モードに切り替える </Button> </Wrap> )
カラーモードのユーティリティ
Yamada UIには、カラーモードの便利なカスタムフックを提供しています。
useColorMode
を使う
コンポーネント内で現在のカラーモードを取得する場合には、useColorMode
を使用します。
編集可能な例
const { colorMode, internalColorMode } = useColorMode() return ( <Text> The current colorMode is "{colorMode}", internal colorMode is " {internalColorMode}" </Text> )
colorMode
は、現在のlight
とdark
を返します。
internalColorMode
は、現在のlight
とdark
またはsystem
を返します。
useColorModeValue
を使う
useColorModeValue
は、第1引数にライトモードの値、第2引数にダークモードの値を渡し、現在のカラーモードの値を返すカスタムフックです。
編集可能な例
const { colorMode } = useColorMode() const bg = useColorModeValue("blackAlpha.800", "whiteAlpha.800") const color = useColorModeValue("whiteAlpha.800", "blackAlpha.800") return ( <Box p="md" bg={bg} color={color}> The current colorMode is "{colorMode}" </Box> )
これは、Yamada UI以外のライブラリのコンポーネントのスタイルを設定するのに適しています。
GitHubでこのページを編集する