- Setup your stencil project as usual
- Add storybook:
npx -p @storybook/cli sb init --type react
(we use react so you can use JSX inside your stories) - Add required deps:
npm add @babel/plugin-syntax-import-meta @open-wc/webpack-import-meta-loader webpack-merge -D
- preview.js:
import { defineCustomElements } from "../dist/esm/loader";
defineCustomElements();
- main.js
const merge = require('webpack-merge');
module.exports = {
addons: [
],
stories: ['../src/**/*.stories.mdx'],
webpack: config => {
return merge(config, {
module: {
rules: [
{
test: /\.js$/,
loader: require.resolve('@open-wc/webpack-import-meta-loader')
}
]
}
});
}
};
- .babelrc.js
module.exports = {
plugins: ['@babel/plugin-syntax-import-meta']
};
-
Start stencil:
stencil build --watch
(MUST run in prod mode, NOT dev mode) -
Start storybook:
npm run storybook
-
Write your stories
import { Meta, Preview, Story } from "@storybook/addon-docs/blocks";
<Meta title="My Component" />
# My Component
Hello world
<Preview>
<Story name="API">
<my-component
first="Jeroen"
middle="Pieter"
last="Zwartepoorte"
></my-component>
</Story>
</Preview>
- You have storybook running with live reload when you save a stencil file.
NOTE: This setup works great as long as you don't try to pass complex objects to a web components. So this will not work:
<x-foo foo={{ foo: 'asdf', bar: 1234 }}></x-foo>
If you want to do this from an MDX story, you have to use @storybook/web-components
and lit-html
.
This is great! Thank you for documenting this!