diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap index 0b7bdca847d7..a19488a73fb9 100644 --- a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap @@ -51,7 +51,7 @@ exports[`admonitions remark plugin default behavior for custom keyword 1`] = ` exports[`admonitions remark plugin interpolation 1`] = ` "

Test admonition with interpolated title/body

-My interpolated title <button style={{color: "red"}} onClick={() => alert("click")}>test

body interpolated content

" +

body interpolated content

" `; exports[`admonitions remark plugin replace custom keyword 1`] = ` diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts b/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts index 779ef71873d0..93dd827b7b5a 100644 --- a/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts @@ -149,8 +149,12 @@ const plugin: Plugin = function plugin( !isSimpleTextTitle && { type: admonitionNodeType, data: { - hName: 'mdxAdmonitionTitle', - hProperties: {}, + // Note: this has to be valid markup itself, because it's replaced + // by client code, not MDX loader, so React sees the content + hName: 'template', + hProperties: { + 'data-admonition-title': true, + }, }, children: titleNodes, }, diff --git a/packages/docusaurus-theme-common/src/utils/admonitionUtils.tsx b/packages/docusaurus-theme-common/src/utils/admonitionUtils.tsx index a8442064e808..fad1fd1f6b5a 100644 --- a/packages/docusaurus-theme-common/src/utils/admonitionUtils.tsx +++ b/packages/docusaurus-theme-common/src/utils/admonitionUtils.tsx @@ -14,15 +14,21 @@ function extractMDXAdmonitionTitle(children: ReactNode): { rest: ReactNode; } { const items = React.Children.toArray(children); - const mdxAdmonitionTitle = items.find( - (item) => - React.isValidElement(item) && - (item.props as {mdxType: string} | null)?.mdxType === - 'mdxAdmonitionTitle', - ); + const mdxAdmonitionTitle = items.find((item) => { + if (!React.isValidElement(item)) { + return false; + } + const props = item.props as { + mdxType: string; + 'data-admonition-title'?: boolean; + } | null; + return ( + props?.mdxType === 'template' && props['data-admonition-title'] === true + ); + }) as JSX.Element | undefined; const rest = <>{items.filter((item) => item !== mdxAdmonitionTitle)}; return { - mdxAdmonitionTitle, + mdxAdmonitionTitle: mdxAdmonitionTitle?.props.children, rest, }; }