Inline components
Declare components directly in your MDX file:Constraints
React components in Mintlify run in a sandboxed MDX environment with the following constraints:- React hooks are pre-injected:
useState,useEffect,useRef,useCallback,useMemo,useContext, anduseReducerare available without importing them. - No external npm packages: You cannot import third-party packages (for example,
lodash,axios,date-fns). Use browser built-ins or write the logic inline. - No default exports: Use named exports (
export const MyComponent = ...). Default exports (export default) are not supported. - No cross-snippet imports: Snippet files cannot import other snippet files. Import all dependencies directly in the parent MDX file.
- No JSON imports: Importing
.jsonfiles is not supported. - No code splitting:
React.lazyand dynamicimport()are not supported. All component code on a page, including imported snippets, compiles into the page and loads with it.
Import components
Component files must be in the/snippets/ folder. Learn more about reusable snippets.
Nested imports are not supported. Import all referenced components directly into the parent MDX file.
snippets/:
/snippets/color-generator.jsx
Considerations
- Client-side rendering only: Custom components render in the browser after the page loads, so they aren’t in the server-rendered HTML. This applies to components you define with
exportin an MDX file and components you import by name from a snippet, such asimport { ColorGenerator } from "/snippets/color-generator.jsx". MDX snippets that you import as content, such asimport MySnippet from "/snippets/my-snippet.mdx", render on the server. - SEO: Because custom components are not in the initial HTML, search engines may not fully index their content.
- Initial load: Visitors may see a flash or layout shift while custom components render. For content that must appear in the initial HTML or must not shift on load, use built-in components such as cards and columns instead. Most built-in components render on the server.
- Accessibility: Ensure screen readers announce dynamic content changes.
- Optimize dependency arrays: Only include necessary dependencies in
useEffect. - Memoize expensive operations: Use
useMemooruseCallbackwhere appropriate. - Reduce re-renders: Break large components into smaller ones.
- Lazy loading: Component code cannot lazy load. All components load with the page. If a component performs resource-intensive operations when it mounts, such as fetching data or heavy computation, use conditional rendering to defer mounting it until user interaction.