The CodeProvider component provides client-side functions for fetching source code and highlighting it. It's designed for cases where you need to render code blocks or demos based on client-side state or dynamic content loading. It also provides heavy processing functions that are moved from individual components to the context for better performance and code splitting.
CodeProvider implements the Props Context Layering pattern by providing heavy functions via context that can't be serialized across the server-client boundary.
Use CodeProvider when you need:
Note
If you need interactive code editing with shared state management, use the
CodeControllerContextinstead.
The simplest way to use CodeProvider is to wrap components that need client-side highlighting:
console.log('Hello, world!');import * as React from 'react';
import { CodeProvider } from '@mui/internal-docs-infra/CodeProvider';
import { Code } from './CodeBlock';
export function BasicCode() {
return (
<CodeProvider>
<Code fileName="example.js">{`console.log('Hello, world!');`}</Code>
</CodeProvider>
);
}
For more dynamic use cases, you can provide custom loading functions that fetch code from external sources:
CodeProvider works seamlessly with CodeHighlighter for dynamic content:
import { CodeProvider } from '@mui/internal-docs-infra/CodeProvider';
import { CodeHighlighter } from '@mui/internal-docs-infra/CodeHighlighter';
import { CodeContent } from './CodeContent';
function DynamicCodeExample() {
return (
<CodeProvider>
<CodeHighlighter Content={CodeContent}>{`console.log("Dynamic code!");`}</CodeHighlighter>
</CodeProvider>
);
}
You can provide custom functions for loading code from different sources:
import { CodeProvider } from '@mui/internal-docs-infra/CodeProvider';
import type { LoadCodeMeta, LoadSource } from '@mui/internal-docs-infra/CodeHighlighter';
const loadCodeFromApi: LoadCodeMeta = async (url: string) => {
const response = await fetch(`/api/code/${encodeURIComponent(url)}`);
return response.json();
};
const loadSourceFromGitHub: LoadSource = async (url: string) => {
const response = await fetch(url.replace('file://', 'https://raw.githubusercontent.com/'));
const source = await response.text();
return { source };
};
function MyApp() {
return (
<CodeProvider loadCodeMeta={loadCodeFromApi} loadSource={loadSourceFromGitHub}>
{/* Your components */}
</CodeProvider>
);
}
The CodeProvider component accepts the following props:
children (React.ReactNode): Child components that will have access to the code handling contextloadCodeMeta (LoadCodeMeta): Function to load code metadata from a URLloadVariantMeta (LoadVariantMeta): Function to load variant-specific metadataloadSource (LoadSource): Function to load source code and extra filesThe provider makes these functions available through context:
interface CodeContext {
// Async parser promise (for initial loading)
sourceParser?: Promise<ParseSource>;
// Sync parser (available after initial load)
parseSource?: ParseSource;
// Source transformers for code transformation
sourceTransformers?: SourceTransformers;
// Custom loading functions
loadSource?: LoadSource;
loadVariantMeta?: LoadVariantMeta;
loadCodeMeta?: LoadCodeMeta;
// Heavy functions for code processing (moved from CodeHighlighterClient)
loadFallbackCode?: LoadFallbackCodeFn;
loadVariant?: LoadVariantFn;
parseCode?: ParseCodeFn;
parseControlledCode?: ParseControlledCodeFn;
applyTransforms?: ApplyTransformsFn;
getAvailableTransforms?: GetAvailableTransformsFn;
}
| Prop | Type | Description |
|---|---|---|
| loadCodeMeta | LoadCodeMeta | |
| loadSource | LoadSource | |
| loadVariantMeta | LoadVariantMeta | |
| children | ReactNode |
CodeProvider high enough to cover all components that need highlightingCodeProvider is perfect for code that can't be precomputed| Feature | CodeProvider | Code Controller | CodeHighlighter |
|---|---|---|---|
| Purpose | Client-side highlighting & fetching | Interactive code editing | Displaying code with previews |
| State management | × No shared state | ✓ Shared editing state | × Component-level only |
| Dynamic loading | ✓ Custom loading functions | × Static content focused | ✓ Various loading options |
| User editing | × Display only | ✓ Real-time editing | × Display only |
| Build optimization | × Client-side only | ✓ Can use precomputation | ✓ Build-time optimization |
| Use case | Dynamic code display | Code playgrounds | Documentation sites |
Highlighting not working:
CodeProviderPerformance issues:
SSR errors:
CodeProvider automatically handles SSR safetyforceClient on CodeHighlighter when needed