@pixerate/editor-svelte 0.15.2 → 0.16.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/BubbleMenu.svelte.d.ts +14 -0
- package/dist/BubbleMenu.svelte.d.ts.map +1 -0
- package/{src → dist}/EditableTextNodeEditor.svelte +1 -1
- package/dist/EditableTextNodeEditor.svelte.d.ts +26 -0
- package/dist/EditableTextNodeEditor.svelte.d.ts.map +1 -0
- package/dist/TemplateRenderer.svelte.d.ts +14 -0
- package/dist/TemplateRenderer.svelte.d.ts.map +1 -0
- package/dist/canvas/AgentPresenceLayer.svelte.d.ts +9 -0
- package/dist/canvas/AgentPresenceLayer.svelte.d.ts.map +1 -0
- package/dist/canvas/FloatingHorizontalScrollbar.svelte.d.ts +9 -0
- package/dist/canvas/FloatingHorizontalScrollbar.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasClipboard.svelte.d.ts +32 -0
- package/dist/canvas/createCanvasClipboard.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasClipboard.svelte.js +171 -0
- package/dist/canvas/createCanvasDisplacement.d.ts +32 -0
- package/dist/canvas/createCanvasDisplacement.d.ts.map +1 -0
- package/dist/canvas/createCanvasDisplacement.js +170 -0
- package/dist/canvas/createCanvasDocking.svelte.d.ts +56 -0
- package/dist/canvas/createCanvasDocking.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasDocking.svelte.js +227 -0
- package/dist/canvas/createCanvasExplosion.svelte.d.ts +31 -0
- package/dist/canvas/createCanvasExplosion.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasExplosion.svelte.js +346 -0
- package/dist/canvas/createCanvasGraph.svelte.d.ts +62 -0
- package/dist/canvas/createCanvasGraph.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasGraph.svelte.js +223 -0
- package/dist/canvas/createCanvasInteractions.svelte.d.ts +28 -0
- package/dist/canvas/createCanvasInteractions.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasInteractions.svelte.js +95 -0
- package/dist/canvas/createCanvasLayout.d.ts +22 -0
- package/dist/canvas/createCanvasLayout.d.ts.map +1 -0
- package/dist/canvas/createCanvasLayout.js +76 -0
- package/dist/canvas/createCanvasMultiDrag.svelte.d.ts +61 -0
- package/dist/canvas/createCanvasMultiDrag.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasMultiDrag.svelte.js +105 -0
- package/dist/canvas/createCanvasNodeSync.svelte.d.ts +58 -0
- package/dist/canvas/createCanvasNodeSync.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasNodeSync.svelte.js +82 -0
- package/dist/canvas/createCanvasSelection.svelte.d.ts +26 -0
- package/dist/canvas/createCanvasSelection.svelte.d.ts.map +1 -0
- package/dist/canvas/createCanvasSelection.svelte.js +26 -0
- package/dist/canvas/createCanvasShortcuts.d.ts +9 -0
- package/dist/canvas/createCanvasShortcuts.d.ts.map +1 -0
- package/dist/canvas/createCanvasShortcuts.js +97 -0
- package/dist/canvas/createCanvasTrajectory.d.ts +31 -0
- package/dist/canvas/createCanvasTrajectory.d.ts.map +1 -0
- package/dist/canvas/createCanvasTrajectory.js +141 -0
- package/dist/canvas/createStreamingCanvas.svelte.d.ts +19 -0
- package/dist/canvas/createStreamingCanvas.svelte.d.ts.map +1 -0
- package/dist/canvas/createStreamingCanvas.svelte.js +32 -0
- package/dist/canvas/index.d.ts +18 -688
- package/dist/canvas/index.d.ts.map +1 -0
- package/dist/canvas/index.js +34 -1839
- package/dist/canvas/types.d.ts +183 -0
- package/dist/canvas/types.d.ts.map +1 -0
- package/dist/canvas/types.js +1 -0
- package/dist/createNavigationGuard.svelte.d.ts +24 -0
- package/dist/createNavigationGuard.svelte.d.ts.map +1 -0
- package/dist/createNavigationGuard.svelte.js +65 -0
- package/dist/editor.svelte.d.ts +23 -0
- package/dist/editor.svelte.d.ts.map +1 -0
- package/dist/editor.svelte.js +41 -0
- package/dist/history/createHistoryShortcuts.d.ts +24 -0
- package/dist/history/createHistoryShortcuts.d.ts.map +1 -0
- package/dist/history/createHistoryShortcuts.js +57 -0
- package/dist/history/history.svelte.d.ts +18 -0
- package/dist/history/history.svelte.d.ts.map +1 -0
- package/dist/history/history.svelte.js +43 -0
- package/dist/history/index.d.ts +3 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +2 -0
- package/{src → dist}/image-editor/ImageEditor.svelte +1 -1
- package/dist/image-editor/ImageEditor.svelte.d.ts +17 -0
- package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -0
- package/dist/image-editor/imageEditorState.svelte.d.ts +50 -0
- package/dist/image-editor/imageEditorState.svelte.d.ts.map +1 -0
- package/dist/image-editor/imageEditorState.svelte.js +132 -0
- package/dist/image-editor/index.d.ts +6 -16
- package/dist/image-editor/index.d.ts.map +1 -0
- package/dist/image-editor/index.js +2 -9
- package/dist/index.d.ts +20 -249
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -1119
- package/dist/navigationGuard.d.ts +21 -0
- package/dist/navigationGuard.d.ts.map +1 -0
- package/dist/navigationGuard.js +59 -0
- package/{src → dist}/spreadsheet/FormulaBar.svelte +1 -1
- package/dist/spreadsheet/FormulaBar.svelte.d.ts +17 -0
- package/dist/spreadsheet/FormulaBar.svelte.d.ts.map +1 -0
- package/{src → dist}/spreadsheet/SpreadsheetEditor.svelte +1 -1
- package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts +22 -0
- package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -0
- package/dist/spreadsheet/index.d.ts +9 -0
- package/dist/spreadsheet/index.d.ts.map +1 -0
- package/{src/spreadsheet/index.ts → dist/spreadsheet/index.js} +1 -1
- package/dist/spreadsheet/spreadsheet.svelte.d.ts +33 -0
- package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -0
- package/dist/spreadsheet/spreadsheet.svelte.js +160 -0
- package/package.json +14 -16
- package/dist/canvas/index.js.map +0 -1
- package/dist/chunk-HEOI4UNF.js +0 -1191
- package/dist/chunk-HEOI4UNF.js.map +0 -1
- package/dist/image-editor/index.js.map +0 -1
- package/dist/index.css +0 -50
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/src/canvas/__tests__/canvas-clipboard.test.ts +0 -154
- package/src/canvas/__tests__/canvas-docking.test.ts +0 -288
- package/src/canvas/__tests__/canvas-explosion.test.ts +0 -634
- package/src/canvas/__tests__/canvas-graph.test.ts +0 -159
- package/src/canvas/__tests__/canvas-interactions.test.ts +0 -86
- package/src/canvas/__tests__/canvas-layout.test.ts +0 -75
- package/src/canvas/__tests__/canvas-multi-drag.test.ts +0 -112
- package/src/canvas/__tests__/canvas-node-sync.svelte.test.ts +0 -104
- package/src/canvas/__tests__/canvas-shortcuts.test.ts +0 -59
- package/src/canvas/createCanvasClipboard.svelte.ts +0 -219
- package/src/canvas/createCanvasDisplacement.ts +0 -253
- package/src/canvas/createCanvasDocking.svelte.ts +0 -355
- package/src/canvas/createCanvasExplosion.svelte.ts +0 -457
- package/src/canvas/createCanvasGraph.svelte.ts +0 -330
- package/src/canvas/createCanvasInteractions.svelte.ts +0 -112
- package/src/canvas/createCanvasLayout.ts +0 -129
- package/src/canvas/createCanvasMultiDrag.svelte.ts +0 -175
- package/src/canvas/createCanvasNodeSync.svelte.ts +0 -150
- package/src/canvas/createCanvasSelection.svelte.ts +0 -51
- package/src/canvas/createCanvasShortcuts.ts +0 -99
- package/src/canvas/createCanvasTrajectory.ts +0 -207
- package/src/canvas/createStreamingCanvas.svelte.ts +0 -56
- package/src/canvas/index.d.ts +0 -688
- package/src/canvas/index.ts +0 -126
- package/src/canvas/types.ts +0 -223
- package/src/createNavigationGuard.svelte.ts +0 -97
- package/src/editor.svelte.ts +0 -65
- package/src/history/createHistoryShortcuts.ts +0 -95
- package/src/history/history.svelte.ts +0 -68
- package/src/history/index.ts +0 -2
- package/src/image-editor/imageEditorState.svelte.ts +0 -151
- package/src/image-editor/index.d.ts +0 -16
- package/src/image-editor/index.ts +0 -2
- package/src/index.d.ts +0 -249
- package/src/index.ts +0 -89
- package/src/navigationGuard.ts +0 -82
- package/src/spreadsheet/spreadsheet.svelte.ts +0 -176
- package/src/svelte.d.ts +0 -5
- /package/{src → dist}/BubbleMenu.svelte +0 -0
- /package/{src → dist}/TemplateRenderer.svelte +0 -0
- /package/{src → dist}/canvas/AgentPresenceLayer.svelte +0 -0
- /package/{src → dist}/canvas/FloatingHorizontalScrollbar.svelte +0 -0
- /package/{src → dist}/canvas/README.md +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { Node, Edge, XYPosition, ColorMode } from '@xyflow/svelte';
|
|
2
|
+
/**
|
|
3
|
+
* Generic node interface representing an element on the canvas.
|
|
4
|
+
*/
|
|
5
|
+
export type CanvasNode<TData extends Record<string, any> = Record<string, any>, TType extends string | undefined = string | undefined> = Node<TData, TType>;
|
|
6
|
+
/**
|
|
7
|
+
* Generic edge interface representing a connection on the canvas.
|
|
8
|
+
*/
|
|
9
|
+
export type CanvasEdge<TData extends Record<string, any> = Record<string, any>, TType extends string | undefined = string | undefined> = Edge<TData, TType>;
|
|
10
|
+
/**
|
|
11
|
+
* Differences computed between two graph states.
|
|
12
|
+
*/
|
|
13
|
+
export interface GraphDifferences<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
|
|
14
|
+
changedNodes: TNode[];
|
|
15
|
+
changedEdges: TEdge[];
|
|
16
|
+
removedNodes: TNode[];
|
|
17
|
+
removedEdges: TEdge[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Standard serialized clipboard payload for nodes and optional edges.
|
|
21
|
+
*/
|
|
22
|
+
export interface CanvasClipboardPayload<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
|
|
23
|
+
version?: number;
|
|
24
|
+
nodes: TNode[];
|
|
25
|
+
edges?: TEdge[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Options for Dagre graph layout.
|
|
29
|
+
*/
|
|
30
|
+
export interface CanvasLayoutOptions {
|
|
31
|
+
direction?: 'LR' | 'TB' | 'RL' | 'BT';
|
|
32
|
+
ranksep?: number;
|
|
33
|
+
nodesep?: number;
|
|
34
|
+
defaultNodeWidth?: number;
|
|
35
|
+
defaultNodeHeight?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Options for keyboard shortcuts.
|
|
39
|
+
*/
|
|
40
|
+
export interface CanvasShortcutsOptions<TNode extends CanvasNode = CanvasNode> {
|
|
41
|
+
targetElement?: HTMLElement | Window;
|
|
42
|
+
onCopy?: () => void;
|
|
43
|
+
onCut?: () => void;
|
|
44
|
+
onPaste?: (event: ClipboardEvent) => void;
|
|
45
|
+
onDelete?: (selectedNodes: TNode[]) => void;
|
|
46
|
+
onDuplicate?: (selectedNodes: TNode[]) => void;
|
|
47
|
+
onSelectAll?: () => void;
|
|
48
|
+
onGroup?: (selectedNodes: TNode[]) => void;
|
|
49
|
+
onUngroup?: (selectedNodes: TNode[]) => void;
|
|
50
|
+
onZoomIn?: () => void;
|
|
51
|
+
onZoomOut?: () => void;
|
|
52
|
+
onFitView?: () => void;
|
|
53
|
+
onSearch?: () => void;
|
|
54
|
+
getSelectedNodes?: () => TNode[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Strategy used to resolve the primary dock target when multiple targets intersect a dragged node.
|
|
58
|
+
* - 'center-point': Chooses the target enclosing or closest to the center coordinate of the dragged node.
|
|
59
|
+
* - 'max-overlap': Chooses the target with the largest bounding box intersection area.
|
|
60
|
+
* - 'pointer': Chooses the target enclosing or closest to the mouse/touch cursor coordinates (falls back to 'center-point').
|
|
61
|
+
* - 'first': Chooses the first intersecting target (legacy behavior).
|
|
62
|
+
*/
|
|
63
|
+
export type DockStrategy = 'center-point' | 'max-overlap' | 'pointer' | 'first';
|
|
64
|
+
/**
|
|
65
|
+
* Docking and intersection callbacks.
|
|
66
|
+
*/
|
|
67
|
+
export interface CanvasDockingCallbacks<TNode extends CanvasNode = CanvasNode> {
|
|
68
|
+
onDockHover?: (dockTarget: TNode, draggedNode: TNode) => void;
|
|
69
|
+
onDockLeave?: (dockTarget: TNode, draggedNode: TNode) => void;
|
|
70
|
+
onDockDrop?: (dockTarget: TNode, draggedNode: TNode) => void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Configuration options for SvelteFlow presets.
|
|
74
|
+
*/
|
|
75
|
+
export interface CanvasInteractionPresetConfig {
|
|
76
|
+
snapGrid?: [number, number];
|
|
77
|
+
panOnDrag?: number[] | boolean;
|
|
78
|
+
panOnScroll?: boolean;
|
|
79
|
+
selectionOnDrag?: boolean;
|
|
80
|
+
colorMode?: ColorMode;
|
|
81
|
+
multiSelectionKey?: string[];
|
|
82
|
+
minZoom?: number;
|
|
83
|
+
maxZoom?: number;
|
|
84
|
+
selectionMode?: 'partial' | 'full';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parametric point returned by a trajectory evaluation.
|
|
88
|
+
*/
|
|
89
|
+
export interface TrajectoryPoint {
|
|
90
|
+
position: XYPosition;
|
|
91
|
+
scale?: number;
|
|
92
|
+
opacity?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Trajectory evaluation function determining path, scale, and opacity over time t in [0, 1].
|
|
96
|
+
*/
|
|
97
|
+
export type TrajectoryFunction = (origin: XYPosition, target: XYPosition, progress: number, index: number, total: number) => TrajectoryPoint;
|
|
98
|
+
/**
|
|
99
|
+
* Options for fan-out trajectory generator.
|
|
100
|
+
*/
|
|
101
|
+
export interface FanOutTrajectoryOptions {
|
|
102
|
+
curvature?: number;
|
|
103
|
+
spreadAngle?: number;
|
|
104
|
+
startScale?: number;
|
|
105
|
+
endScale?: number;
|
|
106
|
+
startOpacity?: number;
|
|
107
|
+
endOpacity?: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Single node animation transition definition.
|
|
111
|
+
*/
|
|
112
|
+
export interface NodeTransition<TNode extends CanvasNode = CanvasNode> {
|
|
113
|
+
node: TNode;
|
|
114
|
+
from: XYPosition;
|
|
115
|
+
to: XYPosition;
|
|
116
|
+
trajectory?: TrajectoryFunction;
|
|
117
|
+
delay?: number;
|
|
118
|
+
duration?: number;
|
|
119
|
+
easing?: (t: number) => number;
|
|
120
|
+
index?: number;
|
|
121
|
+
total?: number;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Displacement axis / direction.
|
|
125
|
+
*/
|
|
126
|
+
export type DisplacementDirection = 'right' | 'left' | 'down' | 'up' | 'vertical';
|
|
127
|
+
/**
|
|
128
|
+
* Options for directional displacement calculation.
|
|
129
|
+
*/
|
|
130
|
+
export interface DirectionalDisplacementOptions {
|
|
131
|
+
direction?: DisplacementDirection;
|
|
132
|
+
gap?: number;
|
|
133
|
+
spreadSiblingLanes?: boolean;
|
|
134
|
+
siblingTolerance?: number;
|
|
135
|
+
minY?: number;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Options for Dagre reflow displacement calculation.
|
|
139
|
+
*/
|
|
140
|
+
export interface ReflowDisplacementOptions extends CanvasLayoutOptions {
|
|
141
|
+
anchorNodeId: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Snapshot of canvas graph state prior to node explosion, enabling exact reversibility.
|
|
145
|
+
*/
|
|
146
|
+
export interface ExplosionSnapshot<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
|
|
147
|
+
parentId: string;
|
|
148
|
+
childNodeIds: string[];
|
|
149
|
+
childEdgeIds: string[];
|
|
150
|
+
displacedNodes: {
|
|
151
|
+
id: string;
|
|
152
|
+
originalPosition: XYPosition;
|
|
153
|
+
}[];
|
|
154
|
+
timestamp: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Options for exploding a node.
|
|
158
|
+
*/
|
|
159
|
+
export interface ExplodeNodeOptions<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
|
|
160
|
+
childNodes: TNode[];
|
|
161
|
+
childEdges?: TEdge[];
|
|
162
|
+
connectParentToChildren?: boolean | 'first' | 'all';
|
|
163
|
+
connectChildrenToDownstream?: boolean;
|
|
164
|
+
displacementStrategy?: 'directional' | 'dagre' | 'none';
|
|
165
|
+
directionalOptions?: DirectionalDisplacementOptions;
|
|
166
|
+
reflowOptions?: Partial<ReflowDisplacementOptions>;
|
|
167
|
+
trajectory?: TrajectoryFunction;
|
|
168
|
+
duration?: number;
|
|
169
|
+
staggerDelay?: number;
|
|
170
|
+
easing?: (t: number) => number;
|
|
171
|
+
onComplete?: () => void;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Options for collapsing an exploded node.
|
|
175
|
+
*/
|
|
176
|
+
export interface CollapseNodeOptions {
|
|
177
|
+
duration?: number;
|
|
178
|
+
staggerDelay?: number;
|
|
179
|
+
easing?: (t: number) => number;
|
|
180
|
+
trajectory?: TrajectoryFunction;
|
|
181
|
+
onComplete?: () => void;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/canvas/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface CreateNavigationGuardOptions {
|
|
2
|
+
/** Function or boolean returning whether there are unsaved changes */
|
|
3
|
+
isDirty: boolean | (() => boolean);
|
|
4
|
+
/** Whether guarding is enabled (defaults to true) */
|
|
5
|
+
enabled?: boolean | (() => boolean);
|
|
6
|
+
/** Optional custom navigation callback (e.g. SvelteKit goto) */
|
|
7
|
+
onNavigate?: (url: string) => void;
|
|
8
|
+
/** Optional callback fired when an internal navigation is intercepted */
|
|
9
|
+
onBlocked?: (url: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface NavigationGuardManager {
|
|
12
|
+
readonly showConfirm: boolean;
|
|
13
|
+
setShowConfirm(show: boolean): void;
|
|
14
|
+
readonly pendingUrl: string | null;
|
|
15
|
+
intercept(url: string): boolean;
|
|
16
|
+
confirmLeave(): void;
|
|
17
|
+
cancelLeave(): void;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Headless Svelte 5 rune managing navigation guard state and beforeunload interception.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createNavigationGuard(options: CreateNavigationGuardOptions): NavigationGuardManager;
|
|
24
|
+
//# sourceMappingURL=createNavigationGuard.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNavigationGuard.svelte.d.ts","sourceRoot":"","sources":["../src/createNavigationGuard.svelte.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,4BAA4B;IAC3C,sEAAsE;IACtE,OAAO,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACnC,qDAAqD;IACrD,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACpC,gEAAgE;IAChE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,YAAY,IAAI,IAAI,CAAC;IACrB,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,sBAAsB,CAsExB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless Svelte 5 rune managing navigation guard state and beforeunload interception.
|
|
3
|
+
*/
|
|
4
|
+
export function createNavigationGuard(options) {
|
|
5
|
+
let showConfirm = $state(false);
|
|
6
|
+
let pendingUrl = $state(null);
|
|
7
|
+
const getIsDirty = () => typeof options.isDirty === "function" ? options.isDirty() : options.isDirty;
|
|
8
|
+
const getEnabled = () => typeof options.enabled === "function"
|
|
9
|
+
? options.enabled()
|
|
10
|
+
: (options.enabled ?? true);
|
|
11
|
+
function handleBeforeUnload(e) {
|
|
12
|
+
if (!getEnabled() || !getIsDirty())
|
|
13
|
+
return;
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
e.returnValue = "";
|
|
16
|
+
}
|
|
17
|
+
if (typeof window !== "undefined") {
|
|
18
|
+
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
19
|
+
}
|
|
20
|
+
function intercept(url) {
|
|
21
|
+
if (getEnabled() && getIsDirty()) {
|
|
22
|
+
pendingUrl = url;
|
|
23
|
+
showConfirm = true;
|
|
24
|
+
options.onBlocked?.(url);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function confirmLeave() {
|
|
30
|
+
showConfirm = false;
|
|
31
|
+
const target = pendingUrl;
|
|
32
|
+
if (target) {
|
|
33
|
+
if (options.onNavigate) {
|
|
34
|
+
options.onNavigate(target);
|
|
35
|
+
}
|
|
36
|
+
else if (typeof window !== "undefined") {
|
|
37
|
+
window.location.href = target;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function cancelLeave() {
|
|
42
|
+
showConfirm = false;
|
|
43
|
+
pendingUrl = null;
|
|
44
|
+
}
|
|
45
|
+
function destroy() {
|
|
46
|
+
if (typeof window !== "undefined") {
|
|
47
|
+
window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
get showConfirm() {
|
|
52
|
+
return showConfirm;
|
|
53
|
+
},
|
|
54
|
+
setShowConfirm(val) {
|
|
55
|
+
showConfirm = val;
|
|
56
|
+
},
|
|
57
|
+
get pendingUrl() {
|
|
58
|
+
return pendingUrl;
|
|
59
|
+
},
|
|
60
|
+
intercept,
|
|
61
|
+
confirmLeave,
|
|
62
|
+
cancelLeave,
|
|
63
|
+
destroy,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Editor, type Content, type EditorOptions, type Extensions } from "@tiptap/core";
|
|
2
|
+
import { type RichTextPresetOptions } from "@pixerate/editor";
|
|
3
|
+
export interface SvelteInitiateEditorOptions extends Partial<EditorOptions> {
|
|
4
|
+
richTextOptions?: RichTextPresetOptions;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Initializes a TipTap editor instance preconfigured with rich text extensions.
|
|
8
|
+
*/
|
|
9
|
+
export declare const initiateEditor: (element?: HTMLElement, content?: Content, extensions?: Extensions, options?: SvelteInitiateEditorOptions) => Editor;
|
|
10
|
+
export interface ReactiveEditorState {
|
|
11
|
+
editor: Editor | undefined;
|
|
12
|
+
content: string;
|
|
13
|
+
isEditable: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a reactive editor state manager for Svelte 5.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createReactiveEditor(initialContent?: string, extensions?: Extensions, options?: Partial<EditorOptions>): {
|
|
19
|
+
readonly current: Editor | undefined;
|
|
20
|
+
mount(element: HTMLElement): Editor;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=editor.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.svelte.d.ts","sourceRoot":"","sources":["../src/editor.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,2BAA4B,SAAQ,OAAO,CAAC,aAAa,CAAC;IACzE,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,WAAW,EACrB,UAAU,OAAO,EACjB,aAAa,UAAU,EACvB,UAAU,2BAA2B,KACpC,MAgBF,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,GAAE,MAAW,EAC3B,UAAU,GAAE,UAAe,EAC3B,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM;;mBAQnB,WAAW;;EAW7B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Editor } from "@tiptap/core";
|
|
2
|
+
import { createRichTextPreset } from "@pixerate/editor";
|
|
3
|
+
/**
|
|
4
|
+
* Initializes a TipTap editor instance preconfigured with rich text extensions.
|
|
5
|
+
*/
|
|
6
|
+
export const initiateEditor = (element, content, extensions, options) => {
|
|
7
|
+
const { richTextOptions, ...editorOptions } = options || {};
|
|
8
|
+
const defaultPreset = createRichTextPreset(richTextOptions);
|
|
9
|
+
const editor = new Editor({
|
|
10
|
+
element,
|
|
11
|
+
content,
|
|
12
|
+
extensions: [
|
|
13
|
+
...defaultPreset,
|
|
14
|
+
...(extensions ?? []),
|
|
15
|
+
],
|
|
16
|
+
autofocus: false,
|
|
17
|
+
...editorOptions,
|
|
18
|
+
});
|
|
19
|
+
return editor;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Creates a reactive editor state manager for Svelte 5.
|
|
23
|
+
*/
|
|
24
|
+
export function createReactiveEditor(initialContent = "", extensions = [], options = {}) {
|
|
25
|
+
let editorInstance;
|
|
26
|
+
return {
|
|
27
|
+
get current() {
|
|
28
|
+
return editorInstance;
|
|
29
|
+
},
|
|
30
|
+
mount(element) {
|
|
31
|
+
editorInstance = initiateEditor(element, initialContent, extensions, options);
|
|
32
|
+
return editorInstance;
|
|
33
|
+
},
|
|
34
|
+
destroy() {
|
|
35
|
+
if (editorInstance) {
|
|
36
|
+
editorInstance.destroy();
|
|
37
|
+
editorInstance = undefined;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HistoryManager } from "@pixerate/editor";
|
|
2
|
+
export interface HistoryShortcutsOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Whether keyboard shortcuts are enabled. Defaults to true.
|
|
5
|
+
*/
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Target element or window to listen on. Defaults to window.
|
|
9
|
+
*/
|
|
10
|
+
target?: Window | HTMLElement | null;
|
|
11
|
+
/**
|
|
12
|
+
* When true (default), shortcuts will not trigger if an <input>, <textarea>,
|
|
13
|
+
* or [contenteditable] element is currently active / focused.
|
|
14
|
+
*/
|
|
15
|
+
ignoreEditableElements?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Attaches keyboard listeners for Undo (Mod+Z) and Redo (Mod+Shift+Z / Mod+Y).
|
|
19
|
+
* Returns an object with a `destroy()` function for lifecycle cleanup.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createHistoryShortcuts(manager: HistoryManager, options?: HistoryShortcutsOptions): {
|
|
22
|
+
destroy: () => void;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=createHistoryShortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createHistoryShortcuts.d.ts","sourceRoot":"","sources":["../../src/history/createHistoryShortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IACrC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,uBAA4B,GACpC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAqEzB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attaches keyboard listeners for Undo (Mod+Z) and Redo (Mod+Shift+Z / Mod+Y).
|
|
3
|
+
* Returns an object with a `destroy()` function for lifecycle cleanup.
|
|
4
|
+
*/
|
|
5
|
+
export function createHistoryShortcuts(manager, options = {}) {
|
|
6
|
+
const { enabled = true, target, ignoreEditableElements = true, } = options;
|
|
7
|
+
if (!enabled) {
|
|
8
|
+
return { destroy: () => { } };
|
|
9
|
+
}
|
|
10
|
+
const eventTarget = target ?? (typeof window !== "undefined" ? window : null);
|
|
11
|
+
if (!eventTarget) {
|
|
12
|
+
return { destroy: () => { } };
|
|
13
|
+
}
|
|
14
|
+
const handleKeyDown = (event) => {
|
|
15
|
+
const e = event;
|
|
16
|
+
const isMac = typeof navigator !== "undefined" &&
|
|
17
|
+
/Mac|iPod|iPhone|iPad/.test(navigator.platform || navigator.userAgent);
|
|
18
|
+
const modifier = isMac ? e.metaKey : e.ctrlKey;
|
|
19
|
+
if (!modifier)
|
|
20
|
+
return;
|
|
21
|
+
if (ignoreEditableElements && typeof document !== "undefined") {
|
|
22
|
+
const targetEl = (e.target || document.activeElement);
|
|
23
|
+
if (targetEl && targetEl.tagName) {
|
|
24
|
+
const tagName = targetEl.tagName.toLowerCase();
|
|
25
|
+
const isInput = tagName === "input" || tagName === "textarea";
|
|
26
|
+
const isContentEditable = targetEl.isContentEditable ||
|
|
27
|
+
targetEl.getAttribute?.("contenteditable") === "true";
|
|
28
|
+
if (isInput || isContentEditable) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const key = e.key?.toLowerCase();
|
|
34
|
+
// Undo: Mod+Z (without Shift)
|
|
35
|
+
if (key === "z" && !e.shiftKey) {
|
|
36
|
+
if (manager.getState().canUndo) {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
manager.undo();
|
|
39
|
+
}
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Redo: Mod+Shift+Z or (on non-Mac) Mod+Y
|
|
43
|
+
const isRedoKey = (key === "z" && e.shiftKey) || (!isMac && key === "y" && !e.shiftKey);
|
|
44
|
+
if (isRedoKey) {
|
|
45
|
+
if (manager.getState().canRedo) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
manager.redo();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
eventTarget.addEventListener("keydown", handleKeyDown);
|
|
52
|
+
return {
|
|
53
|
+
destroy: () => {
|
|
54
|
+
eventTarget.removeEventListener("keydown", handleKeyDown);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HistoryManager, HistoryState, Command, HistoryManagerOptions } from "@pixerate/editor";
|
|
2
|
+
export interface SvelteHistory extends HistoryState {
|
|
3
|
+
readonly manager: HistoryManager;
|
|
4
|
+
undo(): boolean;
|
|
5
|
+
redo(): boolean;
|
|
6
|
+
clear(): void;
|
|
7
|
+
execute(command: Command): void;
|
|
8
|
+
executeMerged(command: Command, options?: {
|
|
9
|
+
windowMs?: number;
|
|
10
|
+
}): void;
|
|
11
|
+
batch(name: string, fn: () => void): void;
|
|
12
|
+
subscribe(run: (value: HistoryState) => void): () => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Creates a reactive Svelte 5 rune-based and Svelte store-compatible history adapter.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createHistory(managerOrOptions?: HistoryManager | HistoryManagerOptions): SvelteHistory;
|
|
18
|
+
//# sourceMappingURL=history.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.svelte.d.ts","sourceRoot":"","sources":["../../src/history/history.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,OAAO,EAEP,qBAAqB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,IAAI,IAAI,OAAO,CAAC;IAChB,IAAI,IAAI,OAAO,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,CAAC,EAAE,cAAc,GAAG,qBAAqB,GACxD,aAAa,CA2Cf"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { HistoryManager, createHistoryManager, } from "@pixerate/editor";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a reactive Svelte 5 rune-based and Svelte store-compatible history adapter.
|
|
4
|
+
*/
|
|
5
|
+
export function createHistory(managerOrOptions) {
|
|
6
|
+
const manager = managerOrOptions instanceof HistoryManager
|
|
7
|
+
? managerOrOptions
|
|
8
|
+
: createHistoryManager(managerOrOptions);
|
|
9
|
+
let state = $state(manager.getState());
|
|
10
|
+
manager.subscribe((newState) => {
|
|
11
|
+
state = newState;
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
get canUndo() {
|
|
15
|
+
return state.canUndo;
|
|
16
|
+
},
|
|
17
|
+
get canRedo() {
|
|
18
|
+
return state.canRedo;
|
|
19
|
+
},
|
|
20
|
+
get undoName() {
|
|
21
|
+
return state.undoName;
|
|
22
|
+
},
|
|
23
|
+
get redoName() {
|
|
24
|
+
return state.redoName;
|
|
25
|
+
},
|
|
26
|
+
get undoCount() {
|
|
27
|
+
return state.undoCount;
|
|
28
|
+
},
|
|
29
|
+
get redoCount() {
|
|
30
|
+
return state.redoCount;
|
|
31
|
+
},
|
|
32
|
+
get manager() {
|
|
33
|
+
return manager;
|
|
34
|
+
},
|
|
35
|
+
undo: () => manager.undo(),
|
|
36
|
+
redo: () => manager.redo(),
|
|
37
|
+
clear: () => manager.clear(),
|
|
38
|
+
execute: (cmd) => manager.execute(cmd),
|
|
39
|
+
executeMerged: (cmd, opts) => manager.executeMerged(cmd, opts),
|
|
40
|
+
batch: (name, fn) => manager.batch(name, fn),
|
|
41
|
+
subscribe: (run) => manager.subscribe(run),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/history/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
calculateCropDrag,
|
|
18
18
|
hitTestAnnotation,
|
|
19
19
|
} from '@pixerate/editor';
|
|
20
|
-
import { createReactiveImageEditor, type ReactiveImageEditor } from './imageEditorState.svelte';
|
|
20
|
+
import { createReactiveImageEditor, type ReactiveImageEditor } from './imageEditorState.svelte.js';
|
|
21
21
|
|
|
22
22
|
interface Props {
|
|
23
23
|
editor?: ReactiveImageEditor;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExportOptions, InpaintHook, RemoveBackgroundHook, ImageEditorAIHooks } from '@pixerate/editor';
|
|
2
|
+
import { type ReactiveImageEditor } from './imageEditorState.svelte.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
editor?: ReactiveImageEditor;
|
|
5
|
+
src?: string;
|
|
6
|
+
class?: string;
|
|
7
|
+
style?: string;
|
|
8
|
+
onSave?: (dataUrl: string) => void;
|
|
9
|
+
exportOptions?: ExportOptions;
|
|
10
|
+
onInpaint?: InpaintHook;
|
|
11
|
+
onRemoveBackground?: RemoveBackgroundHook;
|
|
12
|
+
aiHooks?: ImageEditorAIHooks;
|
|
13
|
+
}
|
|
14
|
+
declare const ImageEditor: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type ImageEditor = ReturnType<typeof ImageEditor>;
|
|
16
|
+
export default ImageEditor;
|
|
17
|
+
//# sourceMappingURL=ImageEditor.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ImageEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,aAAa,EAGb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAQ5B,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjG,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAohCH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ImageEditorController, type ImageEditorOptions, type ImageEditorState, type ImageEditorTool, type CropBox, type AspectRatio, type ImageAdjustments, type DepthMaskOptions, type Annotation, type CreateAnnotationPayload, type ExportOptions, type SerializedImageEditorState, type ImagePoint } from '@pixerate/editor';
|
|
2
|
+
export declare function createReactiveImageEditor(options?: ImageEditorOptions): {
|
|
3
|
+
readonly controller: ImageEditorController;
|
|
4
|
+
readonly state: ImageEditorState;
|
|
5
|
+
readonly canUndo: boolean;
|
|
6
|
+
readonly canRedo: boolean;
|
|
7
|
+
setTool(tool: ImageEditorTool): void;
|
|
8
|
+
setCrop(crop: CropBox | null, addToHistory?: boolean): void;
|
|
9
|
+
applyCropPreset(ratio: AspectRatio): void;
|
|
10
|
+
resetCrop(): void;
|
|
11
|
+
rotate(degrees: number): void;
|
|
12
|
+
setRotation(degrees: number): void;
|
|
13
|
+
flipHorizontal(): void;
|
|
14
|
+
flipVertical(): void;
|
|
15
|
+
setAdjustments(partial: Partial<ImageAdjustments>, commitToHistory?: boolean): void;
|
|
16
|
+
resetAdjustments(): void;
|
|
17
|
+
setDepthMask(partial: Partial<DepthMaskOptions>): void;
|
|
18
|
+
resetDepthMask(): void;
|
|
19
|
+
addAnnotation(ann: CreateAnnotationPayload): string;
|
|
20
|
+
updateAnnotation(id: string, partial: Partial<Annotation>, commitToHistory?: boolean): void;
|
|
21
|
+
removeAnnotation(id: string): void;
|
|
22
|
+
clearAnnotations(): void;
|
|
23
|
+
selectAnnotation(id: string | null): void;
|
|
24
|
+
undo(): boolean;
|
|
25
|
+
redo(): boolean;
|
|
26
|
+
reset(): void;
|
|
27
|
+
zoomIn(factor?: number): void;
|
|
28
|
+
zoomOut(factor?: number): void;
|
|
29
|
+
resetZoom(): void;
|
|
30
|
+
setZoom(zoom: number): void;
|
|
31
|
+
setPan(pan: ImagePoint): void;
|
|
32
|
+
setComparing(comparing: boolean): void;
|
|
33
|
+
loadImage(src: string | HTMLImageElement): Promise<void>;
|
|
34
|
+
toDataURL(opts?: ExportOptions): Promise<string>;
|
|
35
|
+
toBlob(opts?: ExportOptions): Promise<Blob>;
|
|
36
|
+
toJSON(): SerializedImageEditorState;
|
|
37
|
+
loadJSON(data: SerializedImageEditorState): void;
|
|
38
|
+
renderMask(opts?: {
|
|
39
|
+
useAnnotations?: boolean;
|
|
40
|
+
useCrop?: boolean;
|
|
41
|
+
}): Promise<HTMLCanvasElement>;
|
|
42
|
+
toMaskDataURL(opts?: {
|
|
43
|
+
useAnnotations?: boolean;
|
|
44
|
+
useCrop?: boolean;
|
|
45
|
+
}): Promise<string>;
|
|
46
|
+
applyInpaintedImage(newDataUrl: string): Promise<void>;
|
|
47
|
+
applyBackgroundRemovedImage(newDataUrl: string): Promise<void>;
|
|
48
|
+
};
|
|
49
|
+
export type ReactiveImageEditor = ReturnType<typeof createReactiveImageEditor>;
|
|
50
|
+
//# sourceMappingURL=imageEditorState.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageEditorState.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/imageEditorState.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB;;;;;kBA0BxD,eAAe;kBAGf,OAAO,GAAG,IAAI;2BAGL,WAAW;;oBAMlB,MAAM;yBAGD,MAAM;;;4BASH,OAAO,CAAC,gBAAgB,CAAC;;0BAM3B,OAAO,CAAC,gBAAgB,CAAC;;uBAM5B,uBAAuB;yBAGrB,MAAM,WAAW,OAAO,CAAC,UAAU,CAAC;yBAGpC,MAAM;;yBAMN,MAAM,GAAG,IAAI;;;;oBAYlB,MAAM;qBAGL,MAAM;;kBAMT,MAAM;gBAGR,UAAU;4BAGE,OAAO;mBAGhB,MAAM,GAAG,gBAAgB;qBAGvB,aAAa;kBAGhB,aAAa;;mBAMZ,0BAA0B;sBAGvB;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;yBAG5C;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;oCAGpC,MAAM;4CAGE,MAAM;EAIjD;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|