A Canvas/SVG-based rich text editor
# Canvas Editor - Agent Development Guide
This guide provides essential information for agentic coding agents working on the canvas-editor repository.
## Project Overview
Canvas Editor is a TypeScript-based rich text editor library that renders content using HTML5 Canvas/SVG. It's built as an ES module with comprehensive TypeScript support and follows modern development practices.
## Development Commands
### Essential Commands
```bash
# Development
npm run dev # Start Vite dev server
npm run serve # Preview production build
# Building (includes lint + type check)
npm run lib # Build library for distribution
npm run build # Build application
# Code Quality
npm run lint # Run ESLint
npm run type:check # TypeScript type checking
# Testing
npm run cypress:open # Open Cypress test runner interactively
npm run cypress:run # Run Cypress tests headless
```
### Pre-commit Hooks
- Automatically runs `npm run lint && npm run type:check` before commits
- Commit messages must follow conventional commit format (feat:, fix:, docs:, etc.)
## Code Style Guidelines
### Formatting Rules
- **No semicolons** - `semi: [1, "never"]`
- **Single quotes** - `quotes: [1, "single"]`
- **2-space indentation** - No tabs
- **80 character line limit** - `printWidth: 80`
- **No trailing commas** - `trailingComma: "none"`
- **Arrow function parentheses avoided** - `arrowParens: "avoid"`
- **LF line endings** - `endOfLine: "lf"`
### TypeScript Configuration
- **Strict mode enabled** - All type checking enforced
- **Target**: ESNext with modern features
- **Module system**: ESNext modules
- **Source maps**: Enabled for debugging
- **Unused locals/parameters**: Checked and reported
### ESLint Rules
- `any` type allowed (`@typescript-eslint/no-explicit-any: 0`)
- Console statements permitted
- Debugger statements allowed
- No explicit function return type required when inferred
## Project Structure
### Main Directories
```
src/
├── editor/ # Core editor library
│ ├── index.ts # Main entry point - exports Editor class
│ ├── core/ # Core functionality
│ │ ├── draw/ # Canvas rendering engine
│ │ ├── command/ # Command pattern implementation
│ │ ├── listener/ # Event handling system
│ │ └── ...
│ ├── interface/ # TypeScript type definitions
│ ├── dataset/ # Constants and enums
│ │ ├── constant/ # Magic numbers and strings
│ │ └── enum/ # TypeScript enums
│ ├── utils/ # Editor-specific utilities
│ └── assets/ # CSS-in-JS and images
├── plugins/ # Optional editor plugins
├── components/ # Reusable UI components
├── utils/ # Shared utility functions
└── assets/ # Static assets
```
### Key Files
- **Main entry**: `src/editor/index.ts` - Exports Editor class and utilities
- **Package exports**: ES module and UMD builds with TypeScript definitions
- **Node requirement**: `>=16.9.1`
## Import Conventions
### Module Imports
- Use ES module imports: `import { Editor } from './editor'`
- TypeScript interfaces: `import type { EditorInterface } from './interface'`
- Relative imports with explicit extensions for non-TypeScript files
### Import Organization
1. External libraries (Node.js built-ins, npm packages)
2. Internal modules (absolute imports from src/)
3. Relative imports (sibling/parent directory imports)
4. Type-only imports (use `import type` when possible)
## Naming Conventions
### Files and Directories
- **PascalCase** for components and classes: `EditorManager.ts`
- **camelCase** for utilities and functions: `formatText.ts`
- **kebab-case** for directories when containing multiple words: `rich-text/`
### Code Elements
- **PascalCase** for classes and interfaces: `class Editor`, `interface EditorConfig`
- **camelCase** for functions and variables: `formatText`, `currentSelection`
- **UPPER_SNAKE_CASE** for constants: `MAX_CANVAS_WIDTH`, `DEFAULT_FONT_SIZE`
- **PascalCase** for enums: `enum TextAlignment`
## Error Handling
### TypeScript Errors
- Use strict TypeScript checking - prefer explicit types over `any`
- Handle nullable types with optional chaining and nullish coalescing
- Use union types for variant error states
### Runtime Errors
- Throw descriptive Error objects with context
- Use try-catch blocks for external API calls
- Validate user input in public API methods
## Testing Guidelines
### Cypress E2E Tests
- Tests located in `cypress/` directory
- Use `npm run cypress:open` for interactive test development
- Use `npm run cypress:run` for CI/CD automated testing
- Viewport set to 1366x720 for consistency
### Test Organization
- Group related tests in describe blocks
- Use beforeEach for common setup
- Write descriptive test names that explain the behavior
- Test both happy path and error conditions
## Build Process
### Library Build
- TypeScript compilation with strict checking
- Vite bundling for ES module and UMD outputs
- Automatic CSS-in-JS injection via plugin
- Source maps generated for debugging
### Quality Gates
- Linting must pass before build completion
- Type checking must pass before build completion
- Pre-commit hooks enforce quality standards
## API Design
### Public API
- Main Editor class exported from `src/editor/index.ts`
- Fluent method chaining where appropriate
- Consistent parameter ordering (required, then optional)
- Comprehensive TypeScript definitions
### Plugin System
- Plugins in `src/plugins/` directory
- Extend Editor functionality without modifying core
- Follow established plugin patterns in codebase
## Development Workflow
1. **Start development**: `npm run dev`
2. **Make changes**: Follow code style guidelines
3. **Test changes**: Use Cypress for E2E testing
4. **Quality check**: `npm run lint && npm run type:check`
5. **Commit**: Pre-commit hooks will validate automatically
6. **Build**: `npm run lib` for distribution build
## Performance Considerations
- Canvas rendering optimized for frequent updates
- Minimal DOM manipulation - primarily Canvas-based
- Efficient event handling with delegation patterns
- Memory-conscious object pooling where appropriate
## Security Notes
- No external network requests in core library
- Sanitize all user input before rendering
- Avoid eval() and Function constructor usage
- Validate configuration options in public API