storybook-addon-mantine

无需重启 Storybook 即可在多个 Mantine 主题之间切换,并可视化应用了每个主题的组件/页面。

在 Github 上查看

storybook-addon-mantine

无需重启 Storybook 即可在多个 Mantine 主题之间切换,并可视化应用了每个主题的组件/页面。

如何使用

安装附加组件

npm i -D storybook-addon-mantine

注册附加组件

在项目的 .storybook/main.ts 文件中执行此操作

// .storybook/main.ts
import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
  // ... other config properties
  addons: [
    // ... other addons
    "storybook-addon-mantine",
  ],
};

export default config;

主题

// src/themes.ts
import { createTheme } from "@mantine/core";

export const greenTheme = createTheme({
  primaryColor: "green",
  // ... other theme override properties
});

export const brandTheme = createTheme({
  fontFamily: "serif",
  // ... other theme override properties
});

将你的主题传递给附加组件

在你的 .storybook/preview.tsx 文件中执行此操作

import "@mantine/core/styles.css";

import { withMantineThemes } from "storybook-addon-mantine";
import { greenTheme, brandTheme } from "../themes";

export const decorators = [
  withMantineThemes({
    themes: [
      {
        id: "brand-theme",
        name: "Brand Theme",
        ...brandTheme,
      },
      {
        id: "light-green",
        name: "Light Green Theme",
        ...greenTheme,
      },
    ],
  }),
];

选项

withMantineThemes({themes, mantineProviderProps})

.storybook/preview.js 中的装饰器数组内调用此函数。

themes

要在 Storybook 中显示的主题列表。每个主题都应该是一个有效的 Mantine 主题覆盖对象

此外,每个主题对象必须具有

  • id: string - 必需,在主题之间必须唯一
  • name?: string - 可选,在列表中显示的用于从主题中进行选择的名称。

mantineProviderProps

这是要传递给 MantineProvider 组件的可选属性对象。
查看 文档页面 获取详细信息。

大多数用例不需要为该对象设置任何内容。

颜色方案(深色/浅色模式)支持

不能在 Storybook v7 的附加组件中使用 mantine hook。需要将 Storybook 管理器 UI 升级到 React 18(以便附加组件可以使用 React 的 useId hook)。这似乎 已计划在 Storybook 8 版本中发布

解决方法是在你的 Storybook 实例中配置 mantine useMantineColorScheme hook,查看 Mantine 文档以获取所有步骤

安装 Storybook 附加组件

npm install -D storybook-dark-mode @storybook/addon-styling storybook-addon-mantine

将附加组件添加到 .storybook/main.ts

import type { StorybookConfig } from "@storybook/react-vite";

const config: StorybookConfig = {
  // ... other config properties
  addons: [
    // ... other addons
    "@storybook/addon-styling",
    "storybook-dark-mode",
    "storybook-addon-mantine",
  ],
};

export default config;

如前所述创建你的主题。

// Import styles of packages that you've installed.
// All packages except `@mantine/hooks` require styles imports
import "@mantine/core/styles.css";

import React, { useEffect } from "react";
import { addons } from "@storybook/preview-api";
import { DARK_MODE_EVENT_NAME } from "storybook-dark-mode";
import { MantineProvider, useMantineColorScheme } from "@mantine/core";
import { withMantineThemes } from "storybook-addon-mantine";
import { greenTheme, brandTheme } from "../themes";

const channel = addons.getChannel();

function ColorSchemeWrapper({ children }: { children: React.ReactNode }) {
  const { setColorScheme } = useMantineColorScheme();
  const handleColorScheme = (value: boolean) =>
    setColorScheme(value ? "dark" : "light");

  useEffect(() => {
    channel.on(DARK_MODE_EVENT_NAME, handleColorScheme);
    return () => channel.off(DARK_MODE_EVENT_NAME, handleColorScheme);
  }, [channel]);

  return <>{children}</>;
}

export const decorators = [
  (renderStory: any) => (
    <ColorSchemeWrapper>{renderStory()}</ColorSchemeWrapper>
  ),
  withMantineThemes({
    themes: [
      {
        id: "brand-theme",
        name: "Brand Theme",
        ...brandTheme,
      },
      {
        id: "light-green",
        name: "Light Green Theme",
        ...greenTheme,
      },
    ],
  }),
];

应该就这些了!

npm run storybook

版本

此表将帮助你选择正确的 storybook-addon-mantine 版本

Storybook 版本 Mantine 版本 storybook-addon-mantine 版本
8 7 4.x
7 7 3.0.1
7 6 2.0.21
6 6 1.3
6 5 1.2
6 4 1.0

4.0

仅支持 Storybook 8 和 Mantine 7。

3.0

支持 Storybook 7。支持 Mantine v7 版本

这些是值得注意的

2.0

  • 支持 Storybook 7 - 无法与旧版本的 Storybook 配合使用。
  • 使用 AddonKit 和 Typescript 重新构建了整个包。
  • 在组件示例之间切换时始终保持选定的主题,而不是每次都默认返回第一个主题。

1.3

1.2

  • 更新对等依赖项

1.1

1.0

初始版本