import React from "react";
/**
* React Fragment wrapper — returns a Fragment element containing the given parts.
* When passed to renderToStaticMarkup, fragments render as bare text with no HTML tags.
*/
function fragment(...parts: any[]) {
return React.createElement(React.Fragment, null, ...parts);
}
/**
* MDX component overrides that render markdown-formatted text via React Fragments.
*
* When used with renderToStaticMarkup, these components produce clean markdown output
* instead of HTML — no regex stripping needed.
*
* Usage: pass as the `components` prop to an MDX component, or wrap with MDXProvider.
*
* @example
* ```ts
* import { markdownComponents } from "smithers";
* const md = renderToStaticMarkup();
* // md is clean markdown, not HTML
* ```
*/
export const markdownComponents: Record> = {
// Headings
h1: ({ children }: any) => fragment("# ", children, "\n\n"),
h2: ({ children }: any) => fragment("## ", children, "\n\n"),
h3: ({ children }: any) => fragment("### ", children, "\n\n"),
h4: ({ children }: any) => fragment("#### ", children, "\n\n"),
h5: ({ children }: any) => fragment("##### ", children, "\n\n"),
h6: ({ children }: any) => fragment("###### ", children, "\n\n"),
// Block elements
p: ({ children }: any) => fragment(children, "\n\n"),
blockquote: ({ children }: any) => fragment("> ", children, "\n"),
hr: () => fragment("---\n\n"),
// Lists
ul: ({ children }: any) => fragment(children, "\n"),
ol: ({ children }: any) => fragment(children, "\n"),
li: ({ children }: any) => fragment("- ", children, "\n"),
// Code
code: ({ children, className }: any) => {
if (className) {
const lang = className.replace("language-", "");
return fragment("```", lang, "\n", children, "\n```\n\n");
}
return fragment("`", children, "`");
},
pre: ({ children }: any) => fragment(children),
// Inline formatting
strong: ({ children }: any) => fragment("**", children, "**"),
em: ({ children }: any) => fragment("*", children, "*"),
a: ({ href, children }: any) => fragment("[", children, "](", href, ")"),
// Line break
br: () => fragment("\n"),
// Images
img: ({ alt, src }: any) => fragment(""),
// Tables
table: ({ children }: any) => fragment(children, "\n"),
thead: ({ children }: any) => fragment(children),
tbody: ({ children }: any) => fragment(children),
tr: ({ children }: any) => fragment("| ", children, "\n"),
th: ({ children }: any) => fragment(children, " | "),
td: ({ children }: any) => fragment(children, " | "),
// Pass-through containers (no HTML wrapper, just content)
div: ({ children }: any) => fragment(children, "\n"),
section: ({ children }: any) => fragment(children, "\n"),
span: ({ children }: any) => fragment(children),
};