@pixerate/editor-svelte 0.104.0 → 0.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -82,7 +82,7 @@ Tables are on by default in `createRichTextPreset` (`table: false` turns them of
82
82
  | `@pixerate/editor-svelte/image-editor` | `ImageEditor`, `createReactiveImageEditor`: crop, rotate/flip, adjustments, annotations, depth masks, Select & Mask (`SelectionOptionsBar`, `RefineEdgePanel`: magic wand, marquees, lasso, Refine Edge, layer masks), and `onInpaint` / `onRemoveBackground` AI hooks |
83
83
  | `@pixerate/editor-svelte/paint-editor` | `PaintEditor`, `createReactivePaintEditor`: natural-media painting with `PaintCanvas` (pen pressure, tilt and twist, coalesced and predicted events, palm rejection, view rotation and mirroring), `PaintToolbar` (tools, symmetry, perspective, tracing and reference images, save / open, PNG / JPEG / PSD), `BrushPanel` (library with thumbnails), `PaperPanel`, `ColorPanel` (wheel, harmonies, swatches, mixing pad) and `PaintLayersPanel` |
84
84
  | `@pixerate/editor-svelte/commands` | `CommandPalette`, `createCommandPalette` (`hotkey: "Mod+K"`; call `destroy()` when done), `createCommandShortcuts`, `useRegisterCommands` over a `CommandRegistry` from `@pixerate/editor/commands` (also re-exported from the root entry) |
85
- | `@pixerate/editor-svelte/persistence` | `createAutosave` (crash-recovery snapshots bound to a history / dirty flag, flushed on `pagehide`; call `destroy()` when done) and `<RecoveryPrompt>` (also re-exported from the root entry) |
85
+ | `@pixerate/editor-svelte/persistence` | `createAutosave` (crash-recovery snapshots bound to a history / dirty flag, flushed on `pagehide`; call `destroy()` when done), `createEditorAutosave` (the same for any editor's `EditorDocument`, e.g. `createMermaidDiagram().editorDocument`; `restore` loads the snapshot into the editor) and `<RecoveryPrompt>` (also re-exported from the root entry) |
86
86
  | `@pixerate/editor-svelte/generation` | `GenerationSettings` (controls generated from a model's capabilities, reference slots by role, plan adjustments; `onchange` / `onaddreference`), `createGenerationPlan(() => request, () => caps)`, `JobProgress`, `createJobProgress` (call `destroy()` when done) over `@pixerate/editor/generation` (also re-exported from the root entry) |
87
87
  | `@pixerate/editor-svelte/vector` | `VectorEditor` (toolbar, canvas and style panel), `VectorCanvas` (SVG canvas forwarding pointer, wheel, keyboard and clipboard events), `VectorToolbar`, `VectorStylePanel`, `VectorSceneNodes`, `VectorGradientDefs`, `createVectorEditor` (call `destroy()` when done) and `useVectorCommands` over `@pixerate/editor/vector` (see [the vector editor guide](../../docs/vector-editor.md)) |
88
88
  | `@pixerate/editor-svelte/chart` | `ChartEditor` (toolbar, chart, inspector and data grid), `ChartCanvas` (SVG chart with selection, drag-to-edit and keyboard editing), `ChartDataGrid`, `ChartInspector`, `createChartEditor` (call `destroy()` when done) and `useChartCommands` over `@pixerate/editor/chart` (see [the chart editor guide](../../docs/chart-editor.md)) |
@@ -1,4 +1,5 @@
1
- import { DiagramController, type DiagramActionResult, type DiagramControllerOptions, type DiagramState, type EditOp, type MermaidDocument } from '@pixerate/editor/diagram';
1
+ import { DiagramController, type DiagramActionResult, type DiagramControllerOptions, type DiagramState, type EditOp, type DiagramEditorDocument, type MermaidDocument } from '@pixerate/editor/diagram';
2
+ import type { EditorDocument } from '@pixerate/editor/persistence';
2
3
  import { type DiagramLayout, type DiagramLayoutOptions, type DiagramScene, type DiagramSceneTheme, type MermaidFlowEdge, type MermaidFlowNode } from '@pixerate/editor/canvas';
3
4
  export interface CreateMermaidDiagramOptions extends DiagramControllerOptions {
4
5
  /** Layout spacing and node measuring for new nodes (stored positions always win). */
@@ -16,6 +17,11 @@ type Placed = {
16
17
  };
17
18
  export interface SvelteMermaidDiagram {
18
19
  readonly controller: DiagramController;
20
+ /**
21
+ * The save / load / undo contract for this diagram: pass it to `createEditorAutosave`
22
+ * (`@pixerate/editor-svelte/persistence`) or `createDocumentToolProvider`.
23
+ */
24
+ readonly editorDocument: EditorDocument<DiagramEditorDocument>;
19
25
  /** The controller's state (reactive). */
20
26
  readonly state: DiagramState;
21
27
  readonly document: MermaidDocument;
@@ -1,4 +1,4 @@
1
- import { DiagramController } from '@pixerate/editor/diagram';
1
+ import { DiagramController, createDiagramEditorDocument } from '@pixerate/editor/diagram';
2
2
  import { CSS_VARIABLE_DIAGRAM_SCENE_THEME, DiagramStream, blendDiagramLayout, diagramRenameOp, familySceneFromLayout, easeDiagramTween, mermaidMovesFromCanvas, mermaidToCanvas } from '@pixerate/editor/canvas';
3
3
  /**
4
4
  * Svelte 5 rune: a Mermaid diagram on a Svelte Flow canvas. Subscribes to a
@@ -19,8 +19,10 @@ view = {}) {
19
19
  const unsubscribe = controller.subscribe((next) => {
20
20
  state = next;
21
21
  });
22
+ const editorDocument = createDiagramEditorDocument(controller);
22
23
  return {
23
24
  controller,
25
+ editorDocument,
24
26
  get state() {
25
27
  return state;
26
28
  },
@@ -68,7 +70,10 @@ view = {}) {
68
70
  select: (ids) => controller.select(ids),
69
71
  undo: () => void controller.undo(),
70
72
  redo: () => void controller.redo(),
71
- destroy: unsubscribe
73
+ destroy: () => {
74
+ unsubscribe();
75
+ editorDocument.destroy();
76
+ }
72
77
  };
73
78
  }
74
79
  /**
@@ -0,0 +1,17 @@
1
+ import { type EditorDocument, type EditorDocumentFile, type LoadReport } from "@pixerate/editor/persistence";
2
+ import { type CreateAutosaveOptions, type SvelteAutosave } from "./autosave.svelte.js";
3
+ export interface CreateEditorAutosaveOptions extends Omit<CreateAutosaveOptions<EditorDocumentFile>, "key" | "getSnapshot" | "serialize" | "deserialize" | "history"> {
4
+ /** Snapshot key (default the document's `kind`). */
5
+ key?: string;
6
+ }
7
+ export interface SvelteEditorAutosave extends Omit<SvelteAutosave<EditorDocumentFile>, "restore"> {
8
+ /** Loads the recovered snapshot into the document and starts autosaving. */
9
+ restore(): LoadReport | undefined;
10
+ }
11
+ /**
12
+ * `createAutosave` for any editor's `EditorDocument` (e.g.
13
+ * `createMermaidDiagram(...).editorDocument`): snapshots it as an
14
+ * `EditorDocumentFile` after each change, and `restore` loads a recovered
15
+ * snapshot straight into the editor. Status and recovery stay reactive.
16
+ */
17
+ export declare function createEditorAutosave(doc: EditorDocument, options: CreateEditorAutosaveOptions): SvelteEditorAutosave;
@@ -0,0 +1,40 @@
1
+ import { parseEditorDocument, toEditorDocumentFile, } from "@pixerate/editor/persistence";
2
+ import { createAutosave } from "./autosave.svelte.js";
3
+ /**
4
+ * `createAutosave` for any editor's `EditorDocument` (e.g.
5
+ * `createMermaidDiagram(...).editorDocument`): snapshots it as an
6
+ * `EditorDocumentFile` after each change, and `restore` loads a recovered
7
+ * snapshot straight into the editor. Status and recovery stay reactive.
8
+ */
9
+ export function createEditorAutosave(doc, options) {
10
+ const autosave = createAutosave({
11
+ ...options,
12
+ key: options.key ?? doc.kind,
13
+ getSnapshot: () => toEditorDocumentFile(doc),
14
+ deserialize: (text) => parseEditorDocument(text, { kind: doc.kind }),
15
+ history: doc,
16
+ });
17
+ return {
18
+ get status() {
19
+ return autosave.status;
20
+ },
21
+ get recovery() {
22
+ return autosave.recovery;
23
+ },
24
+ get pendingRecovery() {
25
+ return autosave.pendingRecovery;
26
+ },
27
+ restore() {
28
+ const snapshot = autosave.restore();
29
+ return snapshot ? doc.loadDocument(snapshot, { history: "reset" }) : undefined;
30
+ },
31
+ discard: () => autosave.discard(),
32
+ ready: () => autosave.ready(),
33
+ flushNow: () => autosave.flushNow(),
34
+ markClean: () => autosave.markClean(),
35
+ notifyChange: () => autosave.notifyChange(),
36
+ checked: autosave.checked,
37
+ controller: autosave.controller,
38
+ destroy: () => autosave.destroy(),
39
+ };
40
+ }
@@ -2,4 +2,5 @@ import type { ComponentProps } from "svelte";
2
2
  import type RecoveryPromptComponent from "./RecoveryPrompt.svelte";
3
3
  export { default as RecoveryPrompt } from "./RecoveryPrompt.svelte";
4
4
  export * from "./autosave.svelte.js";
5
+ export * from "./editorAutosave.svelte.js";
5
6
  export type RecoveryPromptProps = ComponentProps<typeof RecoveryPromptComponent>;
@@ -1,2 +1,3 @@
1
1
  export { default as RecoveryPrompt } from "./RecoveryPrompt.svelte";
2
2
  export * from "./autosave.svelte.js";
3
+ export * from "./editorAutosave.svelte.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.104.0",
3
+ "version": "0.105.0",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -144,7 +144,7 @@
144
144
  "@tiptap/extension-bubble-menu": "^2.27.3",
145
145
  "@tiptap/extension-placeholder": "^2.27.3",
146
146
  "@tiptap/starter-kit": "^2.27.3",
147
- "@pixerate/editor": "0.145.0"
147
+ "@pixerate/editor": "0.146.0"
148
148
  },
149
149
  "peerDependencies": {
150
150
  "@dagrejs/dagre": "^1.1.4",