ablok-photobooth 0.2.41 → 0.2.43

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.
@@ -1,6 +1,6 @@
1
- import { _ as a } from "./chunks/photo-app.vue_vue_type_style_index_0_lang-CQsO0T0U.js";
2
- import { _ as e } from "./chunks/fabric-canvas.vue_vue_type_style_index_0_lang-B-D65X2t.js";
3
- import { _ as s } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-BHKoShl5.js";
1
+ import { _ as a } from "./chunks/photo-app.vue_vue_type_style_index_0_lang-BdQvhbLS.js";
2
+ import { _ as e } from "./chunks/fabric-canvas.vue_vue_type_style_index_0_lang-C9fwZf_Y.js";
3
+ import { _ as s } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-CRbsZZLr.js";
4
4
  import { _ as m } from "./chunks/face-swap.vue_vue_type_style_index_0_lang-B0EJ4Q3T.js";
5
5
  import { _ } from "./chunks/color-booth.vue_vue_type_style_index_0_lang-Cxo8ZMRt.js";
6
6
  export {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as x, ref as c, computed as l, watch as S, openBlock as u, createElementBlock as v, createElementVNode as h, createVNode as B, normalizeClass as M, createCommentVNode as b, createBlock as V } from "vue";
2
2
  import w from "ablok-components/components/molecules/media-thumbnails/media-thumbnails.vue";
3
- import { _ as A } from "./fabric-canvas.vue_vue_type_style_index_0_lang-B-D65X2t.js";
3
+ import { _ as A } from "./fabric-canvas.vue_vue_type_style_index_0_lang-C9fwZf_Y.js";
4
4
  const C = { class: "creative-booth" }, D = { class: "media-container" }, O = ["innerHTML"], E = { class: "creative-booth__thumbnails" }, F = [
5
5
  {
6
6
  type: "background",
@@ -0,0 +1,316 @@
1
+ import { defineComponent as Z, ref as j, watch as ee, onMounted as te, onUnmounted as ae, openBlock as ne, createElementBlock as oe, createElementVNode as M, renderSlot as re } from "vue";
2
+ import { debounce as ie } from "lodash";
3
+ function O(i) {
4
+ return new Promise((c, l) => {
5
+ i.oncomplete = i.onsuccess = () => c(i.result), i.onabort = i.onerror = () => l(i.error);
6
+ });
7
+ }
8
+ function se(i, c) {
9
+ const l = indexedDB.open(i);
10
+ l.onupgradeneeded = () => l.result.createObjectStore(c);
11
+ const d = O(l);
12
+ return (p, w) => d.then(
13
+ (u) => w(u.transaction(c, p).objectStore(c))
14
+ );
15
+ }
16
+ let _;
17
+ function A() {
18
+ return _ || (_ = se("keyval-store", "keyval")), _;
19
+ }
20
+ function le(i, c = A()) {
21
+ return c("readonly", (l) => O(l.get(i)));
22
+ }
23
+ function ce(i, c, l = A()) {
24
+ return l("readwrite", (d) => (d.put(c, i), O(d.transaction)));
25
+ }
26
+ function de(i, c = A()) {
27
+ return c("readwrite", (l) => (l.delete(i), O(l.transaction)));
28
+ }
29
+ const ue = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23ffffffCC'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-rotate-cw'%3e%3cpolyline%20points='23%204%2023%2010%2017%2010'%3e%3c/polyline%3e%3cpath%20d='M20.49%2015a9%209%200%201%201-2.12-9.36L23%2010'%3e%3c/path%3e%3c/svg%3e", fe = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23ffffffCC'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-x-circle'%3e%3ccircle%20cx='12'%20cy='12'%20r='10'%20fill='none'%3e%3c/circle%3e%3cline%20x1='15'%20y1='9'%20x2='9'%20y2='15'%20fill='none'%3e%3c/line%3e%3cline%20x1='9'%20y1='9'%20x2='15'%20y2='15'%20fill='none'%3e%3c/line%3e%3c/svg%3e", ge = { class: "fabric-canvas__canvas" }, me = {
30
+ id: "fabricCanvas",
31
+ ref: "canvasRef"
32
+ }, ye = /* @__PURE__ */ Z({
33
+ __name: "fabric-canvas",
34
+ props: {
35
+ modelValue: {
36
+ type: String,
37
+ default: ""
38
+ },
39
+ jsonModel: {
40
+ type: null,
41
+ default: void 0
42
+ },
43
+ exportToSvg: {
44
+ type: Boolean,
45
+ default: !1
46
+ },
47
+ resetState: {
48
+ type: Boolean,
49
+ default: !1
50
+ },
51
+ options: {
52
+ type: Object,
53
+ default: () => ({})
54
+ },
55
+ feature: {
56
+ type: String,
57
+ default: ""
58
+ },
59
+ required: {
60
+ type: Boolean,
61
+ default: !1
62
+ },
63
+ pending: {
64
+ type: Boolean,
65
+ default: !1
66
+ },
67
+ emitPending: {
68
+ type: Boolean,
69
+ default: !1
70
+ },
71
+ animationDuration: {
72
+ type: Number,
73
+ default: 0
74
+ }
75
+ },
76
+ emits: ["update:modelValue", "update:jsonModel", "update:pending", "on-ready"],
77
+ setup(i, { expose: c, emit: l }) {
78
+ let d, p, w, u, F, x, R, C;
79
+ const b = l;
80
+ c({ setBackgroundImage: N, setOverlayImage: X, addCanvasObject: Y });
81
+ const o = i, v = j(), f = j(0), g = j(0);
82
+ let a, E = !1;
83
+ const T = j();
84
+ async function G(e, t) {
85
+ return new Promise(async (n) => {
86
+ const r = JSON.parse(t);
87
+ if (r.backgroundImage) {
88
+ const s = await h(r.backgroundImage.src || r.backgroundImage.filename);
89
+ s.set({
90
+ opacity: 1
91
+ }), e.backgroundImage = s, e.centerObject(s);
92
+ }
93
+ if (r.overlayImage) {
94
+ const s = await h(r.overlayImage.src || r.overlayImage.filename);
95
+ s.set({
96
+ opacity: 1
97
+ }), e.overlayImage = D(s), e.centerObject(s);
98
+ }
99
+ (await u.enlivenObjects(r.objects, {
100
+ reviver: void 0
101
+ })).forEach((s) => {
102
+ e.add(s);
103
+ }), n(e);
104
+ });
105
+ }
106
+ async function h(e) {
107
+ const t = await B(e);
108
+ e.includes("data:image") || (t.filename = e);
109
+ const n = u.findScaleToCover(t, a), r = t instanceof p;
110
+ return t.set({
111
+ left: 0,
112
+ top: 0,
113
+ opacity: r && o.animationDuration > 0 ? 0 : 1,
114
+ scaleX: n,
115
+ scaleY: n,
116
+ src: e
117
+ }), t;
118
+ }
119
+ async function k(e) {
120
+ !(e instanceof p) || o.animationDuration === 0 || (o.emitPending && b("update:pending", !0), await new Promise((n) => {
121
+ const r = o.animationDuration, S = Date.now(), s = () => {
122
+ const I = Date.now() - S, m = Math.min(I / r, 1);
123
+ e.set("opacity", m), a.renderAll(), m < 1 ? requestAnimationFrame(s) : (o.emitPending && b("update:pending", !1), n());
124
+ };
125
+ requestAnimationFrame(s);
126
+ }));
127
+ }
128
+ function U(e) {
129
+ const t = u.findScaleToCover(e, a);
130
+ return e.set({
131
+ scaleX: t,
132
+ scaleY: t
133
+ }), e;
134
+ }
135
+ async function N(e) {
136
+ const t = await h(e.src);
137
+ a.backgroundImage = t, a.centerObject(t), a.renderAll(), await k(t), y();
138
+ }
139
+ function D(e) {
140
+ return e.set({
141
+ scaleX: f.value / e.width,
142
+ scaleY: g.value / e.height
143
+ }), e;
144
+ }
145
+ async function P(e) {
146
+ const t = await h(e.src);
147
+ t.selectable = !1, t.assetType = "foreground", a.add(t), a.centerObject(t), a.renderAll(), await k(t), y();
148
+ }
149
+ async function X(e) {
150
+ const t = await h(e.src);
151
+ a.overlayImage = D(t), a.centerObject(t), a.renderAll(), await k(t), y();
152
+ }
153
+ async function Y(e) {
154
+ a.discardActiveObject();
155
+ const t = await B(e.src);
156
+ t.filename = e.src;
157
+ const n = f.value / 3, r = g.value / 3, S = n / t.width, s = r / t.height, I = Math.min(S, s);
158
+ t.set({
159
+ scaleX: I,
160
+ scaleY: I,
161
+ left: f.value / 2,
162
+ top: g.value / 2
163
+ }), t.id = e.id, t.padding = 8, a.add(t), a.setActiveObject(t), await k(t), a.renderAll();
164
+ }
165
+ function L(e, t) {
166
+ t.target.id;
167
+ const n = t.target;
168
+ return a.remove(n), a.requestRenderAll(), !0;
169
+ }
170
+ function W() {
171
+ if (!(!v.value || !a)) {
172
+ if (f.value = v.value.offsetWidth, g.value = v.value.offsetHeight, a.setDimensions({ width: f.value, height: g.value }), a.backgroundImage && (a.backgroundImage = U(a.backgroundImage), a.centerObject(a.backgroundImage)), a.overlayImage) {
173
+ const e = a.overlayImage;
174
+ a.overlayImage = D(e), a.centerObject(e);
175
+ }
176
+ a.getObjects().forEach((e) => {
177
+ e.assetType === "foreground" && (e = U(e), a.centerObject(e));
178
+ }), a.renderAll();
179
+ }
180
+ }
181
+ const V = ie(() => {
182
+ W();
183
+ }, 200, { trailing: !0, leading: !1 });
184
+ function z(e) {
185
+ return (t, n, r, S, s) => {
186
+ t.save(), t.translate(n, r), t.rotate(u.degreesToRadians(s.angle)), t.fillStyle = o.options.themeData?.colors?.primary, t.fillRect(-24 / 2, -24 / 2, 24, 24);
187
+ const m = 20;
188
+ t.drawImage(e, -m / 2, -m / 2, m, m), t.restore();
189
+ };
190
+ }
191
+ function q() {
192
+ const e = document.createElement("img");
193
+ e.src = ue;
194
+ const t = document.createElement("img");
195
+ t.src = fe, a.on("object:added", (n) => {
196
+ n.target && n.target.controls && (n.target.set({
197
+ transparentCorners: !1,
198
+ cornerSize: 16,
199
+ cornerStyle: "circle",
200
+ ...o.options.themeData?.colors?.primary ? {
201
+ cornerColor: o.options.themeData?.colors?.primary,
202
+ cornerStrokeColor: o.options.themeData?.colors?.primary,
203
+ borderColor: o.options.themeData?.colors?.primary
204
+ } : {}
205
+ }), n.target.controls.ml.visible = !1, n.target.controls.mr.visible = !1, n.target.controls.mb.visible = !1, n.target.controls.mt.visible = !1, n.target.controls.mtr.visible = !1, n.target.controls.rotate = new w({
206
+ x: 0.5,
207
+ y: -0.5,
208
+ offsetX: 32,
209
+ offsetY: 0,
210
+ cursorStyle: "pointer",
211
+ actionName: "rotate",
212
+ actionHandler: C.rotationWithSnapping,
213
+ cursorStyleHandler: C.rotationStyleHandler,
214
+ render: z(e)
215
+ }), n.target.controls.delete = new w({
216
+ x: 0.5,
217
+ y: -0.5,
218
+ offsetX: 32,
219
+ offsetY: 32,
220
+ cursorStyle: "pointer",
221
+ mouseUpHandler: L,
222
+ render: z(t)
223
+ }));
224
+ });
225
+ }
226
+ async function J() {
227
+ return await new Promise((e) => {
228
+ setTimeout(() => {
229
+ const t = o.exportToSvg ? a.toSVG() : a.toDataURL({ multiplier: 2 });
230
+ e(t);
231
+ }, 200);
232
+ });
233
+ }
234
+ function y() {
235
+ setTimeout(async () => {
236
+ const e = a.toDatalessJSON(["selectable", "assetType", "filename"]);
237
+ await ce("fabric-canvas", JSON.stringify(e));
238
+ let t = !0;
239
+ if (o.required)
240
+ switch (t = !1, o.feature) {
241
+ case "overlay":
242
+ e.overlayImage && (t = !0);
243
+ break;
244
+ case "background":
245
+ e.backgroundImage && (t = !0);
246
+ break;
247
+ case "stickers":
248
+ e.objects.length > 1 && (t = !0);
249
+ break;
250
+ default:
251
+ (e.objects.length > 1 || e.backgroundImage || e.overlayImage) && (t = !0);
252
+ }
253
+ if (t) {
254
+ E = !0;
255
+ const n = await J();
256
+ b("update:modelValue", n), b("update:jsonModel", e);
257
+ }
258
+ }, 120);
259
+ }
260
+ async function $(e) {
261
+ try {
262
+ return await p.fromURL(e);
263
+ } catch (t) {
264
+ throw console.error("Error loading image:", t), t;
265
+ }
266
+ }
267
+ async function K(e) {
268
+ const { objects: t, options: n } = await F(e);
269
+ return u.groupSVGElements(t, n);
270
+ }
271
+ async function Q(e) {
272
+ const { objects: t, options: n } = await x(e);
273
+ return u.groupSVGElements(t, n);
274
+ }
275
+ async function B(e) {
276
+ return e && typeof e == "string" && e.trim().startsWith("<") ? await Q(e) : e && new RegExp(/([\w_/-]*\.svg$)|(image\/svg\+xml)/gi).test(e) ? await K(e) : await $(e);
277
+ }
278
+ async function H(e, t) {
279
+ e && !t && !E && await P({ src: e });
280
+ }
281
+ return ee(() => o.modelValue, async (e, t) => {
282
+ a && await H(e, t);
283
+ }), te(async () => {
284
+ ({ Canvas: d, FabricImage: p, Control: w, util: u, loadSVGFromURL: F, loadSVGFromString: x, config: R, controlsUtils: C } = await import("fabric")), f.value = v.value.offsetWidth, g.value = v.value.offsetHeight, window.addEventListener("resize", V), R.NUM_FRACTION_DIGITS = 8;
285
+ const e = d.prototype._onTouchStart;
286
+ d.prototype._onTouchStart = function(t) {
287
+ const n = this.findTarget(t);
288
+ this.allowTouchScrolling && n.assetType && !this.isDrawingMode || e.call(this, t);
289
+ }, a = new d("fabricCanvas", {
290
+ width: f.value,
291
+ height: g.value,
292
+ // enableRetinaScaling: false,
293
+ skipOffscreen: !0,
294
+ // devicePixelRatio: 4,
295
+ allowTouchScrolling: !0
296
+ // backstoreOnly: true
297
+ }), o.resetState && await de("fabric-canvas"), T.value = await le("fabric-canvas"), T.value ? (await G(a, T.value), a.requestRenderAll(), requestAnimationFrame(() => {
298
+ a.renderAll();
299
+ })) : o.modelValue && H(o.modelValue, ""), a.on("object:added", y), a.on("object:removed", y), a.on("object:modified", y), q(), a.renderAll(), b("on-ready", a);
300
+ }), ae(() => {
301
+ window.removeEventListener("resize", V);
302
+ }), (e, t) => (ne(), oe("div", {
303
+ class: "fabric-canvas",
304
+ ref_key: "root",
305
+ ref: v
306
+ }, [
307
+ M("div", ge, [
308
+ M("canvas", me, null, 512)
309
+ ]),
310
+ re(e.$slots, "default")
311
+ ], 512));
312
+ }
313
+ });
314
+ export {
315
+ ye as _
316
+ };
@@ -1,8 +1,8 @@
1
- import { defineComponent as gA, getCurrentInstance as sA, computed as b, ref as B, watch as F, onMounted as rA, openBlock as t, createElementBlock as s, normalizeClass as f, normalizeStyle as v, createVNode as E, createCommentVNode as r, createBlock as Q, Transition as iA, withCtx as D, createElementVNode as n, withModifiers as M, toDisplayString as i, withDirectives as U, vShow as G, Fragment as CA, renderList as cA, createTextVNode as y, renderSlot as X, unref as $ } from "vue";
1
+ import { defineComponent as rA, getCurrentInstance as gA, computed as b, ref as B, watch as F, onMounted as sA, openBlock as t, createElementBlock as g, normalizeClass as f, normalizeStyle as v, createVNode as E, createCommentVNode as s, createBlock as Q, Transition as iA, withCtx as D, createElementVNode as n, withModifiers as M, toDisplayString as i, withDirectives as U, vShow as G, Fragment as cA, renderList as CA, createTextVNode as y, renderSlot as X, unref as $ } from "vue";
2
2
  import uA from "ablok-components/components/molecules/base-camera/base-camera.vue";
3
3
  import dA from "ablok-components/components/atoms/base-image/base-image.vue";
4
4
  import IA from "ablok-components/components/atoms/loading-spinner/loading-spinner.vue";
5
- import k from "ablok-components/components/atoms/base-button/base-button.vue";
5
+ import O from "ablok-components/components/atoms/base-button/base-button.vue";
6
6
  import p from "ablok-components/components/atoms/svg-icon/svg-icon.vue";
7
7
  import BA from "ablok-components/components/atoms/input-file/input-file.vue";
8
8
  import { useCameraFilter as fA } from "ablok-components/composables/useCameraFilter";
@@ -11,10 +11,10 @@ import { g as EA, f as j, a as vA, b as QA, c as q, M as mA } from "./media-api-
11
11
  const bA = "data:image/png;base64,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", DA = { class: "photo-app__drop-target__canvas" }, yA = { class: "flex-grow-1 text-center" }, pA = ["innerHTML"], hA = { class: "ml-2" }, PA = {
12
12
  key: 0,
13
13
  class: "d-flex flex-column align-center justify-center"
14
- }, MA = { key: 0 }, LA = { class: "photo-app__errors mt-2" }, HA = { class: "error--text" }, kA = {
14
+ }, MA = { key: 0 }, LA = { class: "photo-app__errors mt-2" }, HA = { class: "error--text" }, OA = {
15
15
  key: 1,
16
16
  class: "photo-app__file-list"
17
- }, OA = { class: "row" }, YA = { key: 0 }, FA = { key: 1 }, UA = { key: 2 }, GA = { key: 3 }, SA = { class: "photo-app__form-input text-center" }, zA = { class: "photo-app__controls" }, RA = { class: "row" }, NA = { class: "col col-12" }, jA = ["innerHTML"], JA = {
17
+ }, kA = { class: "row" }, YA = { key: 0 }, FA = { key: 1 }, UA = { key: 2 }, GA = { key: 3 }, SA = { class: "photo-app__form-input text-center" }, zA = { class: "photo-app__controls" }, RA = { class: "row" }, NA = { class: "col col-12" }, jA = ["innerHTML"], JA = {
18
18
  key: 0,
19
19
  class: "d-flex justify-center col-8 mx-auto"
20
20
  }, TA = { class: "col" }, ZA = {
@@ -23,7 +23,7 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
23
23
  }, xA = {
24
24
  key: 1,
25
25
  class: "col"
26
- }, WA = ["required", "value"], oe = /* @__PURE__ */ gA({
26
+ }, WA = ["required", "value"], oe = /* @__PURE__ */ rA({
27
27
  __name: "photo-app",
28
28
  props: {
29
29
  modelValue: {
@@ -179,79 +179,83 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
179
179
  enableZoomSlider: {
180
180
  type: Boolean,
181
181
  default: !1
182
+ },
183
+ correctOrientation: {
184
+ type: Boolean,
185
+ default: !1
182
186
  }
183
187
  },
184
188
  emits: ["update:modelValue"],
185
189
  setup(A, { emit: _ }) {
186
- const { tm: KA } = wA(), J = sA(), S = J && J.appContext.config.globalProperties.$config, g = A, AA = _, eA = b(() => S.baseMediaPath), aA = b(() => l.value && l.value.length && l.value.filter((e) => e.response && Object.keys(e.response).length).length === l.value.length), z = b(() => {
190
+ const { tm: KA } = wA(), J = gA(), S = J && J.appContext.config.globalProperties.$config, r = A, AA = _, eA = b(() => S.baseMediaPath), aA = b(() => l.value && l.value.length && l.value.filter((e) => e.response && Object.keys(e.response).length).length === l.value.length), z = b(() => {
187
191
  const e = l.value.find((a) => a.response && a.response.path);
188
192
  return e && e.response.path;
189
193
  }), T = b(() => z.value ? `${eA.value}${z.value}` : ""), u = b(() => ({
190
- ...g.i18n ? g.i18n.messages : {},
191
- ...g.messages
194
+ ...r.i18n ? r.i18n.messages : {},
195
+ ...r.messages
192
196
  }));
193
197
  b(() => !!(l.value && l.value.length));
194
- const tA = b(() => l.value.length ? u.value.reviewTitle : u.value.captureTitle), l = B([]), L = B(), Z = B(), R = B(), O = B(!1), C = B(!1), N = B(), I = B(), w = B(!1), x = B("");
198
+ const tA = b(() => l.value.length ? u.value.reviewTitle : u.value.captureTitle), l = B([]), L = B(), Z = B(), R = B(), k = B(!1), c = B(!1), N = B(), I = B(), w = B(!1), x = B("");
195
199
  F(N, async (e, a) => {
196
200
  if (e) {
197
- const o = e.blob && e.blob.type.split("/")[1], c = new File([e.blob], `${e.id}.${o}`), d = await EA(c), h = await j(c), H = await vA(h, d), P = await (await fetch(H)).blob();
201
+ const o = e.blob && e.blob.type.split("/")[1], C = new File([e.blob], `${e.id}.${o}`), d = await EA(C), h = await j(C), H = await vA(h, d), P = await (await fetch(H)).blob();
198
202
  l.value.push(new File([P], `${e.id}.${o}`, {
199
203
  type: P.type
200
204
  })), w.value = !1, lA();
201
205
  }
202
206
  }, { deep: !0 }), F(l, async (e, a) => {
203
- if (g.enableInstantUpload)
207
+ if (r.enableInstantUpload)
204
208
  e.find((o) => !o.response.path) && (L.value.active = !0);
205
209
  else {
206
- const o = await Promise.all(e.map(async (c) => {
207
- let d = await j(c);
208
- g.downScaleImages && Number(g.maxFileSize) && c.size > Number(g.maxFileSize) && (d = await QA(d, 800, 800));
209
- const h = g.ratio.split("x");
210
+ const o = await Promise.all(e.map(async (C) => {
211
+ let d = await j(C);
212
+ r.downScaleImages && Number(r.maxFileSize) && C.size > Number(r.maxFileSize) && (d = await QA(d, 800, 800));
213
+ const h = r.ratio.split("x");
210
214
  return await q(d, Number(h[0]) / Number(h[1]));
211
215
  }));
212
216
  I.value = o[0];
213
217
  }
214
218
  }, { deep: !0 }), F(aA, async (e, a) => {
215
- e && !a && (I.value = g.enableInstantUpload ? z.value : await q(T.value));
219
+ e && !a && (I.value = r.enableInstantUpload ? z.value : await q(T.value));
216
220
  }, { deep: !0 }), F(I, async (e, a) => {
217
- g.enableAutoSave && I !== a && K();
221
+ r.enableAutoSave && I !== a && K();
218
222
  });
219
223
  function W() {
220
224
  I.value = "", l.value = [], w.value = !1;
221
225
  }
222
226
  function lA() {
223
- C.value = !1;
227
+ c.value = !1;
224
228
  }
225
229
  function Y() {
226
- W(), C.value = !C.value;
230
+ W(), c.value = !c.value;
227
231
  }
228
232
  async function oA(e) {
229
- if (!g.filter) {
233
+ if (!r.filter) {
230
234
  l.value = e;
231
235
  return;
232
236
  }
233
237
  const { applyFilterToImageBlob: a } = fA({
234
- ...g,
235
- filter: g.filter ?? "none",
236
- tintColor: g.tint?.color ?? "",
237
- tintIntensity: g.tint?.intensity ?? 0
238
- }), o = await Promise.all((e || []).map(async (c) => {
239
- const d = c?.file instanceof File ? c.file : c instanceof File ? c : null;
238
+ ...r,
239
+ filter: r.filter ?? "none",
240
+ tintColor: r.tint?.color ?? "",
241
+ tintIntensity: r.tint?.intensity ?? 0
242
+ }), o = await Promise.all((e || []).map(async (C) => {
243
+ const d = C?.file instanceof File ? C.file : C instanceof File ? C : null;
240
244
  if (!d)
241
- return c;
245
+ return C;
242
246
  const h = await j(d), H = await a(h), m = new File([H], d.name, {
243
247
  type: H.type || d.type,
244
248
  lastModified: d.lastModified
245
249
  });
246
- if (c?.file instanceof File) {
250
+ if (C?.file instanceof File) {
247
251
  const P = window.URL || window.webkitURL;
248
252
  return {
249
- ...c,
253
+ ...C,
250
254
  file: m,
251
255
  size: m.size,
252
256
  type: m.type,
253
257
  name: m.name,
254
- blob: P && P.createObjectURL ? P.createObjectURL(m) : c.blob
258
+ blob: P && P.createObjectURL ? P.createObjectURL(m) : C.blob
255
259
  };
256
260
  }
257
261
  return m;
@@ -259,40 +263,40 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
259
263
  l.value = o;
260
264
  }
261
265
  const K = (async () => {
262
- w.value = !0, g.enableProcessImage && g.processImage && (I.value = await g.processImage.reduce(async (e, a) => {
266
+ w.value = !0, r.enableProcessImage && r.processImage && (I.value = await r.processImage.reduce(async (e, a) => {
263
267
  const o = await e;
264
268
  return await nA(o, a);
265
269
  }, Promise.resolve(I.value))), AA("update:modelValue", I.value);
266
270
  }), nA = (async (e, a) => `${await mA.processImage(
267
271
  `${a.endpoint}${a.search ? `?${a.search}` : ""}`,
268
- { ...a.body, dataUrl: e, resolution: g.fixedResolution },
272
+ { ...a.body, dataUrl: e, resolution: r.fixedResolution },
269
273
  a.basePath
270
274
  )}`);
271
275
  function V() {
272
276
  w.value = !0, Z.value?.onCapture();
273
277
  }
274
- return rA(() => {
278
+ return sA(() => {
275
279
  ["dragenter", "dragover"].forEach((e) => {
276
280
  document.body.addEventListener(e, (a) => {
277
- a.preventDefault(), O.value = !0;
281
+ a.preventDefault(), k.value = !0;
278
282
  }, !1);
279
283
  }), ["dragleave", "drop"].forEach((e) => {
280
284
  R.value.addEventListener(e, (a) => {
281
- a.preventDefault(), O.value = !1;
285
+ a.preventDefault(), k.value = !1;
282
286
  }, !1);
283
287
  }), ["drop"].forEach((e) => {
284
288
  R.value.addEventListener(e, (a) => {
285
- a.preventDefault(), O.value = !1;
289
+ a.preventDefault(), k.value = !1;
286
290
  const o = a.dataTransfer;
287
291
  (o && Array.from(o.files || []))?.forEach((d) => {
288
292
  l.value.push(d);
289
293
  });
290
294
  }, !1);
291
295
  });
292
- }), (e, a) => (t(), s("div", {
296
+ }), (e, a) => (t(), g("div", {
293
297
  class: f(["photo-app", A.variant === "dark" && "theme--dark"])
294
298
  }, [
295
- A.enableCamera ? (t(), s("div", {
299
+ A.enableCamera ? (t(), g("div", {
296
300
  key: 0,
297
301
  class: "photo-app__canvas media-container",
298
302
  style: v({
@@ -300,7 +304,7 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
300
304
  backgroundColor: A.backgroundColor
301
305
  })
302
306
  }, [
303
- C.value ? (t(), s("div", {
307
+ c.value ? (t(), g("div", {
304
308
  key: 0,
305
309
  class: f(["photo-app__camera", `${A.ratio ? `aspect-ratio--${A.ratio}` : ""}`]),
306
310
  style: v({ borderColor: A.color })
@@ -329,10 +333,11 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
329
333
  "tint-color": A.tint?.color,
330
334
  "tint-intensity": A.tint?.intensity,
331
335
  zoom: A.zoom,
332
- "enable-zoom-slider": A.enableZoomSlider
333
- }, null, 8, ["modelValue", "enable-toggle-play", "countdown", "enable-mirror-camera", "enable-switch-camera", "default-rear-camera", "enable-guide", "guide-src", "fixed-resolution", "enable-audio", "enable-select-device", "enable-crop-image", "text-color", "ratio", "resolutions", "filter", "tint-color", "tint-intensity", "zoom", "enable-zoom-slider"])
334
- ], 6)) : r("", !0),
335
- l.value && l.value.length && !C.value ? (t(), s("div", {
336
+ "enable-zoom-slider": A.enableZoomSlider,
337
+ "correct-orientation": A.correctOrientation
338
+ }, null, 8, ["modelValue", "enable-toggle-play", "countdown", "enable-mirror-camera", "enable-switch-camera", "default-rear-camera", "enable-guide", "guide-src", "fixed-resolution", "enable-audio", "enable-select-device", "enable-crop-image", "text-color", "ratio", "resolutions", "filter", "tint-color", "tint-intensity", "zoom", "enable-zoom-slider", "correct-orientation"])
339
+ ], 6)) : s("", !0),
340
+ l.value && l.value.length && !c.value ? (t(), g("div", {
336
341
  key: 1,
337
342
  class: "photo-app__preview",
338
343
  style: v({ borderColor: A.color })
@@ -340,17 +345,17 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
340
345
  I.value ? (t(), Q(dA, {
341
346
  key: 0,
342
347
  src: T.value || I.value
343
- }, null, 8, ["src"])) : r("", !0),
348
+ }, null, 8, ["src"])) : s("", !0),
344
349
  E(iA, {
345
350
  name: "fade",
346
351
  mode: "out-in"
347
352
  }, {
348
353
  default: D(() => [
349
- w.value ? (t(), Q(IA, { key: 0 })) : r("", !0)
354
+ w.value ? (t(), Q(IA, { key: 0 })) : s("", !0)
350
355
  ]),
351
356
  _: 1
352
357
  })
353
- ], 4)) : C.value ? r("", !0) : (t(), s("div", {
358
+ ], 4)) : c.value ? s("", !0) : (t(), g("div", {
354
359
  key: 2,
355
360
  class: f(["photo-app__drop-target", `${A.ratio ? `aspect-ratio--${A.ratio}` : ""}`]),
356
361
  style: v({ borderColor: A.color })
@@ -361,7 +366,7 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
361
366
  class: "headline h2 font-weight-bold",
362
367
  innerHTML: u.value.title || e.$t("fileInput.coverTitle")
363
368
  }, null, 8, pA),
364
- A.enableCamera ? (t(), Q(k, {
369
+ A.enableCamera ? (t(), Q(O, {
365
370
  key: 0,
366
371
  type: "button",
367
372
  onClick: M(Y, ["prevent"]),
@@ -374,9 +379,9 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
374
379
  n("span", hA, i(u.value.launchCamera || e.$t("fileInput.coverLaunchCta")), 1)
375
380
  ]),
376
381
  _: 1
377
- }, 8, ["style"])) : r("", !0)
382
+ }, 8, ["style"])) : s("", !0)
378
383
  ]),
379
- A.enableLocalFileUpload ? (t(), s("div", PA, [
384
+ A.enableLocalFileUpload ? (t(), g("div", PA, [
380
385
  n("p", {
381
386
  class: "subtitle fw-bold ma-0",
382
387
  style: v({ color: A.color })
@@ -385,7 +390,7 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
385
390
  class: "text-body-1",
386
391
  style: v({ color: A.color })
387
392
  }, [
388
- A.enableDragDrop ? (t(), s("span", MA, i(u.value.dropTarget || e.$t("fileInput.coverDropTarget")) + " " + i(A.enableLocalFileUpload && A.enableDragDrop ? u.value.or || e.$t("common.or") : "") + " " + i(), 1)) : r("", !0),
393
+ A.enableDragDrop ? (t(), g("span", MA, i(u.value.dropTarget || e.$t("fileInput.coverDropTarget")) + " " + i(A.enableLocalFileUpload && A.enableDragDrop ? u.value.or || e.$t("common.or") : "") + " " + i(), 1)) : s("", !0),
389
394
  n("label", {
390
395
  for: "fileUpload",
391
396
  role: "button",
@@ -393,10 +398,10 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
393
398
  style: v({ color: A.color })
394
399
  }, i(u.value.coverSelectFileCta || e.$t("fileInput.coverLocalFileCta")), 5)
395
400
  ], 4)
396
- ])) : r("", !0)
401
+ ])) : s("", !0)
397
402
  ])
398
403
  ], 6))
399
- ], 4)) : r("", !0),
404
+ ], 4)) : s("", !0),
400
405
  U(n("div", {
401
406
  class: "photo-app__drop-overlay",
402
407
  ref_key: "dropArea",
@@ -404,16 +409,16 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
404
409
  }, [
405
410
  n("h3", null, i(u.value.dropTarget || e.$t("fileInput.dropTargetLabel")), 1)
406
411
  ], 512), [
407
- [G, A.enableLocalFileUpload && A.enableDragDrop && O.value]
412
+ [G, A.enableLocalFileUpload && A.enableDragDrop && k.value]
408
413
  ]),
409
414
  U(n("div", LA, [
410
415
  n("p", HA, i(x.value), 1)
411
416
  ], 512), [
412
417
  [G, x.value]
413
418
  ]),
414
- A.enableFileList && l.value.length ? (t(), s("div", kA, [
415
- n("div", OA, [
416
- (t(!0), s(CA, null, cA(l.value, (o) => (t(), s("div", {
419
+ A.enableFileList && l.value.length ? (t(), g("div", OA, [
420
+ n("div", kA, [
421
+ (t(!0), g(cA, null, CA(l.value, (o) => (t(), g("div", {
417
422
  key: o.id,
418
423
  class: "col col-12"
419
424
  }, [
@@ -421,28 +426,28 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
421
426
  a[2] || (a[2] = y(" - ", -1)),
422
427
  n("span", null, i(o.size), 1),
423
428
  a[3] || (a[3] = y(" - ", -1)),
424
- o.error ? (t(), s("span", YA, i(o.error), 1)) : o.success ? (t(), s("span", FA, i(e.$t("common.success")), 1)) : o.active ? (t(), s("span", UA, i(e.$t("common.active")), 1)) : (t(), s("span", GA))
429
+ o.error ? (t(), g("span", YA, i(o.error), 1)) : o.success ? (t(), g("span", FA, i(e.$t("common.success")), 1)) : o.active ? (t(), g("span", UA, i(e.$t("common.active")), 1)) : (t(), g("span", GA))
425
430
  ]))), 128))
426
431
  ])
427
- ])) : r("", !0),
432
+ ])) : s("", !0),
428
433
  U(n("div", SA, [
429
434
  n("div", zA, [
430
435
  n("div", RA, [
431
436
  n("div", NA, [
432
437
  X(e.$slots, "headline", {}, () => [
433
- A.enableTitle && (C.value || l.value.length) ? (t(), s("p", {
438
+ A.enableTitle && (c.value || l.value.length) ? (t(), g("p", {
434
439
  key: 0,
435
440
  class: "headline",
436
441
  innerHTML: tA.value
437
- }, null, 8, jA)) : r("", !0)
442
+ }, null, 8, jA)) : s("", !0)
438
443
  ]),
439
- !A.enableLegacyInput && (C.value || l.value.length) ? (t(), s("div", JA, [
444
+ !A.enableLegacyInput && (c.value || l.value.length) ? (t(), g("div", JA, [
440
445
  n("div", TA, [
441
- C.value || l.value.length && (!L.value || !L.value.active) ? (t(), Q(k, {
446
+ c.value || l.value.length && (!L.value || !L.value.active) ? (t(), Q(O, {
442
447
  key: 0,
443
448
  type: "button",
444
449
  class: f(["btn btn-primary-outline rounded-circle", `theme--${A.variant}`]),
445
- onClick: a[1] || (a[1] = M((o) => C.value ? Y() : W(), ["prevent"]))
450
+ onClick: a[1] || (a[1] = M((o) => c.value ? Y() : W(), ["prevent"]))
446
451
  }, {
447
452
  default: D(() => [
448
453
  E(p, {
@@ -453,10 +458,10 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
453
458
  y(" " + i(A.enableButtonCaptions ? u.value.cancel || e.$t("fileInput.cancel") : ""), 1)
454
459
  ]),
455
460
  _: 1
456
- }, 8, ["class"])) : r("", !0)
461
+ }, 8, ["class"])) : s("", !0)
457
462
  ]),
458
- C.value ? (t(), s("div", ZA, [
459
- E(k, {
463
+ c.value ? (t(), g("div", ZA, [
464
+ E(O, {
460
465
  type: "button",
461
466
  class: f(["btn btn-primary rounded-circle", `theme--${A.variant}`]),
462
467
  onClick: M(V, ["prevent"]),
@@ -471,8 +476,8 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
471
476
  ]),
472
477
  _: 1
473
478
  }, 8, ["class", "disabled"])
474
- ])) : A.enableReview ? (t(), s("div", xA, [
475
- E(k, {
479
+ ])) : A.enableReview ? (t(), g("div", xA, [
480
+ E(O, {
476
481
  type: "button",
477
482
  class: f(["btn btn-primary rounded-circle", {
478
483
  [`theme--${A.variant}`]: A.variant,
@@ -487,11 +492,11 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
487
492
  ]),
488
493
  _: 1
489
494
  }, 8, ["class", "disabled"])
490
- ])) : r("", !0)
491
- ])) : r("", !0),
495
+ ])) : s("", !0)
496
+ ])) : s("", !0),
492
497
  U(n("div", {
493
498
  class: f(["justify-center col-10 mx-auto", {
494
- "d-flex": A.enableLegacyInput && (C.value || l.value.length)
499
+ "d-flex": A.enableLegacyInput && (c.value || l.value.length)
495
500
  }])
496
501
  }, [
497
502
  n("button", {
@@ -502,10 +507,10 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
502
507
  A.enableButtonIcons ? (t(), Q(p, {
503
508
  key: 0,
504
509
  symbol: "camera"
505
- })) : r("", !0),
506
- y(" " + i(A.enableButtonCaptions ? C.value ? u.value.cancel || e.$t("common.cancel") : u.value.camera || e.$t("fileInput.selectCameraCta") : ""), 1)
510
+ })) : s("", !0),
511
+ y(" " + i(A.enableButtonCaptions ? c.value ? u.value.cancel || e.$t("common.cancel") : u.value.camera || e.$t("fileInput.selectCameraCta") : ""), 1)
507
512
  ], 2),
508
- C.value && (!e.$refs.upload || L.value.active) ? (t(), Q(k, {
513
+ c.value && (!e.$refs.upload || L.value.active) ? (t(), Q(O, {
509
514
  key: 0,
510
515
  type: "button",
511
516
  class: f(["btn btn-primary", `theme--${A.variant}`]),
@@ -516,11 +521,11 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
516
521
  A.enableButtonIcons ? (t(), Q(p, {
517
522
  key: 0,
518
523
  symbol: "camera"
519
- })) : r("", !0),
524
+ })) : s("", !0),
520
525
  y(" " + i(A.enableButtonCaptions ? u.value.shoot || e.$t("fileInput.shoot") : ""), 1)
521
526
  ]),
522
527
  _: 1
523
- }, 8, ["class", "disabled"])) : r("", !0),
528
+ }, 8, ["class", "disabled"])) : s("", !0),
524
529
  E(BA, {
525
530
  ref_key: "upload",
526
531
  ref: L,
@@ -539,27 +544,27 @@ const bA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAA
539
544
  A.enableButtonIcons ? (t(), Q(p, {
540
545
  key: 0,
541
546
  symbol: "camera"
542
- })) : r("", !0)
547
+ })) : s("", !0)
543
548
  ], 2)
544
549
  ])
545
550
  ]),
546
551
  _: 3
547
552
  }, 8, ["model-value"])
548
553
  ], 2), [
549
- [G, A.enableLegacyInput && (C.value || l.value.length)]
554
+ [G, A.enableLegacyInput && (c.value || l.value.length)]
550
555
  ]),
551
- A.required ? (t(), s("input", {
556
+ A.required ? (t(), g("input", {
552
557
  key: 1,
553
558
  ref: "hiddenInput",
554
559
  required: A.required,
555
560
  value: I.value,
556
561
  style: { display: "none" }
557
- }, null, 8, WA)) : r("", !0)
562
+ }, null, 8, WA)) : s("", !0)
558
563
  ])
559
564
  ])
560
565
  ])
561
566
  ], 512), [
562
- [G, C.value || l.value.length]
567
+ [G, c.value || l.value.length]
563
568
  ])
564
569
  ], 2));
565
570
  }
@@ -1,5 +1,5 @@
1
- import { _ as o } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-BHKoShl5.js";
2
- import { D as m } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-BHKoShl5.js";
1
+ import { _ as o } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-CRbsZZLr.js";
2
+ import { D as m } from "./chunks/creative-booth.vue_vue_type_style_index_0_lang-CRbsZZLr.js";
3
3
  export {
4
4
  m as DEFAULT_ASSETS,
5
5
  o as default
@@ -1,4 +1,4 @@
1
- import { _ as f } from "./chunks/fabric-canvas.vue_vue_type_style_index_0_lang-B-D65X2t.js";
1
+ import { _ as f } from "./chunks/fabric-canvas.vue_vue_type_style_index_0_lang-C9fwZf_Y.js";
2
2
  export {
3
3
  f as default
4
4
  };
package/dist/photo-app.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as f } from "./chunks/photo-app.vue_vue_type_style_index_0_lang-CQsO0T0U.js";
1
+ import { _ as f } from "./chunks/photo-app.vue_vue_type_style_index_0_lang-BdQvhbLS.js";
2
2
  export {
3
3
  f as default
4
4
  };
@@ -148,6 +148,10 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
148
148
  type: BooleanConstructor;
149
149
  default: boolean;
150
150
  };
151
+ correctOrientation: {
152
+ type: BooleanConstructor;
153
+ default: boolean;
154
+ };
151
155
  }>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
152
156
  "update:modelValue": (...args: any[]) => void;
153
157
  }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
@@ -300,6 +304,10 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
300
304
  type: BooleanConstructor;
301
305
  default: boolean;
302
306
  };
307
+ correctOrientation: {
308
+ type: BooleanConstructor;
309
+ default: boolean;
310
+ };
303
311
  }>> & Readonly<{
304
312
  "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
305
313
  }>, {
@@ -339,6 +347,7 @@ declare const _default: __VLS_WithTemplateSlots<import('vue').DefineComponent<im
339
347
  enableSelectDevice: boolean;
340
348
  enableProcessImage: boolean;
341
349
  enableZoomSlider: boolean;
350
+ correctOrientation: boolean;
342
351
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
343
352
  camera: any;
344
353
  dropArea: HTMLDivElement;
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "ablok-photobooth",
3
3
  "private": false,
4
- "version": "0.2.41",
4
+ "version": "0.2.43",
5
5
  "type": "module",
6
6
  "peerDependencies": {
7
7
  "@popperjs/core": "^2.11.6",
8
- "ablok-components": "^0.3.68",
8
+ "ablok-components": "^0.3.74",
9
9
  "bootstrap": "^5.3.8",
10
10
  "fabric": "^7.1.0",
11
11
  "lodash": "^4.17.23",
@@ -1,318 +0,0 @@
1
- import { defineComponent as Q, ref as j, watch as Z, onMounted as ee, openBlock as te, createElementBlock as ae, createElementVNode as B, renderSlot as oe } from "vue";
2
- import { debounce as ne } from "lodash";
3
- function C(s) {
4
- return new Promise((c, l) => {
5
- s.oncomplete = s.onsuccess = () => c(s.result), s.onabort = s.onerror = () => l(s.error);
6
- });
7
- }
8
- function re(s, c) {
9
- const l = indexedDB.open(s);
10
- l.onupgradeneeded = () => l.result.createObjectStore(c);
11
- const f = C(l);
12
- return (p, y) => f.then(
13
- (g) => y(g.transaction(c, p).objectStore(c))
14
- );
15
- }
16
- let D;
17
- function _() {
18
- return D || (D = re("keyval-store", "keyval")), D;
19
- }
20
- function ie(s, c = _()) {
21
- return c("readonly", (l) => C(l.get(s)));
22
- }
23
- function se(s, c, l = _()) {
24
- return l("readwrite", (f) => (f.put(c, s), C(f.transaction)));
25
- }
26
- function le(s, c = _()) {
27
- return c("readwrite", (l) => (l.delete(s), C(l.transaction)));
28
- }
29
- const ce = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23ffffffCC'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-rotate-cw'%3e%3cpolyline%20points='23%204%2023%2010%2017%2010'%3e%3c/polyline%3e%3cpath%20d='M20.49%2015a9%209%200%201%201-2.12-9.36L23%2010'%3e%3c/path%3e%3c/svg%3e", de = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23ffffffCC'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-x-circle'%3e%3ccircle%20cx='12'%20cy='12'%20r='10'%20fill='none'%3e%3c/circle%3e%3cline%20x1='15'%20y1='9'%20x2='9'%20y2='15'%20fill='none'%3e%3c/line%3e%3cline%20x1='9'%20y1='9'%20x2='15'%20y2='15'%20fill='none'%3e%3c/line%3e%3c/svg%3e", ue = { class: "fabric-canvas__canvas" }, fe = {
30
- id: "fabricCanvas",
31
- ref: "canvasRef"
32
- }, pe = /* @__PURE__ */ Q({
33
- __name: "fabric-canvas",
34
- props: {
35
- modelValue: {
36
- type: String,
37
- default: ""
38
- },
39
- jsonModel: {
40
- type: null,
41
- default: void 0
42
- },
43
- exportToSvg: {
44
- type: Boolean,
45
- default: !1
46
- },
47
- resetState: {
48
- type: Boolean,
49
- default: !1
50
- },
51
- options: {
52
- type: Object,
53
- default: () => ({})
54
- },
55
- feature: {
56
- type: String,
57
- default: ""
58
- },
59
- required: {
60
- type: Boolean,
61
- default: !1
62
- },
63
- pending: {
64
- type: Boolean,
65
- default: !1
66
- },
67
- emitPending: {
68
- type: Boolean,
69
- default: !1
70
- },
71
- animationDuration: {
72
- type: Number,
73
- default: 0
74
- }
75
- },
76
- emits: ["update:modelValue", "update:jsonModel", "update:pending", "on-ready"],
77
- setup(s, { expose: c, emit: l }) {
78
- let f, p, y, g, A, F, x, O;
79
- const h = l;
80
- c({ setBackgroundImage: M, setOverlayImage: Y, addCanvasObject: G });
81
- const n = s, w = j(), d = j(0), u = j(0);
82
- let a, R = !1;
83
- const T = j();
84
- async function H(e, t) {
85
- return new Promise(async (o) => {
86
- const r = JSON.parse(t);
87
- if (r.backgroundImage) {
88
- const i = await b(r.backgroundImage.src || r.backgroundImage.filename);
89
- i.set({
90
- opacity: 1
91
- }), e.backgroundImage = i, e.centerObject(i);
92
- }
93
- if (r.overlayImage) {
94
- const i = await b(r.overlayImage.src || r.overlayImage.filename);
95
- i.set({
96
- opacity: 1,
97
- left: d.value / 2,
98
- top: u.value / 2,
99
- scaleX: d.value / i.width,
100
- scaleY: u.value / i.height
101
- }), e.overlayImage = i;
102
- }
103
- (await g.enlivenObjects(r.objects, {
104
- reviver: void 0
105
- })).forEach((i) => {
106
- e.add(i);
107
- }), o(e);
108
- });
109
- }
110
- async function b(e) {
111
- const t = await U(e);
112
- e.includes("data:image") || (t.filename = e);
113
- const o = g.findScaleToCover(t, a), r = t instanceof p;
114
- return t.set({
115
- left: 0,
116
- top: 0,
117
- opacity: r && n.animationDuration > 0 ? 0 : 1,
118
- scaleX: o,
119
- scaleY: o,
120
- src: e
121
- }), t;
122
- }
123
- async function k(e) {
124
- !(e instanceof p) || n.animationDuration === 0 || (n.emitPending && h("update:pending", !0), await new Promise((o) => {
125
- const r = n.animationDuration, S = Date.now(), i = () => {
126
- const I = Date.now() - S, m = Math.min(I / r, 1);
127
- e.set("opacity", m), a.renderAll(), m < 1 ? requestAnimationFrame(i) : (n.emitPending && h("update:pending", !1), o());
128
- };
129
- requestAnimationFrame(i);
130
- }));
131
- }
132
- function V(e) {
133
- const t = g.findScaleToCover(e, a);
134
- return e.set({
135
- scaleX: t,
136
- scaleY: t
137
- }), e;
138
- }
139
- async function M(e) {
140
- const t = await b(e.src);
141
- a.backgroundImage = t, a.centerObject(t), a.renderAll(), await k(t), v();
142
- }
143
- async function X(e) {
144
- const t = await b(e.src);
145
- t.selectable = !1, t.assetType = "foreground", a.add(t), a.centerObject(t), a.renderAll(), await k(t), v();
146
- }
147
- async function Y(e) {
148
- const t = await b(e.src);
149
- t.set({
150
- left: d.value / 2,
151
- top: u.value / 2,
152
- scaleX: d.value / t.width,
153
- scaleY: u.value / t.height
154
- }), a.overlayImage = t, a.renderAll(), await k(t), v();
155
- }
156
- async function G(e) {
157
- a.discardActiveObject();
158
- const t = await U(e.src);
159
- t.filename = e.src;
160
- const o = d.value / 3, r = u.value / 3, S = o / t.width, i = r / t.height, I = Math.min(S, i);
161
- t.set({
162
- scaleX: I,
163
- scaleY: I,
164
- left: d.value / 2,
165
- top: u.value / 2
166
- }), t.id = e.id, t.padding = 8, a.add(t), a.setActiveObject(t), await k(t), a.renderAll();
167
- }
168
- function N(e, t) {
169
- t.target.id;
170
- const o = t.target;
171
- return a.remove(o), a.requestRenderAll(), !0;
172
- }
173
- function P() {
174
- if (d.value = w.value.offsetWidth, u.value = w.value.offsetHeight, a.setDimensions({ width: d.value, height: u.value }), a.backgroundImage && (a.backgroundImage = V(a.backgroundImage), a.centerObject(a.backgroundImage)), a.overlayImage) {
175
- const e = a.overlayImage;
176
- e.set({
177
- scaleX: d.value / e.width,
178
- scaleY: u.value / e.height
179
- });
180
- }
181
- a.getObjects().forEach((e) => {
182
- e.assetType === "foreground" && (e = V(e), a.centerObject(e));
183
- }), a.renderAll();
184
- }
185
- const L = ne(() => {
186
- P();
187
- }, 200, { trailing: !0, leading: !1 });
188
- function E(e) {
189
- return (t, o, r, S, i) => {
190
- t.save(), t.translate(o, r), t.rotate(g.degreesToRadians(i.angle)), t.fillStyle = n.options.themeData?.colors?.primary, t.fillRect(-24 / 2, -24 / 2, 24, 24);
191
- const m = 20;
192
- t.drawImage(e, -m / 2, -m / 2, m, m), t.restore();
193
- };
194
- }
195
- function W() {
196
- const e = document.createElement("img");
197
- e.src = ce;
198
- const t = document.createElement("img");
199
- t.src = de, a.on("object:added", (o) => {
200
- o.target && o.target.controls && (o.target.set({
201
- transparentCorners: !1,
202
- cornerSize: 16,
203
- cornerStyle: "circle",
204
- ...n.options.themeData?.colors?.primary ? {
205
- cornerColor: n.options.themeData?.colors?.primary,
206
- cornerStrokeColor: n.options.themeData?.colors?.primary,
207
- borderColor: n.options.themeData?.colors?.primary
208
- } : {}
209
- }), o.target.controls.ml.visible = !1, o.target.controls.mr.visible = !1, o.target.controls.mb.visible = !1, o.target.controls.mt.visible = !1, o.target.controls.mtr.visible = !1, o.target.controls.rotate = new y({
210
- x: 0.5,
211
- y: -0.5,
212
- offsetX: 32,
213
- offsetY: 0,
214
- cursorStyle: "pointer",
215
- actionName: "rotate",
216
- actionHandler: O.rotationWithSnapping,
217
- cursorStyleHandler: O.rotationStyleHandler,
218
- render: E(e)
219
- }), o.target.controls.delete = new y({
220
- x: 0.5,
221
- y: -0.5,
222
- offsetX: 32,
223
- offsetY: 32,
224
- cursorStyle: "pointer",
225
- mouseUpHandler: N,
226
- render: E(t)
227
- }));
228
- });
229
- }
230
- async function q() {
231
- return await new Promise((e) => {
232
- setTimeout(() => {
233
- const t = n.exportToSvg ? a.toSVG() : a.toDataURL({ multiplier: 2 });
234
- e(t);
235
- }, 200);
236
- });
237
- }
238
- function v() {
239
- setTimeout(async () => {
240
- const e = a.toDatalessJSON(["selectable", "assetType", "filename"]);
241
- await se("fabric-canvas", JSON.stringify(e));
242
- let t = !0;
243
- if (n.required)
244
- switch (t = !1, n.feature) {
245
- case "overlay":
246
- e.overlayImage && (t = !0);
247
- break;
248
- case "background":
249
- e.backgroundImage && (t = !0);
250
- break;
251
- case "stickers":
252
- e.objects.length > 1 && (t = !0);
253
- break;
254
- default:
255
- (e.objects.length > 1 || e.backgroundImage || e.overlayImage) && (t = !0);
256
- }
257
- if (t) {
258
- R = !0;
259
- const o = await q();
260
- h("update:modelValue", o), h("update:jsonModel", e);
261
- }
262
- }, 120);
263
- }
264
- async function J(e) {
265
- try {
266
- return await p.fromURL(e);
267
- } catch (t) {
268
- throw console.error("Error loading image:", t), t;
269
- }
270
- }
271
- async function $(e) {
272
- const { objects: t, options: o } = await A(e);
273
- return g.groupSVGElements(t, o);
274
- }
275
- async function K(e) {
276
- const { objects: t, options: o } = await F(e);
277
- return g.groupSVGElements(t, o);
278
- }
279
- async function U(e) {
280
- return e && typeof e == "string" && e.trim().startsWith("<") ? await K(e) : e && new RegExp(/([\w_/-]*\.svg$)|(image\/svg\+xml)/gi).test(e) ? await $(e) : await J(e);
281
- }
282
- async function z(e, t) {
283
- e && !t && !R && X({ src: e });
284
- }
285
- return Z(() => n.modelValue, async (e, t) => {
286
- z(e, t);
287
- }), ee(async () => {
288
- ({ Canvas: f, FabricImage: p, Control: y, util: g, loadSVGFromURL: A, loadSVGFromString: F, config: x, controlsUtils: O } = await import("fabric")), d.value = w.value.offsetWidth, u.value = w.value.offsetHeight, window.addEventListener("resize", L), x.NUM_FRACTION_DIGITS = 8;
289
- const e = f.prototype._onTouchStart;
290
- f.prototype._onTouchStart = function(t) {
291
- const o = this.findTarget(t);
292
- this.allowTouchScrolling && o.assetType && !this.isDrawingMode || e.call(this, t);
293
- }, a = new f("fabricCanvas", {
294
- width: d.value,
295
- height: u.value,
296
- // enableRetinaScaling: false,
297
- skipOffscreen: !0,
298
- // devicePixelRatio: 4,
299
- allowTouchScrolling: !0
300
- // backstoreOnly: true
301
- }), n.resetState && await le("fabric-canvas"), T.value = await ie("fabric-canvas"), T.value ? (await H(a, T.value), a.requestRenderAll(), requestAnimationFrame(() => {
302
- a.renderAll();
303
- })) : n.modelValue && z(n.modelValue, ""), a.on("object:added", v), a.on("object:removed", v), a.on("object:modified", v), W(), a.renderAll(), h("on-ready", a);
304
- }), (e, t) => (te(), ae("div", {
305
- class: "fabric-canvas",
306
- ref_key: "root",
307
- ref: w
308
- }, [
309
- B("div", ue, [
310
- B("canvas", fe, null, 512)
311
- ]),
312
- oe(e.$slots, "default")
313
- ], 512));
314
- }
315
- });
316
- export {
317
- pe as _
318
- };