diff --git a/packages/integrations/markdoc/README.md b/packages/integrations/markdoc/README.md index 8d4fc1ef5..e16e6e105 100644 --- a/packages/integrations/markdoc/README.md +++ b/packages/integrations/markdoc/README.md @@ -131,14 +131,41 @@ These options will be applied during [the Markdoc "transform" phase](https://mar The `Content` component accepts a `components` prop, which defines mappings from Markdoc tags and HTML element names to Astro or UI framework components (React, Vue, Svelte, etc). -#### Render HTML elements as Astro components +#### Render Markdoc nodes / HTML elements as Astro components -You may want to map standard HTML elements like headings and paragraphs to components. This example renders all `h1` headings using a `Title` component: +You may want to map standard HTML elements like headings and paragraphs to components. For this, you can configure a custom [Markdoc node](https://markdoc.dev/docs/nodes). This example overrides Markdoc's `heading` node to render a `Heading` component, passing the built-in `level` attribute as a prop: + +```js +// astro.config.mjs +import { defineConfig } from 'astro/config'; +import markdoc from '@astrojs/markdoc'; + +// https://astro.build/config +export default defineConfig({ + integrations: [ + markdoc({ + nodes: { + heading: { + render: 'Heading', + // Markdoc requires type defs for each attribute. + // These should mirror the `Props` type of the component + // you are rendering. + attributes: { + level: { type: String }, + } + }, + }, + }), + ], +}); +``` + +Now, you can map the string passed to render (`'Heading'` in this example) to a component import. This is configured from the `` component used to render your Markdoc using the `components` prop: ```astro --- import { getEntryBySlug } from 'astro:content'; -import Title from '../components/Title.astro'; +import Heading from '../components/Heading.astro'; const entry = await getEntryBySlug('docs', 'why-markdoc'); const { Content } = await entry.render(); @@ -146,11 +173,13 @@ const { Content } = await entry.render(); ``` +📚 [Find all of Markdoc's built-in nodes and node attributes on their documentation.](https://markdoc.dev/docs/nodes#built-in-nodes) + #### Render Markdoc tags as Astro components You may also configure [Markdoc tags](https://markdoc.dev/docs/tags) that map to components. You can configure a new tag from your `astro.config` like so, passiing the uppercase component name as the `render` prop: