đŸĸ Enterprise Plugins

Detailed React and Web Component examples for advanced workflows

Overview

Enterprise plugins are available at @editora/plugins/enterprise for React and by plugin IDs in Web Components. Full, lite, and enterprise plugin paths are all free and customizable.

React Setup Pattern

import { EditoraEditor } from "@editora/react";
import {
  MentionPlugin,
  TrackChangesPlugin,
  VersionDiffPlugin
} from "@editora/plugins/enterprise";

const plugins = [
  MentionPlugin(),
  TrackChangesPlugin(),
  VersionDiffPlugin()
];

Web Component Setup Pattern

<editora-editor
  id="enterprise-editor"
  plugins="mention trackChanges version-diff"
  toolbar-items="mention | trackChanges versionDiff"
></editora-editor>

<script type="module">
const editor = document.getElementById("enterprise-editor");
await editor.setConfig({
  pluginConfig: {
    mention: { minChars: 1, maxSuggestions: 8 },
    trackChanges: { author: "QA Reviewer" },
    "version-diff": { mode: "word" }
  }
});
</script>

Detailed Plugin Examples

Mention - contextual @mentions with API/local suggestions
MentionPlugin({
  triggerChars: ["@"],
  minChars: 1,
  maxSuggestions: 8,
  items: [
    { id: "u-1", label: "Ajay Kumar", meta: "Product Owner" },
    { id: "u-2", label: "Nina Chen", meta: "Translator" }
  ]
});
<editora-editor id="mention-demo" plugins="mention"></editora-editor>
<script type="module">
await document.getElementById("mention-demo").setConfig({
  pluginConfig: { mention: { triggerChars: ["@"], minChars: 1, maxSuggestions: 8 } }
});
</script>
Track Changes - reviewer-author diffs and accept/reject workflow
TrackChangesPlugin({
  author: "Legal Reviewer",
  enabledByDefault: true,
  includeTimestamp: true
});
<editora-editor id="track-demo" plugins="trackChanges"></editora-editor>
<script type="module">
await document.getElementById("track-demo").setConfig({
  pluginConfig: {
    trackChanges: { author: "Legal Reviewer", enabledByDefault: true, includeTimestamp: true }
  }
});
</script>
Version Diff - compare baseline vs current draft
VersionDiffPlugin({
  mode: "word",
  ignoreWhitespace: true,
  maxTokens: 20000
});
<editora-editor id="diff-demo" plugins="version-diff"></editora-editor>
<script type="module">
await document.getElementById("diff-demo").setConfig({
  pluginConfig: { "version-diff": { mode: "word", ignoreWhitespace: true, maxTokens: 20000 } }
});
</script>
Conditional Content - audience/locale-driven blocks
ConditionalContentPlugin({
  defaultCondition: "country === 'US'",
  currentAudience: ["enterprise"],
  currentLocale: ["en-US"],
  enableElseByDefault: true
});
<editora-editor id="conditional-demo" plugins="conditional-content"></editora-editor>
<script type="module">
await document.getElementById("conditional-demo").setConfig({
  pluginConfig: {
    "conditional-content": {
      defaultCondition: "country === 'US'",
      currentAudience: ["enterprise"],
      currentLocale: ["en-US"],
      enableElseByDefault: true
    }
  }
});
</script>
Data Binding - runtime token resolution from data sources
DataBindingPlugin({
  data: {
    customer: { name: "Acme Corp", tier: "Gold" },
    invoice: { total: 12500.55 }
  },
  defaultFormat: "text",
  defaultFallback: "N/A"
});
<editora-editor id="binding-demo" plugins="data-binding"></editora-editor>
<script type="module">
await document.getElementById("binding-demo").setConfig({
  pluginConfig: {
    "data-binding": {
      data: {
        customer: { name: "Acme Corp", tier: "Gold" },
        invoice: { total: 12500.55 }
      },
      defaultFormat: "text",
      defaultFallback: "N/A"
    }
  }
});
</script>
Content Rules - policy linting and editorial quality gates
ContentRulesPlugin({
  bannedWords: ["obviously", "simply"],
  requiredHeadings: ["Overview", "Risks"],
  maxSentenceWords: 25,
  enableRealtime: true
});
<editora-editor id="rules-demo" plugins="content-rules"></editora-editor>
<script type="module">
await document.getElementById("rules-demo").setConfig({
  pluginConfig: {
    "content-rules": {
      bannedWords: ["obviously", "simply"],
      requiredHeadings: ["Overview", "Risks"],
      maxSentenceWords: 25,
      enableRealtime: true
    }
  }
});
</script>
Citations - legal/academic citation and bibliography support
CitationsPlugin({
  defaultStyle: "apa",
  enableFootnoteSync: true,
  maxRecentCitations: 15
});
<editora-editor id="citations-demo" plugins="citations"></editora-editor>
<script type="module">
await document.getElementById("citations-demo").setConfig({
  pluginConfig: {
    citations: { defaultStyle: "apa", enableFootnoteSync: true, maxRecentCitations: 15 }
  }
});
</script>
Approval Workflow - draft/review/approved lifecycle
ApprovalWorkflowPlugin({
  defaultStatus: "draft",
  lockOnApproval: true,
  requireCommentOnApprove: true,
  defaultActor: "Ops Lead"
});
<editora-editor id="approval-demo" plugins="approval-workflow"></editora-editor>
<script type="module">
await document.getElementById("approval-demo").setConfig({
  pluginConfig: {
    "approval-workflow": {
      defaultStatus: "draft",
      lockOnApproval: true,
      requireCommentOnApprove: true,
      defaultActor: "Ops Lead"
    }
  }
});
</script>
PII Redaction - scan and redact sensitive information
PIIRedactionPlugin({
  enableRealtime: true,
  redactionMode: "mask",
  maskChar: "â€ĸ",
  maxFindings: 200,
  detectors: { email: true, phone: true, jwt: true, "api-key": true }
});
<editora-editor id="pii-demo" plugins="pii-redaction"></editora-editor>
<script type="module">
await document.getElementById("pii-demo").setConfig({
  pluginConfig: {
    "pii-redaction": {
      enableRealtime: true,
      redactionMode: "mask",
      maskChar: "â€ĸ",
      maxFindings: 200,
      detectors: { email: true, phone: true, jwt: true, "api-key": true }
    }
  }
});
</script>
Smart Paste - source-aware cleanup for Word/Docs/HTML
SmartPastePlugin({
  enabled: true,
  defaultProfile: "balanced",
  normalizeWhitespace: false,
  profileOptions: {
    fidelity: { keepStyles: true, preserveTables: true },
    plain: { keepStyles: false, keepClasses: false }
  }
});
<editora-editor id="paste-demo" plugins="smart-paste"></editora-editor>
<script type="module">
await document.getElementById("paste-demo").setConfig({
  pluginConfig: {
    "smart-paste": {
      enabled: true,
      defaultProfile: "balanced",
      normalizeWhitespace: false,
      profileOptions: {
        fidelity: { keepStyles: true, preserveTables: true },
        plain: { keepStyles: false, keepClasses: false }
      }
    }
  }
});
</script>
Blocks Library - reusable content block insertion
BlocksLibraryPlugin({
  maxResults: 50,
  maxRecentBlocks: 10,
  blocks: [
    { id: "hero", label: "Hero Banner", category: "Marketing", html: "<h2>Launch</h2><p>Campaign copy</p>" },
    { id: "cta", label: "CTA", category: "Marketing", html: "<p><a href='#'>Get started</a></p>" }
  ]
});
<editora-editor id="blocks-demo" plugins="blocks-library"></editora-editor>
<script type="module">
await document.getElementById("blocks-demo").setConfig({
  pluginConfig: {
    "blocks-library": {
      maxResults: 50,
      maxRecentBlocks: 10,
      blocks: [
        { id: "hero", label: "Hero Banner", category: "Marketing", html: "<h2>Launch</h2><p>Campaign copy</p>" }
      ]
    }
  }
});
</script>
Document Schema - enforce document section structure
DocSchemaPlugin({
  enableRealtime: true,
  defaultSchemaId: "release-notes",
  schemas: [
    {
      id: "release-notes",
      label: "Release Notes",
      strictOrder: true,
      sections: [
        { id: "summary", title: "Summary", minOccurrences: 1, maxOccurrences: 1 },
        { id: "impacts", title: "Customer Impact", minOccurrences: 1, maxOccurrences: 1 }
      ]
    }
  ]
});
<editora-editor id="schema-demo" plugins="doc-schema"></editora-editor>
<script type="module">
await document.getElementById("schema-demo").setConfig({
  pluginConfig: {
    "doc-schema": {
      enableRealtime: true,
      defaultSchemaId: "release-notes",
      schemas: [
        {
          id: "release-notes",
          label: "Release Notes",
          strictOrder: true,
          sections: [
            { id: "summary", title: "Summary", minOccurrences: 1, maxOccurrences: 1 },
            { id: "impacts", title: "Customer Impact", minOccurrences: 1, maxOccurrences: 1 }
          ]
        }
      ]
    }
  }
});
</script>
Translation Workflow - source capture, segment locks, locale QA
TranslationWorkflowPlugin({
  sourceLocale: "en-US",
  targetLocale: "fr-FR",
  enableRealtime: true,
  segmentSelector: "p, li, td",
  localeRules: [
    { locale: "fr-FR", minLengthRatio: 0.7, maxLengthRatio: 1.5, preserveTokens: true }
  ]
});
<editora-editor id="translation-demo" plugins="translation-workflow"></editora-editor>
<script type="module">
await document.getElementById("translation-demo").setConfig({
  pluginConfig: {
    "translation-workflow": {
      sourceLocale: "en-US",
      targetLocale: "fr-FR",
      enableRealtime: true,
      segmentSelector: "p, li, td",
      localeRules: [
        { locale: "fr-FR", minLengthRatio: 0.7, maxLengthRatio: 1.5, preserveTokens: true }
      ]
    }
  }
});
</script>
Slash Commands - command palette from / trigger
SlashCommandsPlugin({
  triggerChar: "/",
  minChars: 0,
  includeDefaultItems: true,
  items: [
    { id: "insert-warning", label: "Warning Box", insertHTML: "<blockquote>⚠ Review required</blockquote>" }
  ]
});
<editora-editor id="slash-demo" plugins="slash-commands"></editora-editor>
<script type="module">
await document.getElementById("slash-demo").setConfig({
  pluginConfig: {
    "slash-commands": {
      triggerChar: "/",
      minChars: 0,
      includeDefaultItems: true,
      items: [
        { id: "insert-warning", label: "Warning Box", insertHTML: "<blockquote>⚠ Review required</blockquote>" }
      ]
    }
  }
});
</script>
Spell Check - in-editor spelling diagnostics
SpellCheckPlugin();
<editora-editor
  id="spell-demo"
  plugins="spellCheck"
  spellcheck='{"enabled":true,"provider":"browser"}'
></editora-editor>
A11y Checker - content accessibility checks
A11yCheckerPlugin();
<editora-editor
  id="a11y-demo"
  plugins="a11yChecker"
  accessibility='{"enableARIA":true,"keyboardNavigation":true,"checker":true}'
></editora-editor>
Comments - inline review comments and discussion threads
CommentsPlugin();
<editora-editor id="comments-demo" plugins="comments"></editora-editor>
Merge Tag - CRM/transactional personalization tokens
MergeTagPlugin({
  categories: [
    {
      id: "CUSTOMER",
      name: "Customer",
      tags: [
        { key: "first_name", label: "First Name", value: "{{customer.first_name}}", preview: "Ava" },
        { key: "email", label: "Email", value: "{{customer.email}}", preview: "ava@acme.com" }
      ]
    }
  ],
  defaultCategory: "CUSTOMER",
  tokenTemplate: "{value}"
});
<editora-editor id="mergetag-demo" plugins="mergeTag"></editora-editor>
<script type="module">
await document.getElementById("mergetag-demo").setConfig({
  pluginConfig: {
    mergeTag: {
      categories: [
        {
          id: "CUSTOMER",
          name: "Customer",
          tags: [
            { key: "first_name", label: "First Name", value: "{{customer.first_name}}" }
          ]
        }
      ],
      defaultCategory: "CUSTOMER"
    }
  }
});
</script>
Template - curated starter documents
import { TemplatePlugin, addCustomTemplate } from "@editora/plugins/enterprise";

addCustomTemplate({
  id: "incident-postmortem",
  name: "Incident Postmortem",
  category: "Operations",
  description: "Root-cause and corrective action structure",
  html: "<h1>Incident Summary</h1><p>Impact...</p>"
});

TemplatePlugin();
<editora-editor id="template-demo" plugins="template"></editora-editor>
<!-- Register templates before editor mount in host app bootstrap code -->
Media Manager - managed uploads and media library
import { MediaManagerPlugin, setMediaManagerConfig } from "@editora/plugins/enterprise";

setMediaManagerConfig({
  apiUrl: "https://api.acme.com",
  apiEndpoints: {
    upload: "/media/upload",
    library: "/media/library",
    delete: "/media/library"
  },
  maxFileSize: 25 * 1024 * 1024,
  allowedTypes: ["image/jpeg", "image/png", "video/mp4"]
});

MediaManagerPlugin();
<editora-editor id="media-demo" plugins="image"></editora-editor>
<!-- "image" plugin id maps to Media Manager in Web Components -->
Document Manager - export workflows (Word and fallback)
import { DocumentManagerPlugin, setDocumentManagerConfig } from "@editora/plugins/enterprise";

setDocumentManagerConfig({
  apiUrl: "https://api.acme.com",
  apiEndpoints: { exportWord: "/documents/export-word" },
  useClientSideFallback: true
});

DocumentManagerPlugin();
<editora-editor id="document-demo" plugins="document-manager"></editora-editor>
← Back to Features