Skip to Content

Plugin API

Core plugin registration and management API.

Element Definition

dmn.plugin.defineElement(options): void

Defines a draggable overlay element. See Declarative API for details.

dmn.plugin.defineElement({ name: "My Plugin", maxInstances: 1, settings: { color: { type: "color", default: "#ffffff", label: "Color" }, }, messages: { ko: { "menu.create": "생성", "menu.delete": "삭제" }, en: { "menu.create": "Create", "menu.delete": "Delete" }, }, contextMenu: { create: "menu.create", delete: "menu.delete", }, template: (state, settings, { html, t }) => html` <div>Content</div> `, onMount: ({ setState, getSettings, onHook }) => { return () => { /* cleanup */ }; }, });

Settings Definition

dmn.plugin.defineSettings(options): void

Defines plugin settings UI in the main window settings panel. See Settings System for details.

dmn.plugin.defineSettings({ id: "my-settings", title: "My Plugin Settings", settings: { enabled: { type: "boolean", default: true, label: "Enable" }, theme: { type: "select", default: "dark", options: [ { value: "light", label: "Light" }, { value: "dark", label: "Dark" }, ], label: "Theme", }, }, });

Lifecycle

dmn.plugin.registerCleanup(callback): void

Registers cleanup function called when plugin is unloaded.

const interval = setInterval(() => { console.log("tick"); }, 1000); dmn.plugin.registerCleanup(() => { clearInterval(interval); });

Always clean up timers, event listeners, and DOM elements.


Storage

dmn.plugin.storage

Plugin-specific persistent storage. See Storage API for details.

// Save await dmn.plugin.storage.set("myKey", { value: 42 }); // Load const data = await dmn.plugin.storage.get("myKey"); // Delete await dmn.plugin.storage.remove("myKey"); // List keys const keys = await dmn.plugin.storage.keys();

Plugin Info

dmn.plugin.id: string

Returns current plugin ID (from // @id comment).

// @id my-plugin console.log(dmn.plugin.id); // 'my-plugin'

dmn.plugin.list(): Promise<PluginInfo[]>

Returns list of all loaded plugins.

interface PluginInfo { id: string; name: string; instances: number; } const plugins = await dmn.plugin.list(); plugins.forEach((p) => { console.log(`${p.name} (${p.id}): ${p.instances} instances`); });

Example Usage

// @id stats-tracker dmn.plugin.defineElement({ name: "Stats Tracker", maxInstances: 1, template: (state, settings, { html }) => html` <div style="background: #222; padding: 12px; border-radius: 8px;"> <div>Total Keys: ${state.total ?? 0}</div> <div>Session: ${state.session ?? 0}</div> </div> `, onMount: ({ setState, onHook }) => { let session = 0; // Load saved total dmn.plugin.storage.get("total").then((total) => { setState({ total: total ?? 0 }); }); onHook("key", ({ state }) => { if (state !== "DOWN") return; session++; dmn.plugin.storage.get("total").then((total) => { const newTotal = (total ?? 0) + 1; dmn.plugin.storage.set("total", newTotal); setState({ total: newTotal, session }); }); }); }, });