import dynamic from "next/dynamic"; import Link from "next/link"; import Image from "next/image"; import type { LinkProps } from "next/link"; import type { ImageProps } from "next/image"; // The following components are all passed into as replacement HTML tags or drop-in React components // available in .mdx files containing post content, since they're not directly aware of the components in this folder. type CustomLinkProps = LinkProps & { target?: string; rel?: string; className?: string; children?: unknown; }; const CustomLink = ({ href, target, rel, className, children }: CustomLinkProps) => ( {children} ); const CustomImg = (props: ImageProps) => ( // the required height and width are part of the props, so they get automatically passed here with {...props}
{/* eslint-disable-next-line jsx-a11y/alt-text */}
); const CustomCode = (props: any) => { if (props.className?.split(" ").includes("hljs")) { const CopyButton = dynamic(() => import("./clipboard/CopyButton")); // full multi-line code blocks with highlight.js and copy-to-clipboard button return (
{props.children}
); } else { // inline code in paragraphs, headings, etc. (not highlighted) return {props.children}; } }; const CustomTweet = (props: { id: string }) => { const TweetEmbed = dynamic(() => import("react-tweet-embed")); return ( ); }; const CustomGist = dynamic(() => import("react-gist")); const CustomVideo = dynamic(() => import("./video/Video")); const CustomGitHubLink = (props: { repo: string }) => { const OctocatOcticon: any = dynamic(() => import("./icons/octicons").then((mod) => mod.OctocatOcticon)); return ( ); }; // These are the actual tags referenced in mdx files: const mdxComponents = { a: CustomLink, img: CustomImg, code: CustomCode, video: CustomVideo, tweet: CustomTweet, gist: CustomGist, octocat: CustomGitHubLink, }; export default mdxComponents;