@pixerate/editor 0.12.0 → 0.14.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/grammar/index.cjs +45 -58
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.d.cts +13 -3
- package/dist/grammar/index.d.ts +13 -3
- package/dist/grammar/index.js +42 -58
- package/dist/grammar/index.js.map +1 -1
- package/dist/image-editor/index.cjs +93 -1
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +34 -1
- package/dist/image-editor/index.d.ts +34 -1
- package/dist/image-editor/index.js +93 -1
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +138 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +135 -59
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { T as Token } from './tokens-7kRTEtPb.cjs';
|
|
2
2
|
export { C as ColorGradient, I as INSTRUCTION_REGEX, a as TEMPLATE_REGEX, b as Template, c as TemplateVersion, d as TokenType, V as VARIABLE_REGEX, i as instructionRegex, t as templateRegex, v as variableRegex } from './tokens-7kRTEtPb.cjs';
|
|
3
|
-
export { ResolveTemplatesOptions, SourceMapSegment, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt } from './grammar/index.cjs';
|
|
3
|
+
export { ResolveTemplatesOptions, SourceMapSegment, TEMPLATE_DEPTH_ERROR, TEMPLATE_LOOP_ERROR, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, getTemplateBody, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt } from './grammar/index.cjs';
|
|
4
4
|
export { ColorHighlighter, FontSize, GradientText, GradientTextOptions, Image, ImageOptions, LoadingNode, Markdown, RichTextPresetOptions, SlashCommandMatchData, SlashCommands, SlashCommandsOptions, SmilieReplacer, TemplateSuggestions, TemplateSuggestionsOptions, createRichTextPreset, findHexColors, handleImageInsertion, imagePastePluginKey, insertImageNode, removeImageNode, updateImageSrc } from './extensions/index.cjs';
|
|
5
5
|
export { M as Mention, a as MentionEntity, b as MentionOptions, c as createMentionExtension } from './mention-Dcevh3ff.cjs';
|
|
6
6
|
export { ExtractedMention, MARKDOWN_MENTION_SPLIT_REGEX, MENTION_REGEX, MarkdownToHtmlOptions, MentionSegment, PreprocessMarkdownMentionsOptions, escapeHtml, extractMentions, extractMentionsFromDoc, getEditorMarkdown, getEditorText, htmlToPlainText, markdownToTipTapHtml, parseMentionSegments, plainTextToTipTapHtml, preprocessMarkdownFileLinks, preprocessMarkdownMentions, stripMarkdownCode } from './serializers/index.cjs';
|
|
@@ -11,7 +11,7 @@ export { Command, HistoryManager, HistoryManagerOptions, HistoryState, MergedExe
|
|
|
11
11
|
export { C as CanvasClipboardPayload, a as CanvasDockingCallbacks, b as CanvasEdge, c as CanvasLayoutOptions, d as CanvasNode, e as CollapseNodeOptions, D as DirectionalDisplacementOptions, f as DisplacementDirection, g as DockStrategy, E as ExplodeNodeOptions, h as ExplosionSnapshot, F as FanOutTrajectoryOptions, G as GraphDifferences, I as IncrementalLayoutOptions, N as NodeTransition, P as PlaceBesideOptions, i as Point, j as Position, R as Rect, k as ReflowDisplacementOptions, S as Side, T as TrajectoryFunction, l as TrajectoryPoint, X as XYPosition } from './types-lGtRobRV.cjs';
|
|
12
12
|
export { CanvasHeightOptions, Clock, DEFAULT_NODE_HEIGHT, DEFAULT_NODE_WIDTH, DEFAULT_PLACEMENT_GAP, ManualClock, StreamingLayoutManager, StreamingLayoutManagerOptions, blendLayout, boundsOf, calculateDagreReflowDisplacement, calculateDirectionalDisplacement, canvasHeight, centerNodes, centre, computeNodesBoundingBox, connectedOnly, createBezierTrajectory, createFanOutTrajectory, defaultEasing, ensureLayout, estimateCanvasHeight, estimateNodeSize, flowSide, getCenteredNodePosition, getLayoutedNodes, isEventFromTextInput, isValidCanvasNode, isValidUrl, layoutBounds, linearPositionTrajectory, linearTrajectory, overlaps, pageHidden, parseCanvasClipboardData, placeBeside, realClock, remapPastedNodes, repositionNodesTo, runMultiNodeTransition, serializeCanvasNodes } from './canvas/index.cjs';
|
|
13
13
|
export { AgentCommand, AgentPresence, AgentStep, EDITOR_MCP_TOOLS, EXPORT_EXCLUDED_SELECTORS, EditorSnapshot, MCP_TOOL_EDIT_CANVAS, MCP_TOOL_EDIT_PROMPT, MCP_TOOL_GET_EDITOR_STATE, MCP_TOOL_VIEW_EDITOR, planAgentCommand } from './agent/index.cjs';
|
|
14
|
-
export { Annotation, AnnotationType, ArrowAnnotation, AspectRatio, BaseAnnotation, CircleAnnotation, CreateAnnotationPayload, CropBox, CropHandle, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_TRANSFORM, DepthMaskOptions, ExportOptions, ImageAdjustments, ImageAnnotation, ImageDimensions, ImageEditorController, ImageEditorOptions, ImageEditorRenderer, ImageEditorState, ImageEditorTool, ImagePoint, ImageTransform, LineAnnotation, PenAnnotation, RectAnnotation, RenderOptions, SerializedImageEditorState, TextAnnotation, ViewportMetrics, applyAdjustments, applyDepthMask, calculateCropDrag, canvasToImagePoint, getAnnotationBounds, getCropCursor, getViewportMetrics, globalImageCache, hitTestAnnotation, hitTestCrop, imageToCanvasPoint, removeAlpha } from './image-editor/index.cjs';
|
|
14
|
+
export { Annotation, AnnotationType, ArrowAnnotation, AspectRatio, BaseAnnotation, CircleAnnotation, CreateAnnotationPayload, CropBox, CropHandle, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_TRANSFORM, DepthMaskOptions, ExportOptions, ImageAdjustments, ImageAnnotation, ImageDimensions, ImageEditorAIHooks, ImageEditorController, ImageEditorOptions, ImageEditorRenderer, ImageEditorState, ImageEditorTool, ImagePoint, ImageTransform, InpaintHook, InpaintOptions, LineAnnotation, PenAnnotation, RectAnnotation, RemoveBackgroundHook, RemoveBackgroundOptions, RenderOptions, SerializedImageEditorState, TextAnnotation, ViewportMetrics, applyAdjustments, applyDepthMask, calculateCropDrag, canvasToImagePoint, getAnnotationBounds, getCropCursor, getViewportMetrics, globalImageCache, hitTestAnnotation, hitTestCrop, imageToCanvasPoint, removeAlpha } from './image-editor/index.cjs';
|
|
15
15
|
export { MarkdownOptions } from 'tiptap-markdown';
|
|
16
16
|
import '@tiptap/pm/view';
|
|
17
17
|
import '@tiptap/pm/model';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { T as Token } from './tokens-7kRTEtPb.js';
|
|
2
2
|
export { C as ColorGradient, I as INSTRUCTION_REGEX, a as TEMPLATE_REGEX, b as Template, c as TemplateVersion, d as TokenType, V as VARIABLE_REGEX, i as instructionRegex, t as templateRegex, v as variableRegex } from './tokens-7kRTEtPb.js';
|
|
3
|
-
export { ResolveTemplatesOptions, SourceMapSegment, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt } from './grammar/index.js';
|
|
3
|
+
export { ResolveTemplatesOptions, SourceMapSegment, TEMPLATE_DEPTH_ERROR, TEMPLATE_LOOP_ERROR, extractInstructionNames, extractTemplateNames, extractVariableNames, getLatestVersion, getTemplateBody, mapRawOffsetToResolved, mapResolvedOffsetToRaw, resolveTemplates, resolveTemplatesWithMapping, resolveVariables, tokenizePrompt } from './grammar/index.js';
|
|
4
4
|
export { ColorHighlighter, FontSize, GradientText, GradientTextOptions, Image, ImageOptions, LoadingNode, Markdown, RichTextPresetOptions, SlashCommandMatchData, SlashCommands, SlashCommandsOptions, SmilieReplacer, TemplateSuggestions, TemplateSuggestionsOptions, createRichTextPreset, findHexColors, handleImageInsertion, imagePastePluginKey, insertImageNode, removeImageNode, updateImageSrc } from './extensions/index.js';
|
|
5
5
|
export { M as Mention, a as MentionEntity, b as MentionOptions, c as createMentionExtension } from './mention-Dcevh3ff.js';
|
|
6
6
|
export { ExtractedMention, MARKDOWN_MENTION_SPLIT_REGEX, MENTION_REGEX, MarkdownToHtmlOptions, MentionSegment, PreprocessMarkdownMentionsOptions, escapeHtml, extractMentions, extractMentionsFromDoc, getEditorMarkdown, getEditorText, htmlToPlainText, markdownToTipTapHtml, parseMentionSegments, plainTextToTipTapHtml, preprocessMarkdownFileLinks, preprocessMarkdownMentions, stripMarkdownCode } from './serializers/index.js';
|
|
@@ -11,7 +11,7 @@ export { Command, HistoryManager, HistoryManagerOptions, HistoryState, MergedExe
|
|
|
11
11
|
export { C as CanvasClipboardPayload, a as CanvasDockingCallbacks, b as CanvasEdge, c as CanvasLayoutOptions, d as CanvasNode, e as CollapseNodeOptions, D as DirectionalDisplacementOptions, f as DisplacementDirection, g as DockStrategy, E as ExplodeNodeOptions, h as ExplosionSnapshot, F as FanOutTrajectoryOptions, G as GraphDifferences, I as IncrementalLayoutOptions, N as NodeTransition, P as PlaceBesideOptions, i as Point, j as Position, R as Rect, k as ReflowDisplacementOptions, S as Side, T as TrajectoryFunction, l as TrajectoryPoint, X as XYPosition } from './types-lGtRobRV.js';
|
|
12
12
|
export { CanvasHeightOptions, Clock, DEFAULT_NODE_HEIGHT, DEFAULT_NODE_WIDTH, DEFAULT_PLACEMENT_GAP, ManualClock, StreamingLayoutManager, StreamingLayoutManagerOptions, blendLayout, boundsOf, calculateDagreReflowDisplacement, calculateDirectionalDisplacement, canvasHeight, centerNodes, centre, computeNodesBoundingBox, connectedOnly, createBezierTrajectory, createFanOutTrajectory, defaultEasing, ensureLayout, estimateCanvasHeight, estimateNodeSize, flowSide, getCenteredNodePosition, getLayoutedNodes, isEventFromTextInput, isValidCanvasNode, isValidUrl, layoutBounds, linearPositionTrajectory, linearTrajectory, overlaps, pageHidden, parseCanvasClipboardData, placeBeside, realClock, remapPastedNodes, repositionNodesTo, runMultiNodeTransition, serializeCanvasNodes } from './canvas/index.js';
|
|
13
13
|
export { AgentCommand, AgentPresence, AgentStep, EDITOR_MCP_TOOLS, EXPORT_EXCLUDED_SELECTORS, EditorSnapshot, MCP_TOOL_EDIT_CANVAS, MCP_TOOL_EDIT_PROMPT, MCP_TOOL_GET_EDITOR_STATE, MCP_TOOL_VIEW_EDITOR, planAgentCommand } from './agent/index.js';
|
|
14
|
-
export { Annotation, AnnotationType, ArrowAnnotation, AspectRatio, BaseAnnotation, CircleAnnotation, CreateAnnotationPayload, CropBox, CropHandle, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_TRANSFORM, DepthMaskOptions, ExportOptions, ImageAdjustments, ImageAnnotation, ImageDimensions, ImageEditorController, ImageEditorOptions, ImageEditorRenderer, ImageEditorState, ImageEditorTool, ImagePoint, ImageTransform, LineAnnotation, PenAnnotation, RectAnnotation, RenderOptions, SerializedImageEditorState, TextAnnotation, ViewportMetrics, applyAdjustments, applyDepthMask, calculateCropDrag, canvasToImagePoint, getAnnotationBounds, getCropCursor, getViewportMetrics, globalImageCache, hitTestAnnotation, hitTestCrop, imageToCanvasPoint, removeAlpha } from './image-editor/index.js';
|
|
14
|
+
export { Annotation, AnnotationType, ArrowAnnotation, AspectRatio, BaseAnnotation, CircleAnnotation, CreateAnnotationPayload, CropBox, CropHandle, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_TRANSFORM, DepthMaskOptions, ExportOptions, ImageAdjustments, ImageAnnotation, ImageDimensions, ImageEditorAIHooks, ImageEditorController, ImageEditorOptions, ImageEditorRenderer, ImageEditorState, ImageEditorTool, ImagePoint, ImageTransform, InpaintHook, InpaintOptions, LineAnnotation, PenAnnotation, RectAnnotation, RemoveBackgroundHook, RemoveBackgroundOptions, RenderOptions, SerializedImageEditorState, TextAnnotation, ViewportMetrics, applyAdjustments, applyDepthMask, calculateCropDrag, canvasToImagePoint, getAnnotationBounds, getCropCursor, getViewportMetrics, globalImageCache, hitTestAnnotation, hitTestCrop, imageToCanvasPoint, removeAlpha } from './image-editor/index.js';
|
|
15
15
|
export { MarkdownOptions } from 'tiptap-markdown';
|
|
16
16
|
import '@tiptap/pm/view';
|
|
17
17
|
import '@tiptap/pm/model';
|
package/dist/index.js
CHANGED
|
@@ -116,6 +116,18 @@ function getLatestVersion(template) {
|
|
|
116
116
|
}
|
|
117
117
|
return template.versions[template.versions.length - 1];
|
|
118
118
|
}
|
|
119
|
+
var TEMPLATE_LOOP_ERROR = "[Template loop detected]";
|
|
120
|
+
var TEMPLATE_DEPTH_ERROR = "[Template max depth exceeded]";
|
|
121
|
+
function getTemplateBody(template, bindings) {
|
|
122
|
+
const boundVersionId = bindings?.[template.name];
|
|
123
|
+
if (boundVersionId && template.versions) {
|
|
124
|
+
const boundVersion = template.versions.find(
|
|
125
|
+
(v) => v.id === boundVersionId || v.version === boundVersionId
|
|
126
|
+
);
|
|
127
|
+
return boundVersion?.body;
|
|
128
|
+
}
|
|
129
|
+
return getLatestVersion(template)?.body ?? template.body;
|
|
130
|
+
}
|
|
119
131
|
function resolveTemplates(text, templates = [], options) {
|
|
120
132
|
const templateMap = /* @__PURE__ */ new Map();
|
|
121
133
|
for (const t of templates) {
|
|
@@ -123,50 +135,27 @@ function resolveTemplates(text, templates = [], options) {
|
|
|
123
135
|
}
|
|
124
136
|
const maxDepth = options?.maxDepth ?? 10;
|
|
125
137
|
function resolveRecursive(currentText, visited, depth) {
|
|
126
|
-
if (depth > maxDepth) {
|
|
127
|
-
return "[Template max depth exceeded]";
|
|
128
|
-
}
|
|
129
|
-
let result = currentText;
|
|
130
138
|
const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);
|
|
131
|
-
|
|
132
|
-
while ((match = regex.exec(result)) !== null) {
|
|
133
|
-
const [fullMatch, rawTemplateName] = match;
|
|
139
|
+
return currentText.replace(regex, (fullMatch, rawTemplateName) => {
|
|
134
140
|
const templateName = rawTemplateName.trim();
|
|
135
141
|
if (visited.has(templateName)) {
|
|
136
|
-
return
|
|
142
|
+
return TEMPLATE_LOOP_ERROR;
|
|
137
143
|
}
|
|
138
144
|
const template = templateMap.get(templateName);
|
|
139
145
|
if (!template) {
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
let versionBody;
|
|
143
|
-
const boundVersionId = options?.bindings?.[templateName];
|
|
144
|
-
if (boundVersionId && template.versions) {
|
|
145
|
-
const boundVersion = template.versions.find(
|
|
146
|
-
(v) => v.id === boundVersionId || v.version === boundVersionId
|
|
147
|
-
);
|
|
148
|
-
versionBody = boundVersion?.body;
|
|
149
|
-
} else {
|
|
150
|
-
const latest = getLatestVersion(template);
|
|
151
|
-
versionBody = latest?.body ?? template.body;
|
|
146
|
+
return fullMatch;
|
|
152
147
|
}
|
|
148
|
+
const versionBody = getTemplateBody(template, options?.bindings);
|
|
153
149
|
if (versionBody === void 0) {
|
|
154
|
-
|
|
150
|
+
return fullMatch;
|
|
151
|
+
}
|
|
152
|
+
if (depth + 1 > maxDepth) {
|
|
153
|
+
return TEMPLATE_DEPTH_ERROR;
|
|
155
154
|
}
|
|
156
155
|
const nextVisited = new Set(visited);
|
|
157
156
|
nextVisited.add(templateName);
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
nextVisited,
|
|
161
|
-
depth + 1
|
|
162
|
-
);
|
|
163
|
-
if (resolvedBody === "[Template loop detected]" || resolvedBody === "[Template max depth exceeded]") {
|
|
164
|
-
return resolvedBody;
|
|
165
|
-
}
|
|
166
|
-
result = result.replace(fullMatch, resolvedBody);
|
|
167
|
-
regex.lastIndex = 0;
|
|
168
|
-
}
|
|
169
|
-
return result;
|
|
157
|
+
return resolveRecursive(versionBody, nextVisited, depth + 1);
|
|
158
|
+
});
|
|
170
159
|
}
|
|
171
160
|
return resolveRecursive(text, /* @__PURE__ */ new Set(), 0);
|
|
172
161
|
}
|
|
@@ -215,7 +204,7 @@ function extractInstructionNames(text) {
|
|
|
215
204
|
}
|
|
216
205
|
|
|
217
206
|
// src/grammar/sourcemap.ts
|
|
218
|
-
function resolveTemplatesWithMapping(text, templates = [], templateBindings) {
|
|
207
|
+
function resolveTemplatesWithMapping(text, templates = [], templateBindings, options) {
|
|
219
208
|
if (!templates || templates.length === 0 || !text.includes("{{")) {
|
|
220
209
|
return {
|
|
221
210
|
text,
|
|
@@ -231,7 +220,7 @@ function resolveTemplatesWithMapping(text, templates = [], templateBindings) {
|
|
|
231
220
|
};
|
|
232
221
|
}
|
|
233
222
|
const templateMap = new Map(templates.map((t) => [t.name, t]));
|
|
234
|
-
const regex =
|
|
223
|
+
const regex = new RegExp(TEMPLATE_REGEX.source, TEMPLATE_REGEX.flags);
|
|
235
224
|
let match;
|
|
236
225
|
let lastIndex = 0;
|
|
237
226
|
let resolvedText = "";
|
|
@@ -253,25 +242,13 @@ function resolveTemplatesWithMapping(text, templates = [], templateBindings) {
|
|
|
253
242
|
}
|
|
254
243
|
let resolvedBody = fullMatch;
|
|
255
244
|
let isTemplate = false;
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
);
|
|
264
|
-
versionBody = boundVersion?.body;
|
|
265
|
-
} else {
|
|
266
|
-
const latestVersion = getLatestVersion(template);
|
|
267
|
-
versionBody = latestVersion?.body ?? template.body;
|
|
268
|
-
}
|
|
269
|
-
if (versionBody !== void 0) {
|
|
270
|
-
resolvedBody = resolveTemplates(versionBody, templates, {
|
|
271
|
-
bindings: templateBindings
|
|
272
|
-
});
|
|
273
|
-
isTemplate = true;
|
|
274
|
-
}
|
|
245
|
+
const template = templateMap.get(templateName);
|
|
246
|
+
if (template && getTemplateBody(template, templateBindings) !== void 0) {
|
|
247
|
+
resolvedBody = resolveTemplates(fullMatch, templates, {
|
|
248
|
+
bindings: templateBindings,
|
|
249
|
+
maxDepth: options?.maxDepth
|
|
250
|
+
});
|
|
251
|
+
isTemplate = true;
|
|
275
252
|
}
|
|
276
253
|
if (isTemplate) {
|
|
277
254
|
map.push({
|
|
@@ -316,9 +293,11 @@ function mapResolvedOffsetToRaw(resolvedOffset, map) {
|
|
|
316
293
|
if (inRange) {
|
|
317
294
|
if (seg.source === "raw") {
|
|
318
295
|
return seg.rawStart + (resolvedOffset - seg.resolvedStart);
|
|
319
|
-
} else {
|
|
320
|
-
return seg.rawStart;
|
|
321
296
|
}
|
|
297
|
+
if (resolvedOffset === seg.resolvedEnd) {
|
|
298
|
+
return seg.rawEnd;
|
|
299
|
+
}
|
|
300
|
+
return seg.rawStart;
|
|
322
301
|
}
|
|
323
302
|
}
|
|
324
303
|
return resolvedOffset;
|
|
@@ -331,9 +310,11 @@ function mapRawOffsetToResolved(rawOffset, map) {
|
|
|
331
310
|
if (inRange) {
|
|
332
311
|
if (seg.source === "raw") {
|
|
333
312
|
return seg.resolvedStart + (rawOffset - seg.rawStart);
|
|
334
|
-
} else {
|
|
335
|
-
return seg.resolvedStart;
|
|
336
313
|
}
|
|
314
|
+
if (rawOffset === seg.rawEnd) {
|
|
315
|
+
return seg.resolvedEnd;
|
|
316
|
+
}
|
|
317
|
+
return seg.resolvedStart;
|
|
337
318
|
}
|
|
338
319
|
}
|
|
339
320
|
return rawOffset;
|
|
@@ -5620,6 +5601,18 @@ var ImageCache = class {
|
|
|
5620
5601
|
};
|
|
5621
5602
|
img.onerror = (e) => reject(new Error(`Failed to load image from: ${src}`));
|
|
5622
5603
|
img.src = src;
|
|
5604
|
+
if (typeof navigator !== "undefined" && /jsdom/i.test(navigator.userAgent)) {
|
|
5605
|
+
setTimeout(() => {
|
|
5606
|
+
try {
|
|
5607
|
+
Object.defineProperty(img, "naturalWidth", { value: 800, configurable: true });
|
|
5608
|
+
Object.defineProperty(img, "naturalHeight", { value: 600, configurable: true });
|
|
5609
|
+
Object.defineProperty(img, "complete", { value: true, configurable: true });
|
|
5610
|
+
} catch {
|
|
5611
|
+
}
|
|
5612
|
+
this.cache.set(src, img);
|
|
5613
|
+
resolve(img);
|
|
5614
|
+
}, 10);
|
|
5615
|
+
}
|
|
5623
5616
|
});
|
|
5624
5617
|
}
|
|
5625
5618
|
set(src, img) {
|
|
@@ -6099,6 +6092,66 @@ var ImageEditorRenderer = class {
|
|
|
6099
6092
|
}
|
|
6100
6093
|
return exportCanvas;
|
|
6101
6094
|
}
|
|
6095
|
+
/**
|
|
6096
|
+
* Generates a binary mask canvas (white for mask/selected area, black for unmasked).
|
|
6097
|
+
* Useful for AI inpainting and selective generative fill.
|
|
6098
|
+
*/
|
|
6099
|
+
async renderMask(state, options) {
|
|
6100
|
+
const naturalWidth = state.imageDimensions.width;
|
|
6101
|
+
const naturalHeight = state.imageDimensions.height;
|
|
6102
|
+
const maskCanvas = this.createCanvas(naturalWidth, naturalHeight);
|
|
6103
|
+
const ctx = maskCanvas.getContext("2d");
|
|
6104
|
+
if (!ctx) return maskCanvas;
|
|
6105
|
+
ctx.fillStyle = "#000000";
|
|
6106
|
+
ctx.fillRect(0, 0, naturalWidth, naturalHeight);
|
|
6107
|
+
const useCrop = options?.useCrop ?? true;
|
|
6108
|
+
const useAnnotations = options?.useAnnotations ?? true;
|
|
6109
|
+
if (useCrop && state.crop) {
|
|
6110
|
+
ctx.fillStyle = "#ffffff";
|
|
6111
|
+
ctx.fillRect(state.crop.x, state.crop.y, state.crop.width, state.crop.height);
|
|
6112
|
+
}
|
|
6113
|
+
if (useAnnotations && state.annotations.length > 0) {
|
|
6114
|
+
for (const ann of state.annotations) {
|
|
6115
|
+
ctx.save();
|
|
6116
|
+
if (ann.rotation) {
|
|
6117
|
+
ctx.translate(ann.x, ann.y);
|
|
6118
|
+
ctx.rotate(ann.rotation * Math.PI / 180);
|
|
6119
|
+
ctx.translate(-ann.x, -ann.y);
|
|
6120
|
+
}
|
|
6121
|
+
if (ann.type === "pen") {
|
|
6122
|
+
const pen = ann;
|
|
6123
|
+
if (pen.points.length > 0) {
|
|
6124
|
+
ctx.beginPath();
|
|
6125
|
+
ctx.strokeStyle = "#ffffff";
|
|
6126
|
+
ctx.lineWidth = Math.max(pen.strokeWidth, 8);
|
|
6127
|
+
ctx.lineCap = "round";
|
|
6128
|
+
ctx.lineJoin = "round";
|
|
6129
|
+
ctx.moveTo(pen.points[0].x, pen.points[0].y);
|
|
6130
|
+
for (let i = 1; i < pen.points.length; i++) {
|
|
6131
|
+
ctx.lineTo(pen.points[i].x, pen.points[i].y);
|
|
6132
|
+
}
|
|
6133
|
+
ctx.stroke();
|
|
6134
|
+
}
|
|
6135
|
+
} else if (ann.type === "rect") {
|
|
6136
|
+
const rect = ann;
|
|
6137
|
+
ctx.fillStyle = "#ffffff";
|
|
6138
|
+
ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
|
|
6139
|
+
} else if (ann.type === "circle") {
|
|
6140
|
+
const circ = ann;
|
|
6141
|
+
ctx.fillStyle = "#ffffff";
|
|
6142
|
+
ctx.beginPath();
|
|
6143
|
+
ctx.ellipse(circ.x, circ.y, circ.radiusX, circ.radiusY, 0, 0, Math.PI * 2);
|
|
6144
|
+
ctx.fill();
|
|
6145
|
+
} else {
|
|
6146
|
+
ctx.strokeStyle = "#ffffff";
|
|
6147
|
+
ctx.fillStyle = "#ffffff";
|
|
6148
|
+
await this.drawAnnotation(ctx, ann);
|
|
6149
|
+
}
|
|
6150
|
+
ctx.restore();
|
|
6151
|
+
}
|
|
6152
|
+
}
|
|
6153
|
+
return maskCanvas;
|
|
6154
|
+
}
|
|
6102
6155
|
};
|
|
6103
6156
|
|
|
6104
6157
|
// src/image-editor/controller.ts
|
|
@@ -6441,7 +6494,10 @@ var ImageEditorController = class {
|
|
|
6441
6494
|
async render(targetCanvas, options) {
|
|
6442
6495
|
const source = this.imageElement || this.state.sourceUrl;
|
|
6443
6496
|
if (!source) return;
|
|
6444
|
-
|
|
6497
|
+
try {
|
|
6498
|
+
await this.renderer.renderToCanvas(targetCanvas, source, this.state, options);
|
|
6499
|
+
} catch {
|
|
6500
|
+
}
|
|
6445
6501
|
}
|
|
6446
6502
|
async renderExport(options) {
|
|
6447
6503
|
const source = this.imageElement || this.state.sourceUrl;
|
|
@@ -6483,6 +6539,23 @@ var ImageEditorController = class {
|
|
|
6483
6539
|
}
|
|
6484
6540
|
});
|
|
6485
6541
|
}
|
|
6542
|
+
// --- AI Masking & Transformation Helpers ---
|
|
6543
|
+
async renderMask(options) {
|
|
6544
|
+
return this.renderer.renderMask(this.state, options);
|
|
6545
|
+
}
|
|
6546
|
+
async toMaskDataURL(options) {
|
|
6547
|
+
const canvas = await this.renderMask(options);
|
|
6548
|
+
return canvas.toDataURL("image/png");
|
|
6549
|
+
}
|
|
6550
|
+
async applyInpaintedImage(newDataUrl) {
|
|
6551
|
+
this.recordHistory();
|
|
6552
|
+
await this.loadImage(newDataUrl);
|
|
6553
|
+
this.clearAnnotations();
|
|
6554
|
+
}
|
|
6555
|
+
async applyBackgroundRemovedImage(newDataUrl) {
|
|
6556
|
+
this.recordHistory();
|
|
6557
|
+
await this.loadImage(newDataUrl);
|
|
6558
|
+
}
|
|
6486
6559
|
// --- Serialization ---
|
|
6487
6560
|
toJSON() {
|
|
6488
6561
|
return this.serializeState();
|
|
@@ -6773,6 +6846,8 @@ export {
|
|
|
6773
6846
|
SmilieReplacer,
|
|
6774
6847
|
SpreadsheetController,
|
|
6775
6848
|
StreamingLayoutManager,
|
|
6849
|
+
TEMPLATE_DEPTH_ERROR,
|
|
6850
|
+
TEMPLATE_LOOP_ERROR,
|
|
6776
6851
|
TEMPLATE_REGEX,
|
|
6777
6852
|
TemplateSuggestions,
|
|
6778
6853
|
VARIABLE_REGEX,
|
|
@@ -6818,6 +6893,7 @@ export {
|
|
|
6818
6893
|
getEditorText,
|
|
6819
6894
|
getLatestVersion,
|
|
6820
6895
|
getLayoutedNodes,
|
|
6896
|
+
getTemplateBody,
|
|
6821
6897
|
getViewportMetrics,
|
|
6822
6898
|
globalImageCache,
|
|
6823
6899
|
handleImageInsertion,
|