@pooder/vue 4.4.4 → 4.5.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/index.es.js CHANGED
@@ -1,89 +1,95 @@
1
- import { defineComponent as B, ref as T, onMounted as V, onUnmounted as O, createElementBlock as P, openBlock as k, createElementVNode as j, provide as $, createVNode as q } from "vue";
2
- import { Pooder as G } from "@pooder/core";
1
+ import { defineComponent as F, ref as T, onMounted as q, onUnmounted as O, createElementBlock as P, openBlock as N, createElementVNode as G, provide as J, createVNode as K } from "vue";
2
+ import { Pooder as Q } from "@pooder/core";
3
3
  export * from "@pooder/core";
4
- import { CanvasService as J, SceneLayoutService as K, BackgroundTool as Q, SizeTool as Z, ImageTool as ee, WhiteInkTool as te, DielineTool as ne, RulerTool as re, FeatureTool as oe } from "@pooder/kit";
4
+ import { CanvasService as Z, SceneLayoutService as ee, BackgroundTool as te, SizeTool as ne, ImageTool as re, WhiteInkTool as ae, DielineTool as oe, RulerTool as ie, FeatureTool as ce } from "@pooder/kit";
5
5
  export * from "@pooder/kit";
6
- const ie = /* @__PURE__ */ B({
6
+ const se = /* @__PURE__ */ F({
7
7
  __name: "CanvasArea",
8
8
  emits: ["canvas-ready", "resize"],
9
9
  setup(h, { emit: l }) {
10
- const m = l, r = T(null), o = T(null);
11
- let i = null;
12
- return V(() => {
13
- if (r.value && o.value) {
10
+ const m = l, r = T(null), a = T(null);
11
+ let c = null;
12
+ return q(() => {
13
+ if (r.value && a.value) {
14
14
  const { clientWidth: u, clientHeight: f } = r.value;
15
- o.value.width = u, o.value.height = f, m("canvas-ready", o.value), i = new ResizeObserver((v) => {
16
- for (const p of v) {
17
- const { width: w, height: y } = p.contentRect;
15
+ a.value.width = u, a.value.height = f, m("canvas-ready", a.value), c = new ResizeObserver((p) => {
16
+ for (const v of p) {
17
+ const { width: w, height: y } = v.contentRect;
18
18
  m("resize", w, y);
19
19
  }
20
- }), i.observe(r.value);
20
+ }), c.observe(r.value);
21
21
  }
22
22
  }), O(() => {
23
- i && i.disconnect();
24
- }), (u, f) => (k(), P("div", {
23
+ c && c.disconnect();
24
+ }), (u, f) => (N(), P("div", {
25
25
  ref_key: "container",
26
26
  ref: r,
27
27
  class: "pooder-canvas-area"
28
28
  }, [
29
- j("canvas", {
29
+ G("canvas", {
30
30
  ref_key: "canvas",
31
- ref: o
31
+ ref: a
32
32
  }, null, 512)
33
33
  ], 512));
34
34
  }
35
- }), N = (h, l) => {
35
+ }), k = (h, l) => {
36
36
  const m = h.__vccOpts || h;
37
- for (const [r, o] of l)
38
- m[r] = o;
37
+ for (const [r, a] of l)
38
+ m[r] = a;
39
39
  return m;
40
- }, ae = /* @__PURE__ */ N(ie, [["__scopeId", "data-v-203ff8d9"]]), ce = { class: "pooder-editor" }, I = "SceneLayoutService", se = /* @__PURE__ */ B({
40
+ }, de = /* @__PURE__ */ k(se, [["__scopeId", "data-v-203ff8d9"]]), me = { class: "pooder-editor" }, B = "SceneLayoutService", ue = /* @__PURE__ */ F({
41
41
  __name: "PooderEditor",
42
- emits: ["image-change"],
42
+ emits: ["image-state-change"],
43
43
  setup(h, { expose: l, emit: m }) {
44
- const r = new G();
45
- $("pooder", r);
46
- const o = r.getService("CommandService"), i = r.getService("ConfigurationService"), u = r.getService("WorkbenchService"), f = m, v = i.onAnyChange((e) => {
47
- e.key === "image.items" && f("image-change", e.value);
48
- }), p = (e) => {
49
- i.import(e);
50
- }, w = () => i.export(), y = () => i.get("image.items", []), R = async (e) => {
44
+ const r = new Q();
45
+ J("pooder", r);
46
+ const a = r.getService("CommandService"), c = r.getService("ConfigurationService"), u = r.getService("WorkbenchService"), f = m, p = (e) => {
47
+ f("image-state-change", e);
48
+ };
49
+ r.eventBus.on("image:state:change", p);
50
+ const v = (e) => {
51
+ c.import(e);
52
+ }, w = () => c.export(), y = async (e) => {
51
53
  try {
52
- const t = await o.executeCommand(
54
+ const t = await a.executeCommand(
53
55
  "exportCutImage",
54
56
  e
55
57
  );
56
58
  return t || console.warn("[PooderEditor] generateCutImage returned null", {
57
59
  options: e,
58
- imageCount: (i.get("image.items") || []).length,
60
+ imageCount: (c.get("image.items") || []).length,
59
61
  hasCanvasService: !!r.getService("CanvasService")
60
62
  }), t;
61
63
  } catch (t) {
62
64
  throw console.error("[PooderEditor] generateCutImage failed", t), t;
63
65
  }
64
- }, D = async (e, t) => await o.executeCommand("upsertImage", e, {
66
+ }, _ = async (e, t) => await a.executeCommand("upsertImage", e, {
65
67
  id: t?.id,
66
68
  mode: t?.mode,
67
69
  addOptions: t?.addOptions,
68
- fitOnAdd: t?.fitOnAdd
69
- }), _ = async (e, t) => (await D(e, {
70
+ operation: t?.operation
71
+ }), D = async (e, t) => (await _(e, {
70
72
  mode: "add",
71
- addOptions: t,
72
- fitOnAdd: !0
73
- })).id, A = async (e, t) => await o.executeCommand("updateImage", e, t), U = async () => await o.executeCommand("clearImages"), C = async (e) => await o.executeCommand(
73
+ addOptions: t
74
+ })).id, R = async (e, t, n) => await a.executeCommand(
75
+ "applyImageOperation",
76
+ e,
77
+ t,
78
+ n
79
+ ), U = async () => await a.executeCommand("getImageViewState"), z = async (e, t, n) => await a.executeCommand("setImageTransform", e, t, n), M = (e) => (r.eventBus.on("image:state:change", e), () => r.eventBus.off("image:state:change", e)), W = async (e, t) => await a.executeCommand("updateImage", e, t), L = async () => await a.executeCommand("clearImages"), C = async (e) => await a.executeCommand(
74
80
  "exportUserCroppedImage",
75
81
  e
76
- ), z = async (e, t) => await o.executeCommand("focusImage", e, t), x = (e, t) => {
77
- i.update("dieline.shape", "custom"), i.update("dieline.pathData", e.pathData);
78
- const n = Number(e.imageWidth ?? t?.width ?? 0), a = Number(e.imageHeight ?? t?.height ?? 0);
79
- i.update(
82
+ ), Y = async (e, t) => await a.executeCommand("focusImage", e, t), x = (e, t) => {
83
+ c.update("dieline.shape", "custom"), c.update("dieline.pathData", e.pathData);
84
+ const n = Number(e.imageWidth ?? t?.width ?? 0), o = Number(e.imageHeight ?? t?.height ?? 0);
85
+ c.update(
80
86
  "dieline.customSourceWidthPx",
81
87
  Number.isFinite(n) && n > 0 ? n : void 0
82
- ), i.update(
88
+ ), c.update(
83
89
  "dieline.customSourceHeightPx",
84
- Number.isFinite(a) && a > 0 ? a : void 0
85
- ), i.update("size.cutMode", "trim"), i.update("size.cutMarginMm", 0);
86
- }, b = (e) => !!e && Number.isFinite(e.x) && Number.isFinite(e.y) && Number.isFinite(e.width) && Number.isFinite(e.height) && e.width > 0 && e.height > 0, E = (e, t) => {
90
+ Number.isFinite(o) && o > 0 ? o : void 0
91
+ ), c.update("size.cutMode", "trim"), c.update("size.cutMarginMm", 0);
92
+ }, b = (e) => !!e && Number.isFinite(e.x) && Number.isFinite(e.y) && Number.isFinite(e.width) && Number.isFinite(e.height) && e.width > 0 && e.height > 0, I = (e, t) => {
87
93
  const n = e.rawBounds || e.baseBounds || null;
88
94
  if (!n)
89
95
  return {
@@ -95,17 +101,17 @@ const ie = /* @__PURE__ */ B({
95
101
  coverageX: 0,
96
102
  coverageY: 0
97
103
  };
98
- const a = t.width / 2, c = t.height / 2, s = n.x + n.width / 2, d = n.y + n.height / 2;
104
+ const o = t.width / 2, i = t.height / 2, s = n.x + n.width / 2, d = n.y + n.height / 2;
99
105
  return {
100
106
  sourceWidth: t.width,
101
107
  sourceHeight: t.height,
102
108
  detectedBounds: n,
103
- centerOffsetX: s - a,
104
- centerOffsetY: d - c,
109
+ centerOffsetX: s - o,
110
+ centerOffsetY: d - i,
105
111
  coverageX: t.width > 0 ? n.width / t.width : 0,
106
112
  coverageY: t.height > 0 ? n.height / t.height : 0
107
113
  };
108
- }, M = (e) => {
114
+ }, A = (e) => {
109
115
  if (!b(e.rawBounds) || !b(e.baseBounds))
110
116
  return null;
111
117
  const t = e.rawBounds, n = e.baseBounds;
@@ -115,61 +121,64 @@ const ie = /* @__PURE__ */ B({
115
121
  right: t.x + t.width - (n.x + n.width),
116
122
  bottom: t.y + t.height - (n.y + n.height)
117
123
  };
118
- }, W = (e, t, n) => {
119
- const a = E(e, t), c = M(e), s = c ? {
120
- left: c.left - n,
121
- top: c.top - n,
122
- right: c.right - n,
123
- bottom: c.bottom - n
124
- } : null, d = c ? {
125
- x: c.right - c.left,
126
- y: c.bottom - c.top
124
+ }, H = (e, t, n) => {
125
+ const o = I(e, t), i = A(e), s = i ? {
126
+ left: i.left - n,
127
+ top: i.top - n,
128
+ right: i.right - n,
129
+ bottom: i.bottom - n
130
+ } : null, d = i ? {
131
+ x: i.right - i.left,
132
+ y: i.bottom - i.top
127
133
  } : null;
128
134
  return {
129
- frame: a,
130
- margin: c,
135
+ frame: o,
136
+ margin: i,
131
137
  expectedExpand: n,
132
138
  marginDeltaFromExpected: s,
133
139
  marginAsymmetry: d
134
140
  };
135
- }, L = async (e, t, n) => {
141
+ }, X = async (e, t, n) => {
136
142
  if (!e.length) return null;
137
- const a = await C({
143
+ const o = await C({
138
144
  multiplier: n?.multiplier ?? 2,
139
145
  format: n?.format ?? "png",
140
146
  imageIds: e
141
- }), c = a?.url;
142
- if (!c) return null;
147
+ }), i = o?.url;
148
+ if (!i) return null;
143
149
  try {
144
- const s = await o.executeCommand("detectEdge", c, {
150
+ const s = await a.executeCommand("detectEdge", i, {
145
151
  expand: n?.detect?.expand ?? 0,
146
152
  smoothing: n?.detect?.smoothing ?? !0,
147
153
  simplifyTolerance: n?.detect?.simplifyTolerance ?? 2,
148
154
  threshold: n?.detect?.threshold,
149
155
  debug: !1
150
156
  });
151
- return s ? W(
157
+ return s ? H(
152
158
  s,
153
- a,
159
+ o,
154
160
  t
155
161
  ) : null;
156
162
  } finally {
157
- URL.revokeObjectURL(c);
163
+ URL.revokeObjectURL(i);
158
164
  }
159
165
  };
160
166
  l({
161
- importConfig: p,
167
+ importConfig: v,
162
168
  exportConfig: w,
163
- getImages: y,
164
- generateCutImage: R,
165
- addImage: _,
166
- upsertImage: D,
167
- updateImage: A,
168
- clearImages: U,
169
+ generateCutImage: y,
170
+ addImage: D,
171
+ upsertImage: _,
172
+ getImageState: U,
173
+ onImageStateChange: M,
174
+ applyImageOperation: R,
175
+ setImageTransform: z,
176
+ updateImage: W,
177
+ clearImages: L,
169
178
  exportUserCroppedImage: C,
170
- focusImage: z,
179
+ focusImage: Y,
171
180
  detectDieline: async (e) => {
172
- const t = await o.executeCommand("detectEdge", e, {
181
+ const t = await a.executeCommand("detectEdge", e, {
173
182
  expand: 10,
174
183
  // 安全距离(像素)
175
184
  smoothing: !0,
@@ -179,8 +188,8 @@ const ie = /* @__PURE__ */ B({
179
188
  });
180
189
  return t ? (x(t), t.pathData) : null;
181
190
  },
182
- detectDielineFromFrame: async (e) => {
183
- const t = e?.detect?.debug === !0, n = e?.inspect?.includeCroppedImage === !0, a = e?.inspect?.includeDiagnostics === !0, c = Math.max(0, Number(e?.detect?.expand ?? 0)), s = await C({
191
+ detectDielineFromFrame: async (e = {}) => {
192
+ const t = e?.detect?.debug === !0, n = e?.inspect?.includeCroppedImage === !0, o = e?.inspect?.includeDiagnostics === !0, i = Math.max(0, Number(e?.detect?.expand ?? 0)), s = await C({
184
193
  multiplier: e?.export?.multiplier ?? 2,
185
194
  format: e?.export?.format ?? "png",
186
195
  imageIds: e?.export?.imageIds
@@ -188,7 +197,7 @@ const ie = /* @__PURE__ */ B({
188
197
  if (!d)
189
198
  return console.warn("[PooderEditor] detectDielineFromFrame no source image"), null;
190
199
  try {
191
- const g = await o.executeCommand("detectEdge", d, {
200
+ const g = await a.executeCommand("detectEdge", d, {
192
201
  expand: e?.detect?.expand ?? 0,
193
202
  smoothing: e?.detect?.smoothing ?? !0,
194
203
  simplifyTolerance: e?.detect?.simplifyTolerance ?? 2,
@@ -199,15 +208,15 @@ const ie = /* @__PURE__ */ B({
199
208
  return console.warn(
200
209
  "[PooderEditor] detectDielineFromFrame detectEdge returned null"
201
210
  ), null;
202
- const F = E(g, s);
211
+ const E = I(g, s);
203
212
  if (e?.commit === !1)
204
213
  return {
205
214
  ...g,
206
215
  ...n ? { sourceImage: s } : {},
207
- ...a ? { diagnostics: F } : {}
216
+ ...o ? { diagnostics: E } : {}
208
217
  };
209
218
  x(g, s);
210
- const X = {
219
+ const $ = {
211
220
  multiplier: e?.export?.multiplier ?? 2,
212
221
  format: e?.export?.format ?? "png",
213
222
  detect: {
@@ -217,10 +226,10 @@ const ie = /* @__PURE__ */ B({
217
226
  threshold: e?.detect?.threshold
218
227
  }
219
228
  };
220
- let S = await L(
229
+ let S = await X(
221
230
  s.imageIds,
222
- c,
223
- X
231
+ i,
232
+ $
224
233
  );
225
234
  return S ? console.info(
226
235
  "[PooderEditor] detectDielineFromFrame post-commit diagnostics",
@@ -230,65 +239,65 @@ const ie = /* @__PURE__ */ B({
230
239
  ), {
231
240
  ...g,
232
241
  ...n ? { sourceImage: s } : {},
233
- ...a ? { diagnostics: F, postCommitDiagnostics: S } : {}
242
+ ...o ? { diagnostics: E, postCommitDiagnostics: S } : {}
234
243
  };
235
244
  } finally {
236
245
  d && !n && URL.revokeObjectURL(d);
237
246
  }
238
247
  },
239
248
  uploadAndDetectEdge: async (e, t) => {
240
- const n = await _(e), a = await o.executeCommand("detectEdge", e, {
249
+ const n = await D(e), o = await a.executeCommand("detectEdge", e, {
241
250
  expand: t?.expand ?? 10,
242
251
  smoothing: t?.smoothing ?? !0,
243
252
  simplifyTolerance: t?.simplifyTolerance ?? 2
244
253
  });
245
- return a ? (x(a), { imageId: n, url: e, pathData: a.pathData }) : null;
254
+ return o ? (x(o), { imageId: n, url: e, pathData: o.pathData }) : null;
246
255
  },
247
256
  activateTool: async (e) => await u.switchTool(e),
248
257
  deactivateTool: async () => await u.deactivate(),
249
258
  on: (e, t) => r.eventBus.on(e, t),
250
259
  off: (e, t) => r.eventBus.off(e, t),
251
260
  emit: (e, t) => r.eventBus.emit(e, t),
252
- executeCommand: (e, ...t) => o.executeCommand(e, ...t),
253
- getConfig: (e) => i.get(e),
254
- updateConfig: (e, t) => i.update(e, t),
261
+ executeCommand: (e, ...t) => a.executeCommand(e, ...t),
262
+ getConfig: (e) => c.get(e),
263
+ updateConfig: (e, t) => c.update(e, t),
255
264
  services: {
256
265
  workbench: u,
257
- command: o,
258
- config: i
266
+ command: a,
267
+ config: c
259
268
  }
260
269
  });
261
- const Y = (e) => {
262
- const t = new J(e, {
270
+ const V = (e) => {
271
+ const t = new Z(e, {
263
272
  eventBus: r.eventBus
264
273
  });
265
- r.registerService(t, "CanvasService"), r.registerService(new K(), I), [
266
- new Q(),
267
- new Z(),
268
- new ee(),
269
- // new FilmTool(),
274
+ r.registerService(t, "CanvasService"), r.registerService(new ee(), B), [
270
275
  new te(),
271
- // new MirrorTool(),
272
276
  new ne(),
273
277
  new re(),
274
- new oe()
275
- ].forEach((a) => {
276
- r.extensionManager.register(a);
278
+ // new FilmTool(),
279
+ new ae(),
280
+ // new MirrorTool(),
281
+ new oe(),
282
+ new ie(),
283
+ new ce()
284
+ ].forEach((o) => {
285
+ r.extensionManager.register(o);
277
286
  });
278
- }, H = (e, t) => {
287
+ }, j = (e, t) => {
279
288
  const n = r.getService("CanvasService");
280
289
  n && n.resize(e, t);
281
290
  };
282
291
  return O(() => {
283
- v.dispose(), r.extensionManager.destroy(), r.unregisterService(I), r.unregisterService("CanvasService");
284
- }), (e, t) => (k(), P("div", ce, [
285
- q(ae, {
286
- onCanvasReady: Y,
287
- onResize: H
292
+ r.eventBus.off("image:state:change", p), r.extensionManager.destroy(), r.unregisterService(B), r.unregisterService("CanvasService");
293
+ }), (e, t) => (N(), P("div", me, [
294
+ K(de, {
295
+ onCanvasReady: V,
296
+ onResize: j
288
297
  })
289
298
  ]));
290
299
  }
291
- }), fe = /* @__PURE__ */ N(se, [["__scopeId", "data-v-32ae317e"]]);
300
+ }), ye = /* @__PURE__ */ k(ue, [["__scopeId", "data-v-0f508bf4"]]);
292
301
  export {
293
- fe as PooderEditor
302
+ ye as PooderEditor
294
303
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(l,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("vue"),require("@pooder/core"),require("@pooder/kit")):typeof define=="function"&&define.amd?define(["exports","vue","@pooder/core","@pooder/kit"],s):(l=typeof globalThis<"u"?globalThis:l||self,s(l.PooderVue={},l.Vue,l.PooderCore,l.PooderKit))})(this,(function(l,s,w,m){"use strict";const R=s.defineComponent({__name:"CanvasArea",emits:["canvas-ready","resize"],setup(d,{emit:p}){const f=p,r=s.ref(null),o=s.ref(null);let i=null;return s.onMounted(()=>{if(r.value&&o.value){const{clientWidth:h,clientHeight:y}=r.value;o.value.width=h,o.value.height=y,f("canvas-ready",o.value),i=new ResizeObserver(C=>{for(const x of C){const{width:b,height:S}=x.contentRect;f("resize",b,S)}}),i.observe(r.value)}}),s.onUnmounted(()=>{i&&i.disconnect()}),(h,y)=>(s.openBlock(),s.createElementBlock("div",{ref_key:"container",ref:r,class:"pooder-canvas-area"},[s.createElementVNode("canvas",{ref_key:"canvas",ref:o},null,512)],512))}}),E=(d,p)=>{const f=d.__vccOpts||d;for(const[r,o]of p)f[r]=o;return f},U=E(R,[["__scopeId","data-v-203ff8d9"]]),j={class:"pooder-editor"},T="SceneLayoutService",A=E(s.defineComponent({__name:"PooderEditor",emits:["image-change"],setup(d,{expose:p,emit:f}){const r=new w.Pooder;s.provide("pooder",r);const o=r.getService("CommandService"),i=r.getService("ConfigurationService"),h=r.getService("WorkbenchService"),y=f,C=i.onAnyChange(e=>{e.key==="image.items"&&y("image-change",e.value)}),x=e=>{i.import(e)},b=()=>i.export(),S=()=>i.get("image.items",[]),z=async e=>{try{const t=await o.executeCommand("exportCutImage",e);return t||console.warn("[PooderEditor] generateCutImage returned null",{options:e,imageCount:(i.get("image.items")||[]).length,hasCanvasService:!!r.getService("CanvasService")}),t}catch(t){throw console.error("[PooderEditor] generateCutImage failed",t),t}},P=async(e,t)=>await o.executeCommand("upsertImage",e,{id:t?.id,mode:t?.mode,addOptions:t?.addOptions,fitOnAdd:t?.fitOnAdd}),F=async(e,t)=>(await P(e,{mode:"add",addOptions:t,fitOnAdd:!0})).id,M=async(e,t)=>await o.executeCommand("updateImage",e,t),W=async()=>await o.executeCommand("clearImages"),_=async e=>await o.executeCommand("exportUserCroppedImage",e),L=async(e,t)=>await o.executeCommand("focusImage",e,t),D=(e,t)=>{i.update("dieline.shape","custom"),i.update("dieline.pathData",e.pathData);const n=Number(e.imageWidth??t?.width??0),a=Number(e.imageHeight??t?.height??0);i.update("dieline.customSourceWidthPx",Number.isFinite(n)&&n>0?n:void 0),i.update("dieline.customSourceHeightPx",Number.isFinite(a)&&a>0?a:void 0),i.update("size.cutMode","trim"),i.update("size.cutMarginMm",0)},B=e=>!!e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0,I=(e,t)=>{const n=e.rawBounds||e.baseBounds||null;if(!n)return{sourceWidth:t.width,sourceHeight:t.height,detectedBounds:null,centerOffsetX:0,centerOffsetY:0,coverageX:0,coverageY:0};const a=t.width/2,c=t.height/2,u=n.x+n.width/2,g=n.y+n.height/2;return{sourceWidth:t.width,sourceHeight:t.height,detectedBounds:n,centerOffsetX:u-a,centerOffsetY:g-c,coverageX:t.width>0?n.width/t.width:0,coverageY:t.height>0?n.height/t.height:0}},Y=e=>{if(!B(e.rawBounds)||!B(e.baseBounds))return null;const t=e.rawBounds,n=e.baseBounds;return{left:n.x-t.x,top:n.y-t.y,right:t.x+t.width-(n.x+n.width),bottom:t.y+t.height-(n.y+n.height)}},H=(e,t,n)=>{const a=I(e,t),c=Y(e),u=c?{left:c.left-n,top:c.top-n,right:c.right-n,bottom:c.bottom-n}:null,g=c?{x:c.right-c.left,y:c.bottom-c.top}:null;return{frame:a,margin:c,expectedExpand:n,marginDeltaFromExpected:u,marginAsymmetry:g}},V=async(e,t,n)=>{if(!e.length)return null;const a=await _({multiplier:n?.multiplier??2,format:n?.format??"png",imageIds:e}),c=a?.url;if(!c)return null;try{const u=await o.executeCommand("detectEdge",c,{expand:n?.detect?.expand??0,smoothing:n?.detect?.smoothing??!0,simplifyTolerance:n?.detect?.simplifyTolerance??2,threshold:n?.detect?.threshold,debug:!1});return u?H(u,a,t):null}finally{URL.revokeObjectURL(c)}};p({importConfig:x,exportConfig:b,getImages:S,generateCutImage:z,addImage:F,upsertImage:P,updateImage:M,clearImages:W,exportUserCroppedImage:_,focusImage:L,detectDieline:async e=>{const t=await o.executeCommand("detectEdge",e,{expand:10,smoothing:!0,simplifyTolerance:2});return t?(D(t),t.pathData):null},detectDielineFromFrame:async e=>{const t=e?.detect?.debug===!0,n=e?.inspect?.includeCroppedImage===!0,a=e?.inspect?.includeDiagnostics===!0,c=Math.max(0,Number(e?.detect?.expand??0)),u=await _({multiplier:e?.export?.multiplier??2,format:e?.export?.format??"png",imageIds:e?.export?.imageIds}),g=u?.url;if(!g)return console.warn("[PooderEditor] detectDielineFromFrame no source image"),null;try{const v=await o.executeCommand("detectEdge",g,{expand:e?.detect?.expand??0,smoothing:e?.detect?.smoothing??!0,simplifyTolerance:e?.detect?.simplifyTolerance??2,threshold:e?.detect?.threshold,debug:t});if(!v)return console.warn("[PooderEditor] detectDielineFromFrame detectEdge returned null"),null;const N=I(v,u);if(e?.commit===!1)return{...v,...n?{sourceImage:u}:{},...a?{diagnostics:N}:{}};D(v,u);const k={multiplier:e?.export?.multiplier??2,format:e?.export?.format??"png",detect:{expand:e?.detect?.expand??0,smoothing:e?.detect?.smoothing??!0,simplifyTolerance:e?.detect?.simplifyTolerance??2,threshold:e?.detect?.threshold}};let O=await V(u.imageIds,c,k);return O?console.info("[PooderEditor] detectDielineFromFrame post-commit diagnostics",O):u.imageIds.length>0&&console.warn("[PooderEditor] detectDielineFromFrame post-commit detectEdge returned null"),{...v,...n?{sourceImage:u}:{},...a?{diagnostics:N,postCommitDiagnostics:O}:{}}}finally{g&&!n&&URL.revokeObjectURL(g)}},uploadAndDetectEdge:async(e,t)=>{const n=await F(e),a=await o.executeCommand("detectEdge",e,{expand:t?.expand??10,smoothing:t?.smoothing??!0,simplifyTolerance:t?.simplifyTolerance??2});return a?(D(a),{imageId:n,url:e,pathData:a.pathData}):null},activateTool:async e=>await h.switchTool(e),deactivateTool:async()=>await h.deactivate(),on:(e,t)=>r.eventBus.on(e,t),off:(e,t)=>r.eventBus.off(e,t),emit:(e,t)=>r.eventBus.emit(e,t),executeCommand:(e,...t)=>o.executeCommand(e,...t),getConfig:e=>i.get(e),updateConfig:(e,t)=>i.update(e,t),services:{workbench:h,command:o,config:i}});const X=e=>{const t=new m.CanvasService(e,{eventBus:r.eventBus});r.registerService(t,"CanvasService"),r.registerService(new m.SceneLayoutService,T),[new m.BackgroundTool,new m.SizeTool,new m.ImageTool,new m.WhiteInkTool,new m.DielineTool,new m.RulerTool,new m.FeatureTool].forEach(a=>{r.extensionManager.register(a)})},q=(e,t)=>{const n=r.getService("CanvasService");n&&n.resize(e,t)};return s.onUnmounted(()=>{C.dispose(),r.extensionManager.destroy(),r.unregisterService(T),r.unregisterService("CanvasService")}),(e,t)=>(s.openBlock(),s.createElementBlock("div",j,[s.createVNode(U,{onCanvasReady:X,onResize:q})]))}}),[["__scopeId","data-v-32ae317e"]]);l.PooderEditor=A,Object.keys(w).forEach(d=>{d!=="default"&&!Object.prototype.hasOwnProperty.call(l,d)&&Object.defineProperty(l,d,{enumerable:!0,get:()=>w[d]})}),Object.keys(m).forEach(d=>{d!=="default"&&!Object.prototype.hasOwnProperty.call(l,d)&&Object.defineProperty(l,d,{enumerable:!0,get:()=>m[d]})}),Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(u,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("vue"),require("@pooder/core"),require("@pooder/kit")):typeof define=="function"&&define.amd?define(["exports","vue","@pooder/core","@pooder/kit"],c):(u=typeof globalThis<"u"?globalThis:u||self,c(u.PooderVue={},u.Vue,u.PooderCore,u.PooderKit))})(this,(function(u,c,C,l){"use strict";const R=c.defineComponent({__name:"CanvasArea",emits:["canvas-ready","resize"],setup(d,{emit:p}){const f=p,o=c.ref(null),r=c.ref(null);let s=null;return c.onMounted(()=>{if(o.value&&r.value){const{clientWidth:h,clientHeight:y}=o.value;r.value.width=h,r.value.height=y,f("canvas-ready",r.value),s=new ResizeObserver(w=>{for(const x of w){const{width:S,height:b}=x.contentRect;f("resize",S,b)}}),s.observe(o.value)}}),c.onUnmounted(()=>{s&&s.disconnect()}),(h,y)=>(c.openBlock(),c.createElementBlock("div",{ref_key:"container",ref:o,class:"pooder-canvas-area"},[c.createElementVNode("canvas",{ref_key:"canvas",ref:r},null,512)],512))}}),I=(d,p)=>{const f=d.__vccOpts||d;for(const[o,r]of p)f[o]=r;return f},U=I(R,[["__scopeId","data-v-203ff8d9"]]),j={class:"pooder-editor"},O="SceneLayoutService",z=I(c.defineComponent({__name:"PooderEditor",emits:["image-state-change"],setup(d,{expose:p,emit:f}){const o=new C.Pooder;c.provide("pooder",o);const r=o.getService("CommandService"),s=o.getService("ConfigurationService"),h=o.getService("WorkbenchService"),y=f,w=e=>{y("image-state-change",e)};o.eventBus.on("image:state:change",w);const x=e=>{s.import(e)},S=()=>s.export(),b=async e=>{try{const t=await r.executeCommand("exportCutImage",e);return t||console.warn("[PooderEditor] generateCutImage returned null",{options:e,imageCount:(s.get("image.items")||[]).length,hasCanvasService:!!o.getService("CanvasService")}),t}catch(t){throw console.error("[PooderEditor] generateCutImage failed",t),t}},T=async(e,t)=>await r.executeCommand("upsertImage",e,{id:t?.id,mode:t?.mode,addOptions:t?.addOptions,operation:t?.operation}),B=async(e,t)=>(await T(e,{mode:"add",addOptions:t})).id,M=async(e,t,n)=>await r.executeCommand("applyImageOperation",e,t,n),W=async()=>await r.executeCommand("getImageViewState"),L=async(e,t,n)=>await r.executeCommand("setImageTransform",e,t,n),V=e=>(o.eventBus.on("image:state:change",e),()=>o.eventBus.off("image:state:change",e)),Y=async(e,t)=>await r.executeCommand("updateImage",e,t),A=async()=>await r.executeCommand("clearImages"),_=async e=>await r.executeCommand("exportUserCroppedImage",e),H=async(e,t)=>await r.executeCommand("focusImage",e,t),D=(e,t)=>{s.update("dieline.shape","custom"),s.update("dieline.pathData",e.pathData);const n=Number(e.imageWidth??t?.width??0),a=Number(e.imageHeight??t?.height??0);s.update("dieline.customSourceWidthPx",Number.isFinite(n)&&n>0?n:void 0),s.update("dieline.customSourceHeightPx",Number.isFinite(a)&&a>0?a:void 0),s.update("size.cutMode","trim"),s.update("size.cutMarginMm",0)},P=e=>!!e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0,F=(e,t)=>{const n=e.rawBounds||e.baseBounds||null;if(!n)return{sourceWidth:t.width,sourceHeight:t.height,detectedBounds:null,centerOffsetX:0,centerOffsetY:0,coverageX:0,coverageY:0};const a=t.width/2,i=t.height/2,m=n.x+n.width/2,g=n.y+n.height/2;return{sourceWidth:t.width,sourceHeight:t.height,detectedBounds:n,centerOffsetX:m-a,centerOffsetY:g-i,coverageX:t.width>0?n.width/t.width:0,coverageY:t.height>0?n.height/t.height:0}},X=e=>{if(!P(e.rawBounds)||!P(e.baseBounds))return null;const t=e.rawBounds,n=e.baseBounds;return{left:n.x-t.x,top:n.y-t.y,right:t.x+t.width-(n.x+n.width),bottom:t.y+t.height-(n.y+n.height)}},q=(e,t,n)=>{const a=F(e,t),i=X(e),m=i?{left:i.left-n,top:i.top-n,right:i.right-n,bottom:i.bottom-n}:null,g=i?{x:i.right-i.left,y:i.bottom-i.top}:null;return{frame:a,margin:i,expectedExpand:n,marginDeltaFromExpected:m,marginAsymmetry:g}},k=async(e,t,n)=>{if(!e.length)return null;const a=await _({multiplier:n?.multiplier??2,format:n?.format??"png",imageIds:e}),i=a?.url;if(!i)return null;try{const m=await r.executeCommand("detectEdge",i,{expand:n?.detect?.expand??0,smoothing:n?.detect?.smoothing??!0,simplifyTolerance:n?.detect?.simplifyTolerance??2,threshold:n?.detect?.threshold,debug:!1});return m?q(m,a,t):null}finally{URL.revokeObjectURL(i)}};p({importConfig:x,exportConfig:S,generateCutImage:b,addImage:B,upsertImage:T,getImageState:W,onImageStateChange:V,applyImageOperation:M,setImageTransform:L,updateImage:Y,clearImages:A,exportUserCroppedImage:_,focusImage:H,detectDieline:async e=>{const t=await r.executeCommand("detectEdge",e,{expand:10,smoothing:!0,simplifyTolerance:2});return t?(D(t),t.pathData):null},detectDielineFromFrame:async(e={})=>{const t=e?.detect?.debug===!0,n=e?.inspect?.includeCroppedImage===!0,a=e?.inspect?.includeDiagnostics===!0,i=Math.max(0,Number(e?.detect?.expand??0)),m=await _({multiplier:e?.export?.multiplier??2,format:e?.export?.format??"png",imageIds:e?.export?.imageIds}),g=m?.url;if(!g)return console.warn("[PooderEditor] detectDielineFromFrame no source image"),null;try{const v=await r.executeCommand("detectEdge",g,{expand:e?.detect?.expand??0,smoothing:e?.detect?.smoothing??!0,simplifyTolerance:e?.detect?.simplifyTolerance??2,threshold:e?.detect?.threshold,debug:t});if(!v)return console.warn("[PooderEditor] detectDielineFromFrame detectEdge returned null"),null;const N=F(v,m);if(e?.commit===!1)return{...v,...n?{sourceImage:m}:{},...a?{diagnostics:N}:{}};D(v,m);const G={multiplier:e?.export?.multiplier??2,format:e?.export?.format??"png",detect:{expand:e?.detect?.expand??0,smoothing:e?.detect?.smoothing??!0,simplifyTolerance:e?.detect?.simplifyTolerance??2,threshold:e?.detect?.threshold}};let E=await k(m.imageIds,i,G);return E?console.info("[PooderEditor] detectDielineFromFrame post-commit diagnostics",E):m.imageIds.length>0&&console.warn("[PooderEditor] detectDielineFromFrame post-commit detectEdge returned null"),{...v,...n?{sourceImage:m}:{},...a?{diagnostics:N,postCommitDiagnostics:E}:{}}}finally{g&&!n&&URL.revokeObjectURL(g)}},uploadAndDetectEdge:async(e,t)=>{const n=await B(e),a=await r.executeCommand("detectEdge",e,{expand:t?.expand??10,smoothing:t?.smoothing??!0,simplifyTolerance:t?.simplifyTolerance??2});return a?(D(a),{imageId:n,url:e,pathData:a.pathData}):null},activateTool:async e=>await h.switchTool(e),deactivateTool:async()=>await h.deactivate(),on:(e,t)=>o.eventBus.on(e,t),off:(e,t)=>o.eventBus.off(e,t),emit:(e,t)=>o.eventBus.emit(e,t),executeCommand:(e,...t)=>r.executeCommand(e,...t),getConfig:e=>s.get(e),updateConfig:(e,t)=>s.update(e,t),services:{workbench:h,command:r,config:s}});const K=e=>{const t=new l.CanvasService(e,{eventBus:o.eventBus});o.registerService(t,"CanvasService"),o.registerService(new l.SceneLayoutService,O),[new l.BackgroundTool,new l.SizeTool,new l.ImageTool,new l.WhiteInkTool,new l.DielineTool,new l.RulerTool,new l.FeatureTool].forEach(a=>{o.extensionManager.register(a)})},$=(e,t)=>{const n=o.getService("CanvasService");n&&n.resize(e,t)};return c.onUnmounted(()=>{o.eventBus.off("image:state:change",w),o.extensionManager.destroy(),o.unregisterService(O),o.unregisterService("CanvasService")}),(e,t)=>(c.openBlock(),c.createElementBlock("div",j,[c.createVNode(U,{onCanvasReady:K,onResize:$})]))}}),[["__scopeId","data-v-0f508bf4"]]);u.PooderEditor=z,Object.keys(C).forEach(d=>{d!=="default"&&!Object.prototype.hasOwnProperty.call(u,d)&&Object.defineProperty(u,d,{enumerable:!0,get:()=>C[d]})}),Object.keys(l).forEach(d=>{d!=="default"&&!Object.prototype.hasOwnProperty.call(u,d)&&Object.defineProperty(u,d,{enumerable:!0,get:()=>l[d]})}),Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})}));
@@ -1,112 +1,34 @@
1
1
  import { CommandService, ConfigurationService, WorkbenchService } from '../../core/src/index.ts';
2
- interface DetectBounds {
3
- x: number;
4
- y: number;
5
- width: number;
6
- height: number;
7
- }
8
- interface DetectFrameDiagnostics {
9
- sourceWidth: number;
10
- sourceHeight: number;
11
- detectedBounds: DetectBounds | null;
12
- centerOffsetX: number;
13
- centerOffsetY: number;
14
- coverageX: number;
15
- coverageY: number;
16
- }
17
- interface DetectMarginDiagnostics {
18
- left: number;
19
- top: number;
20
- right: number;
21
- bottom: number;
22
- }
23
- interface DetectPostCommitDiagnostics {
24
- frame: DetectFrameDiagnostics;
25
- margin: DetectMarginDiagnostics | null;
26
- expectedExpand: number;
27
- marginDeltaFromExpected: DetectMarginDiagnostics | null;
28
- marginAsymmetry: {
29
- x: number;
30
- y: number;
31
- } | null;
32
- }
33
- interface ExportUserCroppedImageResult {
34
- url: string;
35
- width: number;
36
- height: number;
37
- multiplier: number;
38
- format: "png" | "jpeg";
39
- imageIds: string[];
40
- }
2
+ import { ImageOperation, ImageTransformUpdates, ImageViewState } from '../../kit/src/index.ts';
3
+ import { PooderDetectDielineFromFrameOptions, PooderDetectDielineFromFrameResult, PooderEditorImageStateChangeHandler, PooderExportUserCroppedImageOptions, PooderExportUserCroppedImageResult as ExportUserCroppedImageResult, PooderFocusImageOptions, PooderGenerateCutImageOptions, PooderImageTarget, PooderUpsertImageOptions, PooderUploadAndDetectEdgeOptions, PooderUploadAndDetectEdgeResult } from './model';
41
4
  declare const _default: import('vue').DefineComponent<{}, {
42
5
  importConfig: (config: Record<string, any>) => void;
43
6
  exportConfig: () => Record<string, any>;
44
- getImages: () => never[];
45
- generateCutImage: (options?: {
46
- debug?: boolean;
47
- }) => Promise<string | null>;
7
+ generateCutImage: (options?: PooderGenerateCutImageOptions) => Promise<string | null>;
48
8
  addImage: (url: string, options?: any) => Promise<any>;
49
- upsertImage: (url: string, options?: {
50
- id?: string;
51
- mode?: "replace" | "add";
52
- addOptions?: any;
53
- fitOnAdd?: boolean;
9
+ upsertImage: (url: string, options?: PooderUpsertImageOptions) => Promise<any>;
10
+ getImageState: () => Promise<ImageViewState>;
11
+ onImageStateChange: (handler: PooderEditorImageStateChangeHandler) => () => void;
12
+ applyImageOperation: (id: string, operation: ImageOperation, options?: {
13
+ target?: PooderImageTarget;
14
+ }) => Promise<any>;
15
+ setImageTransform: (id: string, updates: ImageTransformUpdates, options?: {
16
+ target?: PooderImageTarget;
54
17
  }) => Promise<any>;
55
18
  updateImage: (id: string, options?: any) => Promise<any>;
56
19
  clearImages: () => Promise<any>;
57
- exportUserCroppedImage: (options?: {
58
- multiplier?: number;
59
- format?: "png" | "jpeg";
60
- imageIds?: string[];
61
- }) => Promise<ExportUserCroppedImageResult>;
62
- focusImage: (id: string | null, options?: {
63
- syncCanvasSelection?: boolean;
64
- }) => Promise<any>;
20
+ exportUserCroppedImage: (options?: PooderExportUserCroppedImageOptions) => Promise<ExportUserCroppedImageResult>;
21
+ focusImage: (id: string | null, options?: PooderFocusImageOptions) => Promise<any>;
65
22
  detectDieline: (url: string) => Promise<string | null>;
66
- detectDielineFromFrame: (options?: {
67
- detect?: {
68
- expand?: number;
69
- smoothing?: boolean;
70
- simplifyTolerance?: number;
71
- threshold?: number;
72
- debug?: boolean;
73
- };
74
- export?: {
75
- multiplier?: number;
76
- format?: "png" | "jpeg";
77
- imageIds?: string[];
78
- };
79
- inspect?: {
80
- includeCroppedImage?: boolean;
81
- includeDiagnostics?: boolean;
82
- };
83
- commit?: boolean;
84
- }) => Promise<{
85
- diagnostics?: DetectFrameDiagnostics | undefined;
86
- postCommitDiagnostics?: DetectPostCommitDiagnostics | null | undefined;
87
- sourceImage?: ExportUserCroppedImageResult | undefined;
88
- pathData: string;
89
- rawBounds?: DetectBounds;
90
- baseBounds?: DetectBounds;
91
- imageWidth?: number;
92
- imageHeight?: number;
93
- } | null>;
94
- uploadAndDetectEdge: (url: string, options?: {
95
- expand?: number;
96
- smoothing?: boolean;
97
- simplifyTolerance?: number;
98
- }) => Promise<{
99
- imageId: any;
100
- url: string;
101
- pathData: string;
102
- } | null>;
23
+ detectDielineFromFrame: (options?: PooderDetectDielineFromFrameOptions) => Promise<PooderDetectDielineFromFrameResult | null>;
24
+ uploadAndDetectEdge: (url: string, options?: PooderUploadAndDetectEdgeOptions) => Promise<PooderUploadAndDetectEdgeResult | null>;
103
25
  activateTool: (id: string | null) => Promise<import('../../core/src/services/WorkbenchService').ToolSwitchResult>;
104
26
  deactivateTool: () => Promise<import('../../core/src/services/WorkbenchService').ToolSwitchResult>;
105
27
  on: (event: string, handler: any) => void;
106
28
  off: (event: string, handler: any) => void;
107
29
  emit: (event: string, data: any) => void;
108
- executeCommand: (id: string, ...args: any[]) => Promise<any>;
109
- getConfig: (key: string) => any;
30
+ executeCommand: <T = unknown>(id: string, ...args: any[]) => Promise<T>;
31
+ getConfig: <T = unknown>(key: string) => T;
110
32
  updateConfig: (key: string, val: any) => void;
111
33
  services: {
112
34
  workbench: WorkbenchService;
@@ -114,8 +36,8 @@ declare const _default: import('vue').DefineComponent<{}, {
114
36
  config: ConfigurationService;
115
37
  };
116
38
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
117
- "image-change": (images: any[]) => any;
39
+ "image-state-change": (state: ImageViewState) => any;
118
40
  }, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
119
- "onImage-change"?: ((images: any[]) => any) | undefined;
41
+ "onImage-state-change"?: ((state: ImageViewState) => any) | undefined;
120
42
  }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
121
43
  export default _default;
@@ -1,4 +1,5 @@
1
1
  import { default as PooderEditor } from './PooderEditor.vue';
2
2
  export { PooderEditor };
3
+ export * from './model';
3
4
  export * from '../../core/src/index.ts';
4
5
  export * from '../../kit/src/index.ts';
@@ -0,0 +1,145 @@
1
+ import { CommandService, ConfigurationService, WorkbenchService } from '../../core/src/index.ts';
2
+ import { ImageOperation, ImageTransformUpdates, ImageViewState } from '../../kit/src/index.ts';
3
+ export type PooderImageTarget = "auto" | "config" | "working";
4
+ export type PooderEditorEventHandler = (data: any) => void;
5
+ export type PooderEditorImageStateChangeHandler = (state: ImageViewState) => void;
6
+ export interface PooderGenerateCutImageOptions {
7
+ debug?: boolean;
8
+ }
9
+ export interface PooderUpsertImageOptions {
10
+ id?: string;
11
+ mode?: "replace" | "add";
12
+ addOptions?: any;
13
+ operation?: ImageOperation;
14
+ }
15
+ export interface PooderExportUserCroppedImageOptions {
16
+ multiplier?: number;
17
+ format?: "png" | "jpeg";
18
+ imageIds?: string[];
19
+ }
20
+ export interface PooderExportUserCroppedImageResult {
21
+ url: string;
22
+ width: number;
23
+ height: number;
24
+ multiplier: number;
25
+ format: "png" | "jpeg";
26
+ imageIds: string[];
27
+ }
28
+ export interface PooderDetectBounds {
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ }
34
+ export interface PooderDetectEdgeResult {
35
+ pathData: string;
36
+ rawBounds?: PooderDetectBounds;
37
+ baseBounds?: PooderDetectBounds;
38
+ imageWidth?: number;
39
+ imageHeight?: number;
40
+ }
41
+ export interface PooderDetectFrameDiagnostics {
42
+ sourceWidth: number;
43
+ sourceHeight: number;
44
+ detectedBounds: PooderDetectBounds | null;
45
+ centerOffsetX: number;
46
+ centerOffsetY: number;
47
+ coverageX: number;
48
+ coverageY: number;
49
+ }
50
+ export interface PooderDetectMarginDiagnostics {
51
+ left: number;
52
+ top: number;
53
+ right: number;
54
+ bottom: number;
55
+ }
56
+ export interface PooderDetectPostCommitDiagnostics {
57
+ frame: PooderDetectFrameDiagnostics;
58
+ margin: PooderDetectMarginDiagnostics | null;
59
+ expectedExpand: number;
60
+ marginDeltaFromExpected: PooderDetectMarginDiagnostics | null;
61
+ marginAsymmetry: {
62
+ x: number;
63
+ y: number;
64
+ } | null;
65
+ }
66
+ export interface PooderDetectDielineOptions {
67
+ expand?: number;
68
+ smoothing?: boolean;
69
+ simplifyTolerance?: number;
70
+ threshold?: number;
71
+ debug?: boolean;
72
+ }
73
+ export interface PooderDetectDielineFromFrameOptions {
74
+ detect?: PooderDetectDielineOptions;
75
+ export?: PooderExportUserCroppedImageOptions;
76
+ inspect?: {
77
+ includeCroppedImage?: boolean;
78
+ includeDiagnostics?: boolean;
79
+ };
80
+ commit?: boolean;
81
+ }
82
+ export interface PooderDetectDielineFromFrameResult extends PooderDetectEdgeResult {
83
+ sourceImage?: PooderExportUserCroppedImageResult;
84
+ diagnostics?: PooderDetectFrameDiagnostics;
85
+ postCommitDiagnostics?: PooderDetectPostCommitDiagnostics | null;
86
+ }
87
+ export interface PooderUploadAndDetectEdgeOptions {
88
+ expand?: number;
89
+ smoothing?: boolean;
90
+ simplifyTolerance?: number;
91
+ }
92
+ export interface PooderUploadAndDetectEdgeResult {
93
+ imageId: string;
94
+ url: string;
95
+ pathData: string;
96
+ }
97
+ export interface PooderFocusImageOptions {
98
+ syncCanvasSelection?: boolean;
99
+ }
100
+ export interface PooderEditorServices {
101
+ workbench: WorkbenchService;
102
+ command: CommandService;
103
+ config: ConfigurationService;
104
+ }
105
+ export interface PooderToolSwitchResult {
106
+ ok: boolean;
107
+ from: string | null;
108
+ to: string | null;
109
+ reason?: string;
110
+ }
111
+ export interface PooderEditorExposed {
112
+ importConfig(config: Record<string, any>): void;
113
+ exportConfig(): Record<string, any>;
114
+ generateCutImage(options?: PooderGenerateCutImageOptions): Promise<string | null>;
115
+ addImage(url: string, options?: any): Promise<string>;
116
+ upsertImage(url: string, options?: PooderUpsertImageOptions): Promise<{
117
+ id: string;
118
+ mode: "replace" | "add";
119
+ }>;
120
+ getImageState(): Promise<ImageViewState>;
121
+ onImageStateChange(handler: PooderEditorImageStateChangeHandler): () => void;
122
+ applyImageOperation(id: string, operation: ImageOperation, options?: {
123
+ target?: PooderImageTarget;
124
+ }): Promise<void>;
125
+ setImageTransform(id: string, updates: ImageTransformUpdates, options?: {
126
+ target?: PooderImageTarget;
127
+ }): Promise<void>;
128
+ updateImage(id: string, options?: any): Promise<void>;
129
+ clearImages(): Promise<void>;
130
+ exportUserCroppedImage(options?: PooderExportUserCroppedImageOptions): Promise<PooderExportUserCroppedImageResult>;
131
+ focusImage(id: string | null, options?: PooderFocusImageOptions): Promise<any>;
132
+ detectDieline(url: string): Promise<string | null>;
133
+ detectDielineFromFrame(options?: PooderDetectDielineFromFrameOptions): Promise<PooderDetectDielineFromFrameResult | null>;
134
+ uploadAndDetectEdge(url: string, options?: PooderUploadAndDetectEdgeOptions): Promise<PooderUploadAndDetectEdgeResult | null>;
135
+ activateTool(id: string | null): Promise<PooderToolSwitchResult>;
136
+ deactivateTool(): Promise<PooderToolSwitchResult>;
137
+ on(event: string, handler: PooderEditorEventHandler): void;
138
+ off(event: string, handler: PooderEditorEventHandler): void;
139
+ emit(event: string, data: any): void;
140
+ executeCommand<T = unknown>(id: string, ...args: any[]): Promise<T>;
141
+ getConfig<T = unknown>(key: string): T;
142
+ updateConfig(key: string, val: any): void;
143
+ services: PooderEditorServices;
144
+ }
145
+ export type PooderEditorImageApi = Pick<PooderEditorExposed, "addImage" | "upsertImage" | "getImageState" | "onImageStateChange" | "applyImageOperation" | "setImageTransform" | "updateImage" | "clearImages" | "focusImage">;
package/dist/vue.css CHANGED
@@ -1 +1 @@
1
- .pooder-canvas-area[data-v-203ff8d9]{flex:1;width:100%;height:100%;min-height:650px;min-width:650px;overflow:hidden;background:#ececec;position:relative}canvas[data-v-203ff8d9]{display:block}.pooder-editor[data-v-32ae317e]{display:flex;width:100%;height:100%;overflow:hidden}
1
+ .pooder-canvas-area[data-v-203ff8d9]{flex:1;width:100%;height:100%;min-height:650px;min-width:650px;overflow:hidden;background:#ececec;position:relative}canvas[data-v-203ff8d9]{display:block}.pooder-editor[data-v-0f508bf4]{display:flex;width:100%;height:100%;overflow:hidden}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pooder/vue",
3
- "version": "4.4.4",
3
+ "version": "4.5.0",
4
4
  "main": "./dist/index.umd.js",
5
5
  "module": "./dist/index.es.js",
6
6
  "types": "./dist/index.d.ts",
@@ -19,8 +19,8 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@pooder/core": "2.2.1",
23
- "@pooder/kit": "6.2.1"
22
+ "@pooder/kit": "6.3.0",
23
+ "@pooder/core": "2.2.1"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "vue": "^3.0.0"