Vaulthalla Logo

Scoping

Understand how global, collection, scope-specific, and renderer-level Markdown config merge.

Scoping

Config resolves from broad defaults to local overrides:

1plugin -> collection -> field/block scope -> direct renderer props

Later layers win for scalar values. Class names are joined so global and collection class additions can both apply.

Plugin Defaults

1payloadMarkdown({2  code: {3    lineNumbers: true,4    shikiTheme: 'github-dark',5  },6  config: {7    size: 'lg',8    variant: 'blog',9  },10  themes: {11    card: {12      items: [13        {14          name: 'brand',15          classes: 'rounded-2xl border border-cyan-400/40 bg-cyan-950/30 p-5',16        },17      ],18    },19  },20})

These defaults apply everywhere unless a collection or renderer overrides them.

Collection Overrides

1payloadMarkdown({2  code: {3    lineNumbers: true,4  },5  collections: {6    posts: {7      code: {8        lineNumbers: false,9      },10      config: {11        className: 'posts-markdown',12        variant: 'docs',13      },14      themes: {15        card: {16          items: [17            {18              name: 'brand',19              classes: 'rounded-2xl border border-emerald-400/40 bg-emerald-950/30 p-5',20            },21          ],22        },23      },24    },25  },26  config: {27    className: 'global-markdown',28    variant: 'blog',29  },30})

For posts, the resolved className becomes global-markdown posts-markdown, while variant becomes docs.

Field And Block Scope

Use field and blocks when the same collection needs different presentation:

1payloadMarkdown({2  collections: {3    pages: {4      config: {5        blocks: {6          size: 'md',7          variant: 'docs',8        },9        field: {10          size: 'lg',11          variant: 'blog',12        },13      },14    },15  },16})

MarkdownRenderer defaults to field scope. MarkdownBlockComponent uses block scope.

Direct Rendering

1<MarkdownRenderer2  collectionSlug="posts"3  markdown={post.content}4  scope="field"5/>

Without collectionSlug, collection-scoped config cannot be resolved.

Renderer Overrides

1<MarkdownRenderer2  collectionSlug="posts"3  code={{ lineNumbers: true }}4  markdown={post.content}5  themes={{6    callout: {7      items: [8        {9          name: 'preview',10          classes: 'rounded-xl border border-amber-400/40 bg-amber-950/20 px-4 py-3',11        },12      ],13    },14  }}15  variant="compact"16/>

Use local overrides for preview states, one-off pages, tests, or migration paths. Prefer plugin and collection config for repeatable production behavior.

Theme Merge Behavior

Theme groups merge by theme name. A collection theme with the same name as a global theme overrides that global theme for the collection.

Use deliberate names

Use stable, semantic theme names such as postHero, docsWarning, or featureCard. These names become data-theme values and slugged vl-md-*--theme-* class modifiers.