如何使用 Storybook 6 在 Vuetify 中自定义主题?

Posted

技术标签:

【中文标题】如何使用 Storybook 6 在 Vuetify 中自定义主题?【英文标题】:How to customize theme in Vuetify using Storybook 6? 【发布时间】:2021-11-12 03:39:06 【问题描述】:

我想使用 Storybook 6 在 Vuetify 中自定义主题,我正在使用 @socheatsok78/storybook-addon-vuetify 包 https://storybook.js.org/addons/@socheatsok78/storybook-addon-vuetify

我完全按照文档所说的做了,但主题仍然无法正常工作。我想使用自定义属性和我自己的调色板来配置 vuetify。

preview.js

import '!style-loader!css-loader!sass-loader!./main.scss';
import 
  withVuetify,
  withThemeProvider,
 from '@socheatsok78/storybook-addon-vuetify/dist/decorators';
import minifyTheme from 'minify-css-string';

export const globalTypes = 
  theme: 
    dark: false,
    options: 
      customProperties: true,
      minifyTheme,
    ,
    themes: 
      light: 
        primary: '#007BBF',
        secondary: '#008574',
      ,
      dark: 
        primary: '#f099aa',
      ,
    ,
  ,
;

export const parameters = 
  actions:  argTypesRegex: '^on[A-Z].*' ,
  controls: 
    matchers: 
      color: /(background|color)$/i,
      date: /Date$/,
    ,
  ,
;

export const decorators = [withThemeProvider, withVuetify];

main.js

const path = require('path');

module.exports = 
  stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: [
    '@storybook/addon-links',
    '@storybook/addon-docs',
    '@storybook/addon-essentials',
    '@storybook/preset-scss',
    '@socheatsok78/storybook-addon-vuetify',
  ],
  webpackFinal: async (config) => 
    config.module.rules.push(
      test: /\.scss$/,
      use: [
        'style-loader',
        'css-loader',
        'sass-loader',
        
          loader: 'sass-resources-loader',
          options: 
            resources: path.resolve(__dirname, 'main.scss'),
          ,
        ,
      ],
      sideEffects: true,
      include: path.resolve(__dirname, '../'),
    );
    return config;
  ,
;

【问题讨论】:

【参考方案1】:

好的,我修复了主题,您可以在下面找到如何执行此操作的教程以及所有工作代码。 我在这里找到了一个很好的解释:

https://morphatic.com/2020/09/30/configuring-storybook-6-for-vue-2-vuetify-2-3/

preview.html

import '!style-loader!css-loader!sass-loader!./main.scss';
import  withVuetify  from '@socheatsok78/storybook-addon-vuetify/dist/decorators';
import vuetify from './vuetify';

import Vue from 'vue';

export const parameters = 
  actions:  argTypesRegex: '^on[A-Z].*' ,
  controls: 
    matchers: 
      color: /(background|color)$/i,
      date: /Date$/,
    ,
  ,
;

export const decorators = [
  (story, context) => 
    const wrapped = story(context);

    return Vue.extend(
      vuetify,
      components:  wrapped ,
      template: `
        <v-app>
          <v-container fluid>
            <wrapped/>
          </v-container>
        </v-app>
    `,
    );
  ,
  withVuetify,
];

main.js

我从插件中删除了一行

'@socheatsok78/storybook-addon-vuetify',

vuetify.js

import Vue from 'vue';
import Vuetify from 'vuetify';
import minifyTheme from 'minify-css-string';
import theme from './theme';
import LRU from 'lru-cache';

const themeCache = new LRU(
  max: 10,
  maxAge: 1000 * 60 * 60, // 1 hour
);

Vue.use(Vuetify);

export default new Vuetify(
  theme: 
    options: 
      customProperties: true,
      minifyTheme,
      themeCache,
    ,
    themes: 
      light: theme,
    ,
  ,
);

theme.js

export default 
  // ... other colors
  primary: '#007BBF',
;

主题现在完美运行,只是变量没有正确加载,我不知道如何解决这个问题,你可以在文章 cmets 中阅读它

【讨论】:

以上是关于如何使用 Storybook 6 在 Vuetify 中自定义主题?的主要内容,如果未能解决你的问题,请参考以下文章

Storybook 6 错误:ngrx no provider for Store 错误 - 如何修复? [关闭]

Storybook 6 装饰器将道具传递给故事不起作用

如何在 Storybook 中使用 NextJS 的 'useRouter()' 钩子

找不到与 @storybook/react-native@^5.0.6 匹配的版本

React Storybook 中不可见的面板

如何使用 Svelte 在 Storybook 中设置打字稿?