Open5

Chakra UIのColorについて

カラーテーマ

https://chakra-ui.com/docs/styled-system/theme#colors

Chakra UIでは上記リンク内のようなカラーの定義があり、
カスタマイズとして上書き、もしくは新たな色の定義を行う。

// theme.js
export default {
  colors: {
    transparent: 'transparent',
    black: '#000',
    white: '#fff',
    gray: {
      50: '#f7fafc',
      // ...
      900: '#171923',
    },
    // ...
  },
}

カラーテーマのカスタマイズ

https://chakra-ui.com/docs/styled-system/customize-theme#customizing-theme-tokens

新たな色としてblueGrayのように、色自体を追加してもよいし、brand カラーのように意味を持たせたカラーを定義しても良い。

// theme.js
export default {
  colors: {
    brand: {
      100: "#f7fafc",
      // ...
      900: "#1a202c",
    },
  },
}

Textでの使用例

<Text color='brand.300'>Click me</Text>

ButtonでのcolorSchemeでの使用例

<Button colorScheme='brand'>Click me</Button>

colorSchemeはコンポーネントごとに定義をしている。
たとえばButtonだと下記のように、backgroundColorが500、hover時が600など。

数値の色の強さによって一律設定されている
※ 一部アクセシビリティを考慮して、個別に色の強さを変えている

// Buttonのvariantがsolidの定義
const {
    bg = `${color}.500`,
    color = "white",
    hoverBg = `${color}.600`,
    activeBg = `${color}.700`,
  }

実際のソースコード。

https://github.com/chakra-ui/chakra-ui/blob/main/packages/components/theme/src/components/button.ts

汎用的なカラーテーマの定義方法

下記のように機能的な意味合いの色を定義していくことも可能

// theme.js
export default {
  colors: {
    fontColor: {
      main: "#000",
      sub: "#2D2D2D",
      link: "#BEE3F8",
    },
    border: {
      normal: "#F7FAFC",
    },
  },
}

Textでの使用例

<Text color='fontColor.main'>Click me</Text>

カラーと機能的なカラーの定義を分けて、下記のようにしておくと汎用的

// theme.js
const baseColors = {
  transparent: 'transparent',
  black: '#000',
  white: '#fff',
  gray: {
    50: '#f7fafc',
    // ...
    900: '#171923',
  },
  // ...
}

export default {
  colors: {
    ...baseColors,
    fontColor: {
      main: baseColors.black,
      sub: baseColors.gray[700],
      link: baseColors.blue[500],
    },
    border: {
      normal: baseColors.blue[100],
    },
  },
}

カラーモード対応(light, dark..)

Chakra UIではデフォルトでカラーモード対応している。

https://chakra-ui.com/docs/styled-system/color-mode#usecolormodevalue

基本はコンポーネントに対してのcolorModeでの処理になる

function StyleColorMode() {
  const { toggleColorMode } = useColorMode()

  const bg = useColorModeValue('red.500', 'red.200')
  const color = useColorModeValue('white', 'gray.800')

  return (
    <>
      <Box mb={4} bg={bg} color={color}>
        This box's style will change based on the color mode.
      </Box>
      <Button size='sm' onClick={toggleColorMode}>
        Toggle Mode
      </Button>
    </>
  )
}

fontColor.main などでカラーモードに対応したい場合

コンポーネントごとではなく、一律グローバルでのカラーモード対応をしたい場合

カラーの定義自体、下記リンクのようにCSS Variablesでの定義になっている。

https://chakra-ui.com/docs/styled-system/css-variables#converting-theme-tokens-to-css-variables
:root {
  --chakra-colors-fontColor-main: #000;
}

そのためカラーモードに対応して、--chakra-colors-fontColor-main の定義を上書きすれば可能。

公式のグローバルなカラーモード対応

https://chakra-ui.com/docs/styled-system/css-variables#creating-scoped-theme-aware-css-variables

これは将来的に削除される可能性のある機能。
この仕組みを利用するか、削除されても困らないようにここだけCSS上で設定しても良い。

Providerなどと同じレイヤーで設定してあげると、全体に定義可能

<Box
  sx={{
    '--chakra-colors-fontColor-main': colorMode === 'light' ? 'colors.gray.100' : 'colors.white',
  }}
>
  // ...
</Box>

上述のthemingでの設定をデフォルトとすればよいので、
例えばdark対応時のみこの設定が適用されるようにすればよい。

if (colorMode = 'dark') {
  return <Box
    sx={{
      '--chakra-colors-fontColor-main':  'colors.white',
    }}
  >
    {children}
  </Box>
}
作成者以外のコメントは許可されていません