API Reference
Complete TypeScript API reference for remark-notes-plugin.
Plugin Function
remarkNotes(options?)
The main plugin function that transforms markdown blockquotes into styled note elements.
Type Signature:
function remarkNotes(options?: RemarkNotesOptions): (tree: Node) => void
Parameters:
options(optional): Configuration object of typeRemarkNotesOptions
Returns:
A transformer function that processes the AST (Abstract Syntax Tree).
Example:
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import remarkNotes from 'remark-notes-plugin';
import remarkRehype from 'remark-rehype';
import rehypeStringify from 'rehype-stringify';
const processor = unified()
.use(remarkParse)
.use(remarkNotes, { classPrefix: 'custom' })
.use(remarkRehype)
.use(rehypeStringify);
const result = await processor.process('> [!note]\n> This is a note');
Configuration Options
RemarkNotesOptions
Configuration interface for the plugin.
interface RemarkNotesOptions {
classPrefix?: string;
injectStyles?: boolean;
}
classPrefix
Custom prefix for all generated CSS class names.
- Type:
string - Default:
''(empty string - no prefix) - Optional: Yes
The prefix is prepended to the standard remark-note class names.
Default behavior (no prefix):
<blockquote class="remark-note remark-note-tip">
<div class="remark-note-header">
<span class="remark-note-icon">...</span>
<span class="remark-note-title">tip</span>
</div>
<div class="remark-note-content">...</div>
</blockquote>
With prefix (e.g., 'my'):
<blockquote class="my-remark-note my-remark-note-tip">
<div class="my-remark-note-header">
<span class="my-remark-note-icon">...</span>
<span class="my-remark-note-title">tip</span>
</div>
<div class="my-remark-note-content">...</div>
</blockquote>
Example:
unified().use(remarkNotes, { classPrefix: 'docs' });
// Generates: docs-remark-note, docs-remark-note-tip, etc.
noteThe shipped CSS uses attribute selectors (e.g.,
[class*="remark-note-icon"]) and will work automatically with any prefix.
injectStyles
Controls whether the plugin automatically injects styles into the document.
- Type:
boolean - Default:
true - Optional: Yes
When true, the plugin injects a <style> tag containing note styles directly into the AST. When false, you must manually import the CSS file.
When to set to false:
- Using Server-Side Rendering (SSR) with separate CSS extraction
- Building with tools that handle CSS imports separately (Vite, Webpack, etc.)
- Providing completely custom styles
- You want more control over style loading order
Example:
// Automatic style injection (default)
unified().use(remarkNotes);
// Manual CSS import required
unified().use(remarkNotes, { injectStyles: false });
// Then in your code:
import 'remark-notes-plugin/styles.css';
Types
ValidNoteType
Union type of all valid note type strings.
type ValidNoteType = 'note' | 'tip' | 'important' | 'quote' | 'bonus';
Valid note types:
note- General informational notestip- Helpful suggestions and adviceimportant- Critical information requiring attentionquote- Styled quote blocksbonus- Additional information or advanced features
Usage in Markdown:
> [!note]
> General information
> [!tip]
> Helpful advice
> [!important]
> Critical information
> [!quote]
> "A memorable quote"
> [!bonus]
> Advanced techniques
importantNote types are case-insensitive in markdown (
[!NOTE],[!Note],[!note]all work), but the plugin normalizes them to lowercase.
Exports
The package exports the following from its main entry point:
// Default export
export default function remarkNotes(options?: RemarkNotesOptions): Transformer;
// Named type exports
export type { RemarkNotesOptions };
export type { ValidNoteType };
Importing the plugin:
// ES Modules (recommended)
import remarkNotes from 'remark-notes-plugin';
import type { RemarkNotesOptions, ValidNoteType } from 'remark-notes-plugin';
// CommonJS
const remarkNotes = require('remark-notes-plugin');
Importing styles:
// When injectStyles is false
import 'remark-notes-plugin/styles.css';
Package Exports
The package.json defines the following exports:
{
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.js",
"default": "./dist/index.js"
},
"./styles.css": "./dist/styles.css"
}
}
This allows you to import:
- The plugin:
import remarkNotes from 'remark-notes-plugin' - Types:
import type { RemarkNotesOptions } from 'remark-notes-plugin' - Styles:
import 'remark-notes-plugin/styles.css'
HTML Output Structure
The plugin generates the following HTML structure for each note:
<blockquote class="remark-note remark-note-{type}">
<div class="remark-note-header">
<span class="remark-note-icon">
<!-- SVG icon -->
</span>
<span class="remark-note-title">{type}</span>
</div>
<div class="remark-note-content">
<!-- Original markdown content -->
</div>
</blockquote>
CSS Classes:
remark-note- Base class applied to all notesremark-note-{type}- Specific class for note type (e.g.,remark-note-tip)remark-note-header- Container for icon and titleremark-note-icon- Icon wrapperremark-note-title- Title text (displays the note type)remark-note-content- Content wrapper
With a custom prefix (e.g., 'my'), classes become:
my-remark-notemy-remark-note-{type}my-remark-note-header- etc.
Browser and Environment Support
- Node.js: v14.0.0 or higher
- Remark: v13.0.0 or higher
- Module System: ESM (ES Modules)
- TypeScript: Full type definitions included
Browser Support:
The generated HTML and CSS work in all modern browsers:
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
Error Handling
The plugin implements graceful degradation:
Invalid note types:
If an invalid note type is encountered (e.g., [!warning]), the plugin leaves the blockquote unchanged. No error is thrown.
> [!warning]
> This is not a valid note type
Output: Regular blockquote (not transformed)
Valid note types:
Only these types are transformed:
notetipimportantquotebonus
Performance Considerations
Style Injection:
When injectStyles is true, styles are injected only once per document, regardless of how many notes are present.
AST Processing:
The plugin uses efficient AST traversal with unist-util-visit, processing only blockquote nodes.
Bundle Size:
- Plugin code: ~8KB minified
- CSS file: ~2KB minified
- Total: ~10KB for complete functionality
MDX Compatibility
The plugin is fully compatible with MDX. It transforms markdown blockquotes in .mdx files just like in .md files.
import { SomeComponent } from './components';
> [!note]
> This note works in MDX!
<SomeComponent />
> [!tip]
> You can mix markdown notes with JSX components.
TypeScript Usage
Full type safety with TypeScript:
import remarkNotes from 'remark-notes-plugin';
import type { RemarkNotesOptions, ValidNoteType } from 'remark-notes-plugin';
// Type-safe configuration
const options: RemarkNotesOptions = {
classPrefix: 'docs',
injectStyles: false,
};
// Type-safe note type checking
const noteType: ValidNoteType = 'tip'; // ✓ Valid
const invalid: ValidNoteType = 'warning'; // ✗ TypeScript error