@storybook/react

  • Version 10.2.12
  • Published
  • 1.23 MB
  • 3 dependencies
  • MIT license

Install

npm i @storybook/react
yarn add @storybook/react
pnpm add @storybook/react

Overview

Storybook React renderer

Index

Variables

variable INTERNAL_DEFAULT_PROJECT_ANNOTATIONS

const INTERNAL_DEFAULT_PROJECT_ANNOTATIONS: ProjectAnnotations<ReactRenderer>;

    Functions

    function composeStories

    composeStories: <TModule extends Store_CSFExports<ReactRenderer, any>>(
    csfExports: TModule,
    projectAnnotations?: ProjectAnnotations<ReactRenderer>
    ) => Omit<StoriesWithPartialProps<ReactRenderer, TModule>, keyof Store_CSFExports>;
    • Function that will receive a stories import (e.g. import * as stories from './Button.stories') and optionally projectAnnotations (e.g. `import * as projectAnnotations from '../.storybook/preview`) and will return an object containing all the stories passed, but now as a composed component that has all args/parameters/decorators/etc combined and applied to it.

      It's very useful for reusing stories in scenarios outside of Storybook like unit testing.

      Example:

      import { render } from '@testing-library/react';
      import { composeStories } from '@storybook/react';
      import * as stories from './Button.stories';
      const { Primary, Secondary } = composeStories(stories);
      test('renders primary button with Hello World', () => {
      const { getByText } = render(<Primary>Hello world</Primary>);
      expect(getByText(/Hello world/i)).not.toBeNull();
      });

      Parameter csfExports

      E.g. (import * as stories from './Button.stories')

      Parameter projectAnnotations

      E.g. (import * as projectAnnotations from '../.storybook/preview') this can be applied automatically if you use setProjectAnnotations in your setup files.

    function composeStory

    composeStory: <TArgs extends Args = Args>(
    story: StoryAnnotationsOrFn<ReactRenderer, TArgs>,
    componentAnnotations: ComponentAnnotations<
    ReactRenderer,
    ComponentProps<TCmpOrArgs>
    >,
    projectAnnotations?: ProjectAnnotations<ReactRenderer>,
    exportsName?: string
    ) => ComposedStoryFn<ReactRenderer, Partial<TArgs>>;
    • Function that will receive a story along with meta (e.g. a default export from a .stories file) and optionally projectAnnotations e.g. (import * as projectAnnotations from '../.storybook/preview) and will return a composed component that has all args/parameters/decorators/etc combined and applied to it.

      It's very useful for reusing a story in scenarios outside of Storybook like unit testing.

      Example:

      import { render } from '@testing-library/react';
      import { composeStory } from '@storybook/react';
      import Meta, { Primary as PrimaryStory } from './Button.stories';
      const Primary = composeStory(PrimaryStory, Meta);
      test('renders primary button with Hello World', () => {
      const { getByText } = render(<Primary>Hello world</Primary>);
      expect(getByText(/Hello world/i)).not.toBeNull();
      });

      Parameter story

      Parameter componentAnnotations

      E.g. (import Meta from './Button.stories')

      Parameter projectAnnotations

      E.g. (import * as projectAnnotations from '../.storybook/preview') this can be applied automatically if you use setProjectAnnotations in your setup files.

      Parameter exportsName

      In case your story does not contain a name and you want it to have a name.

    function setProjectAnnotations

    setProjectAnnotations: (
    projectAnnotations:
    | NamedOrDefaultProjectAnnotations<any>
    | NamedOrDefaultProjectAnnotations<any>[]
    ) => NormalizedProjectAnnotations<ReactRenderer>;
    • Function that sets the globalConfig of your storybook. The global config is the preview module of your .storybook folder.

      It should be run a single time, so that your global config (e.g. decorators) is applied to your stories when using composeStories or composeStory.

      Example:

      // setup-file.js
      import { setProjectAnnotations } from '@storybook/react';
      import projectAnnotations from './.storybook/preview';
      setProjectAnnotations(projectAnnotations);

      Parameter projectAnnotations

      E.g. (import * as projectAnnotations from '../.storybook/preview')

    Interfaces

    interface ReactMeta

    interface ReactMeta<T extends ReactTypes, MetaInput extends ComponentAnnotations<T>>
    extends Meta$1<T, MetaInput> {}
    • React-specific Meta interface returned by preview.meta().

      Provides the story() method to create individual stories with proper type inference. Args provided in meta become optional in stories, while missing required args must be provided at the story level.

    method story

    story: {
    <TInput extends unknown>(story: TInput): ReactStory<
    T,
    TInput extends () => ReactTypes['storyResult']
    ? { render: TInput }
    : TInput
    >;
    <
    TInput extends StoryAnnotations<
    T,
    Simplify<
    {
    [T in keyof T['args']]: T extends keyof MetaInput['args']
    ? MetaInput['args'][T] extends (...args: any) => any
    ? MetaInput['args'][T]
    : T['args'][T]
    : T['args'][T];
    },
    {}
    >,
    Simplify<
    Except<T['args'], keyof T['args'] & keyof MetaInput['args']> &
    Partial<
    Pick<
    T['args'],
    keyof T['args'] & keyof MetaInput['args']
    >
    >,
    {}
    >
    >
    >(
    story: TInput
    ): ReactStory<T, TInput>;
    (
    ..._args: Partial<T['args']> extends Simplify<
    Except<T['args'], keyof T['args'] & keyof MetaInput['args']> &
    Partial<
    Pick<T['args'], keyof T['args'] & keyof MetaInput['args']>
    >,
    {}
    >
    ? []
    : [never]
    ): ReactStory<T, {}>;
    };
    • Creates a story with a custom render function that takes no args.

      This overload allows you to define a story using just a render function or an object with a render function that doesn't depend on args. Since the render function doesn't use args, no args need to be provided regardless of what's required by the component.

      Example 1

      // Using just a render function
      export const CustomRender = meta.story(() => <div>Custom content</div>);
      // Using an object with render
      export const WithRender = meta.story({
      render: () => <MyComponent prop="static" />,
      });
    • Creates a story with custom configuration including args, decorators, or other annotations.

      This is the primary overload for defining stories. Args that were already provided in meta become optional, while any remaining required args must be specified here.

      Example 1

      // Provide required args not in meta
      export const Primary = meta.story({
      args: { label: 'Click me', disabled: false },
      });
      // Override meta args and add story-specific configuration
      export const Disabled = meta.story({
      args: { disabled: true },
      decorators: [withCustomWrapper],
      });
    • Creates a story with no additional configuration.

      This overload is only available when all required args have been provided in meta. The conditional type Partial<T['args']> extends SetOptional<...> checks if the remaining required args (after accounting for args provided in meta) are all optional. If so, the function accepts zero arguments []. Otherwise, it requires [never] which makes this overload unmatchable, forcing the user to provide args.

      Example 1

      // When meta provides all required args, story() can be called with no arguments
      const meta = preview.meta({ component: Button, args: { label: 'Hi', disabled: false } });
      export const Default = meta.story(); // Valid - all args provided in meta

    interface ReactPreview

    interface ReactPreview<T extends AddonTypes> extends Preview$1<ReactTypes & T> {}
    • @ts-expect-error We cannot implement the meta faithfully here, but that is okay.

    method meta

    meta: <
    TArgs extends Args,
    Decorators extends DecoratorFunction<ReactTypes & T, any>,
    TMetaArgs extends Partial<TArgs & T['args']>
    >(
    meta: {
    render?: ArgsStoryFn<ReactTypes & T, TArgs & T['args']>;
    component?: ComponentType<TArgs>;
    decorators?: Decorators | Decorators[];
    args?: TMetaArgs;
    } & Omit<
    ComponentAnnotations<ReactTypes & T, TArgs>,
    'decorators' | 'component' | 'args' | 'render'
    >
    ) => ReactMeta<
    InferReactTypes<T, TArgs, Decorators>,
    Omit<ComponentAnnotations<InferReactTypes<T, TArgs, Decorators>>, 'args'> & {
    args: Partial<TArgs> extends TMetaArgs ? {} : TMetaArgs;
    }
    >;

      method type

      type: <R>() => ReactPreview<T & R>;
      • Narrows the type of the preview to include additional type information. This is useful when you need to add args that aren't inferred from the component.

        Example 1

        const meta = preview.type<{ args: { theme: 'light' | 'dark' } }>().meta({
        component: Button,
        });

      interface ReactRenderer

      interface ReactRenderer extends WebRenderer {}

        property component

        component: ComponentType<this['T']>;

          property mount

          mount: (ui?: JSX.Element) => Promise<Canvas>;

            property storyResult

            storyResult: StoryFnReactReturnType;

              interface ReactStory

              interface ReactStory<
              T extends ReactTypes,
              TInput extends StoryAnnotations<T, T['args']>
              > extends Story<T, TInput> {}
              • React-specific Story interface returned by meta.story().

                Represents a single story with its configuration and provides access to the composed story for testing via story.run().

                Also includes a Component property for portable story compatibility.

              property Component

              Component: ComponentType<Partial<T['args']>>;

                interface ReactTypes

                interface ReactTypes extends ReactRenderer {}

                  property parameters

                  parameters: ReactParameters;

                    Type Aliases

                    type AddMocks

                    type AddMocks<TArgs, DefaultArgs> = Simplify<{
                    [T in keyof TArgs]: T extends keyof DefaultArgs
                    ? DefaultArgs[T] extends (...args: any) => any & {
                    mock: {};
                    }
                    ? DefaultArgs[T]
                    : TArgs[T]
                    : TArgs[T];
                    }>;

                      type Decorator

                      type Decorator<TArgs = StrictArgs> = DecoratorFunction<ReactRenderer, TArgs>;

                        type Loader

                        type Loader<TArgs = StrictArgs> = LoaderFunction<ReactRenderer, TArgs>;

                          type Meta

                          type Meta<TCmpOrArgs = Args> = [TCmpOrArgs] extends [ComponentType<any>]
                          ? ComponentAnnotations<ReactRenderer, ComponentProps<TCmpOrArgs>>
                          : ComponentAnnotations<ReactRenderer, TCmpOrArgs>;
                          • Metadata to configure the stories for a component.

                            See Also

                            • [Default export](https://storybook.js.org/docs/api/csf#default-export)

                          type Preview

                          type Preview = ProjectAnnotations<ReactRenderer>;

                            type StoryContext

                            type StoryContext<TArgs = StrictArgs> = StoryContext$1<ReactRenderer, TArgs>;

                              type StoryFn

                              type StoryFn<TCmpOrArgs = Args> = [TCmpOrArgs] extends [ComponentType<any>]
                              ? AnnotatedStoryFn<ReactRenderer, ComponentProps<TCmpOrArgs>>
                              : AnnotatedStoryFn<ReactRenderer, TCmpOrArgs>;
                              • Story function that represents a CSFv2 component example.

                                See Also

                                • [Named Story exports](https://storybook.js.org/docs/api/csf#named-story-exports)

                              type StoryObj

                              type StoryObj<TMetaOrCmpOrArgs = Args> = [TMetaOrCmpOrArgs] extends [
                              {
                              render?: ArgsStoryFn<ReactRenderer, any>;
                              component?: infer Component;
                              args?: infer DefaultArgs;
                              }
                              ]
                              ? Simplify<
                              (Component extends ComponentType<any>
                              ? ComponentProps<Component>
                              : unknown) &
                              ArgsFromMeta<ReactRenderer, TMetaOrCmpOrArgs>
                              > extends infer TArgs
                              ? StoryAnnotations<
                              ReactRenderer,
                              AddMocks<TArgs, DefaultArgs>,
                              SetOptional<TArgs, keyof TArgs & keyof DefaultArgs>
                              >
                              : never
                              : TMetaOrCmpOrArgs extends ComponentType<any>
                              ? StoryAnnotations<ReactRenderer, ComponentProps<TMetaOrCmpOrArgs>>
                              : StoryAnnotations<ReactRenderer, TMetaOrCmpOrArgs>;
                              • Story object that represents a CSFv3 component example.

                                See Also

                                • [Named Story exports](https://storybook.js.org/docs/api/csf#named-story-exports)

                              Namespaces

                              namespace global

                              namespace global {}

                                interface SymbolConstructor

                                interface SymbolConstructor {}

                                  property observable

                                  readonly observable: symbol;

                                    Package Files (1)

                                    Dependencies (3)

                                    Dev Dependencies (19)

                                    Peer Dependencies (4)

                                    Badge

                                    To add a badge like this onejsDocs.io badgeto your package's README, use the codes available below.

                                    You may also use Shields.io to create a custom badge linking to https://www.jsdocs.io/package/@storybook/react.

                                    • Markdown
                                      [![jsDocs.io](https://img.shields.io/badge/jsDocs.io-reference-blue)](https://www.jsdocs.io/package/@storybook/react)
                                    • HTML
                                      <a href="https://www.jsdocs.io/package/@storybook/react"><img src="https://img.shields.io/badge/jsDocs.io-reference-blue" alt="jsDocs.io"></a>