A Canvas/SVG-based rich text editor.
Live Demo · Documentation · Report Bug · Request Feature · Discussions
English · 中文文档
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.
| 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
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 plugin collection |
| feature/svg | SVG render layer (in development) |
| feature/pdf | PDF export feature |
| feature/ai | AI-powered text processing demo |
| poc/table-paging | Table pagination POC (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.
$ claude mcp add canvas-editor \
-- python -m otcore.mcp_server <graph>