观看视频教程
Storybook 使用轻量级主题 API 可进行主题化。
可以全局主题化 Storybook。
Storybook 包含两个开箱即用的主题:“light” 和 “dark”。除非您将首选颜色方案设置为暗色,否则 Storybook 将默认使用浅色主题。
确保您已安装 @storybook/manager-api
和 @storybook/theming
包。
例如,您可以通过修改 .storybook/manager.js
来告诉 Storybook 使用 “dark” 主题。
设置主题时,请设置完整的主题对象。主题将被替换,而不是组合。
Storybook 文档 使用与 Storybook UI 相同的主题系统,但独立于主 UI 进行主题化。
假设您在 .storybook/manager.js
中为主 UI 定义了一个 Storybook 主题。
以下是如何在 .storybook/preview.js
中为文档指定相同主题。
如果您想学习如何创建自己的主题,请继续阅读。
自定义 Storybook 最简单的方法是使用 storybook/theming
中的 create()
函数生成一个新主题。此函数包含最常用主题变量的简写。以下是如何使用它
在您的 .storybook
目录中,创建一个名为 YourTheme.js
的新文件,并添加以下内容
💡如果您使用 brandImage
添加自定义徽标,您可以使用任何最常见的图像格式。
上面,我们创建了一个新的主题,它将
- 使用 Storybook 的
light
主题作为基线。
- 用我们自己的徽标 (在 brandImage 变量中定义) 替换 Storybook 的侧边栏徽标。
- 添加自定义品牌信息。
- 通过
target
属性,将品牌链接设置为在同一个窗口中打开(而不是新窗口)。
最后,我们需要将主题导入 Storybook。在您的 .storybook
目录中创建一个名为 manager.js
的新文件,并添加以下内容
现在,您的自定义主题将替换 Storybook 的默认主题,您将在 UI 中看到类似的变化。
让我们来看一个更复杂的示例。复制下面的代码,并将其粘贴到 .storybook/YourTheme.js
中。
上面,我们正在使用以下更改更新主题
- 自定义颜色调色板 (在
app
和 color
变量中定义)。
- 自定义字体 (在
font
和 text
变量中定义)。
随着引入的新更改,自定义主题应该产生类似的结果。
💡许多主题变量都是可选的,base
属性**不是**。
@storybook/theming
包使用 TypeScript 构建,这将有助于为 TypeScript 用户创建有效的主题。类型是包本身的一部分。
Storybook 主题 API 的设计非常狭窄。如果您希望对 CSS 有更细粒度的控制,所有 UI 和文档组件都使用类名进行标记,以使这成为可能。**使用风险自负**,因为这是一个高级功能。
要为这些元素设置样式,请将样式标签插入
- 对于 Storybook 的 UI,请使用
.storybook/manager-head.html
- 对于 Storybook 文档,请使用
.storybook/preview-head.html
⚠️注意
与调整 预览的头部标签 方式相同,Storybook 允许您通过 .storybook/manager-head.html
修改管理器端代码。当添加针对 Storybook HTML 的主题样式时,这会很有帮助,但也有成本,因为 Storybook 的内部 HTML 可能会在发布周期中的任何时间发生变化。
如果您在文档中使用 MDX,则还有一个“主题化”级别。MDX 允许您使用 components
参数完全覆盖从 Markdown 渲染的组件。这是一个高级用法,我们在 Storybook 中没有正式支持,但如果您需要,这是一个强大的构造。
以下是如何在 .storybook/preview.js
中插入自定义代码渲染器,以用于页面上的 code
块
您甚至可以覆盖 Storybook 块组件。
以下是如何插入自定义 <Canvas />
块
某些附加组件需要 Storybook 用户必须添加的特定主题变量。如果您与社区共享您的主题,请确保支持官方 API 和其他流行的附加组件,以便您的用户拥有一致的体验。
例如,流行的操作附加组件使用 react-inspector,它有自己的主题。提供额外的主题变量来设置它的样式,如下所示
将上面的主题变量重新用于原生 Storybook 开发者体验。主题引擎依赖于 emotion,一个 CSS-in-JS 库。
以对象表示法使用主题变量
或使用模板文字