Преглед изворни кода

Merge pull request #16138 from grafana/tooling/storybook-sass-theme

Enable sass theme change in Storybook
Dominik Prokop пре 6 година
родитељ
комит
d3a321cac1

+ 14 - 2
packages/grafana-ui/.storybook/config.ts

@@ -2,13 +2,25 @@ import { configure, addDecorator } from '@storybook/react';
 import { withKnobs } from '@storybook/addon-knobs';
 import { withTheme } from '../src/utils/storybook/withTheme';
 
-import '../../../public/sass/grafana.light.scss';
+// @ts-ignore
+import lightTheme from '../../../public/sass/grafana.light.scss';
+// @ts-ignore
+import darkTheme from '../../../public/sass/grafana.dark.scss';
 
+const handleThemeChange = (theme: string) => {
+  if (theme !== 'light') {
+    lightTheme.unuse();
+    darkTheme.use();
+  } else {
+    darkTheme.unuse();
+    lightTheme.use();
+  }
+};
 // automatically import all files ending in *.stories.tsx
 const req = require.context('../src/components', true, /.story.tsx$/);
 
 addDecorator(withKnobs);
-addDecorator(withTheme);
+addDecorator(withTheme(handleThemeChange));
 
 function loadStories() {
   req.keys().forEach(req);

+ 5 - 5
packages/grafana-ui/.storybook/webpack.config.js

@@ -14,15 +14,15 @@ module.exports = (baseConfig, env, config) => {
     test: /\.scss$/,
     use: [
       {
-        loader: 'style-loader',
+        loader: 'style-loader/useable',
       },
       {
         loader: 'css-loader',
         options: {
           importLoaders: 2,
-          url: false,
-          sourceMap: false,
-          minimize: false,
+          // url: false,
+          // sourceMap: false,
+          // minimize: false,
         },
       },
       {
@@ -35,7 +35,7 @@ module.exports = (baseConfig, env, config) => {
       {
         loader: 'sass-loader',
         options: {
-          sourceMap: false
+          sourceMap: false,
         },
       },
     ],

+ 10 - 2
packages/grafana-ui/src/utils/storybook/withTheme.tsx

@@ -5,7 +5,11 @@ import { select } from '@storybook/addon-knobs';
 import { getTheme } from '../../themes/index';
 import { GrafanaThemeType } from '../../types';
 
-const ThemableStory: React.FunctionComponent<{}> = ({ children }) => {
+type SassThemeChangeHandler = (theme: GrafanaThemeType) => void;
+const ThemableStory: React.FunctionComponent<{ handleSassThemeChange: SassThemeChangeHandler }> = ({
+  children,
+  handleSassThemeChange,
+}) => {
   const themeKnob = select(
     'Theme',
     {
@@ -15,6 +19,8 @@ const ThemableStory: React.FunctionComponent<{}> = ({ children }) => {
     GrafanaThemeType.Dark
   );
 
+  handleSassThemeChange(themeKnob);
+
   return <ThemeContext.Provider value={getTheme(themeKnob)}>{children}</ThemeContext.Provider>;
 };
 
@@ -33,4 +39,6 @@ export const renderComponentWithTheme = (component: React.ComponentType<any>, pr
   );
 };
 
-export const withTheme = (story: RenderFunction) => <ThemableStory>{story()}</ThemableStory>;
+export const withTheme = (handleSassThemeChange: SassThemeChangeHandler) => (story: RenderFunction) => (
+  <ThemableStory handleSassThemeChange={handleSassThemeChange}>{story()}</ThemableStory>
+);