A Payload CMS plugin for creating beautiful callout blocks with GitHub and Obsidian themes.
Multiple Themes: GitHub and Obsidian-style callouts
Rich Styling: Pre-designed callout types with icons
Rich Text Support: Full RichText editor support with nested content
Configurable: Collapsible callouts with customizable defaults
- Note - General information
- Tip - Helpful suggestions
- Important - Critical information
- Warning - Cautionary content
- Caution - Danger alerts
- Note - General notes
- Abstract/Summary/Tldr - Content summaries
- Info - Information blocks
- Todo - Task lists
- Tip/Hint - Helpful suggestions
- Important - Critical content
- Success/Check/Done - Completion status
- Question/Help/FAQ - Q&A content
- Warning/Attention/Caution - Warnings
- Failure/Missing/Fail - Error states
- Danger/Error/Bug - Critical errors
- Example - Code examples
- Quote/Cite - Quotations
npm install payload-callouts
# or
yarn add payload-callouts
# or
pnpm add payload-calloutsAdd the plugin to your Payload configuration:
// payload.config.ts
import { payloadCallouts } from 'payload-callouts'
export default buildConfig({
plugins: [
payloadCallouts({
theme: 'github', // or 'obsidian'
blockSlug: 'callout', // optional, default: 'callout'
blockInterfaceName: 'CalloutBlock', // optional, default: 'CalloutBlock'
collapsible: true, // optional, default: true
defaultOpen: true, // optional, default: true
}),
],
// ... rest of your config
})// collections/Posts.ts
import { createBlockConfig } from 'payload-callouts'
export const Posts: CollectionConfig = {
slug: 'posts',
fields: [
{
name: 'content',
type: 'richText',
editor: lexicalEditor({
features: ({ rootFeatures }) => [
...rootFeatures,
BlocksFeature({
blocks: [
createBlockConfig(), // Add callout blocks
// ... other blocks
],
}),
],
}),
},
],
}Create a RichText component with callout converters:
// components/RichText.tsx
import { createCalloutBlockJSXConverter } from 'payload-callouts/converters'
import {
RichText as ConvertRichText,
type JSXConvertersFunction,
} from '@payloadcms/richtext-lexical/react'
const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => {
const calloutBlockConverter = createCalloutBlockJSXConverter((content) => (
{/* Passing your customized RichText / ConvertRichText component */}
<ConvertRichText converters={jsxConverters} data={content} />
));
return {
...existingConverters,
blocks: {
...existingConverters.blocks,
...calloutBlockConverter.blocks,
},
};
}
export default function RichText(props) {
return (
<ConvertRichText
className="prose dark:prose-invert max-w-none"
converters={jsxConverters}
{...props}
/>
)
}interface PayloadCalloutsConfig {
/** Enable or disable the plugin */
disabled?: boolean
/** The slug for the callout block */
blockSlug?: string // default: 'callout'
/** Interface name for TypeScript generation */
blockInterfaceName?: string // default: 'CalloutBlock'
/** Theme to use */
theme?: 'github' | 'obsidian' // default: 'github'
/** Whether callouts are collapsible by default */
collapsible?: boolean // default: true
/** Whether callouts are open by default */
defaultOpen?: boolean // default: true
}The plugin includes CSS modules for styling. You can customize the appearance by:
- Using CSS Custom Properties: Override the built-in CSS variables
- Custom CSS: Import and modify the provided styles
- Tailwind Classes: Add additional classes to the rendered components
:root {
/* add the following line if you want dark mode support */
color-scheme: light dark;
--callout-border-radius: 8px;
--callout-padding: 1rem;
/* ... more variables */
}Contributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE file for details.
Part of the CSS styles are from rehype-callouts.

