UNPKG

@storybook/addon-styling-webpack

Version:

A base addon for configuring popular styling tools in Webpack

258 lines (218 loc) 6.64 kB
<div style="margin: 0 auto; text-align: center; padding-bottom: 20px;"> <img src="https://raw.githubusercontent.com/storybookjs/addon-styling-webpack/3b88daa822e57b7e691cd0b77d70ac5582410f8a/.github/media/styling.svg" alt="addon-styling-webpack Logo" width="150" height="150" align="center"> </div> # `@storybook/addon-styling-webpack` Get started in Storybook 7 faster with popular styling tools. ## ✨ Features - 🤖 Zero-config for popular tools through codemods. - 🧩 Configuration templates for popular tools - ⚡️ Options for CSS modules, PostCSS, Sass, Less, and Vanilla-extract ## 🏁 Getting ### 🤖 Automatic configuration To get started, **install the package** using the Storybook CLI: pnpm: ```zsh pnpm dlx storybook@latest add @storybook/addon-styling-webpack ``` yarn: ```zsh yarn dlx storybook@latest add @storybook/addon-styling-webpack ``` npm: ```zsh npx storybook@latest add @storybook/addon-styling-webpack ``` **What does this do?** Under the hood, this installs the package in your project and adds the addon to your `main.js` file. After that, it will run `npx @storybook/auto-config styling`. This is a codemod package that will attempt to detect the styling tools in your project and configure your storybook accordingly. If the codemod fails, please try running `npx @storybook/auto-config styling` manually. If that fails, please [file an issue in the auto-config repo](https://github.com/storybookjs/auto-config/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%5BBug%5D). ### 🛠️ Manual configuration `@storybook/addon-styling-webpack` takes Webpack module rules for your styling tools and replaces the existing rules in Storybook's Webpack config. This avoids duplicating rules that will break your Storybook build. ```js { name: '@storybook/addon-styling-webpack', options: { rules: [ // Replaces existing CSS rules with given rule { test: /\.css$/, use: [ 'style-loader', 'css-loader', ], } ] } } ``` It can also take Webpack plugins to add to the Storybook config. ```js { name: '@storybook/addon-styling-webpack', options: { plugins: [ new MiniCssExtractPlugin(), ] } } ``` ### 🧩 Popular Configurations Below are a few popular configurations for common styling tools to get you started. More complex configurations are possible by combining the different rules below. #### PostCSS ```js // Often used for tailwind { name: '@storybook/addon-styling-webpack', options: { rules: [ // Replaces existing CSS rules to support PostCSS { test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { importLoaders: 1 } }, { // Gets options from `postcss.config.js` in your project root loader: 'postcss-loader', options: { implementation: require.resolve('postcss') } } ], } ] } } ``` You can also take a look at this [example project](https://stackblitz.com/edit/github-5njuww?file=.storybook%2Fmain.ts) that uses PostCSS for **Tailwind** with Storybook: #### CSS Modules ```js { name: '@storybook/addon-styling-webpack', options: { rules: [ // Replaces existing CSS rules to support CSS Modules { test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { modules: { auto: true, localIdentName: '[name]__[local]--[hash:base64:5]', }, }, } ], } ] } } ``` #### Sass ```js { name: '@storybook/addon-styling-webpack', options: { rules: [ // Replaces any existing Sass rules with given rules { test: /\.s[ac]ss$/i, use: [ "style-loader", "css-loader", { loader: "sass-loader", options: { implementation: require.resolve("sass") } }, ], }, ] } } ``` #### Less ```js { name: '@storybook/addon-styling-webpack', options: { rules: [ // Replaces any existing Sass rules with given rules { test: /\.less$/i, use: [ "style-loader", "css-loader", { loader: "less-loader", options: { implementation: require.resolve("less") } }, ], }, ] } } ``` #### Vanilla-extract ```js { name: '@storybook/addon-styling-webpack', options: { plugins: [ new VanillaExtractPlugin(), new MiniCssExtractPlugin(), ], rules: [ { test: /\.css$/, sideEffects: true, use: [ require.resolve("style-loader"), { loader: require.resolve("css-loader"), options: {}, }, ], exclude: /\.vanilla\.css$/, }, { // Targets only CSS files generated by vanilla-extract test: /\.vanilla\.css$/i, sideEffects: true, use: [ MiniCssExtractPlugin.loader, { loader: require.resolve('css-loader'), options: { // Required as image imports should be handled via JS/TS import statements url: false, }, }, ], }, ] } } ``` ## Troubleshooting <details> <summary> This isn't working in my monorepo. </summary> Monorepos are a more advanced setup that may require a bit more configuration. To find out more. Refer to the Storybook FAQs on [monorepos](https://storybook.js.org/docs/faq#how-do-i-fix-module-resolution-in-special-environments). </details> ## 🤝 Contributing If you'd like to contribute to this addon, **THANK YOU**, I'd love your help 🙏 ### 📝 Development scripts - `pnpm build` build and package your addon code ### 🌲 Branch structure - **next** - the `next` version on npm, and the development branch where most work occurs - **main** - the `latest` version on npm and the stable version that most users use ### 🚀 Release process 1. All PRs should target the `next` branch, which depends on the `next` version of Storybook. 2. When merged, a new version of this package will be released on the `next` NPM tag. 3. If the change contains a bugfix that needs to be patched back to the stable version, please note that in PR description. 4. PRs labeled `pick` will get cherry-picked back to the `main` branch and will generate a release on the `latest` npm tag.