syncfusion-blazor-smart-rich-text-editor — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-blazor-smart-rich-text-editor (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A comprehensive skill for implementing and configuring the Syncfusion Blazor Smart Rich Text Editor (SfSmartRichTextEditor) — an AI-powered WYSIWYG editor that extends the full-featured SfRichTextEditor with intelligent content assistance. Supports OpenAI, Azure OpenAI, Ollama, and custom AI backends. Provides a Smart Action dropdown toolbar, an AI query dialog (Alt+Enter), and a fully customizable AI Assistant popup via AssistViewSettings.
Use this skill when the user needs to:
SfSmartRichTextEditor in a Blazor Server or Web App projectIChatClientIChatInferenceService / SyncfusionAIService in Program.csName = "AI Commands" and Name = "AI Query" to ToolbarItemModel list to render AI toolbar buttonsAlt+Enter for free-form AI promptsAssistViewSettings: Commands, Suggestions, Prompts, Placeholder, MaxPromptHistory, popup sizingBannerTemplate, HeaderToolbarSettings, PromptToolbarSettings, ResponseToolbarSettings)AIPromptRequested, AIResponseStopped, AIToolbarItemClicked, AIPopupOpening, AIPopupClosingShowAIPopupAsync, HideAIPopupAsync, ExecuteAIPromptAsync, UpdateAIResponseAsync, GetAIPromptHistoryAsync, ClearAIPromptHistoryAsync.e-rte-aiquery-dialog)SfRichTextEditor features: toolbar, images, tables, events, methods, data binding, paste cleanup, import/export, accessibility1. Install NuGet packages:
dotnet add package Syncfusion.Blazor.SmartRichTextEditor
dotnet add package Syncfusion.Blazor.Themes
dotnet add package Microsoft.Extensions.AI
dotnet add package Microsoft.Extensions.AI.OpenAI2. Register services in `Program.cs`:
using Syncfusion.Blazor;
using Syncfusion.Blazor.AI;
using Microsoft.Extensions.AI;
using OpenAI;
builder.Services.AddSyncfusionBlazor();
string openAIApiKey = "YOUR_API_KEY";
string openAIModel = "gpt-4";
OpenAIClient openAIClient = new OpenAIClient(openAIApiKey);
IChatClient chatClient = openAIClient.GetChatClient(openAIModel).AsIChatClient();
builder.Services.AddChatClient(chatClient);
builder.Services.AddSingleton<IChatInferenceService, SyncfusionAIService>();3. Add to `_Imports.razor`:
@using Syncfusion.Blazor
@using Syncfusion.Blazor.SmartRichTextEditor4. Add CSS/JS in `App.razor` (Server) or `index.html` (WASM):
<link href="_content/Syncfusion.Blazor.Themes/tailwind.css" rel="stylesheet" />
<script src="_content/Syncfusion.Blazor.Core/scripts/syncfusion-blazor.min.js"></script>5. Add the component:
@rendermode InteractiveServer
<SfSmartRichTextEditor>
<h2>Welcome to Smart Rich Text Editor</h2>
<p>Select text and use the Smart Action toolbar, or press Alt+Enter to open the AI Query dialog.</p>
<AssistViewSettings Placeholder="Ask AI to rewrite or generate content." />
</SfSmartRichTextEditor>📄 Read: references/getting-started.md
Syncfusion.Blazor.SmartRichTextEditor + Syncfusion.Blazor.ThemesIChatClient configuration in Program.csAddInteractiveServerComponents() registration pattern for Web AppAssistViewSettingsGetTextAsync, GetCharCountAsync)📄 Read: references/ai-backends.md
gpt-4-turbo, gpt-4, gpt-3.5-turbo), OpenAIClient setup, environment variables and User SecretsAzureOpenAIClient + ApiKeyCredential, appsettings.json config, Managed Identity (production recommended), HIPAA/SOC 2 compliance, monitoring, cost optimizationmistral, llama2), OllamaApiClient + OllamaSharp NuGet, Docker Compose, GPU acceleration, model recommendationsIChatClient for internal/proprietary AI, registering in Program.cs, streaming responses, retry logic, error handling, corporate AI API example📄 Read: references/assist-view-settings.md
Commands (List<AICommands>): Smart Action dropdown with nested sub-commands and icon CSSPopupMaxHeight / PopupWidth: control popup dimensions (CSS values or pixel numbers)Placeholder: placeholder text in the AI prompt textareaPrompts (List<AssistViewPrompt>): predefined prompt/response templates loaded into the popupSuggestions (List<string>): quick suggestion chips shown in the AI popupMaxPromptHistory: maximum conversation entries retained (default: 20)BannerTemplate: custom branding/header RenderFragment for the AI popupHeaderToolbarSettings / PromptToolbarSettings / ResponseToolbarSettings: toolbar customization with AssistViewToolbarItem📄 Read: references/ai-events.md
AIPromptRequested (AssistViewPromptRequestedEventArgs): intercept/modify prompt before AI call; set Cancel=true to prevent; modify Response, PromptSuggestions, ResponseToolbarItemsAIResponseStopped (ResponseStoppedEventArgs): user clicked "Stop Responding"; provides DataIndex and PromptAIToolbarItemClicked (AssistViewToolbarItemClickedEventArgs): handle custom toolbar button clicks; access Item, DataIndex, Event; set Cancel=trueAIPopupOpening (BeforeOpenEventArgs): cancel popup opening with args.Cancel = true; access Element referenceAIPopupClosing (BeforeCloseEventArgs): cancel popup closing; access ClosedBy, IsInteracted, PreventFocus📄 Read: references/ai-methods.md
ShowAIPopupAsync(): open the AI Assistant popup programmaticallyHideAIPopupAsync(): close the AI Assistant popupExecuteAIPromptAsync(string prompt): send a prompt programmatically (as if user typed it)UpdateAIResponseAsync(string response, bool isFinalUpdate): stream or inject AI response; set isFinalUpdate=true to hide Stop buttonGetAIPromptHistoryAsync(): retrieve all saved prompts/responses as AssistViewPrompt[] (chronological, limited to MaxPromptHistory)ClearAIPromptHistoryAsync(): reset all conversation history@ref📄 Read: references/ai-appearance.md
.e-rte-aiquery-dialog, .e-aiassistview.e-view-header, .e-view-content .e-toolbar, .e-footer sub-sections for fine-grained control📄 Read: references/toolbar.md
RichTextEditorToolbarSettings.EnableToolbarItemModel📄 Read: references/built-in-tools.md
SfSmartRichTextEditorName = "AI Commands" (Smart Action dropdown) and Name = "AI Query" (Ask AI button); must use Name property, NOT ToolbarCommand enumToolbarCommand enum valuesSfSmartRichTextEditor📄 Read: references/text-formatting.md
📄 Read: references/images-and-media.md
RichTextEditorImageSettings: SaveUrl, Path, AllowedTypes, EnableResize📄 Read: references/tables.md
CreateTable toolbar itemRichTextEditorTableSettings: width, resize, custom styles📄 Read: references/editor-modes.md
EditorMode.Markdown)📄 Read: references/inline-mode.md
InlineMode)📄 Read: references/custom-tools.md
ToolbarItemModel and templatesExecuteCommandAsync/ trigger menu) configurationRichTextEditorFormatPainterSettings)📄 Read: references/events.md
RichTextEditorEvents child component usage and wiring patternCreated, DestroyedFocus, Blur, OnToolbarClick, SelectionChangedValueChange, BeforePasteCleanup, AfterPasteCleanupOnActionBegin, OnActionCompleteOnDialogOpen, DialogOpened, OnDialogClose, DialogClosedOnQuickToolbarOpen, QuickToolbarOpened, QuickToolbarClosedOnImageSelected, BeforeUploadImage, OnImageUploadSuccess, OnImageUploadFailed, ImageUploadChange, OnImageDrop, ImageDeleteFileSelected, FileUploading, FileUploadSuccess, FileUploadFailed, FileUploadChange, OnMediaDrop, MediaDeletedOnResizeStart, OnResizeStopUpdatedToolbarStatusOnExport, OnExportFailureSlashMenuItemSelecting📄 Read: references/methods.md
FocusAsync, FocusOutAsync, SaveSelectionAsync, RestoreSelectionAsync, SelectAllAsync, GetSelectionAsyncGetTextAsync, GetSelectedHtmlAsync, GetCharCountAsync, GetXhtmlAsyncExecuteCommandAsync overloads with typed args (image, link, table, video, audio, code block, format painter)EnableToolbarItem, DisableToolbarItem, RemoveToolbarItemShowDialogAsync, CloseDialogAsync, ShowFullScreenAsync, PrintAsync, RefreshUIAsync, ShowSourceCodeAsyncClearUndoRedoAsyncCommandName, ToolbarCommand, and DialogType enum references📄 Read: references/properties.md
Value, Placeholder, Readonly, Enabled, MaxLength, ShowCharCountEditorMode, EnterKey, ShiftEnterKey, EnableTabKey, EnableAutoUrl, EnableMarkdownAutoFormat, EnableClipboardCleanup, EnableXhtml, EnableHtmlEncode, EnableResizeHeight, Width, CssClass, ShowTooltip, FloatingToolbarOffsetRichTextEditorIFrameSettings child component with Enable, Attributes, ResourcesEnableHtmlSanitizer, AdditionalSanitizeAttributes, AdditionalSanitizeTags, DeniedSanitizeSelectorsKeyConfigure with full ShortcutKeys default bindings tableEnablePersistence, SaveInterval, AutoSaveOnIdleUndoRedoSteps, UndoRedoTimerHttpClientInstance📄 Read: references/data-binding.md
@bind-ValueValueChange event for detecting editsReadonly property)📄 Read: references/paste-and-cleanup.md
RichTextEditorPasteCleanupSettings configurationEnterKey, ShiftEnterKey)📄 Read: references/import-export.md
📄 Read: references/accessibility-globalization.md
EnableRtl)@rendermode InteractiveServer
@using Syncfusion.Blazor.SmartRichTextEditor
<SfSmartRichTextEditor @bind-Value="@Content">
<AssistViewSettings Placeholder="Ask AI to rewrite or generate content." />
</SfSmartRichTextEditor>
@code {
private string Content { get; set; } = "<p>Start editing...</p>";
}<SfSmartRichTextEditor>
<AssistViewSettings Commands="@MyCommands" Suggestions="@QuickSuggestions" />
</SfSmartRichTextEditor>
@code {
private List<AICommands> MyCommands = new()
{
new AICommands { Text = "Summarize", Prompt = "Summarize this content concisely" },
new AICommands { Text = "Expand", Prompt = "Add more details and examples" },
new AICommands
{
Text = "Translate",
Items = new List<AICommands>
{
new AICommands { Text = "To French", Prompt = "Translate to French" },
new AICommands { Text = "To Spanish", Prompt = "Translate to Spanish" }
}
}
};
private List<string> QuickSuggestions = new()
{
"Fix grammar", "Make shorter", "More formal", "Simplify"
};
}<SfSmartRichTextEditor>
<AssistViewSettings @ref="AssistViewRef" MaxPromptHistory="10" />
</SfSmartRichTextEditor>
<button @onclick="OpenAI">Open AI</button>
<button @onclick="RunPrompt">Run Prompt</button>
@code {
private AssistViewSettings AssistViewRef;
private async Task OpenAI() =>
await AssistViewRef.ShowAIPopupAsync();
private async Task RunPrompt() =>
await AssistViewRef.ExecuteAIPromptAsync("Improve the clarity of this text");
}<SfSmartRichTextEditor @bind-Value="@HtmlContent" ShowCharCount="true" MaxLength="2000">
<AssistViewSettings Placeholder="Ask AI for writing help." />
</SfSmartRichTextEditor>
@code {
private string HtmlContent { get; set; } = string.Empty;
}<SfSmartRichTextEditor Value="@HtmlContent" Readonly="true">
<RichTextEditorToolbarSettings Enable="false" />
</SfSmartRichTextEditor><SfSmartRichTextEditor EditorMode="EditorMode.Markdown" @bind-Value="@MarkdownContent">
<AssistViewSettings Placeholder="Ask AI to help with your Markdown content." />
</SfSmartRichTextEditor>
@code {
private string MarkdownContent { get; set; } = "**Hello** world!";
}<SfSmartRichTextEditor>
<AssistViewSettings AIPromptRequested="OnAIPrompt" />
</SfSmartRichTextEditor>
@code {
private async Task OnAIPrompt(AssistViewPromptRequestedEventArgs args)
{
// Log, validate, or modify args.Prompt before it is sent to AI
Console.WriteLine($"Prompt: {args.Prompt}");
// To cancel: args.Cancel = true;
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.