storybook [Bug]: themes.normal 无法在文档页面上工作

7fyelxc5  于 2个月前  发布在  其他
关注(0)|答案(5)|浏览(48)

描述bug
我有一个hosted storybook site,它只显示文档页面,我希望整个网站(侧边栏、预览等)都能根据用户的系统设置(浅色/深色模式)来显示。在Storybook Theming页面上,有一个视频指出,您可以在自定义主题中使用themes.normal(来自@storybook/theming包),以便尊重用户的系统设置(浅色/深色模式)。这在我自定义主题(在manager.js中)中运行良好,但对我的文档页面内容不起作用。
从同一个Theming页面:它说,您可以通过将以下内容放入preview.js来主题化文档页面:

parameters: {
    docs: {
        theme: themes.dark,
    },
},

这运行良好,但我想尊重用户的系统设置,所以我尝试再次使用themes.normal,这次它不起作用 - 它总是显示浅色主题。您可以在此处看到实际操作:https://intl-tel-input.com/storybook
是否有办法让文档预览面板尊重用户的系统设置?
我找到了两个相关的插件:
https://storybook.js.org/addons/storybook-dark-mode
https://storybook.js.org/addons/@storybook/addon-themes
但是它们似乎都关注于给用户手动切换主题的能力,而这不是我想要的 - 我只想让它自动尊重用户的系统设置。

// manager.js
import { addons } from '@storybook/manager-api';
import { themes, create } from '@storybook/theming';

const customTheme = create({
  base: themes.normal,
  brandTitle: 'IntlTelInput Storybook',
  brandUrl: 'https://intl-tel-input.com',
  brandImage: 'https://intl-tel-input.com/img/logo.png',
  brandTarget: '_self',
});

addons.setConfig({
  showToolbar: false,
  showPanel: false,
  theme: customTheme,
});
// preview.js
import { themes } from '@storybook/theming';

/** @type { import('@storybook/react').Preview } */
const preview = {
  parameters: {
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/i,
      },
    },
    docs: {
      theme: themes.default,
    },
  },
};

export default preview;

复现链接

https://stackblitz.com/edit/github-ctbu1e?file=.storybook%2Fpreview.js

复现步骤

在您的preview.js中放入以下内容:

parameters: {
    docs: {
        theme: themes.normal,
    },
},

我原以为这会尊重用户的系统设置(浅色/深色模式),但它始终使用浅色模式。

系统

Storybook Environment Info:

  System:
    OS: macOS 13.6.7
    CPU: (4) x64 Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.11.0 - ~/.nvm/versions/node/v20.11.0/bin/node
    npm: 10.2.4 - ~/.nvm/versions/node/v20.11.0/bin/npm <----- active
  Browsers:
    Chrome: 126.0.6478.183
    Safari: 17.5
  npmPackages:
    @storybook/addon-essentials: ^8.2.5 => 8.2.5 
    @storybook/addon-interactions: ^8.2.5 => 8.2.5 
    @storybook/addon-links: ^8.2.5 => 8.2.5 
    @storybook/addon-mdx-gfm: ^8.2.5 => 8.2.5 
    @storybook/blocks: ^8.2.5 => 8.2.5 
    @storybook/manager-api: ^8.2.5 => 8.2.5 
    @storybook/react: ^8.2.5 => 8.2.5 
    @storybook/react-vite: ^8.2.5 => 8.2.5 
    @storybook/test: ^8.2.5 => 8.2.5 
    @storybook/theming: ^8.2.5 => 8.2.5 
    eslint-plugin-storybook: ^0.8.0 => 0.8.0 
    storybook: ^8.2.5 => 8.2.5 
    storybook-addon-deep-controls: ^0.6.2 => 0.6.2

附加上下文

  • 无响应*
eanckbw9

eanckbw91#

免责声明:由于信息是自动生成的,可能存在不准确的情况。
要解决themes.normal在文档页面上无法正常工作的问题,请将您的.storybook/preview.js更新为使用@storybook/theming中的ensure功能,以确保主题尊重用户的系统设置。以下是更新后的代码:

import { themes, ensure } from '@storybook/theming';

/** @type { import('@storybook/react').Preview } */
const preview = {
  parameters: {
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/i,
      },
    },
    docs: {
      theme: ensure(themes.normal),
    },
  },
};

export default preview;

参考文献

/docs/_snippets/storybook-preview-docs-dark-theme.md
/docs/_snippets/configure-mock-provider-with-story-parameter.md
/code/.storybook/preview.tsx
/.github/DISCUSSION_TEMPLATE/help.yml
/docs/_snippets/storybook-preview-auto-docs-override-theme.md
/code/deprecated/theming/package.json
/code/addons/themes/package.json
/code/core/src/manager/components/sidebar/Brand.tsx
/test-storybooks/external-docs/.storybook
/code/addons/themes/README.md
/code/core/scripts/helpers/modifyThemeTypes.ts
/code/renderers/server/template/cli/button.stories.json
/.github/DISCUSSION_TEMPLATE/ideas.yml
/docs/_snippets/mock-provider-in-preview.md
/code/presets/server-webpack/src/lib/compiler/testfixtures/backgrounds.json
/code/addons/themes
/docs/configure/user-interface/theming.mdx
/docs/_snippets/storybook-preview-with-angular-polyfills.md
/code/addons/themes/docs/getting-started
/code/addons/docs/template/stories/docspage
/code/presets/server-webpack/src/lib/compiler/testfixtures/kitchen_sink.snapshot
/code/addons/docs/ember
/code/core/src/theming/README.md
/docs/_snippets/your-theme.md
/code/frameworks/ember/src/client/preview/docs

关于Greptile

此响应为您提供研究的起点,而非精确解决方案。
帮助我们改进!如果这有帮助,请留下一个👍,如果无关紧要,请留下一个👎。

3okqufwl

3okqufwl2#

你好,机器人。我尝试了你建议的方法,但在查看页面时出现了以下错误:"向颜色函数传递了错误的参数,请传递颜色的字符串表示形式。"

uinbv5nw

uinbv5nw3#

你好,@jackocnr!
从我看到的代码来看,themes.normal 等同于 themes.light(参见 core/src/theming/create.ts#L11)。
我们在下面的几行中获取用户偏好,所以根据这个偏好使 themes.normal 适应暗色或浅色主题应该不难。我会尽量在下周找时间修复这个问题。
在此期间,你可以尝试以下解决方法:

// Copied from https://github.com/storybookjs/storybook/blob/v8.2.5/code/core/src/theming/utils.ts
const { window: globalWindow } = global;
export const getPreferredColorScheme = () => {
  if (!globalWindow || !globalWindow.matchMedia) return 'light';

  const isDarkThemePreferred = globalWindow.matchMedia('(prefers-color-scheme: dark)').matches;
  if (isDarkThemePreferred) return 'dark';

  return 'light';
};

// In your preview.js
const preview = {
  parameters: {
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/i,
      },
    },
    docs: {
      theme: themes[getPreferredColorScheme()],
    },
  },
};
iecba09b

iecba09b4#

这个方法非常有效,非常感谢@elisezhg的快速回复💐。

6ie5vjzr

6ie5vjzr5#

这是一个Chan视频中的文档问题。据我所知,themes.normal已经存在一段时间了。

相关问题