2.6 KiB
2.6 KiB
Contributing
Project Structure
src/
components/ Vue SFCs (canvas, panels, toolbar, color picker)
properties/ Property panel sections (Appearance, Fill, Stroke, etc.)
composables/ Canvas input, keyboard shortcuts, rendering hooks
stores/ Editor state (Vue reactivity)
engine/ Scene graph, renderer, layout, clipboard, undo, vector, snap
kiwi/ Figma file format (Kiwi codec, .fig import)
kiwi-schema/ Vendored from evanw/kiwi
types.ts Shared types
constants.ts UI colors, defaults, thresholds
desktop/ Tauri v2 (Rust + config)
tests/
e2e/ Playwright visual regression
engine/ Unit tests (bun:test)
docs/ VitePress documentation site
openspec/
specs/ Capability specifications (source of truth)
changes/ Active and archived changes
Development Setup
bun install
bun run dev # Editor at localhost:1420
bun run docs:dev # Docs at localhost:5173
Code Style
Tooling
| Tool | Command | Purpose |
|---|---|---|
| oxlint | bun run lint |
Linting (Rust-based, fast) |
| oxfmt | bun run format |
Code formatting |
| tsgo | bun run typecheck |
Type checking (Go-based TypeScript checker) |
Run all checks:
bun run check
Conventions
- File names — kebab-case (
scene-graph.ts,use-canvas-input.ts) - Components — PascalCase Vue SFCs (
EditorCanvas.vue,ScrubInput.vue) - Constants — SCREAMING_SNAKE_CASE
- Functions/variables — camelCase
- Types/interfaces — PascalCase
Making Changes
- Check existing openspec specs for the capability you're modifying
- Create an openspec change if adding new behavior:
openspec new change "my-change" - Implement the change
- Run
bun run checkandbun run test - Submit a pull request
Key Files
| File | Purpose |
|---|---|
src/engine/scene-graph.ts |
Core data structure for all design nodes |
src/engine/renderer.ts |
CanvasKit rendering pipeline |
src/engine/layout.ts |
Yoga layout adapter |
src/engine/undo.ts |
Undo/redo manager |
src/engine/clipboard.ts |
Figma-compatible clipboard |
src/engine/vector.ts |
Vector network model |
src/stores/editor.ts |
Global editor state |
src/composables/use-canvas.ts |
Canvas rendering composable |
src/composables/use-canvas-input.ts |
Mouse/touch input handling |
src/composables/use-keyboard.ts |
Keyboard shortcut handling |
src/kiwi/codec.ts |
Kiwi binary encoder/decoder |
src/kiwi/fig-import.ts |
.fig file import logic |