In this post, I will explain how to use the Sandpack editor with MDX files in NextJS app.
I'm using next-mdx-remote to render MDX
files and @codesandbox/sandpack-react package to add Sandpack
editor.
To install them run
npm i next-mdx-remote @codesandbox/sandpack-react
Custom MDX component to render Sandpack
editor
Write a custom Sandpack component with the pre-configured theme, Sandpack options etc,
Following is the CustomSandpack
component I built to use in MDX content
import { Sandpack } from "@codesandbox/sandpack-react";import { useTheme } from "@mui/material";type CustomSandpackProps = { template: any; filename: string; children: string;};const CustomSandpack = (props: CustomSandpackProps) => { const theme = useTheme(); const { children, filename } = props; return ( <Sandpack template="react-ts" theme={theme.palette.mode} files={{ [filename]: { code: children, active: true }, }} options={{ showLineNumbers: true, showInlineErrors: true, showTabs: false, closableTabs: false, }} /> );};export default CustomSandpack;
Inject the CustomSandpack
component to the MDX context
Next, import the CustomSandpack
component to the [slug].tsx
where the NextJS dynamic routing happens and pass the CustomSandpack
component to the MDXRemote
via the components
prop.
const components: any = { // It also works with dynamically-imported components, which is especially // useful for conditionally loading components for certain routes. // See the notes in README.md for more details. Spack: dynamic(import("../../src/components/blog/CustomSandpack")),};... <MDXRemote {...mdxSource} components={components} />
Use the <Sandpack>
element in MDX
Finally, You can use the Sandpack
custom component in MDX content as below
<Spack filename="/App.js"> {`export default function App() { return <h1>Hello Sandpack from Knnect</h1> }`}</Spack>
Try out Dark vs Light modesTry editing the code below and see the result