Skip to main content

Choosing Your Entry Point

There are three ways to start an editor, at three different levels of the stack. All three end up constructing the same underlying CanvasEngine — they differ only in how much is pre-wired for you.

<DesignEditor> — batteries-included

import { DesignEditor } from "@rifrocket/fdt-react";

<DesignEditor preset="default" theme="system" width={800} height={600} />;

Use this when you want a general-purpose editor working immediately, and you're fine with the plugin set a named preset bundles. preset="default" installs shapes-basic, clipboard, svg-import, image, effects, export-pdf, and qrcode. preset="minimal" drops qrcode/export-pdf/svg-import for a lighter bundle. Override per-field without abandoning the preset:

<DesignEditor
preset="default"
plugins={{ exclude: ["qrcode"], add: [myBrandKitPlugin] }}
autosave={{ key: "my-app:design" }}
/>

Not bundled into either preset (they'd create a circular dependency on @rifrocket/fdt-react itself): plugin-alignment, plugin-snapping, plugin-devtools, plugin-import-json. Add them via plugins.add, the same way you'd add any third-party plugin — see Installing Plugins.

<Editor> — a-la-carte, still React

import { Editor } from "@rifrocket/fdt-react";
import { shapesBasicPlugin } from "@rifrocket/fdt-plugin-shapes-basic";

<Editor plugins={[shapesBasicPlugin]} theme="dark" width={800} height={600} />;

Use this when you want full control over exactly which plugins are installed, without preset machinery, but still want React's <Editor>/useEditor()/panel-slot system. This is what the Quick Start uses.

<Editor> only renders 3 fixed panel slots (toolbar-start, sidebar-right, properties-footer) inside its own wrapping <div>. If you need a real application shell — a header, multiple sidebars, a status bar, floating panels — see Building a Custom Shell with EditorContext, which covers useCanvasEngine() + re-providing EditorContext around your own layout.

createEngine() — framework-agnostic

import { createEngine } from "@rifrocket/fabricjs-design-tool";

const engine = createEngine(canvasElement, { width: 800, height: 600 });
engine.use(shapesBasicPlugin);
engine.addObjectOfType("rect", { left: 10, top: 10, width: 100, height: 60 });

Use this when you're not using React at all, or you're building a framework adapter of your own. @rifrocket/fabricjs-design-tool has zero React dependency (enforced by a dependency-cruiser CI rule, not just convention), so this works in vanilla JS, Vue, Svelte, or any other environment with a <canvas> element.

@rifrocket/fabricjs-design-tool also exports createEditor(), the non-React counterpart to presets — see Presets — but it can only resolve a literal preset object (via definePreset()), not the named "default"/"minimal" strings <DesignEditor> accepts, because core cannot depend back on the plugin packages that make up those named presets without creating a circular package dependency.

Decision guide

If...Use
You want a general-purpose editor working in one line<DesignEditor preset="default">
You want React but a custom, hand-picked plugin list<Editor plugins={[...]}>
You need a layout beyond 3 fixed panel slots (header, multiple sidebars, status bar)useCanvasEngine() + EditorContext re-provision — see Custom Shell guide
You're not using React at allcreateEngine() from @rifrocket/fabricjs-design-tool
You're building a Vue/Svelte/other framework adaptercreateEngine() (and optionally createEditor() with a literal preset)