@antontranelis/money-printer 1.0.2 → 1.0.3

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.js CHANGED
@@ -1,9 +1,9 @@
1
- import { jsxs as m, jsx as o, Fragment as z } from "react/jsx-runtime";
2
- import { create as le } from "zustand";
3
- import { persist as se } from "zustand/middleware";
4
- import { useState as C, useCallback as E, useRef as A, useEffect as O } from "react";
5
- import ce from "jspdf";
6
- const Y = {
1
+ import { jsxs as m, jsx as i, Fragment as K } from "react/jsx-runtime";
2
+ import { create as fe } from "zustand";
3
+ import { persist as be } from "zustand/middleware";
4
+ import { useState as C, useCallback as S, useRef as T, useEffect as q } from "react";
5
+ import ye from "jspdf";
6
+ const V = {
7
7
  personalInfo: {
8
8
  name: "",
9
9
  email: "",
@@ -23,27 +23,27 @@ const Y = {
23
23
  currentSide: "front",
24
24
  isEnhancing: !1,
25
25
  isExporting: !1
26
- }, g = le()(
27
- se(
26
+ }, f = fe()(
27
+ be(
28
28
  (e) => ({
29
- ...Y,
30
- setPersonalInfo: (t) => e((n) => ({
31
- personalInfo: { ...n.personalInfo, ...t }
29
+ ...V,
30
+ setPersonalInfo: (t) => e((a) => ({
31
+ personalInfo: { ...a.personalInfo, ...t }
32
32
  })),
33
- setVoucherConfig: (t) => e((n) => ({
34
- voucherConfig: { ...n.voucherConfig, ...t }
33
+ setVoucherConfig: (t) => e((a) => ({
34
+ voucherConfig: { ...a.voucherConfig, ...t }
35
35
  })),
36
- setPortrait: (t, n = null) => e({
36
+ setPortrait: (t, a = null) => e({
37
37
  portrait: {
38
38
  original: t,
39
- enhanced: n,
39
+ enhanced: a,
40
40
  useEnhanced: !1,
41
41
  zoom: 1
42
42
  }
43
43
  }),
44
- setEnhancedPortrait: (t) => e((n) => ({
44
+ setEnhancedPortrait: (t) => e((a) => ({
45
45
  portrait: {
46
- ...n.portrait,
46
+ ...a.portrait,
47
47
  enhanced: t,
48
48
  useEnhanced: t !== null
49
49
  }
@@ -54,9 +54,9 @@ const Y = {
54
54
  useEnhanced: t.portrait.enhanced ? !t.portrait.useEnhanced : !1
55
55
  }
56
56
  })),
57
- setPortraitZoom: (t) => e((n) => ({
57
+ setPortraitZoom: (t) => e((a) => ({
58
58
  portrait: {
59
- ...n.portrait,
59
+ ...a.portrait,
60
60
  zoom: t
61
61
  }
62
62
  })),
@@ -66,13 +66,13 @@ const Y = {
66
66
  })),
67
67
  setIsEnhancing: (t) => e({ isEnhancing: t }),
68
68
  setIsExporting: (t) => e({ isExporting: t }),
69
- setLanguage: (t) => e((n) => ({
70
- voucherConfig: { ...n.voucherConfig, language: t }
69
+ setLanguage: (t) => e((a) => ({
70
+ voucherConfig: { ...a.voucherConfig, language: t }
71
71
  })),
72
- setHours: (t) => e((n) => ({
73
- voucherConfig: { ...n.voucherConfig, hours: t }
72
+ setHours: (t) => e((a) => ({
73
+ voucherConfig: { ...a.voucherConfig, hours: t }
74
74
  })),
75
- reset: () => e(Y)
75
+ reset: () => e(V)
76
76
  }),
77
77
  {
78
78
  name: "money-generator-storage",
@@ -82,7 +82,7 @@ const Y = {
82
82
  })
83
83
  }
84
84
  )
85
- ), de = {
85
+ ), we = {
86
86
  header: {
87
87
  title: "Money Generator",
88
88
  subtitle: "Erstelle deinen persönlichen Zeitgutschein"
@@ -129,7 +129,7 @@ const Y = {
129
129
  bill: {
130
130
  descriptionText: "Für diesen Schein erhältst du {hours} {hourLabel} meiner Zeit oder ein gleichwertiges Dankeschön"
131
131
  }
132
- }, he = {
132
+ }, ve = {
133
133
  header: {
134
134
  title: "Money Generator",
135
135
  subtitle: "Create your personal time voucher"
@@ -176,161 +176,250 @@ const Y = {
176
176
  bill: {
177
177
  descriptionText: "This voucher entitles you to {hours} {hourLabel} of my time or an equivalent thank you"
178
178
  }
179
- }, pe = { de, en: he };
179
+ }, xe = { de: we, en: ve };
180
180
  function _(e) {
181
- return pe[e];
181
+ return xe[e];
182
182
  }
183
- function G(e, t, n) {
184
- if (n && n.trim())
185
- return n;
186
- const a = _(e), r = t === 1 ? a.form.voucher.hourLabel : a.form.voucher.hoursLabel;
187
- return a.bill.descriptionText.replace("{hours}", t.toString()).replace("{hourLabel}", r);
183
+ function Q(e, t, a) {
184
+ if (a && a.trim())
185
+ return a;
186
+ const n = _(e), r = t === 1 ? n.form.voucher.hourLabel : n.form.voucher.hoursLabel;
187
+ return n.bill.descriptionText.replace("{hours}", t.toString()).replace("{hourLabel}", r);
188
188
  }
189
- function ze() {
190
- const e = g((r) => r.voucherConfig.language), t = g((r) => r.personalInfo), n = g((r) => r.setPersonalInfo), a = _(e);
189
+ function Ze() {
190
+ const e = f((r) => r.voucherConfig.language), t = f((r) => r.personalInfo), a = f((r) => r.setPersonalInfo), n = _(e);
191
191
  return /* @__PURE__ */ m("div", { className: "space-y-4", children: [
192
192
  /* @__PURE__ */ m("div", { className: "form-control", children: [
193
- /* @__PURE__ */ o("label", { className: "label", children: /* @__PURE__ */ o("span", { className: "label-text font-medium", children: a.form.personalInfo.name }) }),
194
- /* @__PURE__ */ o(
193
+ /* @__PURE__ */ i("label", { className: "label", children: /* @__PURE__ */ i("span", { className: "label-text font-medium", children: n.form.personalInfo.name }) }),
194
+ /* @__PURE__ */ i(
195
195
  "input",
196
196
  {
197
197
  type: "text",
198
- placeholder: a.form.personalInfo.namePlaceholder,
198
+ placeholder: n.form.personalInfo.namePlaceholder,
199
199
  className: "input input-bordered w-full",
200
200
  value: t.name,
201
- onChange: (r) => n({ name: r.target.value })
201
+ onChange: (r) => a({ name: r.target.value })
202
202
  }
203
203
  )
204
204
  ] }),
205
205
  /* @__PURE__ */ m("div", { className: "form-control", children: [
206
- /* @__PURE__ */ o("label", { className: "label", children: /* @__PURE__ */ o("span", { className: "label-text font-medium", children: a.form.personalInfo.email }) }),
207
- /* @__PURE__ */ o(
206
+ /* @__PURE__ */ i("label", { className: "label", children: /* @__PURE__ */ i("span", { className: "label-text font-medium", children: n.form.personalInfo.email }) }),
207
+ /* @__PURE__ */ i(
208
208
  "input",
209
209
  {
210
210
  type: "email",
211
- placeholder: a.form.personalInfo.emailPlaceholder,
211
+ placeholder: n.form.personalInfo.emailPlaceholder,
212
212
  className: "input input-bordered w-full",
213
213
  value: t.email,
214
- onChange: (r) => n({ email: r.target.value })
214
+ onChange: (r) => a({ email: r.target.value })
215
215
  }
216
216
  )
217
217
  ] }),
218
218
  /* @__PURE__ */ m("div", { className: "form-control", children: [
219
- /* @__PURE__ */ o("label", { className: "label", children: /* @__PURE__ */ o("span", { className: "label-text font-medium", children: a.form.personalInfo.phone }) }),
220
- /* @__PURE__ */ o(
219
+ /* @__PURE__ */ i("label", { className: "label", children: /* @__PURE__ */ i("span", { className: "label-text font-medium", children: n.form.personalInfo.phone }) }),
220
+ /* @__PURE__ */ i(
221
221
  "input",
222
222
  {
223
223
  type: "tel",
224
- placeholder: a.form.personalInfo.phonePlaceholder,
224
+ placeholder: n.form.personalInfo.phonePlaceholder,
225
225
  className: "input input-bordered w-full",
226
226
  value: t.phone,
227
- onChange: (r) => n({ phone: r.target.value })
227
+ onChange: (r) => a({ phone: r.target.value })
228
228
  }
229
229
  )
230
230
  ] })
231
231
  ] });
232
232
  }
233
- const F = {}, ue = "https://api.stability.ai/v1/generation", me = {
233
+ const D = {}, ke = "https://api.stability.ai/v1/generation", Ie = "https://clipdrop-api.co/remove-background/v1", ee = "stability_api_key", te = "clipdrop_api_key", Pe = {
234
234
  vintage: "portrait in the style of vintage currency engraving, fine line work, crosshatching, sepia tones, detailed stippling, classic bank note portrait style",
235
235
  engraved: "portrait as detailed intaglio engraving, currency bill style, fine parallel lines, high contrast, official government portrait",
236
236
  currency: "portrait rendered as US dollar bill engraving, official currency portrait style, green tint, fine line engraving technique"
237
- };
238
- function ge(e) {
239
- var s;
240
- const t = e.split(","), n = ((s = t[0].match(/:(.*?);/)) == null ? void 0 : s[1]) || "image/png", a = atob(t[1]), r = a.length, l = new Uint8Array(r);
241
- for (let d = 0; d < r; d++)
242
- l[d] = a.charCodeAt(d);
243
- return new Blob([l], { type: n });
237
+ }, G = [
238
+ { width: 1024, height: 1024 },
239
+ { width: 1152, height: 896 },
240
+ { width: 1216, height: 832 },
241
+ { width: 1344, height: 768 },
242
+ { width: 1536, height: 640 },
243
+ { width: 640, height: 1536 },
244
+ { width: 768, height: 1344 },
245
+ { width: 832, height: 1216 },
246
+ { width: 896, height: 1152 }
247
+ ];
248
+ function Ee(e, t) {
249
+ const a = e / t;
250
+ let n = G[0], r = 1 / 0;
251
+ for (const o of G) {
252
+ const d = o.width / o.height, l = Math.abs(a - d);
253
+ l < r && (r = l, n = o);
254
+ }
255
+ return n;
256
+ }
257
+ function Ne(e) {
258
+ return new Promise((t, a) => {
259
+ const n = new Image();
260
+ n.onload = () => {
261
+ const r = Ee(n.width, n.height), o = document.createElement("canvas");
262
+ o.width = r.width, o.height = r.height;
263
+ const d = o.getContext("2d");
264
+ if (!d) {
265
+ a(new Error("Failed to get canvas context"));
266
+ return;
267
+ }
268
+ const l = n.width / n.height, s = r.width / r.height;
269
+ let c = 0, u = 0, g = n.width, b = n.height;
270
+ l > s ? (g = n.height * s, c = (n.width - g) / 2) : (b = n.width / s, u = (n.height - b) / 2), d.drawImage(n, c, u, g, b, 0, 0, r.width, r.height), t(o.toDataURL("image/png"));
271
+ }, n.onerror = () => a(new Error("Failed to load image")), n.src = e;
272
+ });
273
+ }
274
+ function ne(e) {
275
+ var d;
276
+ const t = e.split(","), a = ((d = t[0].match(/:(.*?);/)) == null ? void 0 : d[1]) || "image/png", n = atob(t[1]), r = n.length, o = new Uint8Array(r);
277
+ for (let l = 0; l < r; l++)
278
+ o[l] = n.charCodeAt(l);
279
+ return new Blob([o], { type: a });
280
+ }
281
+ function ae() {
282
+ var t;
283
+ const e = typeof import.meta < "u" && (D == null ? void 0 : D.VITE_STABILITY_API_KEY) || typeof process < "u" && ((t = process.env) == null ? void 0 : t.NEXT_PUBLIC_STABILITY_API_KEY);
284
+ return e && e !== "your-api-key-here" ? e : typeof localStorage < "u" ? localStorage.getItem(ee) : null;
244
285
  }
245
- function X() {
286
+ function Ce(e) {
287
+ localStorage.setItem(ee, e);
288
+ }
289
+ function Z() {
290
+ return ae() !== null;
291
+ }
292
+ function re() {
246
293
  var t;
247
- const e = typeof import.meta < "u" && (F == null ? void 0 : F.VITE_STABILITY_API_KEY) || typeof process < "u" && ((t = process.env) == null ? void 0 : t.NEXT_PUBLIC_STABILITY_API_KEY);
248
- return e && e !== "your-api-key-here" ? e : typeof localStorage < "u" ? localStorage.getItem("stability_api_key") : null;
294
+ const e = typeof import.meta < "u" && (D == null ? void 0 : D.VITE_CLIPDROP_API_KEY) || typeof process < "u" && ((t = process.env) == null ? void 0 : t.NEXT_PUBLIC_CLIPDROP_API_KEY);
295
+ return e && e !== "your-api-key-here" ? e : typeof localStorage < "u" ? localStorage.getItem(te) : null;
249
296
  }
250
- function fe(e) {
251
- localStorage.setItem("stability_api_key", e);
297
+ function Se(e) {
298
+ localStorage.setItem(te, e);
252
299
  }
253
- function q() {
254
- return X() !== null;
300
+ function Ae() {
301
+ return re() !== null;
255
302
  }
256
- async function be(e) {
257
- const t = X();
303
+ async function Le(e) {
304
+ const t = ae();
258
305
  if (!t)
259
306
  throw new Error("No Stability AI API key configured");
260
- const { imageDataUrl: n, style: a, strength: r = 0.35 } = e, l = ge(n), s = new FormData();
261
- s.append("init_image", l, "portrait.png"), s.append("init_image_mode", "IMAGE_STRENGTH"), s.append("image_strength", String(1 - r)), s.append("text_prompts[0][text]", me[a]), s.append("text_prompts[0][weight]", "1"), s.append("cfg_scale", "7"), s.append("samples", "1"), s.append("steps", "30");
262
- const i = await fetch(`${ue}/stable-diffusion-xl-1024-v1-0/image-to-image`, {
307
+ const { imageDataUrl: a, style: n, strength: r = 0.35 } = e, o = await Ne(a), d = ne(o), l = new FormData();
308
+ l.append("init_image", d, "portrait.png"), l.append("init_image_mode", "IMAGE_STRENGTH"), l.append("image_strength", String(1 - r)), l.append("text_prompts[0][text]", Pe[n]), l.append("text_prompts[0][weight]", "1"), l.append("cfg_scale", "7"), l.append("samples", "1"), l.append("steps", "30");
309
+ const c = await fetch(`${ke}/stable-diffusion-xl-1024-v1-0/image-to-image`, {
263
310
  method: "POST",
264
311
  headers: {
265
312
  Authorization: `Bearer ${t}`,
266
313
  Accept: "application/json"
267
314
  },
268
- body: s
315
+ body: l
269
316
  });
270
- if (!i.ok) {
271
- const f = await i.text();
272
- throw console.error("Stability AI error:", f), i.status === 401 ? new Error("Invalid API key") : i.status === 402 ? new Error("Insufficient credits") : i.status === 429 ? new Error("Rate limit exceeded. Please try again later.") : new Error(`API error: ${i.status}`);
317
+ if (!c.ok) {
318
+ const g = await c.text();
319
+ throw console.error("Stability AI error:", g), c.status === 401 ? new Error("Invalid API key") : c.status === 402 ? new Error("Insufficient credits") : c.status === 429 ? new Error("Rate limit exceeded. Please try again later.") : new Error(`API error: ${c.status}`);
273
320
  }
274
- const c = await i.json();
275
- if (!c.artifacts || c.artifacts.length === 0)
321
+ const u = await c.json();
322
+ if (!u.artifacts || u.artifacts.length === 0)
276
323
  throw new Error("No image generated");
277
- return `data:image/png;base64,${c.artifacts[0].base64}`;
324
+ return `data:image/png;base64,${u.artifacts[0].base64}`;
325
+ }
326
+ async function Te(e) {
327
+ const t = re();
328
+ if (!t)
329
+ throw new Error("No Clipdrop API key configured");
330
+ const a = ne(e), n = new FormData();
331
+ n.append("image_file", a, "image.png");
332
+ const r = await fetch(Ie, {
333
+ method: "POST",
334
+ headers: {
335
+ "x-api-key": t
336
+ },
337
+ body: n
338
+ });
339
+ if (!r.ok) {
340
+ const d = await r.text();
341
+ throw console.error("Clipdrop error:", d), r.status === 401 ? new Error("Invalid API key") : r.status === 402 ? new Error("Insufficient credits") : r.status === 429 ? new Error("Rate limit exceeded. Please try again later.") : new Error(`API error: ${r.status}`);
342
+ }
343
+ const o = await r.blob();
344
+ return new Promise((d, l) => {
345
+ const s = new FileReader();
346
+ s.onload = () => d(s.result), s.onerror = () => l(new Error("Failed to read result")), s.readAsDataURL(o);
347
+ });
278
348
  }
279
- async function V(e) {
280
- return new Promise((t, n) => {
281
- const a = new Image();
282
- a.onload = () => {
283
- const r = document.createElement("canvas"), l = r.getContext("2d");
284
- if (!l) {
285
- n(new Error("Failed to get canvas context"));
349
+ async function X(e) {
350
+ return new Promise((t, a) => {
351
+ const n = new Image();
352
+ n.onload = () => {
353
+ const r = document.createElement("canvas"), o = r.getContext("2d");
354
+ if (!o) {
355
+ a(new Error("Failed to get canvas context"));
286
356
  return;
287
357
  }
288
- r.width = a.width, r.height = a.height, l.filter = "sepia(0.3) contrast(1.1) saturate(0.9)", l.drawImage(a, 0, 0), t(r.toDataURL("image/png"));
289
- }, a.onerror = () => n(new Error("Failed to load image")), a.src = e;
358
+ r.width = n.width, r.height = n.height, o.filter = "sepia(0.3) contrast(1.1) saturate(0.9)", o.drawImage(n, 0, 0), t(r.toDataURL("image/png"));
359
+ }, n.onerror = () => a(new Error("Failed to load image")), n.src = e;
290
360
  });
291
361
  }
292
- function ye() {
293
- const [e, t] = C(!1), [n, a] = C(null), [r, l] = C(q()), s = E(() => a(null), []), d = E((c) => {
294
- fe(c), l(!0), a(null);
295
- }, []);
362
+ function De() {
363
+ const [e, t] = C(!1), [a, n] = C(!1), [r, o] = C(null), [d, l] = C(Z()), [s, c] = C(Ae()), u = S(() => o(null), []), g = S((x) => {
364
+ Ce(x), l(!0), o(null);
365
+ }, []), b = S((x) => {
366
+ Se(x), c(!0), o(null);
367
+ }, []), w = S(
368
+ async (x, k = "vintage") => {
369
+ t(!0), o(null);
370
+ try {
371
+ return Z() ? await Le({
372
+ imageDataUrl: x,
373
+ style: k,
374
+ strength: 0.35
375
+ }) : await X(x);
376
+ } catch (v) {
377
+ const E = v instanceof Error ? v.message : "Enhancement failed";
378
+ if (o(E), E.includes("API") || E.includes("key"))
379
+ try {
380
+ return await X(x);
381
+ } catch {
382
+ throw v;
383
+ }
384
+ throw v;
385
+ } finally {
386
+ t(!1);
387
+ }
388
+ },
389
+ []
390
+ ), h = S(
391
+ async (x) => {
392
+ n(!0), o(null);
393
+ try {
394
+ return await Te(x);
395
+ } catch (k) {
396
+ const v = k instanceof Error ? k.message : "Background removal failed";
397
+ throw o(v), k;
398
+ } finally {
399
+ n(!1);
400
+ }
401
+ },
402
+ []
403
+ );
296
404
  return {
297
- enhance: E(
298
- async (c, f = "vintage") => {
299
- t(!0), a(null);
300
- try {
301
- return q() ? await be({
302
- imageDataUrl: c,
303
- style: f,
304
- strength: 0.35
305
- }) : await V(c);
306
- } catch (p) {
307
- const b = p instanceof Error ? p.message : "Enhancement failed";
308
- if (a(b), b.includes("API") || b.includes("key"))
309
- try {
310
- return await V(c);
311
- } catch {
312
- throw p;
313
- }
314
- throw p;
315
- } finally {
316
- t(!1);
317
- }
318
- },
319
- []
320
- ),
405
+ enhance: w,
406
+ removeBg: h,
321
407
  isEnhancing: e,
322
- error: n,
323
- hasKey: r,
324
- setApiKey: d,
325
- clearError: s
408
+ isRemovingBg: a,
409
+ error: r,
410
+ hasKey: d,
411
+ setApiKey: g,
412
+ hasClipdropKey: s,
413
+ setClipdropKey: b,
414
+ clearError: u
326
415
  };
327
416
  }
328
- function ve({ isOpen: e, onClose: t, onSubmit: n }) {
329
- const a = g((c) => c.voucherConfig.language), [r, l] = C("");
417
+ function _e({ isOpen: e, onClose: t, onSubmit: a }) {
418
+ const n = f((c) => c.voucherConfig.language), [r, o] = C("");
330
419
  if (!e) return null;
331
- const s = (c) => {
332
- c.preventDefault(), r.trim() && (n(r.trim()), l(""), t());
333
- }, i = {
420
+ const d = (c) => {
421
+ c.preventDefault(), r.trim() && (a(r.trim()), o(""), t());
422
+ }, s = {
334
423
  de: {
335
424
  title: "Stability AI API Key",
336
425
  description: "Um die AI-Bildverbesserung zu nutzen, benötigst du einen Stability AI API Key. Du kannst ihn auf platform.stability.ai erhalten.",
@@ -347,108 +436,116 @@ function ve({ isOpen: e, onClose: t, onSubmit: n }) {
347
436
  cancel: "Cancel",
348
437
  hint: "The key is stored locally in your browser."
349
438
  }
350
- }[a];
439
+ }[n];
351
440
  return /* @__PURE__ */ m("dialog", { className: "modal modal-open", children: [
352
441
  /* @__PURE__ */ m("div", { className: "modal-box", children: [
353
- /* @__PURE__ */ o("h3", { className: "font-bold text-lg", children: i.title }),
354
- /* @__PURE__ */ o("p", { className: "py-4 text-sm opacity-80", children: i.description }),
355
- /* @__PURE__ */ m("form", { onSubmit: s, children: [
442
+ /* @__PURE__ */ i("h3", { className: "font-bold text-lg", children: s.title }),
443
+ /* @__PURE__ */ i("p", { className: "py-4 text-sm opacity-80", children: s.description }),
444
+ /* @__PURE__ */ m("form", { onSubmit: d, children: [
356
445
  /* @__PURE__ */ m("div", { className: "form-control", children: [
357
- /* @__PURE__ */ o(
446
+ /* @__PURE__ */ i(
358
447
  "input",
359
448
  {
360
449
  type: "password",
361
- placeholder: i.placeholder,
450
+ placeholder: s.placeholder,
362
451
  className: "input input-bordered w-full",
363
452
  value: r,
364
- onChange: (c) => l(c.target.value),
453
+ onChange: (c) => o(c.target.value),
365
454
  autoFocus: !0
366
455
  }
367
456
  ),
368
- /* @__PURE__ */ o("label", { className: "label", children: /* @__PURE__ */ o("span", { className: "label-text-alt", children: i.hint }) })
457
+ /* @__PURE__ */ i("label", { className: "label", children: /* @__PURE__ */ i("span", { className: "label-text-alt", children: s.hint }) })
369
458
  ] }),
370
459
  /* @__PURE__ */ m("div", { className: "modal-action", children: [
371
- /* @__PURE__ */ o("button", { type: "button", className: "btn btn-ghost", onClick: t, children: i.cancel }),
372
- /* @__PURE__ */ o("button", { type: "submit", className: "btn btn-primary", disabled: !r.trim(), children: i.submit })
460
+ /* @__PURE__ */ i("button", { type: "button", className: "btn btn-ghost", onClick: t, children: s.cancel }),
461
+ /* @__PURE__ */ i("button", { type: "submit", className: "btn btn-primary", disabled: !r.trim(), children: s.submit })
373
462
  ] })
374
463
  ] })
375
464
  ] }),
376
- /* @__PURE__ */ o("form", { method: "dialog", className: "modal-backdrop", children: /* @__PURE__ */ o("button", { onClick: t, children: "close" }) })
465
+ /* @__PURE__ */ i("form", { method: "dialog", className: "modal-backdrop", children: /* @__PURE__ */ i("button", { onClick: t, children: "close" }) })
377
466
  ] });
378
467
  }
379
- function Re() {
380
- const e = g((h) => h.voucherConfig.language), t = g((h) => h.portrait), n = g((h) => h.setPortrait), a = g((h) => h.setEnhancedPortrait), r = g((h) => h.toggleUseEnhanced), l = g((h) => h.setPortraitZoom), { enhance: s, isEnhancing: d, error: i, hasKey: c, setApiKey: f } = ye(), p = _(e), b = A(null), [v, u] = C(!1), [N, I] = C(!1), k = E(
381
- (h) => {
382
- if (!h.type.startsWith("image/"))
468
+ function Xe() {
469
+ const e = f((p) => p.voucherConfig.language), t = f((p) => p.portrait), a = f((p) => p.setPortrait), n = f((p) => p.setEnhancedPortrait), r = f((p) => p.toggleUseEnhanced), o = f((p) => p.setPortraitZoom), { enhance: d, removeBg: l, isEnhancing: s, isRemovingBg: c, error: u, hasKey: g, setApiKey: b, hasClipdropKey: w } = De(), h = _(e), x = T(null), [k, v] = C(!1), [E, y] = C(!1), N = S(
470
+ async (p) => {
471
+ if (!p.type.startsWith("image/"))
383
472
  return;
384
- const w = new FileReader();
385
- w.onload = (B) => {
386
- var K;
387
- const ie = (K = B.target) == null ? void 0 : K.result;
388
- n(ie);
389
- }, w.readAsDataURL(h);
473
+ const I = new FileReader();
474
+ I.onload = async ($) => {
475
+ var Y;
476
+ const F = (Y = $.target) == null ? void 0 : Y.result;
477
+ if (w)
478
+ try {
479
+ const O = await l(F);
480
+ a(O);
481
+ } catch (O) {
482
+ console.error("Background removal failed, using original:", O), a(F);
483
+ }
484
+ else
485
+ a(F);
486
+ }, I.readAsDataURL(p);
390
487
  },
391
- [n]
392
- ), S = E(
393
- (h) => {
394
- h.preventDefault(), u(!1);
395
- const w = h.dataTransfer.files[0];
396
- w && k(w);
488
+ [a, w, l]
489
+ ), R = S(
490
+ (p) => {
491
+ p.preventDefault(), v(!1);
492
+ const I = p.dataTransfer.files[0];
493
+ I && N(I);
397
494
  },
398
- [k]
399
- ), y = E((h) => {
400
- h.preventDefault(), u(!0);
401
- }, []), P = E((h) => {
402
- h.preventDefault(), u(!1);
403
- }, []), D = () => {
404
- var h;
405
- (h = b.current) == null || h.click();
406
- }, $ = (h) => {
407
- var B;
408
- const w = (B = h.target.files) == null ? void 0 : B[0];
409
- w && k(w);
410
- }, M = async () => {
495
+ [N]
496
+ ), B = S((p) => {
497
+ p.preventDefault(), v(!0);
498
+ }, []), U = S((p) => {
499
+ p.preventDefault(), v(!1);
500
+ }, []), M = () => {
501
+ var p;
502
+ (p = x.current) == null || p.click();
503
+ }, he = (p) => {
504
+ var $;
505
+ const I = ($ = p.target.files) == null ? void 0 : $[0];
506
+ I && N(I);
507
+ }, pe = async () => {
411
508
  if (t.original) {
412
- if (!c) {
413
- I(!0);
509
+ if (!g) {
510
+ y(!0);
414
511
  return;
415
512
  }
416
513
  try {
417
- const h = await s(t.original, "vintage");
418
- a(h);
419
- } catch (h) {
420
- console.error("Enhancement failed:", h);
514
+ const p = await d(t.original, "vintage");
515
+ n(p);
516
+ } catch (p) {
517
+ console.error("Enhancement failed:", p);
421
518
  }
422
519
  }
423
- }, U = async (h) => {
424
- if (f(h), t.original)
520
+ }, ue = async (p) => {
521
+ if (b(p), t.original)
425
522
  try {
426
- const w = await s(t.original, "vintage");
427
- a(w);
428
- } catch (w) {
429
- console.error("Enhancement failed:", w);
523
+ const I = await d(t.original, "vintage");
524
+ n(I);
525
+ } catch (I) {
526
+ console.error("Enhancement failed:", I);
430
527
  }
431
- }, re = () => {
432
- n(null);
433
- }, oe = t.useEnhanced && t.enhanced ? t.enhanced : t.original;
528
+ }, me = () => {
529
+ a(null);
530
+ }, ge = t.useEnhanced && t.enhanced ? t.enhanced : t.original;
434
531
  return /* @__PURE__ */ m("div", { className: "space-y-4", children: [
435
532
  t.original ? /* @__PURE__ */ m("div", { className: "space-y-4", children: [
436
- /* @__PURE__ */ o("div", { className: "flex justify-center", children: /* @__PURE__ */ m("div", { className: "relative", children: [
437
- /* @__PURE__ */ o("div", { className: "w-32 h-32 rounded-full overflow-hidden border-4 border-currency-gold shadow-lg", children: /* @__PURE__ */ o(
533
+ /* @__PURE__ */ i("div", { className: "flex justify-center", children: /* @__PURE__ */ m("div", { className: "relative", children: [
534
+ /* @__PURE__ */ i("div", { className: "w-32 h-32 rounded-full overflow-hidden border-4 border-currency-gold shadow-lg", children: /* @__PURE__ */ i(
438
535
  "img",
439
536
  {
440
- src: oe || "",
537
+ src: ge || "",
441
538
  alt: "Portrait",
442
539
  className: "w-full h-full object-cover",
443
540
  style: { transform: `scale(${t.zoom})` }
444
541
  }
445
542
  ) }),
446
- /* @__PURE__ */ o(
543
+ /* @__PURE__ */ i(
447
544
  "button",
448
545
  {
449
546
  className: "btn btn-circle btn-xs btn-error absolute -top-1 -right-1",
450
- onClick: re,
451
- children: /* @__PURE__ */ o(
547
+ onClick: me,
548
+ children: /* @__PURE__ */ i(
452
549
  "svg",
453
550
  {
454
551
  xmlns: "http://www.w3.org/2000/svg",
@@ -456,7 +553,7 @@ function Re() {
456
553
  fill: "none",
457
554
  viewBox: "0 0 24 24",
458
555
  stroke: "currentColor",
459
- children: /* @__PURE__ */ o(
556
+ children: /* @__PURE__ */ i(
460
557
  "path",
461
558
  {
462
559
  strokeLinecap: "round",
@@ -472,13 +569,13 @@ function Re() {
472
569
  ] }) }),
473
570
  /* @__PURE__ */ m("div", { className: "form-control", children: [
474
571
  /* @__PURE__ */ m("label", { className: "label", children: [
475
- /* @__PURE__ */ o("span", { className: "label-text", children: p.form.portrait.zoom }),
572
+ /* @__PURE__ */ i("span", { className: "label-text", children: h.form.portrait.zoom }),
476
573
  /* @__PURE__ */ m("span", { className: "label-text-alt", children: [
477
574
  Math.round(t.zoom * 100),
478
575
  "%"
479
576
  ] })
480
577
  ] }),
481
- /* @__PURE__ */ o(
578
+ /* @__PURE__ */ i(
482
579
  "input",
483
580
  {
484
581
  type: "range",
@@ -486,23 +583,23 @@ function Re() {
486
583
  max: "2",
487
584
  step: "0.05",
488
585
  value: t.zoom,
489
- onChange: (h) => l(parseFloat(h.target.value)),
586
+ onChange: (p) => o(parseFloat(p.target.value)),
490
587
  className: "range range-primary range-sm"
491
588
  }
492
589
  )
493
590
  ] }),
494
- c && /* @__PURE__ */ m("div", { className: "flex flex-col gap-2", children: [
495
- /* @__PURE__ */ o(
591
+ g && /* @__PURE__ */ m("div", { className: "flex flex-col gap-2", children: [
592
+ /* @__PURE__ */ i(
496
593
  "button",
497
594
  {
498
- className: `btn btn-secondary ${d ? "loading" : ""}`,
499
- onClick: M,
500
- disabled: d,
501
- children: d ? /* @__PURE__ */ m(z, { children: [
502
- /* @__PURE__ */ o("span", { className: "loading loading-spinner loading-sm" }),
503
- p.form.portrait.enhancing
504
- ] }) : /* @__PURE__ */ m(z, { children: [
505
- /* @__PURE__ */ o(
595
+ className: `btn btn-secondary ${s ? "loading" : ""}`,
596
+ onClick: pe,
597
+ disabled: s,
598
+ children: s ? /* @__PURE__ */ m(K, { children: [
599
+ /* @__PURE__ */ i("span", { className: "loading loading-spinner loading-sm" }),
600
+ h.form.portrait.enhancing
601
+ ] }) : /* @__PURE__ */ m(K, { children: [
602
+ /* @__PURE__ */ i(
506
603
  "svg",
507
604
  {
508
605
  xmlns: "http://www.w3.org/2000/svg",
@@ -510,7 +607,7 @@ function Re() {
510
607
  fill: "none",
511
608
  viewBox: "0 0 24 24",
512
609
  stroke: "currentColor",
513
- children: /* @__PURE__ */ o(
610
+ children: /* @__PURE__ */ i(
514
611
  "path",
515
612
  {
516
613
  strokeLinecap: "round",
@@ -521,16 +618,16 @@ function Re() {
521
618
  )
522
619
  }
523
620
  ),
524
- p.form.portrait.enhance
621
+ h.form.portrait.enhance
525
622
  ] })
526
623
  }
527
624
  ),
528
- i && /* @__PURE__ */ m("div", { className: "alert alert-warning text-sm py-2", children: [
529
- /* @__PURE__ */ o("svg", { xmlns: "http://www.w3.org/2000/svg", className: "stroke-current shrink-0 h-5 w-5", fill: "none", viewBox: "0 0 24 24", children: /* @__PURE__ */ o("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }),
530
- /* @__PURE__ */ o("span", { children: i })
625
+ u && /* @__PURE__ */ m("div", { className: "alert alert-warning text-sm py-2", children: [
626
+ /* @__PURE__ */ i("svg", { xmlns: "http://www.w3.org/2000/svg", className: "stroke-current shrink-0 h-5 w-5", fill: "none", viewBox: "0 0 24 24", children: /* @__PURE__ */ i("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" }) }),
627
+ /* @__PURE__ */ i("span", { children: u })
531
628
  ] }),
532
- t.enhanced && /* @__PURE__ */ o("div", { className: "form-control", children: /* @__PURE__ */ m("label", { className: "label cursor-pointer justify-start gap-3", children: [
533
- /* @__PURE__ */ o(
629
+ t.enhanced && /* @__PURE__ */ i("div", { className: "form-control", children: /* @__PURE__ */ m("label", { className: "label cursor-pointer justify-start gap-3", children: [
630
+ /* @__PURE__ */ i(
534
631
  "input",
535
632
  {
536
633
  type: "checkbox",
@@ -539,30 +636,33 @@ function Re() {
539
636
  onChange: r
540
637
  }
541
638
  ),
542
- /* @__PURE__ */ o("span", { className: "label-text", children: t.useEnhanced ? p.form.portrait.useEnhanced : p.form.portrait.useOriginal })
639
+ /* @__PURE__ */ i("span", { className: "label-text", children: t.useEnhanced ? h.form.portrait.useEnhanced : h.form.portrait.useOriginal })
543
640
  ] }) })
544
641
  ] })
545
642
  ] }) : /* @__PURE__ */ m(
546
643
  "div",
547
644
  {
548
- className: `border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${v ? "border-primary bg-primary/10" : "border-base-300 hover:border-primary hover:bg-base-200"}`,
549
- onDrop: S,
550
- onDragOver: y,
551
- onDragLeave: P,
552
- onClick: D,
645
+ className: `border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${c ? "border-primary bg-primary/10 pointer-events-none" : k ? "border-primary bg-primary/10" : "border-base-300 hover:border-primary hover:bg-base-200"}`,
646
+ onDrop: R,
647
+ onDragOver: B,
648
+ onDragLeave: U,
649
+ onClick: M,
553
650
  children: [
554
- /* @__PURE__ */ o(
651
+ /* @__PURE__ */ i(
555
652
  "input",
556
653
  {
557
- ref: b,
654
+ ref: x,
558
655
  type: "file",
559
656
  accept: "image/*",
560
657
  className: "hidden",
561
- onChange: $
658
+ onChange: he
562
659
  }
563
660
  ),
564
- /* @__PURE__ */ m("div", { className: "flex flex-col items-center gap-2", children: [
565
- /* @__PURE__ */ o(
661
+ c ? /* @__PURE__ */ m("div", { className: "flex flex-col items-center gap-2", children: [
662
+ /* @__PURE__ */ i("span", { className: "loading loading-spinner loading-lg text-primary" }),
663
+ /* @__PURE__ */ i("p", { className: "font-medium", children: e === "de" ? "Hintergrund wird entfernt..." : "Removing background..." })
664
+ ] }) : /* @__PURE__ */ m("div", { className: "flex flex-col items-center gap-2", children: [
665
+ /* @__PURE__ */ i(
566
666
  "svg",
567
667
  {
568
668
  xmlns: "http://www.w3.org/2000/svg",
@@ -570,7 +670,7 @@ function Re() {
570
670
  fill: "none",
571
671
  viewBox: "0 0 24 24",
572
672
  stroke: "currentColor",
573
- children: /* @__PURE__ */ o(
673
+ children: /* @__PURE__ */ i(
574
674
  "path",
575
675
  {
576
676
  strokeLinecap: "round",
@@ -581,67 +681,67 @@ function Re() {
581
681
  )
582
682
  }
583
683
  ),
584
- /* @__PURE__ */ o("p", { className: "font-medium", children: p.form.portrait.upload }),
585
- /* @__PURE__ */ o("p", { className: "text-sm text-base-content/60", children: p.form.portrait.dragDrop })
684
+ /* @__PURE__ */ i("p", { className: "font-medium", children: h.form.portrait.upload }),
685
+ /* @__PURE__ */ i("p", { className: "text-sm text-base-content/60", children: h.form.portrait.dragDrop })
586
686
  ] })
587
687
  ]
588
688
  }
589
689
  ),
590
- /* @__PURE__ */ o(
591
- ve,
690
+ /* @__PURE__ */ i(
691
+ _e,
592
692
  {
593
- isOpen: N,
594
- onClose: () => I(!1),
595
- onSubmit: U
693
+ isOpen: E,
694
+ onClose: () => y(!1),
695
+ onSubmit: ue
596
696
  }
597
697
  )
598
698
  ] });
599
699
  }
600
- function He() {
700
+ function Je() {
601
701
  return null;
602
702
  }
603
- const x = typeof import.meta < "u" && "/" || "/", we = {
703
+ const P = typeof import.meta < "u" && "/" || "/", Re = {
604
704
  en: {
605
705
  1: {
606
- front: `${x}templates/front_ldpi_en.png`,
607
- back: `${x}templates/back_ldpi_en.png`,
706
+ front: `${P}templates/front_ldpi_en.png`,
707
+ back: `${P}templates/back_ldpi_en.png`,
608
708
  width: 1536,
609
709
  height: 1024
610
710
  },
611
711
  5: {
612
- front: `${x}templates/front_ldpi_en.png`,
613
- back: `${x}templates/back_ldpi_en.png`,
712
+ front: `${P}templates/front_ldpi_en.png`,
713
+ back: `${P}templates/back_ldpi_en.png`,
614
714
  width: 1536,
615
715
  height: 1024
616
716
  },
617
717
  10: {
618
- front: `${x}templates/front_ldpi_en.png`,
619
- back: `${x}templates/back_ldpi_en.png`,
718
+ front: `${P}templates/front_ldpi_en.png`,
719
+ back: `${P}templates/back_ldpi_en.png`,
620
720
  width: 1536,
621
721
  height: 1024
622
722
  }
623
723
  },
624
724
  de: {
625
725
  1: {
626
- front: `${x}templates/front_hdpi_de.webp`,
627
- back: `${x}templates/back_hdpi_de.webp`,
726
+ front: `${P}templates/front_hdpi_de.webp`,
727
+ back: `${P}templates/back_hdpi_de.webp`,
628
728
  width: 6144,
629
729
  height: 3200
630
730
  },
631
731
  5: {
632
- front: `${x}templates/front_hdpi_de.webp`,
633
- back: `${x}templates/back_hdpi_de.webp`,
732
+ front: `${P}templates/front_hdpi_de.webp`,
733
+ back: `${P}templates/back_hdpi_de.webp`,
634
734
  width: 6144,
635
735
  height: 3200
636
736
  },
637
737
  10: {
638
- front: `${x}templates/front_hdpi_de.webp`,
639
- back: `${x}templates/back_hdpi_de.webp`,
738
+ front: `${P}templates/front_hdpi_de.webp`,
739
+ back: `${P}templates/back_hdpi_de.webp`,
640
740
  width: 6144,
641
741
  height: 3200
642
742
  }
643
743
  }
644
- }, T = {
744
+ }, A = {
645
745
  front: {
646
746
  portrait: {
647
747
  x: 768,
@@ -734,140 +834,140 @@ const x = typeof import.meta < "u" && "/" || "/", we = {
734
834
  }
735
835
  }
736
836
  };
737
- function J(e) {
738
- return e === "de" ? L : T;
837
+ function oe(e) {
838
+ return e === "de" ? L : A;
739
839
  }
740
- function Q(e, t) {
741
- return we[e][t];
840
+ function ie(e, t) {
841
+ return Re[e][t];
742
842
  }
743
843
  const W = /* @__PURE__ */ new Map();
744
844
  async function j(e) {
745
- return W.has(e) ? W.get(e) : new Promise((t, n) => {
746
- const a = new Image();
747
- a.crossOrigin = "anonymous", a.onload = () => {
748
- W.set(e, a), t(a);
749
- }, a.onerror = n, a.src = e;
845
+ return W.has(e) ? W.get(e) : new Promise((t, a) => {
846
+ const n = new Image();
847
+ n.crossOrigin = "anonymous", n.onload = () => {
848
+ W.set(e, n), t(n);
849
+ }, n.onerror = a, n.src = e;
750
850
  });
751
851
  }
752
- function ee(e, t, n, a) {
753
- e.drawImage(t, 0, 0, n, a);
852
+ function se(e, t, a, n) {
853
+ e.drawImage(t, 0, 0, a, n);
754
854
  }
755
- function xe(e, t, n, a, r, l, s = 1) {
756
- e.save(), e.beginPath(), e.ellipse(n, a, r, l, 0, 0, Math.PI * 2), e.closePath(), e.clip();
757
- const d = t.width / t.height, i = r / l, c = r * 2, f = l * 2;
758
- let p, b;
759
- d > i ? (b = f, p = f * d) : (p = c, b = c / d), p *= s, b *= s;
760
- const v = n - p / 2, u = a - b / 2;
761
- e.drawImage(t, v, u, p, b), e.restore();
855
+ function Be(e, t, a, n, r, o, d = 1) {
856
+ e.save(), e.beginPath(), e.ellipse(a, n, r, o, 0, 0, Math.PI * 2), e.closePath(), e.clip();
857
+ const l = t.width / t.height, s = r / o, c = r * 2, u = o * 2;
858
+ let g, b;
859
+ l > s ? (b = u, g = u * l) : (g = c, b = c / l), g *= d, b *= d;
860
+ const w = a - g / 2, h = n - b / 2;
861
+ e.drawImage(t, w, h, g, b), e.restore();
762
862
  }
763
- function te(e, t, n, a = "#2a3a2a") {
764
- e.save(), e.font = `${n.fontSize}px "Times New Roman", serif`, e.textAlign = n.align || "center", e.textBaseline = "middle", e.fillStyle = a, n.maxWidth ? e.fillText(t, n.x, n.y, n.maxWidth) : e.fillText(t, n.x, n.y), e.restore();
863
+ function le(e, t, a, n = "#2a3a2a") {
864
+ e.save(), e.font = `${a.fontSize}px "Times New Roman", serif`, e.textAlign = a.align || "center", e.textBaseline = "middle", e.fillStyle = n, a.maxWidth ? e.fillText(t, a.x, a.y, a.maxWidth) : e.fillText(t, a.x, a.y), e.restore();
765
865
  }
766
- function ke(e, t, n, a = "#2a3a2a") {
767
- e.save(), e.font = `${n.fontSize}px "Times New Roman", serif`, e.textAlign = n.align || "center", e.textBaseline = "top", e.fillStyle = a;
768
- const r = n.maxWidth || 400, l = n.lineHeight || n.fontSize * 1.4, s = t.split(" "), d = [];
769
- let i = "";
770
- for (const p of s) {
771
- const b = i ? `${i} ${p}` : p;
772
- e.measureText(b).width > r && i ? (d.push(i), i = p) : i = b;
866
+ function $e(e, t, a, n = "#2a3a2a") {
867
+ e.save(), e.font = `${a.fontSize}px "Times New Roman", serif`, e.textAlign = a.align || "center", e.textBaseline = "top", e.fillStyle = n;
868
+ const r = a.maxWidth || 400, o = a.lineHeight || a.fontSize * 1.4, d = t.split(" "), l = [];
869
+ let s = "";
870
+ for (const g of d) {
871
+ const b = s ? `${s} ${g}` : g;
872
+ e.measureText(b).width > r && s ? (l.push(s), s = g) : s = b;
773
873
  }
774
- i && d.push(i);
775
- const c = d.length * l;
776
- let f = n.y - c / 2;
777
- for (const p of d)
778
- e.fillText(p, n.x, f), f += l;
874
+ s && l.push(s);
875
+ const c = l.length * o;
876
+ let u = a.y - c / 2;
877
+ for (const g of l)
878
+ e.fillText(g, a.x, u), u += o;
779
879
  e.restore();
780
880
  }
781
- function Ie(e, t, n, a, r, l = "#2a3a2a") {
782
- e.save(), e.font = `${r.fontSize}px "Times New Roman", serif`, e.textAlign = r.align || "center", e.textBaseline = "middle", e.fillStyle = l;
783
- const s = r.lineHeight || r.fontSize * 1.8, d = [t, n, a].filter(Boolean), i = (d.length - 1) * s;
784
- let c = r.y - i / 2;
785
- for (const f of d)
786
- f && (e.fillText(f, r.x, c), c += s);
881
+ function Ke(e, t, a, n, r, o = "#2a3a2a") {
882
+ e.save(), e.font = `${r.fontSize}px "Times New Roman", serif`, e.textAlign = r.align || "center", e.textBaseline = "middle", e.fillStyle = o;
883
+ const d = r.lineHeight || r.fontSize * 1.8, l = [t, a, n].filter(Boolean), s = (l.length - 1) * d;
884
+ let c = r.y - s / 2;
885
+ for (const u of l)
886
+ u && (e.fillText(u, r.x, c), c += d);
787
887
  e.restore();
788
888
  }
789
- async function ne(e, t, n, a, r, l, s, d = 1) {
790
- const i = e.getContext("2d");
791
- if (!i) return;
792
- e.width = l, e.height = s, i.clearRect(0, 0, l, s);
889
+ async function ce(e, t, a, n, r, o, d, l = 1) {
890
+ const s = e.getContext("2d");
891
+ if (!s) return;
892
+ e.width = o, e.height = d, s.clearRect(0, 0, o, d);
793
893
  const c = await j(t);
794
- if (ee(i, c, l, s), n)
894
+ if (se(s, c, o, d), a)
795
895
  try {
796
- const f = await j(n);
797
- xe(
798
- i,
799
- f,
896
+ const u = await j(a);
897
+ Be(
898
+ s,
899
+ u,
800
900
  r.portrait.x,
801
901
  r.portrait.y,
802
902
  r.portrait.radiusX,
803
903
  r.portrait.radiusY,
804
- d
904
+ l
805
905
  );
806
- } catch (f) {
807
- console.error("Failed to load portrait:", f);
906
+ } catch (u) {
907
+ console.error("Failed to load portrait:", u);
808
908
  }
809
- a && te(i, a, r.namePlate);
909
+ n && le(s, n, r.namePlate);
810
910
  }
811
- async function ae(e, t, n, a, r, l, s, d, i) {
911
+ async function de(e, t, a, n, r, o, d, l, s) {
812
912
  const c = e.getContext("2d");
813
913
  if (!c) return;
814
- e.width = d, e.height = i, c.clearRect(0, 0, d, i);
815
- const f = await j(t);
816
- ee(c, f, d, i), s.contactInfo && (n || a || r) && Ie(c, n, a, r, s.contactInfo), s.description && l && ke(c, l, s.description), n && te(c, n, s.namePlate);
914
+ e.width = l, e.height = s, c.clearRect(0, 0, l, s);
915
+ const u = await j(t);
916
+ se(c, u, l, s), d.contactInfo && (a || n || r) && Ke(c, a, n, r, d.contactInfo), d.description && o && $e(c, o, d.description), a && le(c, a, d.namePlate);
817
917
  }
818
- function Me() {
819
- const e = g((y) => y.voucherConfig.language), t = g((y) => y.voucherConfig.hours), n = g((y) => y.voucherConfig.description), a = g((y) => y.personalInfo), r = g((y) => y.portrait), l = g((y) => y.currentSide), s = g((y) => y.flipSide), d = _(e), i = A(null), c = A(null), f = A(null), [p, b] = C(!1), v = Q(e, t), u = J(e), N = r.useEnhanced && r.enhanced ? r.enhanced : r.original, I = G(e, t, n);
820
- O(() => {
821
- i.current && ne(
822
- i.current,
823
- v.front,
824
- N,
825
- a.name,
826
- u.front,
827
- v.width,
828
- v.height,
918
+ function Qe() {
919
+ const e = f((y) => y.voucherConfig.language), t = f((y) => y.voucherConfig.hours), a = f((y) => y.voucherConfig.description), n = f((y) => y.personalInfo), r = f((y) => y.portrait), o = f((y) => y.currentSide), d = f((y) => y.flipSide), l = _(e), s = T(null), c = T(null), u = T(null), [g, b] = C(!1), w = ie(e, t), h = oe(e), x = r.useEnhanced && r.enhanced ? r.enhanced : r.original, k = Q(e, t, a);
920
+ q(() => {
921
+ s.current && ce(
922
+ s.current,
923
+ w.front,
924
+ x,
925
+ n.name,
926
+ h.front,
927
+ w.width,
928
+ w.height,
829
929
  r.zoom
830
930
  );
831
- }, [v, N, a.name, u, r.zoom]), O(() => {
832
- c.current && ae(
931
+ }, [w, x, n.name, h, r.zoom]), q(() => {
932
+ c.current && de(
833
933
  c.current,
834
- v.back,
835
- a.name,
836
- a.email,
837
- a.phone,
838
- I,
839
- u.back,
840
- v.width,
841
- v.height
934
+ w.back,
935
+ n.name,
936
+ n.email,
937
+ n.phone,
938
+ k,
939
+ h.back,
940
+ w.width,
941
+ w.height
842
942
  );
843
- }, [v, a, I, u]);
844
- const k = () => {
943
+ }, [w, n, k, h]);
944
+ const v = () => {
845
945
  b(!0), setTimeout(() => {
846
- s(), b(!1);
946
+ d(), b(!1);
847
947
  }, 150);
848
- }, S = v.width / v.height;
948
+ }, E = w.width / w.height;
849
949
  return /* @__PURE__ */ m("div", { className: "space-y-4", children: [
850
950
  /* @__PURE__ */ m("div", { className: "flex justify-between items-center", children: [
851
951
  /* @__PURE__ */ m("div", { className: "tabs tabs-boxed bg-base-200", children: [
852
- /* @__PURE__ */ o(
952
+ /* @__PURE__ */ i(
853
953
  "button",
854
954
  {
855
- className: `tab ${l === "front" ? "tab-active bg-primary text-primary-content font-semibold" : ""}`,
856
- onClick: () => l !== "front" && k(),
857
- children: d.preview.front
955
+ className: `tab ${o === "front" ? "tab-active bg-primary text-primary-content font-semibold" : ""}`,
956
+ onClick: () => o !== "front" && v(),
957
+ children: l.preview.front
858
958
  }
859
959
  ),
860
- /* @__PURE__ */ o(
960
+ /* @__PURE__ */ i(
861
961
  "button",
862
962
  {
863
- className: `tab ${l === "back" ? "tab-active bg-primary text-primary-content font-semibold" : ""}`,
864
- onClick: () => l !== "back" && k(),
865
- children: d.preview.back
963
+ className: `tab ${o === "back" ? "tab-active bg-primary text-primary-content font-semibold" : ""}`,
964
+ onClick: () => o !== "back" && v(),
965
+ children: l.preview.back
866
966
  }
867
967
  )
868
968
  ] }),
869
- /* @__PURE__ */ m("button", { className: "btn btn-ghost btn-sm", onClick: k, children: [
870
- /* @__PURE__ */ o(
969
+ /* @__PURE__ */ m("button", { className: "btn btn-ghost btn-sm", onClick: v, children: [
970
+ /* @__PURE__ */ i(
871
971
  "svg",
872
972
  {
873
973
  xmlns: "http://www.w3.org/2000/svg",
@@ -875,7 +975,7 @@ function Me() {
875
975
  fill: "none",
876
976
  viewBox: "0 0 24 24",
877
977
  stroke: "currentColor",
878
- children: /* @__PURE__ */ o(
978
+ children: /* @__PURE__ */ i(
879
979
  "path",
880
980
  {
881
981
  strokeLinecap: "round",
@@ -886,28 +986,28 @@ function Me() {
886
986
  )
887
987
  }
888
988
  ),
889
- d.preview.flip
989
+ l.preview.flip
890
990
  ] })
891
991
  ] }),
892
992
  /* @__PURE__ */ m(
893
993
  "div",
894
994
  {
895
- ref: f,
995
+ ref: u,
896
996
  className: "relative w-full overflow-hidden shadow-lg",
897
- style: { aspectRatio: S },
997
+ style: { aspectRatio: E },
898
998
  children: [
899
- /* @__PURE__ */ o(
999
+ /* @__PURE__ */ i(
900
1000
  "canvas",
901
1001
  {
902
- ref: i,
903
- className: `absolute inset-0 w-full h-full transition-all duration-300 ${l === "front" ? p ? "opacity-0 scale-95" : "opacity-100 scale-100" : "opacity-0 scale-95 pointer-events-none"}`
1002
+ ref: s,
1003
+ className: `absolute inset-0 w-full h-full transition-all duration-300 ${o === "front" ? g ? "opacity-0 scale-95" : "opacity-100 scale-100" : "opacity-0 scale-95 pointer-events-none"}`
904
1004
  }
905
1005
  ),
906
- /* @__PURE__ */ o(
1006
+ /* @__PURE__ */ i(
907
1007
  "canvas",
908
1008
  {
909
1009
  ref: c,
910
- className: `absolute inset-0 w-full h-full transition-all duration-300 ${l === "back" ? p ? "opacity-0 scale-95" : "opacity-100 scale-100" : "opacity-0 scale-95 pointer-events-none"}`
1010
+ className: `absolute inset-0 w-full h-full transition-all duration-300 ${o === "back" ? g ? "opacity-0 scale-95" : "opacity-100 scale-100" : "opacity-0 scale-95 pointer-events-none"}`
911
1011
  }
912
1012
  )
913
1013
  ]
@@ -915,86 +1015,86 @@ function Me() {
915
1015
  )
916
1016
  ] });
917
1017
  }
918
- function Ue() {
919
- const e = A(null), t = A(null);
1018
+ function et() {
1019
+ const e = T(null), t = T(null);
920
1020
  return { frontCanvasRef: e, backCanvasRef: t };
921
1021
  }
922
- async function Pe(e) {
1022
+ async function ze(e) {
923
1023
  const {
924
1024
  frontTemplateSrc: t,
925
- backTemplateSrc: n,
926
- templateWidth: a,
1025
+ backTemplateSrc: a,
1026
+ templateWidth: n,
927
1027
  templateHeight: r,
928
- layout: l,
929
- portrait: s,
930
- portraitZoom: d = 1,
931
- name: i,
1028
+ layout: o,
1029
+ portrait: d,
1030
+ portraitZoom: l = 1,
1031
+ name: s,
932
1032
  email: c,
933
- phone: f,
934
- description: p
935
- } = e, b = document.createElement("canvas"), v = document.createElement("canvas");
1033
+ phone: u,
1034
+ description: g
1035
+ } = e, b = document.createElement("canvas"), w = document.createElement("canvas");
936
1036
  await Promise.all([
937
- ne(b, t, s, i, l.front, a, r, d),
938
- ae(v, n, i, c, f, p, l.back, a, r)
1037
+ ce(b, t, d, s, o.front, n, r, l),
1038
+ de(w, a, s, c, u, g, o.back, n, r)
939
1039
  ]);
940
- const u = new ce({
1040
+ const h = new ye({
941
1041
  orientation: "landscape",
942
1042
  unit: "mm",
943
1043
  format: "a4"
944
- }), N = 297, I = 210, k = 10, S = a / r;
945
- let y = N - k * 2, P = y / S;
946
- P > I - k * 2 && (P = I - k * 2, y = P * S);
947
- const D = (N - y) / 2, $ = (I - P) / 2, M = b.toDataURL("image/jpeg", 0.95);
948
- u.addImage(M, "JPEG", D, $, y, P), u.addPage();
949
- const U = v.toDataURL("image/jpeg", 0.95);
950
- return u.addImage(U, "JPEG", D, $, y, P), u.output("blob");
1044
+ }), x = 297, k = 210, v = 10, E = n / r;
1045
+ let y = x - v * 2, N = y / E;
1046
+ N > k - v * 2 && (N = k - v * 2, y = N * E);
1047
+ const R = (x - y) / 2, B = (k - N) / 2, U = b.toDataURL("image/jpeg", 0.95);
1048
+ h.addImage(U, "JPEG", R, B, y, N), h.addPage();
1049
+ const M = w.toDataURL("image/jpeg", 0.95);
1050
+ return h.addImage(M, "JPEG", R, B, y, N), h.output("blob");
951
1051
  }
952
- function Ne(e, t) {
953
- const n = URL.createObjectURL(e), a = document.createElement("a");
954
- a.href = n, a.download = t, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(n);
1052
+ function He(e, t) {
1053
+ const a = URL.createObjectURL(e), n = document.createElement("a");
1054
+ n.href = a, n.download = t, document.body.appendChild(n), n.click(), document.body.removeChild(n), URL.revokeObjectURL(a);
955
1055
  }
956
- async function Ee(e) {
957
- const t = await Pe(e);
958
- Ne(t, e.filename);
1056
+ async function Ue(e) {
1057
+ const t = await ze(e);
1058
+ He(t, e.filename);
959
1059
  }
960
- function Fe() {
961
- const e = g((u) => u.voucherConfig.language), t = g((u) => u.voucherConfig.hours), n = g((u) => u.voucherConfig.description), a = g((u) => u.personalInfo), r = g((u) => u.portrait), l = g((u) => u.isExporting), s = g((u) => u.setIsExporting), d = _(e), i = Q(e, t), c = J(e), f = r.useEnhanced && r.enhanced ? r.enhanced : r.original, p = G(e, t, n), b = a.name.trim().length > 0 && a.email.trim().length > 0 && a.phone.trim().length > 0 && r.original !== null;
962
- return /* @__PURE__ */ o(
1060
+ function tt() {
1061
+ const e = f((h) => h.voucherConfig.language), t = f((h) => h.voucherConfig.hours), a = f((h) => h.voucherConfig.description), n = f((h) => h.personalInfo), r = f((h) => h.portrait), o = f((h) => h.isExporting), d = f((h) => h.setIsExporting), l = _(e), s = ie(e, t), c = oe(e), u = r.useEnhanced && r.enhanced ? r.enhanced : r.original, g = Q(e, t, a), b = n.name.trim().length > 0 && n.email.trim().length > 0 && n.phone.trim().length > 0 && r.original !== null;
1062
+ return /* @__PURE__ */ i(
963
1063
  "button",
964
1064
  {
965
- className: `btn btn-primary flex-1 ${l ? "loading" : ""}`,
1065
+ className: `btn btn-primary flex-1 ${o ? "loading" : ""}`,
966
1066
  onClick: async () => {
967
- if (!(!b || l)) {
968
- s(!0);
1067
+ if (!(!b || o)) {
1068
+ d(!0);
969
1069
  try {
970
- const u = `zeitgutschein-${t}h-${a.name.replace(/\s+/g, "-").toLowerCase()}.pdf`;
971
- await Ee({
972
- frontTemplateSrc: i.front,
973
- backTemplateSrc: i.back,
974
- templateWidth: i.width,
975
- templateHeight: i.height,
1070
+ const h = `zeitgutschein-${t}h-${n.name.replace(/\s+/g, "-").toLowerCase()}.pdf`;
1071
+ await Ue({
1072
+ frontTemplateSrc: s.front,
1073
+ backTemplateSrc: s.back,
1074
+ templateWidth: s.width,
1075
+ templateHeight: s.height,
976
1076
  layout: c,
977
- portrait: f,
1077
+ portrait: u,
978
1078
  portraitZoom: r.zoom,
979
- name: a.name,
980
- email: a.email,
981
- phone: a.phone,
982
- description: p,
983
- filename: u
1079
+ name: n.name,
1080
+ email: n.email,
1081
+ phone: n.phone,
1082
+ description: g,
1083
+ filename: h
984
1084
  });
985
- } catch (u) {
986
- console.error("PDF export failed:", u);
1085
+ } catch (h) {
1086
+ console.error("PDF export failed:", h);
987
1087
  } finally {
988
- s(!1);
1088
+ d(!1);
989
1089
  }
990
1090
  }
991
1091
  },
992
- disabled: !b || l,
993
- children: l ? /* @__PURE__ */ m(z, { children: [
994
- /* @__PURE__ */ o("span", { className: "loading loading-spinner loading-sm" }),
995
- d.export.exporting
996
- ] }) : /* @__PURE__ */ m(z, { children: [
997
- /* @__PURE__ */ o(
1092
+ disabled: !b || o,
1093
+ children: o ? /* @__PURE__ */ m(K, { children: [
1094
+ /* @__PURE__ */ i("span", { className: "loading loading-spinner loading-sm" }),
1095
+ l.export.exporting
1096
+ ] }) : /* @__PURE__ */ m(K, { children: [
1097
+ /* @__PURE__ */ i(
998
1098
  "svg",
999
1099
  {
1000
1100
  xmlns: "http://www.w3.org/2000/svg",
@@ -1002,7 +1102,7 @@ function Fe() {
1002
1102
  fill: "none",
1003
1103
  viewBox: "0 0 24 24",
1004
1104
  stroke: "currentColor",
1005
- children: /* @__PURE__ */ o(
1105
+ children: /* @__PURE__ */ i(
1006
1106
  "path",
1007
1107
  {
1008
1108
  strokeLinecap: "round",
@@ -1013,50 +1113,50 @@ function Fe() {
1013
1113
  )
1014
1114
  }
1015
1115
  ),
1016
- d.export.button
1116
+ l.export.button
1017
1117
  ] })
1018
1118
  }
1019
1119
  );
1020
1120
  }
1021
- function Ce() {
1022
- const e = g((a) => a.voucherConfig.language), t = g((a) => a.setLanguage), n = (a) => {
1023
- t(a);
1121
+ function Me() {
1122
+ const e = f((n) => n.voucherConfig.language), t = f((n) => n.setLanguage), a = (n) => {
1123
+ t(n);
1024
1124
  };
1025
1125
  return /* @__PURE__ */ m("div", { className: "join", children: [
1026
- /* @__PURE__ */ o(
1126
+ /* @__PURE__ */ i(
1027
1127
  "button",
1028
1128
  {
1029
1129
  className: `join-item btn btn-sm ${e === "de" ? "btn-active btn-primary" : "btn-ghost"}`,
1030
- onClick: () => n("de"),
1130
+ onClick: () => a("de"),
1031
1131
  children: "DE"
1032
1132
  }
1033
1133
  ),
1034
- /* @__PURE__ */ o(
1134
+ /* @__PURE__ */ i(
1035
1135
  "button",
1036
1136
  {
1037
1137
  className: `join-item btn btn-sm ${e === "en" ? "btn-active btn-primary" : "btn-ghost"}`,
1038
- onClick: () => n("en"),
1138
+ onClick: () => a("en"),
1039
1139
  children: "EN"
1040
1140
  }
1041
1141
  )
1042
1142
  ] });
1043
1143
  }
1044
- function We() {
1045
- const e = g((n) => n.voucherConfig.language), t = _(e);
1144
+ function nt() {
1145
+ const e = f((a) => a.voucherConfig.language), t = _(e);
1046
1146
  return /* @__PURE__ */ m("div", { className: "navbar bg-currency-green text-currency-cream shadow-lg", children: [
1047
- /* @__PURE__ */ o("div", { className: "navbar-start", children: /* @__PURE__ */ o("a", { className: "btn btn-ghost text-xl font-currency font-bold", children: t.header.title }) }),
1048
- /* @__PURE__ */ o("div", { className: "navbar-center hidden sm:flex", children: /* @__PURE__ */ o("span", { className: "text-sm opacity-80", children: t.header.subtitle }) }),
1049
- /* @__PURE__ */ o("div", { className: "navbar-end", children: /* @__PURE__ */ o(Ce, {}) })
1147
+ /* @__PURE__ */ i("div", { className: "navbar-start", children: /* @__PURE__ */ i("a", { className: "btn btn-ghost text-xl font-currency font-bold", children: t.header.title }) }),
1148
+ /* @__PURE__ */ i("div", { className: "navbar-center hidden sm:flex", children: /* @__PURE__ */ i("span", { className: "text-sm opacity-80", children: t.header.subtitle }) }),
1149
+ /* @__PURE__ */ i("div", { className: "navbar-end", children: /* @__PURE__ */ i(Me, {}) })
1050
1150
  ] });
1051
1151
  }
1052
- const R = "/", Se = {
1152
+ const z = "/", Fe = {
1053
1153
  id: "time-voucher-classic-de",
1054
1154
  name: "Zeitgutschein Classic",
1055
1155
  type: "time-voucher",
1056
1156
  category: "classic",
1057
1157
  images: {
1058
- front: `${R}templates/front_hdpi_de.jpg`,
1059
- back: `${R}templates/back_hdpi_de.jpg`,
1158
+ front: `${z}templates/front_hdpi_de.jpg`,
1159
+ back: `${z}templates/back_hdpi_de.jpg`,
1060
1160
  width: 6144,
1061
1161
  height: 4096
1062
1162
  },
@@ -1113,14 +1213,14 @@ const R = "/", Se = {
1113
1213
  }
1114
1214
  },
1115
1215
  languages: ["de"]
1116
- }, Te = {
1216
+ }, Oe = {
1117
1217
  id: "time-voucher-classic-en",
1118
1218
  name: "Time Voucher Classic",
1119
1219
  type: "time-voucher",
1120
1220
  category: "classic",
1121
1221
  images: {
1122
- front: `${R}templates/front_ldpi_en.png`,
1123
- back: `${R}templates/back_ldpi_en.png`,
1222
+ front: `${z}templates/front_ldpi_en.png`,
1223
+ back: `${z}templates/back_ldpi_en.png`,
1124
1224
  width: 1536,
1125
1225
  height: 1024
1126
1226
  },
@@ -1167,85 +1267,89 @@ const R = "/", Se = {
1167
1267
  ],
1168
1268
  layout: {
1169
1269
  front: {
1170
- portrait: T.front.portrait,
1171
- name: T.front.namePlate
1270
+ portrait: A.front.portrait,
1271
+ name: A.front.namePlate
1172
1272
  },
1173
1273
  back: {
1174
- name: T.back.namePlate,
1175
- contactInfo: T.back.contactInfo,
1176
- description: T.back.description
1274
+ name: A.back.namePlate,
1275
+ contactInfo: A.back.contactInfo,
1276
+ description: A.back.description
1177
1277
  }
1178
1278
  },
1179
1279
  languages: ["en"]
1180
- }, Z = [
1181
- Se,
1182
- Te
1183
- ], Le = {
1280
+ }, J = [
1281
+ Fe,
1282
+ Oe
1283
+ ], We = {
1184
1284
  async listTemplates(e) {
1185
- let t = [...Z];
1186
- return e != null && e.type && (t = t.filter((n) => n.type === e.type)), e != null && e.category && (t = t.filter((n) => n.category === e.category)), e != null && e.language && (t = t.filter((n) => n.languages.includes(e.language))), t;
1285
+ let t = [...J];
1286
+ return e != null && e.type && (t = t.filter((a) => a.type === e.type)), e != null && e.category && (t = t.filter((a) => a.category === e.category)), e != null && e.language && (t = t.filter((a) => a.languages.includes(e.language))), t;
1187
1287
  },
1188
1288
  async getTemplate(e) {
1189
- const t = Z.find((n) => n.id === e);
1289
+ const t = J.find((a) => a.id === e);
1190
1290
  if (!t)
1191
1291
  throw new Error(`Template not found: ${e}`);
1192
1292
  return t;
1193
1293
  }
1194
1294
  };
1195
- function je(e) {
1295
+ function at(e) {
1196
1296
  return e === "de" ? "time-voucher-classic-de" : "time-voucher-classic-en";
1197
1297
  }
1198
- let H = Le;
1199
- function Ke(e) {
1298
+ let H = We;
1299
+ function rt(e) {
1200
1300
  H = e;
1201
1301
  }
1202
- function Oe() {
1302
+ function ot() {
1203
1303
  return H;
1204
1304
  }
1205
- async function Ye(e) {
1305
+ async function it(e) {
1206
1306
  return H.listTemplates(e);
1207
1307
  }
1208
- async function qe(e) {
1308
+ async function st(e) {
1209
1309
  return H.getTemplate(e);
1210
1310
  }
1211
1311
  export {
1212
- ve as ApiKeyModal,
1213
- Me as BillPreview,
1214
- Fe as ExportButton,
1215
- We as Header,
1312
+ _e as ApiKeyModal,
1313
+ Qe as BillPreview,
1314
+ tt as ExportButton,
1315
+ nt as Header,
1216
1316
  L as LAYOUT_HDPI,
1217
- T as LAYOUT_LDPI,
1218
- Ce as LanguageToggle,
1219
- ze as PersonalInfoForm,
1220
- Re as PortraitUpload,
1221
- we as TEMPLATES,
1222
- He as VoucherConfig,
1223
- Ne as downloadBlob,
1224
- Ie as drawContactInfo,
1225
- ke as drawMultilineText,
1226
- xe as drawOvalPortrait,
1227
- ee as drawTemplate,
1228
- te as drawText,
1229
- be as enhancePortrait,
1230
- V as enhancePortraitFallback,
1231
- Ee as exportBillAsPDF,
1232
- G as formatDescription,
1233
- Pe as generateBillPDF,
1234
- X as getApiKey,
1235
- je as getDefaultTemplateId,
1236
- J as getLayout,
1237
- Q as getTemplate,
1238
- qe as getTemplateById,
1239
- Oe as getTemplateProvider,
1240
- q as hasApiKey,
1241
- Ye as listTemplates,
1317
+ A as LAYOUT_LDPI,
1318
+ Me as LanguageToggle,
1319
+ Ze as PersonalInfoForm,
1320
+ Xe as PortraitUpload,
1321
+ Re as TEMPLATES,
1322
+ Je as VoucherConfig,
1323
+ He as downloadBlob,
1324
+ Ke as drawContactInfo,
1325
+ $e as drawMultilineText,
1326
+ Be as drawOvalPortrait,
1327
+ se as drawTemplate,
1328
+ le as drawText,
1329
+ Le as enhancePortrait,
1330
+ X as enhancePortraitFallback,
1331
+ Ue as exportBillAsPDF,
1332
+ Q as formatDescription,
1333
+ ze as generateBillPDF,
1334
+ ae as getApiKey,
1335
+ re as getClipdropApiKey,
1336
+ at as getDefaultTemplateId,
1337
+ oe as getLayout,
1338
+ ie as getTemplate,
1339
+ st as getTemplateById,
1340
+ ot as getTemplateProvider,
1341
+ Z as hasApiKey,
1342
+ Ae as hasClipdropApiKey,
1343
+ it as listTemplates,
1242
1344
  j as loadImage,
1243
- ae as renderBackSide,
1244
- ne as renderFrontSide,
1245
- fe as setApiKey,
1246
- Ke as setTemplateProvider,
1247
- Le as staticTemplateProvider,
1345
+ Te as removeBackground,
1346
+ de as renderBackSide,
1347
+ ce as renderFrontSide,
1348
+ Ce as setApiKey,
1349
+ Se as setClipdropApiKey,
1350
+ rt as setTemplateProvider,
1351
+ We as staticTemplateProvider,
1248
1352
  _ as t,
1249
- Ue as useBillCanvasRefs,
1250
- g as useBillStore
1353
+ et as useBillCanvasRefs,
1354
+ f as useBillStore
1251
1355
  };