Skip to main content

Theming

The Switch component is a multipart component. The styling needs to be applied to each part specifically.

To learn more about styling multipart components, visit the Component Style page.

Anatomy

  • A: container
  • B: thumb
  • C: track

Theming properties

The properties that affect the theming of the Switch component are:

  • colorScheme: The color scheme of the Switch component. Defaults to blue.
  • size: The size of the Switch component. Defaults to md.

Theming utilities

  • createMultiStyleConfigHelpers: a function that returns a set of utilities for creating style configs for a multipart component (definePartsStyle and defineMultiStyleConfig).
  • definePartsStyle: a function used to create multipart style objects.
  • defineMultiStyleConfig: a function used to define the style configuration for a multipart component.
import { switchAnatomy } from "@chakra-ui/anatomy";
import { createMultiStyleConfigHelpers } from "@chakra-ui/react";

const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(switchAnatomy.keys);

Customizing the default theme

import { switchAnatomy } from "@chakra-ui/anatomy";
import { createMultiStyleConfigHelpers } from "@chakra-ui/react";

const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(switchAnatomy.keys);

const baseStyle = definePartsStyle({
// define the part you're going to style
container: {
// ...
},
thumb: {
bg: "red.500",
},
track: {
bg: "gray.100",
_checked: {
bg: "gray.100",
},
},
});

export const switchTheme = defineMultiStyleConfig({ baseStyle });

After customizing the switch theme, we can import it in our theme file and add it in the components property:

import { extendTheme } from "@chakra-ui/react";
import { switchTheme } from "./components/switch";

export const theme = extendTheme({
components: { Switch: switchTheme },
});

This is a crucial step to make sure that any changes that we make to the switch theme are applied.

Using a custom color scheme

Let's assume we want to use our own custom color scale based on our brand. We'd need to define the color scale first in the main theme file:

import { extendTheme } from '@chakra-ui/react'

export const theme = extendTheme({
colors: {
brand: {
50: '#f7fafc',
...
500: '#718096',
...
900: '#171923',
}
}
})

Then, we can use the custom color scale as the color scheme for the button:

<Switch colorScheme="brand" />

Every time you're adding anything new to the theme, you'd need to run the CLI command to get proper autocomplete in your IDE. You can learn more about the CLI tool here.

Adding a custom variant

Let's assume we want to include a custom boxy variant. Here's how you can do that:

import { switchAnatomy } from '@chakra-ui/anatomy'
import { createMultiStyleConfigHelpers } from '@chakra-ui/react'

const { definePartsStyle, defineMultiStyleConfig } =
createMultiStyleConfigHelpers(switchAnatomy.keys)

const boxy = definePartsStyle({
track: {
borderRadius: 'sm',
p: 1,
}
})

export const switchTheme = defineMultiStyleConfig({ variants: { boxy }})

// Now we can use the new `boxy` variant
<Switch variant="boxy"/>

Changing the default properties

Let's assume we want to change the default size and color scheme of every switch in our app. Here's how we can do that:

import { switchAnatomy } from '@chakra-ui/anatomy'
import { createMultiStyleConfigHelpers, defineStyle } from '@chakra-ui/react'

const { defineMultiStyleConfig } = createMultiStyleConfigHelpers(
switchAnatomy.keys,
)

export const switchTheme = defineMultiStyleConfig({
defaultProps: {
size: 'xl',
colorScheme: 'brand',
},
})

// This saves you time, instead of manually setting the size and variant every time you use an input:
<Switch size="xl" colorScheme="brand" ... />

Showcase

import { ChakraProvider, extendTheme } from "@chakra-ui/react";
import Switch from "./switch";
import { switchTheme } from "./switch-theme";

const theme = extendTheme({
  components: {
    Switch: switchTheme,
  }
});

const App = () => {
  return (
    <ChakraProvider theme={theme}>
      <Switch />
    </ChakraProvider>
  );
}

export default App;