# @md-plugins/md-plugin-containers
A **Markdown-It** plugin that provides custom container support for enhanced Markdown rendering. Containers allow you to create stylized blocks with custom rendering logic, ideal for notes, warnings, callouts, and other visual elements.
## Features
- Define custom containers with specific classes or components.
- Add titles to containers for better context (e.g., "Warning", "Note").
- Supports flexible rendering logic for different container types.
- Compatible with Markdown-It environments for additional customization.
## Installation
Install the plugin via your preferred package manager:
```bash
# with pnpm:
pnpm add @md-plugins/md-plugin-containers
# with bun:
bun add @md-plugins/md-plugin-containers
# with Yarn:
yarn add @md-plugins/md-plugin-containers
# with npm:
npm install @md-plugins/md-plugin-containers
```
## Usage
### Basic Setup
```js
import MarkdownIt from 'markdown-it'
import { containersPlugin } from '@md-plugins/md-plugin-containers'
import container from 'markdown-it-container'
import type {
ContainerDetails,
CreateContainerFn,
Container,
ContainerOptions,
} from '@md-plugins/md-plugin-containers'
const md = new MarkdownIt()
const containers: ContainerDetails[] = [
{ type: 'tip', defaultTitle: 'TIP' },
{ type: 'warning', defaultTitle: 'WARNING' },
{ type: 'danger', defaultTitle: 'WARNING' },
{ type: 'details', defaultTitle: 'Details' },
]
const createContainer: CreateContainerFn = (
container: Container,
containerType: string,
defaultTitle: string,
md: MarkdownIt,
): [Container, string, ContainerOptions] => {
const containerTypeLen = containerType.length
return [
container,
containerType,
{
render(tokens: Token[], idx: number): string {
const token = tokens[idx]
if (!token) {
return ''
}
// Get the title from token info or use defaultTitle
const rawTitle = token.info.trim().slice(containerTypeLen).trim() || defaultTitle
// Process the title as inline markdown
const titleHtml = md ? md.renderInline(rawTitle) : rawTitle
if (containerType === 'details') {
return token.nesting === 1
? `${titleHtml}
\n`
: '
${titleHtml}
\n` : 'TIP
This is a tip container.
WARNING
This is a warning container.
${titleHtml}
\n` : 'This is a custom note with a title.
Outer Note
Be cautious!