Custom Object Types
ObjectTypeRegistry is how every shape, image, and QR code in this framework is defined — including the built-in ones. There's no closed, editable-only-by-editing-the-library factory class; registering a new type is a plugin install() call away.
Custom Tools
A tool is an interaction mode — select, pan, draw, crop — exactly one active at a time. ToolRegistry (engine.registry.tools) manages registration and the currently-active tool.
Custom Panels
A panel is a named UI slot a plugin can render a React component into, without forking the host application's layout. PanelRegistry (engine.registry.panels) manages the slots — slot names are arbitrary strings, so a plugin can register into a new one you invent; @rifrocket/fdt-react's `/` render four of them by default.
Custom Property Fields
PropertiesPanel (from @rifrocket/fdt-react) renders nothing for an object type until that type has propertyFields — a list of field definitions describing what's editable and which component renders each one.
Export/Import Pipelines
Export and import are both registry-based, keyed by format string. CanvasEngine registers 4 built-in export formats (png, jpeg, svg, json) for itself at construction time; there are no built-in importers — every import format is plugin-provided. Neither is special-cased over a plugin-registered one — they're just the default registrations CanvasEngine makes for itself.
Event Middleware
engine.events (an EventBus) is generic string-keyed pub-sub with middleware support — the seam for cross-cutting concerns like logging, analytics, or validation without every plugin that cares having to instrument the same call sites individually.