mirror of
https://github.com/storybookjs/storybook.git
synced 2025-04-09 00:19:13 +08:00
46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import React from 'react';
|
|
import ReactDOM from 'react-dom';
|
|
import { AnyFramework, Parameters } from '@storybook/csf';
|
|
import { DocsContextProps, DocsRenderFunction } from '@storybook/preview-web';
|
|
import { components as htmlComponents } from '@storybook/components';
|
|
import { Docs, CodeOrSourceMdx, AnchorMdx, HeadersMdx } from '@storybook/blocks';
|
|
import { MDXProvider } from '@mdx-js/react';
|
|
|
|
// TS doesn't like that we export a component with types that it doesn't know about (TS4203)
|
|
export const defaultComponents: Record<string, any> = {
|
|
...htmlComponents,
|
|
code: CodeOrSourceMdx,
|
|
a: AnchorMdx,
|
|
...HeadersMdx,
|
|
};
|
|
|
|
export class DocsRenderer<TFramework extends AnyFramework> {
|
|
public render: DocsRenderFunction<TFramework>;
|
|
|
|
public unmount: (element: HTMLElement) => void;
|
|
|
|
constructor() {
|
|
this.render = (
|
|
context: DocsContextProps<TFramework>,
|
|
docsParameter: Parameters,
|
|
element: HTMLElement,
|
|
callback: () => void
|
|
): void => {
|
|
// Use a random key to force the container to re-render each time we call `renderDocs`
|
|
// TODO: do we still need this? It was needed for angular (legacy) inline rendering:
|
|
// https://github.com/storybookjs/storybook/pull/16149
|
|
ReactDOM.render(
|
|
<MDXProvider components={defaultComponents}>
|
|
<Docs key={Math.random()} context={context} docsParameter={docsParameter} />
|
|
</MDXProvider>,
|
|
element,
|
|
callback
|
|
);
|
|
};
|
|
|
|
this.unmount = (element: HTMLElement) => {
|
|
ReactDOM.unmountComponentAtNode(element);
|
|
};
|
|
}
|
|
}
|