A Canvas/SVG-based rich text editor
See the codeA Canvas/SVG-based rich text editor.
Live Demo · Documentation · Report Bug · Request Feature · Discussions
English · 中文文档
🎉 Canvas Editor 1.0.0 is released! See the 1.0 Release Notes for highlights and upgrade notes.
Canvas Editor is a feature-rich, WYSIWYG document editor built on top of the HTML <canvas> API. It is designed for use cases that demand pixel-perfect rendering, advanced typography, complex layouts, and Word-like document experiences in the browser — including EMR (Electronic Medical Records), legal contracts, reports, and other document-centric applications.
Unlike traditional contenteditable-based editors, Canvas Editor takes full control of the rendering pipeline, providing consistent typography across browsers, precise pagination, and a uniform export experience.
instance.use); official plugins cover Word/Excel import-export, formulas, code blocks, comments, spell checking, and more| Canvas Editor | contenteditable Editors | |
|---|---|---|
| Cross-browser rendering | Pixel-perfect, identical | Varies by browser |
| Pagination | Native, document-style | Manual / unsupported |
| Print fidelity | Matches on-screen output | Often diverges |
| Typography control | Full control | Limited by the browser |
| Document features | TOC, headers/footers, watermarks | Requires heavy custom logic |
# npm
npm install @hufe921/canvas-editor
# pnpm
pnpm add @hufe921/canvas-editor
# yarn
yarn add @hufe921/canvas-editor
<div class="canvas-editor"></div>
import Editor from '@hufe921/canvas-editor'
const container = document.querySelector('.canvas-editor')
const editor = new Editor(container, {
main: [
{
value: 'Hello, Canvas Editor!'
}
]
})
For complete API documentation, see the official docs.
| Project | Description |
|---|---|
| canvas-editor-plugin | Official plugins: Word/Excel import-export, formula, comment, spellcheck & 20+ more |
| feature/svg | SVG render layer (in development) |
| feature/pdf | PDF export feature |
| feature/ai | AI-powered text processing demo |
| feature/CRDT | CRDT-based collaboration (experimental) |
>= 24.13.1# Install dependencies
pnpm install
# Start the development server
npm run dev
# Build the application (demo)
npm run build
# Build the library (publishable package)
npm run lib
# Lint
npm run lint
# Type check
npm run type:check
# Unit tests (Vitest)
npm run test:unit
# E2E tests (Cypress)
npm run cypress:open # interactive
npm run cypress:run # headless
npm run docs:dev # Start VitePress docs locally
npm run docs:build # Build the documentation site
src/editor/
├── core/
│ ├── draw/ # Rendering engine (canvas drawing)
│ │ ├── particle/ # Element renderers (text, image, table, latex, ...)
│ │ ├── control/ # Form control rendering
│ │ ├── frame/ # Frame elements (margin, background, borders)
│ │ ├── richtext/ # Decorations (underline, highlight)
│ │ └── interactive/# Interactive features (search, graffiti)
│ ├── command/ # Command pattern (executeBold, executeUndo, ...)
│ ├── event/ # Canvas and global event handling
│ ├── observer/ # Mouse, selection, image observers
│ ├── worker/ # Web Workers for async operations
│ └── plugin/ # Plugin system
├── interface/ # TypeScript interfaces
├── dataset/ # Enums and constants
└── utils/ # Utility helpers
Contributions are what make the open-source community such an amazing place. Any contributions you make are greatly appreciated — bug reports, feature requests, documentation improvements, or pull requests.
git checkout -b feat/amazing-feature)git commit -m 'feat: add amazing feature')git push origin feat/amazing-feature)Pre-commit hooks automatically run
lintandtype:check. Commit messages must follow Conventional Commits format (feat:,fix:,docs:,refactor:, ...).
Thanks to all the people who have contributed to Canvas Editor!
If you find this project useful, please consider sponsoring to support its continued development.
This project is licensed under the MIT License.
Copyright © 2022–present, Hufe921.
A Canvas/SVG-based rich text editor
See the codeA Canvas/SVG-based rich text editor.
Live Demo · Documentation · Report Bug · Request Feature · Discussions
English · 中文文档
🎉 Canvas Editor 1.0.0 is released! See the 1.0 Release Notes for highlights and upgrade notes.
Canvas Editor is a feature-rich, WYSIWYG document editor built on top of the HTML <canvas> API. It is designed for use cases that demand pixel-perfect rendering, advanced typography, complex layouts, and Word-like document experiences in the browser — including EMR (Electronic Medical Records), legal contracts, reports, and other document-centric applications.
Unlike traditional contenteditable-based editors, Canvas Editor takes full control of the rendering pipeline, providing consistent typography across browsers, precise pagination, and a uniform export experience.
instance.use); official plugins cover Word/Excel import-export, formulas, code blocks, comments, spell checking, and more| Canvas Editor | contenteditable Editors | |
|---|---|---|
| Cross-browser rendering | Pixel-perfect, identical | Varies by browser |
| Pagination | Native, document-style | Manual / unsupported |
| Print fidelity | Matches on-screen output | Often diverges |
| Typography control | Full control | Limited by the browser |
| Document features | TOC, headers/footers, watermarks | Requires heavy custom logic |
# npm
npm install @hufe921/canvas-editor
# pnpm
pnpm add @hufe921/canvas-editor
# yarn
yarn add @hufe921/canvas-editor
<div class="canvas-editor"></div>
import Editor from '@hufe921/canvas-editor'
const container = document.querySelector('.canvas-editor')
const editor = new Editor(container, {
main: [
{
value: 'Hello, Canvas Editor!'
}
]
})
For complete API documentation, see the official docs.
| Project | Description |
|---|---|
| canvas-editor-plugin | Official plugins: Word/Excel import-export, formula, comment, spellcheck & 20+ more |
| feature/svg | SVG render layer (in development) |
| feature/pdf | PDF export feature |
| feature/ai | AI-powered text processing demo |
| feature/CRDT | CRDT-based collaboration (experimental) |
>= 24.13.1# Install dependencies
pnpm install
# Start the development server
npm run dev
# Build the application (demo)
npm run build
# Build the library (publishable package)
npm run lib
# Lint
npm run lint
# Type check
npm run type:check
# Unit tests (Vitest)
npm run test:unit
# E2E tests (Cypress)
npm run cypress:open # interactive
npm run cypress:run # headless
npm run docs:dev # Start VitePress docs locally
npm run docs:build # Build the documentation site
src/editor/
├── core/
│ ├── draw/ # Rendering engine (canvas drawing)
│ │ ├── particle/ # Element renderers (text, image, table, latex, ...)
│ │ ├── control/ # Form control rendering
│ │ ├── frame/ # Frame elements (margin, background, borders)
│ │ ├── richtext/ # Decorations (underline, highlight)
│ │ └── interactive/# Interactive features (search, graffiti)
│ ├── command/ # Command pattern (executeBold, executeUndo, ...)
│ ├── event/ # Canvas and global event handling
│ ├── observer/ # Mouse, selection, image observers
│ ├── worker/ # Web Workers for async operations
│ └── plugin/ # Plugin system
├── interface/ # TypeScript interfaces
├── dataset/ # Enums and constants
└── utils/ # Utility helpers
Contributions are what make the open-source community such an amazing place. Any contributions you make are greatly appreciated — bug reports, feature requests, documentation improvements, or pull requests.
git checkout -b feat/amazing-feature)git commit -m 'feat: add amazing feature')git push origin feat/amazing-feature)Pre-commit hooks automatically run
lintandtype:check. Commit messages must follow Conventional Commits format (feat:,fix:,docs:,refactor:, ...).
Thanks to all the people who have contributed to Canvas Editor!
If you find this project useful, please consider sponsoring to support its continued development.
This project is licensed under the MIT License.
Copyright © 2022–present, Hufe921.