mdx
Authoring MDX in this docs site (syntax, components, and project-specific conventions).
MDX in this docs site is powered by Velite + @mdx-js/mdx with custom plugins and components.
This page is the source of truth for writing docs that render correctly here.
What works
- Standard Markdown (CommonMark)
- GFM features (tables, task lists, strikethrough)
- JSX inside markdown
import/exportin MDX- Custom docs components such as
Callout,Tabs,Steps,ComponentPreview, andComponentSource
Use fenced code blocks, not indented code blocks. Indented code blocks are not supported in MDX.
Required frontmatter
Every docs page should include frontmatter with at least:
---
title: your-page-title
description: One sentence summary for nav/SEO.
------
title: your-page-title
description: One sentence summary for nav/SEO.
---Project-specific components
Callout
<Callout icon={<Lightbulb />} title="Tip">
Keep examples short and copy-pasteable.
</Callout><Callout icon={<Lightbulb />} title="Tip">
Keep examples short and copy-pasteable.
</Callout>Steps + Step
<Steps>
<Step>Install dependencies</Step>
<Step>Add the component</Step>
<Step>Run your app</Step>
</Steps><Steps>
<Step>Install dependencies</Step>
<Step>Add the component</Step>
<Step>Run your app</Step>
</Steps>Tabs
<Tabs defaultValue="npm">
<TabsList>
<TabsTrigger value="npm">npm</TabsTrigger>
<TabsTrigger value="pnpm">pnpm</TabsTrigger>
</TabsList>
<TabsContent value="npm">
~~~bash
npm install your-package
~~~
</TabsContent>
<TabsContent value="pnpm">
~~~bash
pnpm add your-package
~~~
</TabsContent>
</Tabs><Tabs defaultValue="npm">
<TabsList>
<TabsTrigger value="npm">npm</TabsTrigger>
<TabsTrigger value="pnpm">pnpm</TabsTrigger>
</TabsList>
<TabsContent value="npm">
~~~bash
npm install your-package
~~~
</TabsContent>
<TabsContent value="pnpm">
~~~bash
pnpm add your-package
~~~
</TabsContent>
</Tabs>ComponentPreview
Use this to render an interactive preview from the registry index.
<ComponentPreview name="button-1" description="Basic button example." /><ComponentPreview name="button-1" description="Basic button example." />ComponentSource
Use this to render source from a file or folder.
<ComponentSource path="packages/registry-ui/src/button" /><ComponentSource path="packages/registry-ui/src/button" />- Path is resolved from monorepo root in this docs app pipeline.
- A directory path renders tabbed files; a single file path renders one code block.
Code blocks
Use fenced blocks with language identifiers:
~~~tsx title="components/demo.tsx" showLineNumbers
export function Demo() {
return <div>Hello</div>
}
~~~~~~tsx title="components/demo.tsx" showLineNumbers
export function Demo() {
return <div>Hello</div>
}
~~~MDX gotchas
- Autolink syntax like
<https://example.com>is not supported in MDX. Use[label](https://example.com). - Unescaped
<and{can break parsing; escape as\<and\{when they are plain text. - HTML comments (
<!-- -->) are not valid in MDX. Use{/* comment */}.
Recommendation
Prefer markdown for prose and JSX only when you need behavior (tabs, previews, callouts, custom layout).