UNPKG

@storybook/addon-docs

Version:

Storybook Docs: Document UI components automatically with stories and MDX

86 lines (82 loc) 2.54 kB
import { Source } from "./_browser-chunks/chunk-UZFOWTVP.js"; import { __name } from "./_browser-chunks/chunk-MM7DTO55.js"; // src/manager.tsx import React, { useEffect, useState } from "react"; import { AddonPanel } from "storybook/internal/components"; import { addons, types, useChannel, useParameter } from "storybook/manager-api"; import { ignoreSsrWarning, styled, useTheme } from "storybook/theming"; // ../../core/src/docs-tools/shared.ts var ADDON_ID = "storybook/docs"; var PANEL_ID = `${ADDON_ID}/panel`; var PARAM_KEY = `docs`; var SNIPPET_RENDERED = `${ADDON_ID}/snippet-rendered`; // src/manager.tsx addons.register(ADDON_ID, (api) => { addons.add(PANEL_ID, { title: "Code", type: types.PANEL, paramKey: PARAM_KEY, /** * This code panel can be enabled by adding this parameter: * * @example * * ```ts * parameters: { * docs: { * codePanel: true, * }, * }, * ``` */ disabled: /* @__PURE__ */ __name((parameters) => !parameters?.docs?.codePanel, "disabled"), match: /* @__PURE__ */ __name(({ viewMode }) => viewMode === "story", "match"), render: /* @__PURE__ */ __name(({ active }) => { const channel = api.getChannel(); const currentStory = api.getCurrentStoryData(); const lastEvent = channel?.last(SNIPPET_RENDERED)?.[0]; const [codeSnippet, setSourceCode] = useState({ source: lastEvent?.source, format: lastEvent?.format ?? void 0 }); const parameter = useParameter(PARAM_KEY, { source: { code: "" }, theme: "dark" }); useEffect(() => { setSourceCode({ source: void 0, format: void 0 }); }, [currentStory?.id]); useChannel({ [SNIPPET_RENDERED]: ({ source, format }) => { setSourceCode({ source, format }); } }); const theme = useTheme(); const isDark = theme.base !== "light"; return React.createElement(AddonPanel, { active: !!active }, React.createElement(SourceStyles, null, React.createElement( Source, { ...parameter.source, code: parameter.source?.code || codeSnippet.source || parameter.source?.originalSource, format: codeSnippet.format, dark: isDark } ))); }, "render") }); }); var SourceStyles = styled.div(() => ({ height: "100%", [`> :first-child${ignoreSsrWarning}`]: { margin: 0, height: "100%", boxShadow: "none" } }));