storybook-addon-themes
Version:
A storybook addon to switch between different themes for your preview
54 lines (49 loc) • 1.26 kB
text/typescript
import addons from '@storybook/addons';
import { CHANGE } from '../constants';
import { Theme } from '../models';
import { getSelectedTheme, getSelectedThemeName } from '../shared';
import { getHtmlClasses } from './shared';
const channel = addons.getChannel();
export const ThemeDecorator = {
beforeDestroy() {
channel.removeListener(CHANGE, this.setThemeName);
},
computed: {
theme(): Theme {
return getSelectedTheme(this.config.list, this.themeName);
},
themeClasses(): string {
return getHtmlClasses(this.theme);
},
},
data() {
const lastValue = channel.last(CHANGE);
return {
themeName: (lastValue && lastValue[0]) || getSelectedThemeName(this.config.list, this.config.default)
};
},
methods: {
setThemeName(themeName: string) {
this.themeName = themeName;
}
},
mounted() {
const channel = addons.getChannel();
channel.on(CHANGE, this.setThemeName);
},
props: [ 'config' ],
template: `
<component
v-if="this.config.Decorator"
:is="this.config.Decorator"
:theme="theme"
:themes="this.config.list"
:themeClasses="themeClasses"
:themeName="themeName"
>
<slot></slot>
</component>
<div v-else :class="themeClasses">
<slot></slot>
</div>`
};