Light and Dark Themes
It is a common pattern to define separate light
, dark
and system themes
to provide the ability to switch between different color schemes.
This would typically be done by defining three separate Theme
s:
const lightVars = {
primaryColor: 'black',
...
};
export const light = stylex.createTheme(vars, lightVars);
const darkVars = {
primaryColor: 'white',
...
};
export const dark = stylex.createTheme(vars, darkVars);
const systemVars = {
primaryColor: {
default: 'black',
'@media (prefers-color-scheme: dark)': 'white',
},
...
};
export const system = stylex.createTheme(vars, systemVars);
This pattern is well supported and will work in all browsers that support CSS variables.
Using the light-dark()
CSS function
In modern browsers, we suggest using the
light-dark()
CSS function instead which will simplify the code and remove the need to define themes.
export const vars = stylex.defineVars({
primaryColor: 'light-dark(black, white)',
...
});
You can now control the color scheme applied by using the color-scheme
CSS property.
const styles = stylex.create({
light: {
colorScheme: 'light',
},
dark: {
colorScheme: 'dark',
},
system: {
colorScheme: 'light dark',
},
});
<div {...stylex.props(styles[colorScheme])}>
...
</div>
You can still define custom themes for other use-cases and use light-dark()
within them.
Limitations
- The
light-dark()
CSS function can only be used for color values. - The
light-dark()
function is not supported in older browsers.