diff --git a/README.md b/README.md index c9470df..fa2ec79 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ App Config UI Location allows you to manage all the app settings centrally. Once ### RTE Location -The RTE Location allows you to create custom plugins to expand the functionality of your JSON Rich Text Editor. Using the Audience and Variables plugin, you can tailor your content as per your requirements. [RTE PLUGIN](docs/rte-plugin.md) +The RTE Location allows you to create custom plugins to expand the functionality of your JSON Rich Text Editor. Using the Audience and Variables plugin, you can tailor your content as per your requirements. ### Sidebar Location diff --git a/docs/rte-plugin.md b/docs/rte-plugin.md deleted file mode 100644 index 80a6e79..0000000 --- a/docs/rte-plugin.md +++ /dev/null @@ -1,296 +0,0 @@ -# JSON RTE Plugin Development Guide - -Quick reference for creating JSON Rich Text Editor plugins using the new simplified approach. - -## 🚀 Quick Start - -```typescript -import ContentstackAppSDK, { PluginBuilder } from '@contentstack/app-sdk'; - -// Create a simple plugin -const boldPlugin = new PluginBuilder('bold-plugin') - .title('Bold') - .elementType('inline') - .on('exec', (rte) => { - rte.addMark('bold', true); - }) - .build(); - -// Register the plugin -ContentstackAppSDK.registerRTEPlugins(boldPlugin); -``` - -## 📋 Plugin Types - -### Inline Plugin -For text formatting (bold, italic, etc.) - -```typescript -const italicPlugin = new PluginBuilder('italic') - .title('Italic') - .elementType('inline') - .display(['toolbar', 'hoveringToolbar']) - .on('exec', (rte) => { - rte.addMark('italic', true); - }) - .build(); -``` - -### Block Plugin -For block-level elements (headings, paragraphs, etc.) - -```typescript -const headingPlugin = new PluginBuilder('heading') - .title('Heading') - .elementType('block') - .render(({ children, attrs }) => ( -

- {children} -

- )) - .on('exec', (rte) => { - rte.insertNode({ - type: 'heading', - attrs: { level: 2 }, - children: [{ text: 'New Heading' }] - }); - }) - .build(); -``` - -### Void Plugin -For self-closing elements (images, embeds, etc.) - -```typescript -const imagePlugin = new PluginBuilder('image') - .title('Image') - .elementType('void') - .render(({ attrs }) => ( - {attrs.alt - )) - .on('exec', (rte) => { - const src = prompt('Enter image URL:'); - if (src) { - rte.insertNode({ - type: 'image', - attrs: { src }, - children: [{ text: '' }] - }); - } - }) - .build(); -``` - -## 🎛️ Builder Methods - -### Basic Configuration -```typescript -new PluginBuilder('plugin-id') - .title('Plugin Name') // Toolbar button text - .icon() // Button icon (React element) - .elementType('block') // 'inline' | 'block' | 'void' -``` - -### Display Options -```typescript - .display(['toolbar']) // Show in main toolbar only - .display(['hoveringToolbar']) // Show in hover toolbar only - .display(['toolbar', 'hoveringToolbar']) // Show in both -``` - -### Event Handlers -```typescript - .on('exec', (rte) => {}) // Button click - .on('keydown', ({ event, rte }) => {}) // Key press - .on('paste', ({ rte, preventDefault }) => {}) // Paste event -``` - -### Advanced Options -```typescript - .render(ComponentFunction) // Custom render component - .shouldOverride((element) => boolean) // Override existing elements - .configure(async (sdk) => {}) // Dynamic configuration -``` - -## 🔧 Event Handling - -### Click Handler -```typescript -.on('exec', (rte) => { - // Insert text - rte.insertText('Hello World'); - - // Add formatting - rte.addMark('bold', true); - - // Insert node - rte.insertNode({ - type: 'custom-element', - attrs: { id: 'unique-id' }, - children: [{ text: 'Content' }] - }); -}) -``` - -### Keyboard Handler -```typescript -.on('keydown', ({ event, rte }) => { - if (event.key === 'Enter' && event.ctrlKey) { - event.preventDefault(); - // Custom enter behavior - rte.insertBreak(); - } -}) -``` - -## 📦 Container Plugins (Dropdowns) - -Create grouped plugins in a dropdown menu: - -```typescript -const mediaContainer = new PluginBuilder('media-dropdown') - .title('Media') - .icon() - .addPlugins( - imagePlugin, - videoPlugin, - audioPlugin - ) - .build(); -``` - -## 🔄 Plugin Registration - -### Single Plugin -```typescript -ContentstackAppSDK.registerRTEPlugins(myPlugin); -``` - -### Multiple Plugins -```typescript -ContentstackAppSDK.registerRTEPlugins( - boldPlugin, - italicPlugin, - headingPlugin, - imagePlugin -); -``` - -### With Enhanced SDK Context -```typescript -// Register plugins first (captures RTE context) -await ContentstackAppSDK.registerRTEPlugins(myPlugin); - -// Then initialize SDK (gets enhanced context) -const sdk = await ContentstackAppSDK.init(); -``` - -## 💡 Real-World Examples - -### YouTube Embed Plugin -```typescript -const youtubePlugin = new PluginBuilder('youtube') - .title('YouTube') - .elementType('void') - .render(({ attrs }) => ( -