Rich text editing for .NET MAUI, rendered entirely on a SkiaSharp canvas.
MintedTextEditor is organized into three packages:
MintedTextEditor.Core: document model, editing engine, layout, formatting, commands, events, HTML interop.MintedTextEditor.SkiaSharp: drawing backend implementingIDrawingContext.MintedTextEditor.Maui: MAUI control (MintedEditorView) and platform integration.
- Highlights
- Package Layout
- Platform Support
- Quick Start
- Sample App
- Configuration
- Documentation
- Build and Test
- Contributing
- Code of Conduct
- License
- Full-canvas rendering using SkiaSharp (no native text editor controls).
- Character formatting: bold, italic, underline, strikethrough, subscript, superscript, font family/size, text color, highlight.
- Paragraph formatting: alignment, indentation, line spacing, headings, lists, block quote.
- Inline content: hyperlinks, images, tables.
- Editing primitives: caret navigation, selection, clipboard, undo/redo.
- Toolbar and command architecture with customizable item sets.
- Three built-in toolbar icon packs (Lucide, Heroicons, Material Symbols) — all embedded in the
MintedTextEditor.Corepackage, no app-bundle asset setup required. - Theme-aware toolbar icons: automatically recolored to the current theme's foreground at draw time, including full dark-mode support.
- HTML and Markdown import/export pipelines, including support for GitHub Flavored Markdown (GFM).
- Theming support (light, dark, high contrast, and custom styles).
- Accessibility and localization support including RTL scenarios.
src/
MintedTextEditor.Core/
MintedTextEditor.SkiaSharp/
MintedTextEditor.Maui/
samples/
SampleApp.Maui/
tests/
MintedTextEditor.Core.Tests/
| Platform | Minimum Version |
|---|---|
| Android | API 21 (Android 5.0) |
| iOS | 15.0 |
| macOS (Mac Catalyst) | 15.0 |
| Windows | 10.0.17763 |
dotnet add package MintedTextEditor.MauiIn MauiProgram.cs:
using MintedTextEditor.Maui;
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMintedTextEditor();<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:minted="https://schemas.mintedtexteditor.com/2026"
x:Class="MyApp.MainPage">
<minted:MintedEditorView
x:Name="Editor"
ShowToolbar="True"
PlaceholderText="Start typing..." />
</ContentPage>Editor.LoadHtml("<p>Hello <strong>world</strong></p>");
string html = Editor.GetHtml();using MintedTextEditor.Core.Markdown;
// Load a document from Markdown
var document = EditorDocumentExtensions.LoadMarkdown("# Hello World\nThis is a paragraph.");
// Export the current document to a Markdown string
var markdown = editor.Document.GetMarkdown();For full import/export options, including GitHub Flavored Markdown (GFM) support, see docs/markdown-interop.md.
The repository includes a runnable MAUI sample with focused pages for:
- basic editing
- formatting
- load/save, HTML, and Markdown
- images and hyperlinks
- tables
- localization
- theming and toolbar icon packs
Project: samples/SampleApp.Maui
Editor.Theme = EditorTheme.CreateDark();
Editor.UseSystemTheme = false;Three icon packs are included and embedded in MintedTextEditor.Core — no extra files are needed in the app project.
| Pack | Style |
|---|---|
ToolbarIconPack.Lucide |
Outlined, 2 px stroke (default) |
ToolbarIconPack.Heroicons |
Outlined, 1.5 px stroke |
ToolbarIconPack.MaterialSymbols |
Filled, Material Design paths |
Editor.ToolbarIconPack = ToolbarIconPack.Lucide; // default
Editor.ToolbarIconPack = ToolbarIconPack.Heroicons;
Editor.ToolbarIconPack = ToolbarIconPack.MaterialSymbols;All icons are rendered with black ink and recolored at draw time using SKColorFilter (SrcIn) to match the current theme color. Switching between light and dark themes updates icon colors automatically without reloading assets.
You can load Markdown content into the editor using the LoadMarkdown or AppendMarkdown methods:
using MintedTextEditor.Core.Markdown;
// Load a new document from Markdown
var document = EditorDocumentExtensions.LoadMarkdown("# Hello World\nThis is a paragraph.");
// Append Markdown to an existing document
editor.Document.AppendMarkdown("## Subheading\nAnother paragraph.");Export the current document to a Markdown string:
using MintedTextEditor.Core.Markdown;
var markdown = editor.Document.GetMarkdown();Customize the Markdown export behavior using the MarkdownExportOptions class:
var options = new MarkdownExportOptions
{
UseGfmExtensions = true, // Enable GitHub Flavored Markdown (default: true)
LineEnding = "\r\n" // Customize line endings (default: "\n")
};
var markdown = editor.Document.GetMarkdown(options);Editor.TextChanged += (_, e) => { /* document changed */ };
Editor.SelectionChanged += (_, e) => { /* selection changed */ };
Editor.HyperlinkClicked += (_, e) => { /* inspect/cancel open */ };For deeper API details, see docs/getting-started.md, docs/commands-events.md, and docs/toolbar-customization.md.
| Document | Description |
|---|---|
| Getting Started | Installation, setup, first editor |
| Document Model | Blocks, inlines, and text runs |
| Formatting | Character and paragraph formatting |
| Toolbar Customization | Toolbar groups and items |
| Theming | Built-in and custom themes |
| Commands & Events | Command and event reference |
| HTML Interop | HTML import/export behavior |
| Markdown Interop | Markdown import/export behavior |
| Images & Hyperlinks | Inline media and links |
| Tables | Table creation and editing |
| Accessibility | Accessibility guidance |
| Architecture | Internal architecture overview |
git clone https://github.com/TheEightBot/MintedTextEditor.git
cd MintedTextEditor
# Build solution
dotnet build
# Run core tests
dotnet test tests/MintedTextEditor.Core.Tests/
# Build MAUI project (after installing MAUI workload)
dotnet workload install maui
dotnet build src/MintedTextEditor.Maui/
# Build sample app
dotnet build samples/SampleApp.Maui/Contributions are welcome. Please read CONTRIBUTING.md before opening a pull request.
This project follows the Contributor Covenant Code of Conduct.
