Source
The Source block is used to render a snippet of source code directly.

import { Meta, Source } from '@storybook/addon-docs/blocks';
import * as ButtonStories from './Button.stories';
<Meta of={ButtonStories} />
<Source of={ButtonStories.Primary} />Source
import { Source } from '@storybook/addon-docs/blocks';使用 props **和** 参数进行配置
ℹ️ Like most blocks, the Source block is configured with props in MDX. Many of those props derive their default value from a corresponding parameter in the block's namespace, parameters.docs.source.
The following language configurations are equivalent
// Replace your-framework with the framework you are using, e.g. react-vite, nextjs, vue3-vite, etc.
import type { Meta, StoryObj } from '@storybook/your-framework';
import { Button } from './Button';
const meta = {
component: Button,
} satisfies Meta<typeof Button>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Basic: Story = {
parameters: {
docs: {
source: { language: 'tsx' },
},
},
};<Source of={ButtonStories.Basic} language="tsx" />上面的示例在 story 级别应用了参数,但也可以在 component (或 meta) 级别或 project 级别应用。
code
类型:string
Default: parameters.docs.source.code
Provides the source code to be rendered.
import { Meta, Source } from '@storybook/addon-docs/blocks';
import * as ButtonStories from './Button.stories';
<Meta of={ButtonStories} />
<Source code={`const thisIsCustomSource = true;
if (isSyntaxHighlighted) {
console.log('syntax highlighting is working');
}`} />dark
类型:boolean
Default: parameters.docs.source.dark
Determines if the snippet is rendered in dark mode.
Light mode is only supported when the Source block is rendered independently. When rendered as part of a Canvas block—like it is in autodocs—it will always use dark mode.
excludeDecorators
类型:boolean
Default: parameters.docs.source.excludeDecorators
Determines if decorators are rendered in the source code snippet.
language
类型
'jsextra' | 'jsx' | 'json' | 'yml' | 'md' | 'bash' | 'css' | 'html' | 'tsx' | 'typescript' | 'graphql'Default: parameters.docs.source.language or 'jsx'
Specifies the language used for syntax highlighting.
of
类型: Story export
Specifies which story's source is rendered.
transform
Type: (code: string, storyContext: StoryContext) => string | Promise<string>
Default: parameters.docs.source.transform
An async function to dynamically transform the source before being rendered, based on the original source and any story context necessary. The returned string is displayed as-is. If both code and transform are specified, transform will be ignored.
export default {
parameters: {
docs: {
source: {
transform: async (source) => {
const prettier = await import('prettier/standalone');
const prettierPluginBabel = await import('prettier/plugins/babel');
const prettierPluginEstree = await import('prettier/plugins/estree');
return prettier.format(source, {
parser: 'babel',
plugins: [prettierPluginBabel, prettierPluginEstree],
});
},
},
},
},
};This example shows how to use Prettier to format all source code snippets in your documentation. The transform function is applied globally through the preview configuration, ensuring consistent code formatting across all stories.
type
Type: 'auto' | 'code' | 'dynamic'
Default: parameters.docs.source.type or 'auto'
Specifies how the source code is rendered.
- auto: Same as dynamic, if the story's
renderfunction accepts args inputs and dynamic is supported by the framework in use; otherwise same as code - code: Renders the value of
codeprop, otherwise renders static story source - dynamic: Renders the story source with dynamically updated arg values
Note that dynamic snippets will only work if the story uses args and the Story block for that story is rendered along with the Source block.
