title | sidebar | ||||
---|---|---|---|---|---|
Theming |
|
Storybook is theme-able using a lightweight theming API.
It's possible to theme Storybook globally.
Storybook includes two themes that look good out of the box: "light" and "dark". Unless you've set your preferred color scheme as dark, Storybook will use the light theme as default.
Make sure you have installed @storybook/manager-api
and @storybook/theming
packages.
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
As an example, you can tell Storybook to use the "dark" theme by modifying .storybook/manager.js
:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
When setting a theme, set a complete theme object. The theme is replaced, not combined.
Storybook Docs uses the same theme system as Storybook’s UI but is themed independently from the main UI.
Supposing you have a Storybook theme defined for the main UI in .storybook/manager.js
:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Here's how you'd specify the same theme for docs in .storybook/preview.js
:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Continue to read if you want to learn how to create your theme.
The easiest way to customize Storybook is to generate a new theme using the create()
function from storybook/theming
. This function includes shorthands for the most common theme variables. Here's how to use it:
Inside your .storybook
directory, create a new file called YourTheme.js
and add the following:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
If you're using brandImage
to add your custom logo, you can use any of the most common image formats.
Above, we're creating a new theme that will:
- Use Storybook's
light
theme as a baseline. - Replace Storybook's logo in the sidebar with our own (defined in the brandImage variable).
- Add custom branding information.
- Set the brand link to open in the same window (as opposed to a new one), via the
target
attribute.
Finally, we'll need to import the theme into Storybook. Create a new file called manager.js
in your .storybook
directory and add the following:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Now your custom theme will replace Storybook's default theme, and you'll see a similar set of changes in the UI.
Let's take a look at a more complex example. Copy the code below and paste it in .storybook/YourTheme.js
.
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Above, we're updating the theme with the following changes:
- A custom color palette (defined in the
app
andcolor
variables). - Custom fonts (defined in the
font
andtext
variables).
With the new changes introduced, the custom theme should yield a similar result.
Many theme variables are optional, thebase
property is **NOT**.
The @storybook/theming
package is built using TypeScript, which should help create a valid theme for TypeScript users. The types are part of the package itself.
The Storybook theme API is narrow by design. If you want to have fine-grained control over the CSS, all UI and Docs components are tagged with class names to make this possible. Use at your own risk as this is an advanced feature.
To style these elements, insert style tags into:
- For Storybook’s UI, use
.storybook/manager-head.html
- For Storybook Docs, use
.storybook/preview-head.html
If you're using MDX for docs, there's one more level of "themability". MDX allows you to completely override the rendered components from Markdown using a components
parameter. It's an advanced usage that we don't officially support in Storybook, but it's a powerful construct if you need it.
Here's how you might insert a custom code renderer for code
blocks on the page, in .storybook/preview.js
:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
You can even override a Storybook block component.
Here's how you might insert a custom <Canvas />
block:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Some addons require specific theme variables that a Storybook user must add. If you share your theme with the community, make sure to support the official API and other popular addons, so your users have a consistent experience.
For example, the popular Actions addon uses react-inspector, which has themes of its own. Supply additional theme variables to style it like so:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Reuse the theme variables above for a native Storybook developer experience. The theming engine relies on emotion, a CSS-in-JS library.
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Use the theme variables in object notation:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}
Or with template literals:
{/* prettier-ignore-start */}
{/* prettier-ignore-end */}