An experimental infinite-canvas editor built with React, Moveable, Infinite Viewer, and Zustand.
The project separates a stateful EditorEngine from the React rendering and interaction layer so viewport behavior, element operations, history, and business UI can evolve independently.
- Infinite pan and zoom workspace.
- Rectangle, text, image, and frame elements.
- Selection, multi-selection, move, resize, and interaction guidelines.
- Element, viewport, interaction, history, and font managers.
- Keyboard shortcuts and creation gestures.
- Floating toolbars for different element types.
- Command-style
EditorAPIfor business integrations. - Selection export to image.
- UI extension points through editor slots.
Business page
│
▼
CoreEditor (React integration)
│
├── rendering and interaction managers
├── toolbars and keyboard shortcuts
└── EditorAPI
│
▼
EditorEngine
│
├── elements
├── viewport
├── history
└── interaction state
The engine and React integration live under src/core; EngineEditorPage demonstrates how a product can inject its own controls while using the shared editor.
npm install
npm run devUseful commands:
npm run build
npm run lint
npm run previewimport { useRef } from "react";
import { CoreEditor, EditorProvider, type EditorAPI } from "./core";
export function Editor() {
const apiRef = useRef<EditorAPI | null>(null);
return (
<EditorProvider>
<CoreEditor apiRef={apiRef} />
</EditorProvider>
);
}Infinite View is an editor-engine experiment rather than a published package. The public API and element model may change as interaction and product requirements are explored.