diff --git a/blazor-toc.html b/blazor-toc.html
index c2e88a806c..a57986d30a 100644
--- a/blazor-toc.html
+++ b/blazor-toc.html
@@ -4219,7 +4219,9 @@
Validation and Security
diff --git a/blazor/rich-text-editor/code-snippet/embedly-interop.js b/blazor/rich-text-editor/code-snippet/embedly-interop.js
new file mode 100644
index 0000000000..b4cd2e0a0f
--- /dev/null
+++ b/blazor/rich-text-editor/code-snippet/embedly-interop.js
@@ -0,0 +1,34 @@
+window.embedlyInterop = {
+ wrapLinkInEmbedlyCard: function() {
+ const rteContent = document.querySelector('.e-rte-content');
+ if (!rteContent) return;
+
+ const links = rteContent.querySelectorAll('a');
+ links.forEach(link => {
+ if (!link.closest('.embedly-card')) {
+ const blockquote = document.createElement('blockquote');
+ blockquote.className = 'embedly-card';
+
+ const a = document.createElement('a');
+ a.href = link.href;
+ a.textContent = link.textContent || link.href;
+
+ blockquote.appendChild(a);
+ blockquote.appendChild(document.createElement('p'));
+
+ link.parentNode.replaceChild(blockquote, link);
+ }
+ });
+
+ if (window.embedly && window.embedly.lib) {
+ window.embedly.lib.process(rteContent);
+ }
+ }
+};
+
+// Initialize Embedly processing on page load
+function initializeEmbedly() {
+ if (window.embedly && window.embedly.lib) {
+ window.embedly.lib.process(document.body);
+ }
+}
\ No newline at end of file
diff --git a/blazor/rich-text-editor/code-snippet/embedly.razor b/blazor/rich-text-editor/code-snippet/embedly.razor
new file mode 100644
index 0000000000..7600c84400
--- /dev/null
+++ b/blazor/rich-text-editor/code-snippet/embedly.razor
@@ -0,0 +1,46 @@
+@page "/embedly"
+
+@using Syncfusion.Blazor.RichTextEditor
+@using Syncfusion.Blazor
+
+@inject IJSRuntime JS
+
+
+
+
+
+
+ Embedly integration automatically transforms plain links into rich, interactive preview cards with titles, descriptions, and thumbnails.
+ How it works:
+
+ Paste or create links - Use the CreateLink toolbar button to add URLs to the editor
+ Automatic card rendering - Links are automatically converted to rich Embedly cards with preview, title, and description
+ Supported content - Works with articles, videos, images, documents, and other embeddable web content
+
+
+
+
+@code {
+ private SfRichTextEditor Editor;
+
+ private List ToolbarItems = new()
+ {
+ new ToolbarItemModel { Command = ToolbarCommand.CreateLink }
+ };
+
+ private async Task OnActionComplete(ActionCompleteEventArgs args)
+ {
+ if (args.RequestType == "Links")
+ {
+ await JS.InvokeVoidAsync("embedlyInterop.wrapLinkInEmbedlyCard");
+ }
+ }
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (firstRender)
+ {
+ await JS.InvokeVoidAsync("initializeEmbedly");
+ }
+ }
+}
\ No newline at end of file
diff --git a/blazor/rich-text-editor/code-snippet/image-editor-integration.razor b/blazor/rich-text-editor/code-snippet/image-editor-integration.razor
new file mode 100644
index 0000000000..bcfe636c7d
--- /dev/null
+++ b/blazor/rich-text-editor/code-snippet/image-editor-integration.razor
@@ -0,0 +1,231 @@
+@page "/imageeditorintegration"
+
+@using Syncfusion.Blazor.RichTextEditor
+@using Syncfusion.Blazor.ImageEditor
+@using Syncfusion.Blazor.Popups
+@inject IJSRuntime jsRuntime
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (IsImageEditorOpen)
+ {
+
+
+
+ }
+
+
+
+
+
+
+
+
+
+
+@code {
+ private SfRichTextEditor EditorRef;
+ private SfDialog DialogRef;
+ private SfImageEditor ImageEditorRef;
+ private object DotNetRef;
+ private bool ShowDialog = false;
+ private bool IsImageEditorOpen = false;
+ private string CurrentImageSrc = string.Empty;
+ private string RteValue = @"Rich Text Editor with Image Editing
+ This Rich Text Editor allows you to edit images directly within your content. Select any image and use the Edit Image button to access image editing tools.
+ How to Use
+
+ Click on an image in the editor to select it
+ Click the Edit Image button in the main toolbar
+ Use the editing tools: crop, zoom, filter, annotate, and fine-tune
+ Click Insert to replace the original image with your edited version
+
+ Available Features
+
+ Crop and resize images
+ Apply filters and adjustments
+ Rotate and flip images
+ Add annotations and drawings
+ Support for JPG, PNG, GIF, and WebP formats
+
+ Sample Image
+ Select the image below to start editing:
+
";
+
+ private List ImageEditorToolbar = new List()
+ {
+ new ImageEditorToolbarItemModel() { Name = "Open" },
+ new ImageEditorToolbarItemModel() { Name = "Zoom" },
+ new ImageEditorToolbarItemModel() { Name = "Crop" },
+ new ImageEditorToolbarItemModel() { Name = "Annotation" },
+ new ImageEditorToolbarItemModel() { Name = "Finetune" },
+ new ImageEditorToolbarItemModel() { Name = "Filter" },
+ new ImageEditorToolbarItemModel() { Name = "Reset" }
+ };
+
+ private List Items = new List()
+ {
+ new ToolbarItemModel() { Command = ToolbarCommand.Undo },
+ new ToolbarItemModel() { Command = ToolbarCommand.Redo },
+ new ToolbarItemModel() { Command = ToolbarCommand.Separator },
+ new ToolbarItemModel() { Command = ToolbarCommand.Bold },
+ new ToolbarItemModel() { Command = ToolbarCommand.Italic },
+ new ToolbarItemModel() { Command = ToolbarCommand.Underline },
+ new ToolbarItemModel() { Command = ToolbarCommand.Separator },
+ new ToolbarItemModel() { Command = ToolbarCommand.CreateLink },
+ new ToolbarItemModel() { Command = ToolbarCommand.Image },
+ new ToolbarItemModel() { Command = ToolbarCommand.Separator },
+ new ToolbarItemModel() { Name = "ImageEditor", TooltipText = "Edit Image" },
+ new ToolbarItemModel() { Command = ToolbarCommand.SourceCode },
+ new ToolbarItemModel() { Command = ToolbarCommand.FullScreen }
+ };
+
+ private List ImageQuickTools = new List()
+ {
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Replace },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Align },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Caption },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Remove },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Separator },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.InsertLink },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Display },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.AltText },
+ new ImageToolbarItemModel() { Command = ImageToolbarCommand.Dimension }
+ };
+
+ protected override void OnInitialized()
+ {
+ DotNetRef = DotNetObjectReference.Create(this as object);
+ }
+
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ if (firstRender)
+ {
+ await jsRuntime.InvokeAsync("rteInterop.onInitialized", DotNetRef);
+ }
+ }
+
+ private async Task OnImageEditorClick()
+ {
+ if (EditorRef == null) {
+ return;
+ }
+ await EditorRef.SaveSelectionAsync();
+ var selectedHtml = await EditorRef.GetSelectedHtmlAsync();
+ if (string.IsNullOrWhiteSpace(selectedHtml) || !selectedHtml.Contains(" ]+)['\"]?", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
+ CurrentImageSrc = srcMatch.Success ? srcMatch.Groups[1].Value : string.Empty;
+ }
+ catch
+ {
+ CurrentImageSrc = string.Empty;
+ }
+ }
+
+ private void OnDialogOpened(Syncfusion.Blazor.Popups.OpenEventArgs args)
+ {
+ if (!IsImageEditorOpen)
+ {
+ IsImageEditorOpen = true;
+ StateHasChanged();
+ }
+ }
+
+ private void OnDialogClosed(Syncfusion.Blazor.Popups.CloseEventArgs args)
+ {
+ IsImageEditorOpen = false;
+ }
+
+ private async Task OnEditorCreated()
+ {
+ if (ImageEditorRef != null && !string.IsNullOrEmpty(CurrentImageSrc))
+ {
+ await Task.Delay(100);
+ await ImageEditorRef.OpenAsync(CurrentImageSrc);
+ }
+ }
+
+ [JSInvokable]
+ public async Task FileSelected(string imageUrl)
+ {
+ if (ImageEditorRef != null)
+ {
+ await ImageEditorRef.OpenAsync(imageUrl);
+ }
+ }
+
+ private async Task OnSaveReplace()
+ {
+ if (ImageEditorRef == null || EditorRef == null) {
+ return;
+ }
+
+ var imageDataUrl = await ImageEditorRef.GetImageDataUrlAsync();
+ if (string.IsNullOrEmpty(imageDataUrl)) {
+ return;
+ }
+
+ string newImageHtml = $@" ";
+
+ if (!string.IsNullOrEmpty(CurrentImageSrc))
+ {
+ string escapedOldSrc = System.Text.RegularExpressions.Regex.Escape(CurrentImageSrc);
+ RteValue = System.Text.RegularExpressions.Regex.Replace(
+ RteValue,
+ @" ]*src=\"?" + escapedOldSrc + @"\"?[^>]*>",
+ newImageHtml,
+ System.Text.RegularExpressions.RegexOptions.IgnoreCase
+ );
+ }
+ else
+ {
+ RteValue += newImageHtml;
+ }
+
+ ShowDialog = false;
+ CurrentImageSrc = string.Empty;
+ StateHasChanged();
+ }
+
+ private Task OnCancel()
+ {
+ ShowDialog = false;
+ return Task.CompletedTask;
+ }
+}
+
\ No newline at end of file
diff --git a/blazor/rich-text-editor/code-snippet/image-editor-interop.js b/blazor/rich-text-editor/code-snippet/image-editor-interop.js
new file mode 100644
index 0000000000..405bf14e88
--- /dev/null
+++ b/blazor/rich-text-editor/code-snippet/image-editor-interop.js
@@ -0,0 +1,64 @@
+window.canvasInterop = {
+ detectedFormat: null
+};
+
+window.rteInterop = {
+ objRef: null,
+ onInitialized: function (objRef) {
+ window.rteInterop.objRef = objRef;
+ var fileInput = document.getElementById('rte-img-upload');
+ if (fileInput) {
+ fileInput.onchange = function (e) {
+ if (e.target.files && e.target.files.length > 0) {
+ var file = e.target.files[0];
+ window.canvasInterop.detectedFormat = file.type;
+ var reader = new FileReader();
+ reader.onload = function (event) {
+ window.rteInterop.objRef.invokeMethodAsync('FileSelected', event.target.result);
+ };
+ reader.readAsDataURL(file);
+ e.target.value = '';
+ }
+ };
+ }
+ return true;
+ },
+ fileSelect: function () {
+ var inputFile = document.getElementById('rte-img-upload');
+ if (inputFile) {
+ inputFile.click();
+ }
+ return true;
+ },
+ getEditedImageData: function () {
+ var imageEditor = document.querySelector('.e-image-editor');
+ if (!imageEditor) {
+ return '';
+ }
+ var dataId = imageEditor.getAttribute('data-control-id');
+ var instance = null;
+
+ if (!dataId && window.sfBlazor) {
+ instance = window.sfBlazor.getCompInstance(imageEditor);
+ } else if (dataId && window.sfBlazor) {
+ instance = window.sfBlazor.getCompInstance(dataId);
+ }
+
+ if (instance && instance.getImageData) {
+ var imageData = instance.getImageData();
+ if (imageData) {
+ var tempCanvas = document.createElement('canvas');
+ tempCanvas.width = imageData.width;
+ tempCanvas.height = imageData.height;
+ var ctx = tempCanvas.getContext('2d');
+ ctx.putImageData(imageData, 0, 0);
+ if (window.canvasInterop.detectedFormat) {
+ return tempCanvas.toDataURL(window.canvasInterop.detectedFormat);
+ } else {
+ return tempCanvas.toDataURL();
+ }
+ }
+ }
+ return '';
+ }
+};
\ No newline at end of file
diff --git a/blazor/rich-text-editor/embedly.md b/blazor/rich-text-editor/embedly.md
new file mode 100644
index 0000000000..e77185a9f8
--- /dev/null
+++ b/blazor/rich-text-editor/embedly.md
@@ -0,0 +1,158 @@
+---
+layout: post
+title: Embedly Integration with RichTextEditor Component | Syncfusion
+description: Checkout and learn how to integrate Embedly with Blazor RichTextEditor to convert URLs into rich preview cards for enhanced content presentation.
+platform: Blazor
+control: RichTextEditor
+documentation: ug
+---
+
+# Embedly Integration with RichTextEditor
+
+By integrating [Embedly](https://www.embedly.com) with the Blazor RichTextEditor, you can automatically convert URLs into rich preview cards. This integration allows users to insert links that render as interactive embed cards, enhancing the visual presentation and user experience when sharing web content.
+
+## Overview
+
+This documentation provides a complete integration of Embedly with the RichTextEditor component. Users can:
+
+- Insert links in the editor content
+- Links automatically render as interactive Embedly embed cards
+- Support for various content types (videos, articles, social media, etc.)
+- Interactive embed cards enhance content visibility and engagement
+
+## Prerequisites
+
+- **Syncfusion.Blazor NuGet package** installed and configured
+- **Required namespaces:**
+ - `Syncfusion.Blazor.RichTextEditor`
+- **JavaScript interop enabled** — `IJSRuntime` support
+- **Embedly CDN access** — https://cdn.embedly.com/widgets/platform.js
+
+> Before integrating Embedly with RichTextEditor, refer to the [RichTextEditor Getting Started](https://blazor.syncfusion.com/documentation/rich-text-editor/getting-started) documentation for initial setup.
+
+## Step 1: Add the JavaScript Interop File
+
+Create the JavaScript interop module to handle link processing and communication between Blazor and Embedly.
+
+### 1.1 Create the interop file
+
+In your Blazor project, create a new folder `wwwroot/scripts/` and add a file named `embedly-interop.js`.
+
+Copy the complete interop implementation from:
+
+{% highlight javascript %}
+{% include_relative code-snippet/embedly-interop.js %}
+{% endhighlight %}
+
+### 1.2 Verify file placement
+
+Ensure the file is located at:
+
+```
+YourProject/
+└── wwwroot/
+ └── scripts/
+ └── embedly-interop.js
+```
+
+## Step 2: Add Script Reference in Host Page
+
+Add the script references in your host page before the closing `