Skip to content

gaelj/BlazorCodeMirror6

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Blazor CodeMirror 6

NuGet Version

🚧 This project is still a work-in-progress 🚧

codemirror.svg

Blazor CodeMirror 6 brings the power of the CodeMirror 6 code editor to Blazor, offering a comprehensive .NET 6 / .NET 7 / .NET 8 component. It's tailored for both general and specialized use-cases, supporting a range of languages and Markdown editing, extensive support for syntax highlighting, auto-completion, custom linting, themes, Markdown preview, and more.

Try It Out

Visit the live demo to see the component's capabilities.

Features

General

  • 2-way-binding of the document contents
  • setting tab size & indentation unit
  • setting a placeholder text
  • applying preset themes
  • setting ReadOnly and Editable attributes
  • applying syntax highlighting for 145 different languages
  • manual resizing of the editor (similar to html textarea)
  • image preview
  • custom linting
  • insert text at cursor / at position
  • allow undo / redo toolbar buttons
  • configure which plugins are active at startup
  • optionally scroll to the bottom of the document & place the cursor on the last line
  • support long line wrapping
  • support C# language
  • update doc in dotnet either on text changes or on blur
  • diff viewer
  • CSV mode: add column paddings for alignment, navigate columns with tab / shift-tab
  • No <HeadOutlet /> required
  • search & replace toolbar button
  • toolbar with toolbar button template
  • support read-only paragraphs
  • Implement cursor tooltips
  • Implement Copilot/AI style suggestions
  • allow setting the Starting selection
  • Retrieve keybindings
  • Highlight edited lines
  • Allow toggling console debug mode
  • collaborative editing
  • voice recognition
  • automatic translation
  • deleting a file link deletes the file from the server
  • button (visible when editor is hovered), to copy raw editor content to clipboard

Markdown specific

  • apply Markdown syntax
  • report Markdown syntax at selection(s)
  • Resized header text proportional to header #
  • keybindings to set text in bold (Ctrl-B) or italic (Ctrl-I)
  • support emoji: replace on type
  • format lists
  • Implement @user mentions with dropdown list
  • emojis: view :emoji_codes: in the raw text as the emoji
  • emojis: add auto-complete
  • Show horizontal rule instead of ------
  • style Markdown quote lines and paragraphs
  • add increase / decrease selected header (#) level
  • format inline html
  • support file uploads
  • format links, make them clickable
  • support mermaid language highlighting
  • format tables
  • support toolbar toggling of checklist items even if checked
  • Implement kroki / mermaid preview
  • support badges
  • hide markdown control characters unless the selection is in the line
  • Toggling-off a Markdown style should always select the whole styled text block
  • Apply Markdown style toggles to whole words
  • better highlight markdown inline code and code blocks
  • use latest header
  • customize markdown header sizes
  • add color picker extension

Screenshots

image

Quick Start

  • add the nuget package GaelJ.BlazorCodeMirror6
  • Add @using GaelJ.BlazorCodeMirror6, @using GaelJ.BlazorCodeMirror6.Commands and @using GaelJ.BlazorCodeMirror6.Models in your _Imports.razor or page/component
  • Use the <CodeMirror6Wrapper /> component as demonstrated in Examples.Common/Example.razor

Examples

See Examples.Common/Example.razor

JS / CSS resources are loaded automatically (nothing to add in _Host.cshtml / index.html).

Contributing

We welcome contributions!

Local installation

  • Clone the repository: git clone https://github.com/gaelj/BlazorCodeMirror6.git
  • Install node.js and npx: npm install npx
  • For build issues: run dotnet clean followed by dotnet build

Architecture

  • The javascript-side initialization is in CodeMirror6/NodeLib/src/index.ts
  • Interop from .Net to JS is in CodeMirror6/CodeMirrorJsInterop.cs
  • Interop from JS to .Net is in CodeMirror6Wrapper.razor.cs
  • The blazor component is in CodeMirror6Wrapper.razor and CodeMirror6Wrapper.razor.cs
  • The example component is in Examples.Common/Example.razor

The Node project is automatically built with the .Net project.

FAQs / Troubleshooting

  • If you have npm / rollup errors when building (for example after pulling recent changes), dotnet clean will delete the node_modules directory. Then run dotnet build again.

Changelog

See the Changelog

License

Blazor CodeMirror 6 is released under the MIT License. See the LICENSE for more details.

Contact

File an issue or open a discussion

Error reporting

Disclaimer: when a runtime error occurs in one of the demo / example projects, its details are sent to my private account on Sentry.io.

This is to help me detect and fix errors occurring on mobile platforms without the need for USB debugging, and to be informed of any errors that other users of the demo / example projects might encounter.

The component itself does not contain any tracking.

If you run the example projects locally and a runtime error occurs, some personal information will be sent to Sentry (OS, browser details, full path of the source file where the error occurred...)

If this makes you feel uncomfortable but you still wish to run the examples locally, you can disable Sentry by deleting:

  • in Program.cs:
builder.WebHost.UseSentry(o => {
    o.Dsn = "https://d0ab79eee7b999c61d2c01fdf3958eeb@o4505402784546816.ingest.sentry.io/4506525909909504";
    // When configuring for the first time, to see what the SDK is doing:
    o.Debug = true;
    // Set TracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.
    // We recommend adjusting this value in production.
    o.TracesSampleRate = 1.0;
});
  • in Examples.BlazorWasm/wwwroot/index.html (WASM example) or in Examples.BlazorServer/Pages/_Host.cshtml (Blazor Server example):
<script
    src="https://js.sentry-cdn.com/d0ab79eee7b999c61d2c01fdf3958eeb.min.js"
    crossorigin="anonymous"
></script>