@pixerate/editor-svelte 0.112.0 → 0.114.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/dist/canvas/createCanvasDocument.svelte.d.ts +11 -0
- package/dist/canvas/createCanvasDocument.svelte.js +42 -0
- package/dist/canvas/index.d.ts +1 -0
- package/dist/canvas/index.js +1 -0
- package/dist/image-editor/imageEditorState.svelte.d.ts +1 -0
- package/dist/image-editor/imageEditorState.svelte.js +5 -1
- package/dist/paint-editor/paintEditorRune.svelte.d.ts +1 -0
- package/dist/paint-editor/paintEditorRune.svelte.js +5 -1
- package/dist/persistence/editorAutosave.svelte.js +3 -1
- package/package.json +2 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CanvasEdge, type CanvasEdgeLike, type CanvasEditorDocument, type CanvasEditorDocumentOptions, type CanvasNode } from '@pixerate/editor/canvas';
|
|
2
|
+
import type { EditorDocument } from '@pixerate/editor/persistence';
|
|
3
|
+
export type CreateCanvasDocumentOptions<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdgeLike = CanvasEdge> = Omit<CanvasEditorDocumentOptions<TNode, TEdge>, 'subscribe'>;
|
|
4
|
+
/**
|
|
5
|
+
* Svelte 5 rune: the save / load / undo contract (kind `canvas`) for nodes and edges held in
|
|
6
|
+
* `$state`, for `createEditorAutosave` or `createDocumentToolProvider`. Reads `getNodes()` /
|
|
7
|
+
* `getEdges()` reactively, so changes the history does not see (a finished drag, an edge
|
|
8
|
+
* removed by Svelte Flow) count too; selection, measuring and drag frames do not. Parity with
|
|
9
|
+
* React's `useCanvasEditorDocument`. Call `destroy()` when done.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createCanvasDocument<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdgeLike = CanvasEdge>(options: CreateCanvasDocumentOptions<TNode, TEdge>): EditorDocument<CanvasEditorDocument<TNode, TEdge>>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createCanvasEditorDocument } from '@pixerate/editor/canvas';
|
|
2
|
+
const contentKey = (nodes, edges) => JSON.stringify([
|
|
3
|
+
nodes.map(({ selected: _s, dragging: _d, measured: _m, resizing: _r, ...rest }) => rest),
|
|
4
|
+
edges.map(({ selected: _s, ...rest }) => rest)
|
|
5
|
+
]);
|
|
6
|
+
/**
|
|
7
|
+
* Svelte 5 rune: the save / load / undo contract (kind `canvas`) for nodes and edges held in
|
|
8
|
+
* `$state`, for `createEditorAutosave` or `createDocumentToolProvider`. Reads `getNodes()` /
|
|
9
|
+
* `getEdges()` reactively, so changes the history does not see (a finished drag, an edge
|
|
10
|
+
* removed by Svelte Flow) count too; selection, measuring and drag frames do not. Parity with
|
|
11
|
+
* React's `useCanvasEditorDocument`. Call `destroy()` when done.
|
|
12
|
+
*/
|
|
13
|
+
export function createCanvasDocument(options) {
|
|
14
|
+
const listeners = new Set();
|
|
15
|
+
const doc = createCanvasEditorDocument({
|
|
16
|
+
...options,
|
|
17
|
+
subscribe: (listener) => {
|
|
18
|
+
listeners.add(listener);
|
|
19
|
+
return () => listeners.delete(listener);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
let lastKey = null;
|
|
23
|
+
const stop = $effect.root(() => {
|
|
24
|
+
$effect(() => {
|
|
25
|
+
const nodes = options.getNodes();
|
|
26
|
+
const edges = options.getEdges();
|
|
27
|
+
if (nodes.some((n) => n.dragging))
|
|
28
|
+
return;
|
|
29
|
+
const key = contentKey(nodes, edges);
|
|
30
|
+
if (lastKey !== null && key !== lastKey)
|
|
31
|
+
listeners.forEach((listener) => listener());
|
|
32
|
+
lastKey = key;
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
...doc,
|
|
37
|
+
destroy() {
|
|
38
|
+
stop();
|
|
39
|
+
doc.destroy();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
package/dist/canvas/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export { createStreamingCanvas, type CreateStreamingCanvasOptions } from './crea
|
|
|
18
18
|
export { createCanvasArrange, createCanvasArrangeShortcuts, type CanvasArrange, type CreateCanvasArrangeOptions, type CanvasArrangeShortcutsOptions } from './createCanvasArrange.svelte.js';
|
|
19
19
|
export { createCanvasScenes, type CanvasScenes, type CreateCanvasScenesOptions } from './createCanvasScenes.svelte.js';
|
|
20
20
|
export { createCanvasCapture, type CreateCanvasCaptureOptions } from './createCanvasCapture.js';
|
|
21
|
+
export { createCanvasDocument, type CreateCanvasDocumentOptions } from './createCanvasDocument.svelte.js';
|
|
21
22
|
export { createCanvasPlaybackSurface, type CreateCanvasPlaybackSurfaceOptions } from './createCanvasPlaybackSurface.svelte.js';
|
|
22
23
|
export { default as PresenceLayer } from '../playback/PresenceLayer.svelte';
|
|
23
24
|
export { default as CanvasGuidesLayer } from './CanvasGuidesLayer.svelte';
|
package/dist/canvas/index.js
CHANGED
|
@@ -36,6 +36,7 @@ export { createStreamingCanvas } from './createStreamingCanvas.svelte.js';
|
|
|
36
36
|
export { createCanvasArrange, createCanvasArrangeShortcuts } from './createCanvasArrange.svelte.js';
|
|
37
37
|
export { createCanvasScenes } from './createCanvasScenes.svelte.js';
|
|
38
38
|
export { createCanvasCapture } from './createCanvasCapture.js';
|
|
39
|
+
export { createCanvasDocument } from './createCanvasDocument.svelte.js';
|
|
39
40
|
export { createCanvasPlaybackSurface } from './createCanvasPlaybackSurface.svelte.js';
|
|
40
41
|
export { default as PresenceLayer } from '../playback/PresenceLayer.svelte';
|
|
41
42
|
export { default as CanvasGuidesLayer } from './CanvasGuidesLayer.svelte';
|
|
@@ -2,6 +2,7 @@ import type { ToolRegistry } from '@pixerate/editor/tools';
|
|
|
2
2
|
import { ImageEditorController, type ImageEffectsToolProviderOptions, type ImageEditorFit, type ImageEditorOptions, type ImageEditorState, type ImageEditorTool, type CropBox, type AspectRatio, type ImageAdjustments, type DepthMaskOptions, type Annotation, type CreateAnnotationPayload, type ExportOptions, type SerializedImageEditorState, type AIResultOptions, type ImagePoint, type AdjustmentKind, type AdjustmentLayerInit, type AdjustmentLayerUpdate, type ImageHistogram } from '@pixerate/editor/image-editor';
|
|
3
3
|
export declare function createReactiveImageEditor(options?: ImageEditorOptions): {
|
|
4
4
|
readonly controller: ImageEditorController;
|
|
5
|
+
editorDocument: import("@pixerate/editor/persistence").EditorDocument<SerializedImageEditorState>;
|
|
5
6
|
readonly state: ImageEditorState;
|
|
6
7
|
readonly canUndo: boolean;
|
|
7
8
|
/** Histogram of the last rendered preview (after adjustments and layers); null before a render. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ImageEditorController, createImageEffectsToolProvider, } from '@pixerate/editor/image-editor';
|
|
1
|
+
import { ImageEditorController, createImageEditorDocument, createImageEffectsToolProvider, } from '@pixerate/editor/image-editor';
|
|
2
2
|
export function createReactiveImageEditor(options = {}) {
|
|
3
3
|
const controller = new ImageEditorController(options);
|
|
4
4
|
let state = $state(controller.getState());
|
|
@@ -11,10 +11,13 @@ export function createReactiveImageEditor(options = {}) {
|
|
|
11
11
|
const unsubscribeHistogram = controller.subscribeHistogram((h) => {
|
|
12
12
|
histogram = h;
|
|
13
13
|
});
|
|
14
|
+
/** The save / load / undo contract, with layer pixels as asset references. */
|
|
15
|
+
const editorDocument = createImageEditorDocument(controller);
|
|
14
16
|
return {
|
|
15
17
|
get controller() {
|
|
16
18
|
return controller;
|
|
17
19
|
},
|
|
20
|
+
editorDocument,
|
|
18
21
|
get state() {
|
|
19
22
|
return state;
|
|
20
23
|
},
|
|
@@ -168,6 +171,7 @@ export function createReactiveImageEditor(options = {}) {
|
|
|
168
171
|
destroy() {
|
|
169
172
|
unsubscribe();
|
|
170
173
|
unsubscribeHistogram();
|
|
174
|
+
editorDocument.destroy();
|
|
171
175
|
},
|
|
172
176
|
};
|
|
173
177
|
}
|
|
@@ -8,6 +8,7 @@ import type { ToolRegistry } from '@pixerate/editor/tools';
|
|
|
8
8
|
export declare function createReactivePaintEditor(options?: PaintEditorOptions | PaintEditorController): {
|
|
9
9
|
readonly controller: PaintEditorController;
|
|
10
10
|
readonly state: PaintEditorState;
|
|
11
|
+
editorDocument: import("@pixerate/editor/persistence").EditorDocument<import("@pixerate/editor/paint-editor").SerializedPaintDocument>;
|
|
11
12
|
destroy(): void;
|
|
12
13
|
};
|
|
13
14
|
/** The controller's state as a rune, for components (subscribe in an effect, see GOTCHAS). */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { untrack } from 'svelte';
|
|
2
|
-
import { createPaintEffectsToolProvider, PaintDirector, PaintEditorController, PaintPresence } from '@pixerate/editor/paint-editor';
|
|
2
|
+
import { createPaintEditorDocument, createPaintEffectsToolProvider, PaintDirector, PaintEditorController, PaintPresence } from '@pixerate/editor/paint-editor';
|
|
3
3
|
/**
|
|
4
4
|
* A `PaintEditorController` (created from `options`, or the one given) with its state as a
|
|
5
5
|
* rune: `editor.state` updates after every change. Call `destroy()` to unsubscribe.
|
|
@@ -10,6 +10,8 @@ export function createReactivePaintEditor(options = {}) {
|
|
|
10
10
|
const unsubscribe = controller.subscribe(() => {
|
|
11
11
|
snapshot = controller.getState();
|
|
12
12
|
});
|
|
13
|
+
/** The save / load / undo contract, with every image as an asset reference. */
|
|
14
|
+
const editorDocument = createPaintEditorDocument(controller);
|
|
13
15
|
return {
|
|
14
16
|
get controller() {
|
|
15
17
|
return controller;
|
|
@@ -17,8 +19,10 @@ export function createReactivePaintEditor(options = {}) {
|
|
|
17
19
|
get state() {
|
|
18
20
|
return snapshot;
|
|
19
21
|
},
|
|
22
|
+
editorDocument,
|
|
20
23
|
destroy() {
|
|
21
24
|
unsubscribe();
|
|
25
|
+
editorDocument.destroy();
|
|
22
26
|
},
|
|
23
27
|
};
|
|
24
28
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseEditorDocument, toEditorDocumentFile, } from "@pixerate/editor/persistence";
|
|
1
|
+
import { parseEditorDocument, toEditorDocumentFile, withEditorAssets, } from "@pixerate/editor/persistence";
|
|
2
2
|
import { createAutosave } from "./autosave.svelte.js";
|
|
3
3
|
/**
|
|
4
4
|
* `createAutosave` for any editor's `EditorDocument` (e.g.
|
|
@@ -9,6 +9,8 @@ import { createAutosave } from "./autosave.svelte.js";
|
|
|
9
9
|
export function createEditorAutosave(doc, options) {
|
|
10
10
|
const autosave = createAutosave({
|
|
11
11
|
...options,
|
|
12
|
+
// Image and paint documents hold asset references: their bytes are saved and read with them.
|
|
13
|
+
storage: doc.assets ? withEditorAssets(options.storage, doc.assets) : options.storage,
|
|
12
14
|
key: options.key ?? doc.kind,
|
|
13
15
|
getSnapshot: () => toEditorDocumentFile(doc),
|
|
14
16
|
deserialize: (text) => parseEditorDocument(text, { kind: doc.kind }),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixerate/editor-svelte",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.114.0",
|
|
4
4
|
"description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
|
|
5
5
|
"author": "Pixerate",
|
|
6
6
|
"license": "MIT",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"@tiptap/extension-bubble-menu": "^2.27.3",
|
|
161
161
|
"@tiptap/extension-placeholder": "^2.27.3",
|
|
162
162
|
"@tiptap/starter-kit": "^2.27.3",
|
|
163
|
-
"@pixerate/editor": "0.
|
|
163
|
+
"@pixerate/editor": "0.155.0"
|
|
164
164
|
},
|
|
165
165
|
"peerDependencies": {
|
|
166
166
|
"@dagrejs/dagre": "^1.1.4",
|