Yamada UIにスターをあげる

スター
Yamada UIYamada UIv1.3.10

カラーモード

Yamada UIには、アプリケーションのカラーモードを管理するためのサポートが組み込まれています。

Yamada UIのすべてのコンポーネントは、ダークモードをサポートしています。シナリオによっては、コンポーネントをカラーモードに対応させる必要がある場合があります。

セットアップ

ダークモードを正しく動作させるには、次の2つのことを行う必要があります。

  1. コンフィグにinitialColorModeを設定する。
  2. 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を追加する

カラーモードを正常に動作させるために、headbody内にColorModeScriptを追加する必要があります。

理由は、カラーモードがlocalStoragecookiesを用いて実装されており、ページの読み込み時に同期を正しく機能させるためです。

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 = scriptContent
document.head.appendChild(script)
}
injectColorModeScript()
const container = document.getElementById("app")
const root = createRoot(container!)
root.render(
<UIProvider>
<App />
</UIProvider>,
)

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>
<ColorModeScript
type="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>
)
}

colorModeManagerを追加する

Next.jsなどのサーバー側でレンダリングされるサイトの場合は、カラーモードがハイドレーション中に変更することを避けるために、リクエストにカラーモードを含めたい場合があります。

getServerSidePropsを用意する

複数のページでgetServerSidePropsを共通化するために、getServerSideCommonPropsを定義します。

import { GetServerSidePropsContext } from "next"
export const getServerSideCommonProps = ({
req,
}: GetServerSidePropsContext) => {
return {
props: {
cookies: req.headers.cookie ?? "",
},
}
}

colorModeManagercookiesを設定する

createColorModeManagerssrcookiesを設定します。

_app.tsx

import type { AppProps } from "next/app"
import { UIProvider, createColorModeManager } from "@yamada-ui/react"
export default function App({ Component, pageProps }: AppProps) {
const { cookies } = pageProps
const 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>

カラーモードを切り替える

アプリケーション内でカラーモードを変更したい場合は、changeColorModetoggleColorModeを使用します。

  • 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>
)

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

レスポンシブスタイルアットルール