@storybook/addon-themes
要开始使用,你需要安装@storybook/addon-themes
。
运行以下脚本以安装和注册插件
npx storybook@latest add @storybook/addon-themes
在底层,这会运行 npx @storybook/auto-config themes
,它应该读取你的项目并尝试使用正确的装饰器配置你的 Storybook。如果直接运行该命令无法解决你的问题,请在 @storybook/auto-config 仓库上提交一个错误报告,以便我们进一步改进它。要手动添加此插件,请安装它,然后将其添加到 .storybook/main.ts
中的 addons 数组中。
GlobalStyles
在 .storybook/preview.js
内部,创建一个包含 font-family
的 <GlobalStyles />
组件。然后使用 withThemeFromJSXProvider
装饰器将其应用于你的 stories,方法是将其添加到 decorators 数组中。
// .storybook/preview.jsx
import { withThemeFromJSXProvider } from '@storybook/addon-themes';
import { Global, css } from '@emotion/react';
const GlobalStyles = () => (
<Global
styles={css`
body {
font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
`}
/>
);
export const decorators = [
withThemeFromJSXProvider({
GlobalStyles, // Adds your GlobalStyles component to all stories
}),
];
如果你的应用程序中已经有 <Global />
,你可以将其导入到 .storybook/preview.js
中,而不是重新创建一个。
要与 Storybook 中的组件共享你的主题,你需要将它们提供给 withThemeFromJSXProvider
装饰器,以及 @emotion/styled
的 <ThemeProvider />
组件。
// .storybook/preview.jsx
import { withThemeFromJSXProvider } from '@storybook/addon-themes';
import { Global, css, ThemeProvider } from '@emotion/react';
import { lightTheme, darkTheme } from '../src/themes';
const GlobalStyles = () => (
<Global
styles={css`
body {
font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
`}
/>
);
export const decorators = [
withThemeFromJSXProvider({
themes: {
light: lightTheme,
dark: darkTheme,
}
defaultTheme: 'light',
Provider: ThemeProvider,
GlobalStyles,
})];
现在,使用 Emotion 创建的组件将通过 theme
prop 以及从 <Global />
继承的样式获取主题。
当你提供多个主题时,Storybook UI 中将出现一个工具栏菜单,用于选择你想要的 stories 主题。
现在你已准备好将 Emotion 与 Storybook 一起使用。🎉
如果你在工作中使用 Emotion,我们很乐意得到你的帮助,使此设置变得更好。加入 Discord 中的维护者以参与其中,或跳转到插件文档。