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: Third-party packages (for example,
lodash,axios,date-fns) cannot be imported. 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.
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
- SEO: Search engines may not fully index client-rendered dynamic content.
- Initial load: Visitors may see a flash before components render.
- 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: Defer rendering complex components to improve initial page load. Because the MDX sandbox does not support
React.lazyor dynamicimport(), gate heavy components behind user interaction or visibility instead. See Defer rendering for heavy components.
Defer rendering for heavy components
React.lazy, Suspense, and dynamic import() are not available in the MDX sandbox. To get the same benefit, render a lightweight placeholder first and only mount the expensive component after the reader opts in. This keeps the initial page load fast while still letting readers interact with the full component.
The example below keeps the ColorGenerator from the previous section unmounted until the reader clicks Load color generator:
IntersectionObserver set up inside a useEffect. The pattern is the same: keep show false until the trigger fires, then return the heavy component.