カラーモード
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でこのページを編集する

