@spiffcommerce/core 21.1.2 → 21.2.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [21.2.0] - 15-03-2024
9
+
10
+ ### Added
11
+
12
+ - `FileUploadGlobalPropertyHandle`:
13
+ - `hasImage(): boolean`: Returns a boolean value indicating if the associated state has an image.
14
+ - `getImage(): Promise<Asset | undefined>`: Retrieves the current image from the server.
15
+
8
16
  ## [21.1.1] - 15-03-2024
9
17
 
10
18
  ### Fixed
package/dist/index.d.ts CHANGED
@@ -1666,6 +1666,7 @@ declare abstract class GlobalPropertyHandle {
1666
1666
  * @param targetExperiences Optionally filter the steps to only those in the given experiences.
1667
1667
  */
1668
1668
  protected getSharedSteps(targetExperiences?: WorkflowExperience[]): StepHandle<_spiffcommerce_papyrus.AnyStepData>[];
1669
+ protected getStateValue(): string | undefined;
1669
1670
  }
1670
1671
  /**
1671
1672
  * A file upload global property allows for setting a frame image against all shared steps.
@@ -1678,6 +1679,15 @@ declare class FileUploadGlobalPropertyHandle extends GlobalPropertyHandle {
1678
1679
  * @returns A promise resolving when all affected steps have been updated.
1679
1680
  */
1680
1681
  selectImage(asset: Asset): Promise<void>;
1682
+ /**
1683
+ * Returns `true` if the state has an image assigned, otherwise `false`.
1684
+ */
1685
+ hasImage(): boolean;
1686
+ /**
1687
+ * Retrieves the current image selection, if one exists.
1688
+ * @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.
1689
+ */
1690
+ getImage(): Promise<Asset | undefined>;
1681
1691
  applyGlobalState(targetExperiences?: WorkflowExperience[]): Promise<void>;
1682
1692
  private applyImageSelection;
1683
1693
  }
package/dist/index.js CHANGED
@@ -460,7 +460,7 @@ class $t {
460
460
  name: e.name,
461
461
  blob: new Blob([e], { type: e.type })
462
462
  };
463
- return await O.uploadAssetWithProgress(a, n, A, !0);
463
+ return await T.uploadAssetWithProgress(a, n, A, !0);
464
464
  }
465
465
  }
466
466
  removePersistedAsset(e) {
@@ -533,7 +533,7 @@ class be {
533
533
  return e ? Array.from(e.entries()).map((A) => ({ assetKey: A[0], src: A[1] })) : [];
534
534
  }
535
535
  }
536
- const O = new $t();
536
+ const T = new $t();
537
537
  class _t {
538
538
  constructor() {
539
539
  this.cache = {}, this.disabled = !1;
@@ -625,8 +625,8 @@ const ge = new _t(), KA = F`
625
625
  });
626
626
  return e.data.options.forEach((A) => {
627
627
  var t, n;
628
- (t = A.defaultVariant) != null && t.asset && O.cacheAsset(A.defaultVariant.asset), A.colorProfile && O.cacheAsset(A.colorProfile), (n = A.variants) == null || n.forEach((a) => {
629
- a.asset && O.cacheAsset(a.asset), a.displayImage && O.cacheAsset(a.displayImage), a.thumbnail && O.cacheAsset(a.thumbnail), a.material && O.cacheMaterial(a.material);
628
+ (t = A.defaultVariant) != null && t.asset && T.cacheAsset(A.defaultVariant.asset), A.colorProfile && T.cacheAsset(A.colorProfile), (n = A.variants) == null || n.forEach((a) => {
629
+ a.asset && T.cacheAsset(a.asset), a.displayImage && T.cacheAsset(a.displayImage), a.thumbnail && T.cacheAsset(a.thumbnail), a.material && T.cacheMaterial(a.material);
630
630
  });
631
631
  }), e.data.options;
632
632
  }, tn = async (c, e) => (await e).find((t) => t.id === c), nn = async (c) => {
@@ -1852,11 +1852,11 @@ class Mn {
1852
1852
  new qA(
1853
1853
  async () => {
1854
1854
  var o;
1855
- const i = (o = (await O.getLocalOrFromServer(A.key || "")).versions) == null ? void 0 : o.find((r) => r.name === "svg");
1855
+ const i = (o = (await T.getLocalOrFromServer(A.key || "")).versions) == null ? void 0 : o.find((r) => r.name === "svg");
1856
1856
  return i ? (await fetch(i.link)).status === 200 : !1;
1857
1857
  },
1858
1858
  () => {
1859
- O.getLocalOrFromServer(A.key || "").then((a) => {
1859
+ T.getLocalOrFromServer(A.key || "").then((a) => {
1860
1860
  this.loadPatternFromAsset(a, e, t);
1861
1861
  });
1862
1862
  },
@@ -3224,8 +3224,8 @@ class kn {
3224
3224
  let Q;
3225
3225
  if (E && E.variants) {
3226
3226
  const N = E.variants.find((H) => {
3227
- var T;
3228
- return H.id === ((T = E.defaultVariant) == null ? void 0 : T.id);
3227
+ var O;
3228
+ return H.id === ((O = E.defaultVariant) == null ? void 0 : O.id);
3229
3229
  }) || E.variants[0];
3230
3230
  Q = this.createTextFillSpotColor(E, N), i.updateStorage(e, {
3231
3231
  colorProfileAssetKey: (h = E.colorProfile) == null ? void 0 : h.key
@@ -6280,7 +6280,7 @@ const ot = F`
6280
6280
  }, ct = async (c, e, A, t, n, a, i, s, o, r) => {
6281
6281
  var M;
6282
6282
  await (async () => {
6283
- var T;
6283
+ var O;
6284
6284
  if (r !== void 0)
6285
6285
  return r;
6286
6286
  await c.outstandingRequestsPromise();
@@ -6292,7 +6292,7 @@ const ot = F`
6292
6292
  context: {
6293
6293
  transactionOwnerId: S
6294
6294
  }
6295
- }), H = (T = N.data) == null ? void 0 : T.transactions[0].workflowState;
6295
+ }), H = (O = N.data) == null ? void 0 : O.transactions[0].workflowState;
6296
6296
  return N.errors ? (N.errors.forEach((b) => {
6297
6297
  N.errors && console.log("Server Error:", b.message);
6298
6298
  }), null) : H ?? null;
@@ -6302,11 +6302,11 @@ const ot = F`
6302
6302
  let Y = 0;
6303
6303
  if (Object.keys(a).length > 0)
6304
6304
  for (const N of Object.keys(a)) {
6305
- const H = a[N], T = e.steps.find((b) => b.stepName === N);
6305
+ const H = a[N], O = e.steps.find((b) => b.stepName === N);
6306
6306
  for (let b = 0; b < H.selections.length; ++b) {
6307
6307
  const V = H.selections[b];
6308
- if (T && (!y || T.option && (T.option.variants || []).length > 1 && !T.data.hideSelectionInCart && !T.data.hideSelectionsInCart)) {
6309
- const ke = T.stepTitle;
6308
+ if (O && (!y || O.option && (O.option.variants || []).length > 1 && !O.data.hideSelectionInCart && !O.data.hideSelectionsInCart)) {
6309
+ const ke = O.stepTitle;
6310
6310
  S[ke] ? S[ke].push({
6311
6311
  id: V.id || "",
6312
6312
  name: V.name,
@@ -7932,7 +7932,7 @@ class gA {
7932
7932
  * @param targetExperiences Optionally filter the steps to only those in the given experiences.
7933
7933
  */
7934
7934
  getSharedSteps(e) {
7935
- return (e ?? this.bundle.getWorkflowExperiences()).flatMap(
7935
+ const A = e ?? this.bundle.getWorkflowExperiences(), t = A.flatMap(
7936
7936
  (n) => n.getSteps().filter((a) => {
7937
7937
  var i;
7938
7938
  return (i = a.getRaw().globalPropertyAspectConfigurations) == null ? void 0 : i.some(
@@ -7943,6 +7943,10 @@ class gA {
7943
7943
  );
7944
7944
  })
7945
7945
  );
7946
+ return console.log(`getting shared steps for ${A.length} - found ${t.length}`, t), t;
7947
+ }
7948
+ getStateValue() {
7949
+ return this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
7946
7950
  }
7947
7951
  }
7948
7952
  class ja extends gA {
@@ -7960,11 +7964,26 @@ class ja extends gA {
7960
7964
  this.applyImageSelection(e)
7961
7965
  ]);
7962
7966
  }
7967
+ /**
7968
+ * Returns `true` if the state has an image assigned, otherwise `false`.
7969
+ */
7970
+ hasImage() {
7971
+ return !!this.getStateValue();
7972
+ }
7973
+ /**
7974
+ * Retrieves the current image selection, if one exists.
7975
+ * @returns A promise that resolves with an `Asset` object if one is assigned to the state, otherwise `undefined`.
7976
+ */
7977
+ async getImage() {
7978
+ const e = this.getStateValue();
7979
+ if (e)
7980
+ return T.getLocalOrFromServer(e);
7981
+ }
7963
7982
  async applyGlobalState(e) {
7964
- const A = this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
7983
+ const A = this.getStateValue();
7965
7984
  if (!A)
7966
7985
  return Promise.resolve();
7967
- const t = await O.getLocalOrFromServer(A);
7986
+ const t = await T.getLocalOrFromServer(A);
7968
7987
  return t ? this.applyImageSelection(t, e) : Promise.resolve();
7969
7988
  }
7970
7989
  async applyImageSelection(e, A) {
@@ -7980,7 +7999,7 @@ class Va extends gA {
7980
7999
  * Gets the current text
7981
8000
  */
7982
8001
  getText() {
7983
- const e = this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
8002
+ const e = this.getStateValue();
7984
8003
  return e || "";
7985
8004
  }
7986
8005
  /**
@@ -7993,7 +8012,7 @@ class Va extends gA {
7993
8012
  ]);
7994
8013
  }
7995
8014
  async applyGlobalState(e) {
7996
- const A = this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
8015
+ const A = this.getStateValue();
7997
8016
  if (!A)
7998
8017
  return Promise.resolve();
7999
8018
  await this.applyTextSelection(A, e);
@@ -8016,7 +8035,7 @@ class Bt extends gA {
8016
8035
  var A, t;
8017
8036
  if (!this.optionResource)
8018
8037
  return;
8019
- const e = this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
8038
+ const e = this.getStateValue();
8020
8039
  if (e) {
8021
8040
  const n = (t = this.optionResource.variants) == null ? void 0 : t.find((a) => a.id === e);
8022
8041
  return n ? new X(n) : void 0;
@@ -8056,7 +8075,7 @@ class Bt extends gA {
8056
8075
  }
8057
8076
  async applyGlobalState(e) {
8058
8077
  var n, a;
8059
- const A = this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);
8078
+ const A = this.getStateValue();
8060
8079
  if (!A)
8061
8080
  return Promise.resolve();
8062
8081
  const t = (a = (n = this.optionResource) == null ? void 0 : n.variants) == null ? void 0 : a.find((i) => i.id === A);
@@ -9821,8 +9840,8 @@ const oi = F`
9821
9840
  return t.forEach((a) => {
9822
9841
  a.steps.forEach((i) => {
9823
9842
  var s, o, r;
9824
- delete i.data.__typename, (s = i.option) != null && s.id && ((o = i.option.defaultVariant) != null && o.asset && O.cacheAsset(i.option.defaultVariant.asset), i.option.colorProfile && O.cacheAsset(i.option.colorProfile), (r = i.option.variants) == null || r.forEach((g) => {
9825
- g.asset && O.cacheAsset(g.asset), g.displayImage && O.cacheAsset(g.displayImage), g.thumbnail && O.cacheAsset(g.thumbnail), g.material && O.cacheMaterial(g.material);
9843
+ delete i.data.__typename, (s = i.option) != null && s.id && ((o = i.option.defaultVariant) != null && o.asset && T.cacheAsset(i.option.defaultVariant.asset), i.option.colorProfile && T.cacheAsset(i.option.colorProfile), (r = i.option.variants) == null || r.forEach((g) => {
9844
+ g.asset && T.cacheAsset(g.asset), g.displayImage && T.cacheAsset(g.displayImage), g.thumbnail && T.cacheAsset(g.thumbnail), g.material && T.cacheMaterial(g.material);
9826
9845
  }), ge.set({ id: i.option.id }, Promise.resolve(i.option)));
9827
9846
  });
9828
9847
  }), t;
@@ -9874,7 +9893,7 @@ class fi {
9874
9893
  * and the Spiff Commerce platform.
9875
9894
  */
9876
9895
  getAssetManager() {
9877
- return O;
9896
+ return T;
9878
9897
  }
9879
9898
  getCurrencyCode() {
9880
9899
  if (this.currencyCode === void 0)
@@ -10307,7 +10326,7 @@ class fi {
10307
10326
  return {
10308
10327
  transaction: Y,
10309
10328
  workflowId: Y.workflowId,
10310
- readOnly: ((H = m.find((T) => T.option.transactionId === Y.id)) == null ? void 0 : H.option.readOnly) ?? !1,
10329
+ readOnly: ((H = m.find((O) => O.option.transactionId === Y.id)) == null ? void 0 : H.option.readOnly) ?? !1,
10311
10330
  index: m[N].index
10312
10331
  };
10313
10332
  });
@@ -10345,14 +10364,14 @@ class fi {
10345
10364
  ...r.map(n),
10346
10365
  ...g.map(a)
10347
10366
  ])).flat(), l = [...new Set(B.map((m) => m.workflowId))], d = await wt(l, A), w = new Map(d.map((m) => [m.id, m])), h = x.getMap("transactionOwnerIds") || /* @__PURE__ */ new Map(), E = B.map(async (m) => {
10348
- var T;
10367
+ var O;
10349
10368
  const { transaction: I, workflowId: p, readOnly: M, index: y } = m, S = w.get(p), Y = e[y];
10350
10369
  !h.get(I.id) && I.transactionOwnerId && h.set(I.id, I.transactionOwnerId);
10351
10370
  const N = h.get(I.id) || void 0, H = {
10352
10371
  product: I.product,
10353
10372
  transaction: I,
10354
10373
  layouts: [],
10355
- singleVariantsRenderable: (T = Y == null ? void 0 : Y.workflowConfiguration) == null ? void 0 : T.singleVariantsRenderable,
10374
+ singleVariantsRenderable: (O = Y == null ? void 0 : Y.workflowConfiguration) == null ? void 0 : O.singleVariantsRenderable,
10356
10375
  stateMutationFunc: M ? async () => {
10357
10376
  throw new k("State mutation is forbidden in read only mode!");
10358
10377
  } : async (b) => this.updateTransactionState({ ...b, context: { transactionOwnerId: N } }),
@@ -10856,7 +10875,7 @@ export {
10856
10875
  X as Variant,
10857
10876
  Ea as WorkflowExperienceEventType,
10858
10877
  he as WorkflowExperienceImpl,
10859
- O as assetService,
10878
+ T as assetService,
10860
10879
  la as createDesign,
10861
10880
  hs as dataUrlFromExternalUrl,
10862
10881
  Te as designService,
@@ -1,4 +1,4 @@
1
- (function(Q,M){typeof exports=="object"&&typeof module<"u"?M(exports,require("@apollo/client/core"),require("@spiffcommerce/papyrus"),require("@apollo/client/link/context"),require("@apollo/client/link/error"),require("pith"),require("lodash.debounce"),require("lodash.isequal"),require("lodash.clonedeep"),require("qrcode"),require("unicode-default-word-boundary"),require("svg-path-bbox"),require("lodash.chunk")):typeof define=="function"&&define.amd?define(["exports","@apollo/client/core","@spiffcommerce/papyrus","@apollo/client/link/context","@apollo/client/link/error","pith","lodash.debounce","lodash.isequal","lodash.clonedeep","qrcode","unicode-default-word-boundary","svg-path-bbox","lodash.chunk"],M):(Q=typeof globalThis<"u"?globalThis:Q||self,M(Q.Core={},Q.core,Q.papyrus,Q.context,Q.error,Q.pith,Q.debounce,Q.isEqual,Q.cloneDeep,Q.qrcode,Q.unicodeDefaultWordBoundary,Q.svgPathBbox,Q.chunk))})(this,function(Q,M,g,cA,gA,et,tt,At,Ee,nt,Ye,Pe,at){"use strict";class it extends Error{constructor(e){super(e),this.name=this.constructor.name}}class ne extends it{constructor(e){super(`ConfigurationError - ${e}`)}}class ae extends ne{constructor(e){super(`Option not Configured: ${e.stepTitle}`),this.optionId=(e==null?void 0:e.optionId)||"N/A"}}class b extends ne{constructor(e){super(`Panel not Found: ${e.panelId}`),this.panelId=(e==null?void 0:e.panelId)||"N/A"}}class V extends ne{constructor(e){super(`Asset not found for variant: ${e.name}`),this.variant=e}}class X extends ne{constructor(e){super(`Resource not found for asset: ${e.name}`),this.asset=e}}class ie extends ne{constructor(e,t){super(`Workflow Misconfiguration: ${e.stepName} - ${t}`),this.step=e}}class he extends it{constructor(e){super(`ImplementationError - ${e}`)}}class v extends he{constructor(e){super(`Unhandled Behavior Encountered: ${e}`)}}class q extends he{constructor(e){super(`Parsing Error: ${e}`)}}class G extends he{constructor(e){super(`Client Error: ${e}`)}}class Ce extends he{constructor(e){super(`Resource Generation Failed: ${e}`)}}class lA{get(e){return localStorage.getItem(e)||void 0}set(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}class ot{constructor(){this.storage=new Map}get(e){return this.storage.get(e)||void 0}set(e,t){this.storage.set(e,t)}remove(e){this.storage.delete(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}const P=(()=>{try{return localStorage?new lA:new ot}catch{return console.warn("Local storage was unavilable due to browser security settings. Using in-memory storage instead."),new ot}})();class BA{constructor(){this.defaultServerUrl="https://api.spiff.com.au",this.defaultServicesApiUrl="https://services.spiff.com.au",this.defaultHubUrl="https://hub.spiff.com.au",this.serverUrl=this.defaultServerUrl,this.servicesApiUrl=this.defaultServicesApiUrl,this.hubUrl=this.defaultHubUrl,this.serverUrlCallbacks=[]}getServerUrl(){return this.serverUrl}getServicesApiUrl(){return this.servicesApiUrl}getHubUrl(){return this.hubUrl}setServerUrl(e){this.serverUrl=e,this.serverUrlCallbacks.forEach(t=>t())}setServicesApiUrl(e){this.servicesApiUrl=e}setHubUrl(e){this.hubUrl=e}addServerUrlCallback(e){this.serverUrlCallbacks.push(e)}}const W=new BA;let st;const rt=c=>{st=c};let xe;const dA=c=>{xe=c},wA=()=>xe,EA=()=>new Promise(c=>{const e=W.getHubUrl(),t=A=>{A.origin===e&&(window.removeEventListener("message",t),c(A.data))};window.parent!==window&&(window.addEventListener("message",t,!1),window.parent.postMessage("ready",e))}),hA=async()=>{const c={applicationKey:xe,customerToken:st};return typeof window<"u"&&(window.location.href.includes("/workflows/product/")||window.location.href.includes("hub=true"))?{...await EA(),...c}:c};class CA{constructor(){this.shadowGraphqlClient=this.constructShadowGraphqlClient(),W.addServerUrlCallback(()=>{this.shadowGraphqlClient=this.constructShadowGraphqlClient()})}getShadowGraphqlClient(){return this.shadowGraphqlClient}constructShadowGraphqlClient(){const e=M.createHttpLink({uri:`${W.getServerUrl()}/graphql`,fetch:g.fetch}),t=cA.setContext(async(i,o)=>{const{headers:s}=o,r=s||{},l=await hA(),d=o.bearer??l.bearer,B=o.partnerId??l.partnerId,w=o.activeIntegration??l.activeIntegration,E=o.transactionOwnerId,C=o.customerToken??l.customerToken,h=o.applicationKey??l.applicationKey,m=o.bundleOwnerId;try{if(window&&window.__SENTRY__){const u=window.__SENTRY__.hub;if(u){const F=u.traceHeaders();Object.entries(F).forEach(([I,f])=>{r[I]=f})}}}catch{}return d&&(r.Authorization=`Bearer ${d}`),B&&(r.partnerId=B),w&&(r.activeIntegration=w),E&&(r.transactionOwnerId=E),C&&(r.customerToken=C),h&&(r["X-Application-Key"]=h),m&&(r.bundleOwnerId=m),{headers:r}}),A=gA.onError(({operation:i,graphQLErrors:o,networkError:s})=>{const r=o||[];s&&console.log("GraphQL Network error"),r.forEach(()=>console.log("GraphQL Error: "+i.operationName))});function n(){return{read(i=null){return i},merge(i,o){return o||i||null}}}const a=new M.InMemoryCache({addTypename:!1,typePolicies:{Transaction:{fields:{transactionOwnerId:n(),customLogoLink:n(),workflowFooterLogoLink:n(),workflowState:n(),externalDesignProductId:n(),externalDesignProductVariantId:n(),externalCartProductId:n(),externalCartProductVariantId:n(),lastSyncedAt:n(),quantity:n(),lineItem:n()}},WorkflowProduct:{fields:{isPresent:n()}},Product:{fields:{imageUrl:n(),overlayImageUrl:n(),preloadImageUrl:n(),weight:n(),conversionConfiguration:n()}}}});return new M.ApolloClient({link:M.from([A,t,e]),cache:a,name:"Core"})}}const N=new CA,QA=M.gql`
1
+ (function(Q,M){typeof exports=="object"&&typeof module<"u"?M(exports,require("@apollo/client/core"),require("@spiffcommerce/papyrus"),require("@apollo/client/link/context"),require("@apollo/client/link/error"),require("pith"),require("lodash.debounce"),require("lodash.isequal"),require("lodash.clonedeep"),require("qrcode"),require("unicode-default-word-boundary"),require("svg-path-bbox"),require("lodash.chunk")):typeof define=="function"&&define.amd?define(["exports","@apollo/client/core","@spiffcommerce/papyrus","@apollo/client/link/context","@apollo/client/link/error","pith","lodash.debounce","lodash.isequal","lodash.clonedeep","qrcode","unicode-default-word-boundary","svg-path-bbox","lodash.chunk"],M):(Q=typeof globalThis<"u"?globalThis:Q||self,M(Q.Core={},Q.core,Q.papyrus,Q.context,Q.error,Q.pith,Q.debounce,Q.isEqual,Q.cloneDeep,Q.qrcode,Q.unicodeDefaultWordBoundary,Q.svgPathBbox,Q.chunk))})(this,function(Q,M,g,cA,gA,et,tt,At,Ee,nt,Ye,Pe,at){"use strict";class it extends Error{constructor(e){super(e),this.name=this.constructor.name}}class ne extends it{constructor(e){super(`ConfigurationError - ${e}`)}}class ae extends ne{constructor(e){super(`Option not Configured: ${e.stepTitle}`),this.optionId=(e==null?void 0:e.optionId)||"N/A"}}class J extends ne{constructor(e){super(`Panel not Found: ${e.panelId}`),this.panelId=(e==null?void 0:e.panelId)||"N/A"}}class V extends ne{constructor(e){super(`Asset not found for variant: ${e.name}`),this.variant=e}}class X extends ne{constructor(e){super(`Resource not found for asset: ${e.name}`),this.asset=e}}class ie extends ne{constructor(e,t){super(`Workflow Misconfiguration: ${e.stepName} - ${t}`),this.step=e}}class he extends it{constructor(e){super(`ImplementationError - ${e}`)}}class v extends he{constructor(e){super(`Unhandled Behavior Encountered: ${e}`)}}class q extends he{constructor(e){super(`Parsing Error: ${e}`)}}class G extends he{constructor(e){super(`Client Error: ${e}`)}}class Ce extends he{constructor(e){super(`Resource Generation Failed: ${e}`)}}class lA{get(e){return localStorage.getItem(e)||void 0}set(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}class ot{constructor(){this.storage=new Map}get(e){return this.storage.get(e)||void 0}set(e,t){this.storage.set(e,t)}remove(e){this.storage.delete(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const A=JSON.stringify([...t.entries()]);this.set(e,A)}}const P=(()=>{try{return localStorage?new lA:new ot}catch{return console.warn("Local storage was unavilable due to browser security settings. Using in-memory storage instead."),new ot}})();class BA{constructor(){this.defaultServerUrl="https://api.spiff.com.au",this.defaultServicesApiUrl="https://services.spiff.com.au",this.defaultHubUrl="https://hub.spiff.com.au",this.serverUrl=this.defaultServerUrl,this.servicesApiUrl=this.defaultServicesApiUrl,this.hubUrl=this.defaultHubUrl,this.serverUrlCallbacks=[]}getServerUrl(){return this.serverUrl}getServicesApiUrl(){return this.servicesApiUrl}getHubUrl(){return this.hubUrl}setServerUrl(e){this.serverUrl=e,this.serverUrlCallbacks.forEach(t=>t())}setServicesApiUrl(e){this.servicesApiUrl=e}setHubUrl(e){this.hubUrl=e}addServerUrlCallback(e){this.serverUrlCallbacks.push(e)}}const W=new BA;let st;const rt=c=>{st=c};let xe;const dA=c=>{xe=c},wA=()=>xe,EA=()=>new Promise(c=>{const e=W.getHubUrl(),t=A=>{A.origin===e&&(window.removeEventListener("message",t),c(A.data))};window.parent!==window&&(window.addEventListener("message",t,!1),window.parent.postMessage("ready",e))}),hA=async()=>{const c={applicationKey:xe,customerToken:st};return typeof window<"u"&&(window.location.href.includes("/workflows/product/")||window.location.href.includes("hub=true"))?{...await EA(),...c}:c};class CA{constructor(){this.shadowGraphqlClient=this.constructShadowGraphqlClient(),W.addServerUrlCallback(()=>{this.shadowGraphqlClient=this.constructShadowGraphqlClient()})}getShadowGraphqlClient(){return this.shadowGraphqlClient}constructShadowGraphqlClient(){const e=M.createHttpLink({uri:`${W.getServerUrl()}/graphql`,fetch:g.fetch}),t=cA.setContext(async(i,o)=>{const{headers:s}=o,r=s||{},l=await hA(),d=o.bearer??l.bearer,B=o.partnerId??l.partnerId,w=o.activeIntegration??l.activeIntegration,E=o.transactionOwnerId,C=o.customerToken??l.customerToken,h=o.applicationKey??l.applicationKey,m=o.bundleOwnerId;try{if(window&&window.__SENTRY__){const u=window.__SENTRY__.hub;if(u){const F=u.traceHeaders();Object.entries(F).forEach(([I,f])=>{r[I]=f})}}}catch{}return d&&(r.Authorization=`Bearer ${d}`),B&&(r.partnerId=B),w&&(r.activeIntegration=w),E&&(r.transactionOwnerId=E),C&&(r.customerToken=C),h&&(r["X-Application-Key"]=h),m&&(r.bundleOwnerId=m),{headers:r}}),A=gA.onError(({operation:i,graphQLErrors:o,networkError:s})=>{const r=o||[];s&&console.log("GraphQL Network error"),r.forEach(()=>console.log("GraphQL Error: "+i.operationName))});function n(){return{read(i=null){return i},merge(i,o){return o||i||null}}}const a=new M.InMemoryCache({addTypename:!1,typePolicies:{Transaction:{fields:{transactionOwnerId:n(),customLogoLink:n(),workflowFooterLogoLink:n(),workflowState:n(),externalDesignProductId:n(),externalDesignProductVariantId:n(),externalCartProductId:n(),externalCartProductVariantId:n(),lastSyncedAt:n(),quantity:n(),lineItem:n()}},WorkflowProduct:{fields:{isPresent:n()}},Product:{fields:{imageUrl:n(),overlayImageUrl:n(),preloadImageUrl:n(),weight:n(),conversionConfiguration:n()}}}});return new M.ApolloClient({link:M.from([A,t,e]),cache:a,name:"Core"})}}const N=new CA,QA=M.gql`
2
2
  fragment AssetMetadataFields on Asset {
3
3
  metadata {
4
4
  key
@@ -95,7 +95,7 @@
95
95
  }
96
96
  }
97
97
  }
98
- `,ct=async c=>(await N.getShadowGraphqlClient().query({query:uA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{keys:c}})).data.assets,fA=async c=>(await N.getShadowGraphqlClient().query({query:mA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}})).data.materials,DA=async(c,e,t,A,n)=>{var i;return(i=(await N.getShadowGraphqlClient().mutate({mutation:IA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c,type:e,mimeType:t,anonymous:A,temporary:n}})).data)==null?void 0:i.assetCreate};class pA{constructor(){this.cache=new Map,this.materialCache=new Map,this.loadImageAsFileInfo=async e=>{const t=await e.arrayBuffer(),A=await g.getAttributesFromArrayBuffer(t),n=(a,i)=>{const o=atob(a.split(",")[1]),s=[];for(let r=0;r<o.length;r++)s.push(o.charCodeAt(r));return new Blob([new Uint8Array(s)],{type:i})};return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:n(A.dataUrl,e.type)}}}async getLocalOrFromServer(e){if(this.cache.has(e)){const n=this.cache.get(e);if(!n)throw new v("Failed to get asset from cache!");return n}const A=(async()=>(await ct([e]))[0])();return this.cache.set(e,A),A}cacheAsset(e){if(!e.key)throw new v("Asset has no key!");this.cache.has(e.key)||this.cache.set(e.key,Promise.resolve(e))}cacheMaterial(e){if(!e.id)throw new v("Material has no id!");this.materialCache.has(e.id)||this.materialCache.set(e.id,Promise.resolve(e))}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const A=(async()=>(await fA([e]))[0])();return this.materialCache.set(e,A),A}async uploadAssetWithProgress(e,t,A,n,a){const i=await this.dispatchCreateAssetRequest(e,t,n,a);if(!i)throw new Error("Failed to create asset.");return await new Promise((o,s)=>{const r=new XMLHttpRequest;r.open("PUT",i.assetResponse.uploadUrl,!0),r.setRequestHeader("Content-Type",i.mimeType),r.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),r.upload.onprogress=l=>{l.lengthComputable&&A(l.loaded*100/l.total)},r.onload=()=>{const l=i.assetResponse.asset;He.add(i.assetResponse.asset),o(l)},r.onerror=s,r.send(e.blob)}),i.assetResponse.asset}async uploadFile(e,t){const A=!(e.type==="image/svg+xml"||e.type==="application/pdf"),n=A?g.AssetType.Image:g.AssetType.Illustration;if(A){const a=await this.loadImageAsFileInfo(e);return await this.uploadAssetWithProgress(a,n,t,!0)}else{const a={name:e.name,blob:new Blob([e],{type:e.type})};return await J.uploadAssetWithProgress(a,n,t,!0)}}removePersistedAsset(e){He.remove(e)}getPersistedAssets(){return He.list()}async dispatchCreateAssetRequest(e,t,A,n){const a=e.blob.type?e.blob.type:this.guessMIME(e.name),i=await DA(e.name,t,a,A,n);if(i)return{assetResponse:i,mimeType:a}}guessMIME(e){const t=e.split(".").pop();switch(t){case"glb":return"model/gltf-binary";case"ttf":return"font/ttf";case"mkv":return"video/x-matroska";default:throw new v("Unexpected mimetype: "+t)}}}const oe="persistentAssets";class He{static add(e){if(!e.fileLink){console.error("Failed to find cdn link on asset, cannot persist!");return}const t=new Map;t.set(e.key||"",e.fileLink);const A=P.getMap(oe);A&&A.forEach((n,a)=>{t.set(a,n)}),P.setMap(oe,t)}static remove(e){const t=P.getMap(oe);if(!t)return;const A=Array.from(t.entries()).find(n=>n[0]===e);A&&(t.delete(A[0]),P.setMap(oe,t))}static list(){const e=P.getMap(oe);return e?Array.from(e.entries()).map(t=>({assetKey:t[0],src:t[1]})):[]}}const J=new pA;class FA{constructor(){this.cache={},this.disabled=!1}get(e){if(this.disabled)return;const t=JSON.stringify(e);return this.cache[t]}set(e,t){if(this.disabled)return t;const A=JSON.stringify(e);return this.cache[A]=t,t}disable(e){this.disabled=e}}const Z=new FA,gt=M.gql`
98
+ `,ct=async c=>(await N.getShadowGraphqlClient().query({query:uA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{keys:c}})).data.assets,fA=async c=>(await N.getShadowGraphqlClient().query({query:mA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}})).data.materials,DA=async(c,e,t,A,n)=>{var i;return(i=(await N.getShadowGraphqlClient().mutate({mutation:IA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c,type:e,mimeType:t,anonymous:A,temporary:n}})).data)==null?void 0:i.assetCreate};class pA{constructor(){this.cache=new Map,this.materialCache=new Map,this.loadImageAsFileInfo=async e=>{const t=await e.arrayBuffer(),A=await g.getAttributesFromArrayBuffer(t),n=(a,i)=>{const o=atob(a.split(",")[1]),s=[];for(let r=0;r<o.length;r++)s.push(o.charCodeAt(r));return new Blob([new Uint8Array(s)],{type:i})};return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:n(A.dataUrl,e.type)}}}async getLocalOrFromServer(e){if(this.cache.has(e)){const n=this.cache.get(e);if(!n)throw new v("Failed to get asset from cache!");return n}const A=(async()=>(await ct([e]))[0])();return this.cache.set(e,A),A}cacheAsset(e){if(!e.key)throw new v("Asset has no key!");this.cache.has(e.key)||this.cache.set(e.key,Promise.resolve(e))}cacheMaterial(e){if(!e.id)throw new v("Material has no id!");this.materialCache.has(e.id)||this.materialCache.set(e.id,Promise.resolve(e))}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const A=(async()=>(await fA([e]))[0])();return this.materialCache.set(e,A),A}async uploadAssetWithProgress(e,t,A,n,a){const i=await this.dispatchCreateAssetRequest(e,t,n,a);if(!i)throw new Error("Failed to create asset.");return await new Promise((o,s)=>{const r=new XMLHttpRequest;r.open("PUT",i.assetResponse.uploadUrl,!0),r.setRequestHeader("Content-Type",i.mimeType),r.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),r.upload.onprogress=l=>{l.lengthComputable&&A(l.loaded*100/l.total)},r.onload=()=>{const l=i.assetResponse.asset;He.add(i.assetResponse.asset),o(l)},r.onerror=s,r.send(e.blob)}),i.assetResponse.asset}async uploadFile(e,t){const A=!(e.type==="image/svg+xml"||e.type==="application/pdf"),n=A?g.AssetType.Image:g.AssetType.Illustration;if(A){const a=await this.loadImageAsFileInfo(e);return await this.uploadAssetWithProgress(a,n,t,!0)}else{const a={name:e.name,blob:new Blob([e],{type:e.type})};return await k.uploadAssetWithProgress(a,n,t,!0)}}removePersistedAsset(e){He.remove(e)}getPersistedAssets(){return He.list()}async dispatchCreateAssetRequest(e,t,A,n){const a=e.blob.type?e.blob.type:this.guessMIME(e.name),i=await DA(e.name,t,a,A,n);if(i)return{assetResponse:i,mimeType:a}}guessMIME(e){const t=e.split(".").pop();switch(t){case"glb":return"model/gltf-binary";case"ttf":return"font/ttf";case"mkv":return"video/x-matroska";default:throw new v("Unexpected mimetype: "+t)}}}const oe="persistentAssets";class He{static add(e){if(!e.fileLink){console.error("Failed to find cdn link on asset, cannot persist!");return}const t=new Map;t.set(e.key||"",e.fileLink);const A=P.getMap(oe);A&&A.forEach((n,a)=>{t.set(a,n)}),P.setMap(oe,t)}static remove(e){const t=P.getMap(oe);if(!t)return;const A=Array.from(t.entries()).find(n=>n[0]===e);A&&(t.delete(A[0]),P.setMap(oe,t))}static list(){const e=P.getMap(oe);return e?Array.from(e.entries()).map(t=>({assetKey:t[0],src:t[1]})):[]}}const k=new pA;class FA{constructor(){this.cache={},this.disabled=!1}get(e){if(this.disabled)return;const t=JSON.stringify(e);return this.cache[t]}set(e,t){if(this.disabled)return t;const A=JSON.stringify(e);return this.cache[A]=t,t}disable(e){this.disabled=e}}const Z=new FA,gt=M.gql`
99
99
  fragment OptionFields on Option {
100
100
  id
101
101
  name
@@ -144,7 +144,7 @@
144
144
  ...OptionFields
145
145
  }
146
146
  }
147
- `,SA=async c=>{const e=await N.getShadowGraphqlClient().query({query:MA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}});return e.data.options.forEach(t=>{var A,n;(A=t.defaultVariant)!=null&&A.asset&&J.cacheAsset(t.defaultVariant.asset),t.colorProfile&&J.cacheAsset(t.colorProfile),(n=t.variants)==null||n.forEach(a=>{a.asset&&J.cacheAsset(a.asset),a.displayImage&&J.cacheAsset(a.displayImage),a.thumbnail&&J.cacheAsset(a.thumbnail),a.material&&J.cacheMaterial(a.material)})}),e.data.options},yA=async(c,e)=>(await e).find(A=>A.id===c),YA=async c=>{const e=c.map(i=>Z.get({id:i})),t=c.filter((i,o)=>e[o]===void 0);if(t.length===0)return Promise.all(e);const A=SA(t),n=t.map(i=>Z.set({id:i},yA(i,A))),a=e.filter(i=>i!==void 0);return await Promise.all(a.concat(n))};class PA{constructor(){this.getDisplayImageSource=e=>{var t;if(e){const A=(t=e.displayImage)==null?void 0:t.fileLink;if(A)return A}},this.getSelectedVariant=(e,t)=>{var A;if(!(!e||t.length===0))return(A=e.variants)==null?void 0:A.find(n=>n.id===t[0])}}async getOption(e){return(async()=>{const n=(await YA([e]))[0];if(n)return n})()}async getAssetTileImageForVariant(e){var n,a;const t=e.thumbnail;if(t){const i=(n=t.versions)==null?void 0:n.find(s=>s.name==="thumbnail"),o=t.fileLink;return(i==null?void 0:i.link)||o}const A=e.asset;if(A){const i=(a=A.versions)==null?void 0:a.find(s=>s.name==="thumbnail"),o=A.fileLink;return(i==null?void 0:i.link)||o}return e.material?e.material.id:""}getDefaultVariant(e){const t=e.variants;if(t){if(t.length===1)return t[0];if(e.defaultVariant!==void 0)return t.find(A=>{var n;return A.id===((n=e.defaultVariant)==null?void 0:n.id)})}}}const L=new PA;var lt=(c=>(c.Hub="Hub",c.Shopify="Shopify",c))(lt||{}),Bt=(c=>(c[c.Orbit=0]="Orbit",c[c.Pan=1]="Pan",c))(Bt||{}),dt=(c=>(c.Manual="Manual",c.OnStart="OnStart",c.OnQuit="OnQuit",c.OnEnd="OnEnd",c))(dt||{}),wt=(c=>(c.Email="Email",c.FirstName="FirstName",c.LastName="LastName",c.Phone="Phone",c))(wt||{}),se=(c=>(c.Owner="Owner",c.Approver="Approver",c.Editor="Editor",c.Viewer="Viewer",c))(se||{});const $=M.gql`
147
+ `,SA=async c=>{const e=await N.getShadowGraphqlClient().query({query:MA,errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}});return e.data.options.forEach(t=>{var A,n;(A=t.defaultVariant)!=null&&A.asset&&k.cacheAsset(t.defaultVariant.asset),t.colorProfile&&k.cacheAsset(t.colorProfile),(n=t.variants)==null||n.forEach(a=>{a.asset&&k.cacheAsset(a.asset),a.displayImage&&k.cacheAsset(a.displayImage),a.thumbnail&&k.cacheAsset(a.thumbnail),a.material&&k.cacheMaterial(a.material)})}),e.data.options},yA=async(c,e)=>(await e).find(A=>A.id===c),YA=async c=>{const e=c.map(i=>Z.get({id:i})),t=c.filter((i,o)=>e[o]===void 0);if(t.length===0)return Promise.all(e);const A=SA(t),n=t.map(i=>Z.set({id:i},yA(i,A))),a=e.filter(i=>i!==void 0);return await Promise.all(a.concat(n))};class PA{constructor(){this.getDisplayImageSource=e=>{var t;if(e){const A=(t=e.displayImage)==null?void 0:t.fileLink;if(A)return A}},this.getSelectedVariant=(e,t)=>{var A;if(!(!e||t.length===0))return(A=e.variants)==null?void 0:A.find(n=>n.id===t[0])}}async getOption(e){return(async()=>{const n=(await YA([e]))[0];if(n)return n})()}async getAssetTileImageForVariant(e){var n,a;const t=e.thumbnail;if(t){const i=(n=t.versions)==null?void 0:n.find(s=>s.name==="thumbnail"),o=t.fileLink;return(i==null?void 0:i.link)||o}const A=e.asset;if(A){const i=(a=A.versions)==null?void 0:a.find(s=>s.name==="thumbnail"),o=A.fileLink;return(i==null?void 0:i.link)||o}return e.material?e.material.id:""}getDefaultVariant(e){const t=e.variants;if(t){if(t.length===1)return t[0];if(e.defaultVariant!==void 0)return t.find(A=>{var n;return A.id===((n=e.defaultVariant)==null?void 0:n.id)})}}}const L=new PA;var lt=(c=>(c.Hub="Hub",c.Shopify="Shopify",c))(lt||{}),Bt=(c=>(c[c.Orbit=0]="Orbit",c[c.Pan=1]="Pan",c))(Bt||{}),dt=(c=>(c.Manual="Manual",c.OnStart="OnStart",c.OnQuit="OnQuit",c.OnEnd="OnEnd",c))(dt||{}),wt=(c=>(c.Email="Email",c.FirstName="FirstName",c.LastName="LastName",c.Phone="Phone",c))(wt||{}),se=(c=>(c.Owner="Owner",c.Approver="Approver",c.Editor="Editor",c.Viewer="Viewer",c))(se||{});const $=M.gql`
148
148
  fragment AdditionalIntegrationProductFields on IntegrationProduct {
149
149
  id
150
150
  product {
@@ -607,7 +607,7 @@
607
607
  ...IntegrationProductFields
608
608
  }
609
609
  }
610
- `,re=[g.StepType.SilentIllustration,g.StepType.ProductOverlay],kA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:g.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=bA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?re.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:g.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},bA=(c,e)=>e.find(t=>t.stepNames.includes(c)),_=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),JA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>_(A,e)),silentSteps:c.silentSteps.filter(A=>_(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ee=(c,e)=>c.map(t=>JA(t,e)).filter(t=>t!==null),TA=async(c,e,t=!1)=>{var i;const A=ee(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===g.StepType.Model||s.type===g.StepType.Material||s.type===g.StepType.Picture||s.type===g.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Re{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Qt(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,l=t.height*o.zoom;return o.x=me(c.x,e.width-r,0),o.y=me(c.y,e.height-l,0),o}const i=c;return i.x=me(i.x,-n,e.width),i.y=me(i.y,-a,e.height),i}function me(c,e,t){return Math.min(Math.max(c,e),t)}class ut{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=tt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await g.getFrameData(o);At(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=g.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,l=t[o]-s*e[o],d=A[o]-r*e[o];return{x:l,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new v("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Qt(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new v("Frame data not set. This is a bug");if(!this.workflowManager)throw new v("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new g.GroupCommand([new g.UpdateFramePattern(s,t,e[r]),new g.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=g.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class mt{constructor(e,t,A){this.processRegion=async n=>{var s,r,l,d;const a=this.layouts.find(B=>B.panelId===n.panelId);if(!a)throw new b(n);let i="";if(this.configuration.type===g.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===g.LayoutElementType.Image){const B=this.configuration.type===g.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(l=this.product)==null?void 0:l.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:g.generate(),src:B,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new g.CreateElementCommand(w,a)}}else{const B=this.configuration.type===g.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((h,m)=>{if(!B){m("Undefined vector silent step source");return}g.fetchAsString(B,!0).then(u=>{h(u)}).catch(u=>console.error(u))}),E=await g.generateSVGWithUnknownColors(await w()),C={stepName:this.configuration.stepName,id:g.generate(),cachedObjectURL:await g.svgObjectURL(E.svg),src:B,svg:E.svg,colors:E.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:C.id,region:n},command:new g.CreateElementCommand(C,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===g.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===g.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new b(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===g.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?g.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),g.LayoutElementType.Illustration)}}const It=async c=>{const e=`${W.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class ft{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class LA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var d,B;const r=(d=n==null?void 0:n.storage)==null?void 0:d.videoShortUrl,l=(B=n==null?void 0:n.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:l})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const l=async()=>{var I,f;const u=(await ct([A]))[0],F=(f=(I=u==null?void 0:u.versions)==null?void 0:I.find(D=>D.name==="mpeg4"))==null?void 0:f.link;return{asset:u,link:F}},d=await new Promise((u,F)=>{new ft(async()=>!!(await l()).link,async()=>{const I=await l();if(!I.link||!I.link)throw new X(I.asset);u({rel:"mpeg4",href:I.link})},()=>{F("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(u=>s(new g.DeleteElementCommand(u.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const E=w.toString();if(E.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const C=await It(E);if(o(C),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),m=await this.command(C,h,a,i.stepName);m&&(m.command&&a.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await a.setSelectionsAndElements(i.stepName,[],h,async()=>{a.updateStorage(i.stepName,{videoShortUrl:C,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:g.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await nt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const l=r.region,d=a.find(B=>B.panelId===(l==null?void 0:l.panelId));if(!d&&l)throw new b(l);if(d&&!l)throw new Error("Region not found");if(!d||!l)throw new Error("Neither a region or layout found!");return new g.CreateElementCommand({stepRegion:l,stepName:n,id:r.id,src:o,type:g.LayoutElementType.Image,y:l.top,x:l.left,width:l.width,height:l.height,rotation:0},d)});return{command:new g.GroupCommand(s),followup:async()=>{}}}}const Dt=new LA;class OA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return g.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new V(e);const n=A.fileLink;if(n)return g.fetchAsString(n,!0);throw new X(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName).map(l=>({id:l.id,region:l.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const l=e.data.regions.map(d=>g.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:l})}if(n){const l=async()=>{var w,E,C,h;const d=(w=n.storage)==null?void 0:w.framePatternSrc,B=(E=n.storage)==null?void 0:E.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(C=t.getStepSpecificServices(e.stepName))==null?void 0:C.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(h=t.getStepSpecificServices(e.stepName))==null?void 0:h.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const d=n.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(E=>this.frameSourceSvg(B,E)));t.updateStorage(e.stepName,{currentFrameSources:w}),await l()})}}else await t.setSelectionsAndElements(e.stepName,[],s,l)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new ft(async()=>{var s;const i=(s=(await J.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{J.getLocalOrFromServer(t.key||"").then(a=>{this.loadPatternFromAsset(a,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({id:e,type:g.LayoutElementType.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await g.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};g.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await g.fetchAsArrayBuffer(e,!0),n=await g.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};g.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var B;const o=(B=n.getStepSpecificServices(e.stepName))==null?void 0:B.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,E)=>{const C=await g.getFrameData(s[E]),h=o.getImageData(),m=A.map(p=>new g.DeleteElementCommand(p.id)),u=h?g.calculateOffsets(h,C):void 0,F=h?{id:g.generate(),src:h.src,x:(u==null?void 0:u.x)||0,y:(u==null?void 0:u.y)||0,width:h.width,height:h.height,scaleX:(u==null?void 0:u.zoom)||1,scaleY:(u==null?void 0:u.zoom)||1,rotation:0}:void 0,I=g.generate(),D=n.getLayouts().find(p=>p.panelId===w.panelId);if(!D)throw new b(w);return{command:this.getCreateElementCommand(I,w,D,{frameData:C,pattern:F,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:m}})),l=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new g.GroupCommand([...l,...d]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const E=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!E)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,E)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new X(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const Ie=new OA;class zA{async getIllustrationBody(e){return new Promise(t=>{g.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:g.LayoutElementType.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return g.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var l;const i={};for(const[d,B]of a.entries())i[d]={browserValue:B,spotColor:(l=i[d])==null?void 0:l.spotColor};const o=g.modifySVGWithElementProperties(e,t,A,i),s=await g.svgObjectURL(o),r=[];for(const d of n){for(const[B,w]of a.entries())r.push(new g.IllustrationColorCommand(d,B,w));r.push(new g.IllustrationCacheCommand(d,o,s))}return new g.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,E;if(t.length===0)return;const i=g.findElement(t[0].id,n().map(C=>C.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([C,h])=>{const m={browserValue:h.browserValue},u=h.spotColor;u&&(m.spotColor={profileName:u.profileName,namedColor:u.namedColor}),s[C]=m});for(const[C,h]of a.entries())o[C]={browserValue:h,spotColor:(w=o[C])==null?void 0:w.spotColor},s[C]={browserValue:h};let r=Array.from(Object.values(o)).map(C=>C.browserValue);const l=e.data.colorOption;l&&((E=l.variants)==null||E.forEach(C=>{r=r.map(h=>{var m;return h.toLowerCase()===((m=C.color)==null?void 0:m.toLowerCase())?C.name:h})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([C,h])=>{d.set(C,h.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(C=>C.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a){var m;if(!e.data||!e.data.regions)throw new ie(e,"Missing regions.");n(!0);const i=A.map(u=>new g.DeleteElementCommand(u.id));a.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new V(t);const s=o.fileLink;if(!s)throw new X(o);const r=await g.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),l=await g.svgObjectURL(r.svg),d=u=>{const F=a.getLayouts().find(f=>f.panelId===u.panelId);if(!F)throw new b(u);const I=g.generate();return{regionElement:{id:I,region:u},command:this.getCreateElementCommand(I,u,F,{stepName:e.stepName,src:s,objectURL:l,svg:r})}},B=e.data.regions.map(d),E=[...B.map(u=>u.command),...i];let C=Array.from(Object.values(r.colors)).map(u=>u.browserValue);const h=e.data.colorOption;return h&&((m=h.variants)==null||m.forEach(u=>{C=C.map(F=>{var I;return F.toLowerCase()===((I=u.color)==null?void 0:I.toLowerCase())?u.name:F})})),a.updateMetadata(e.stepName,{colors:C}),{command:new g.GroupCommand(E),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],B.map(I=>I.regionElement),async()=>{a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const u=await this.availableColors(e,a)||[],F=Object.keys(r.colors);if(e.data.colorPickerEnabled&&u.length===1&&F.length===1){const I=u[0],f=F[0];await this.changeColors(e,B.map(D=>D.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[f,I.variant.color]]))}}}}}const ce=new zA;class jA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=d.material,w=o.map(E=>({id:E.id,region:E.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const E=t.getModelContainer();if(E){const C=e.data.targetMaterials.map(h=>E.applyMaterialVariant(h,s.id||"",B||{}));Promise.all(C).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){const a=A.getModelContainer();n(!0);const i=t.material;if(!i)throw n(!1),new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{a&&e.data.targetMaterials.forEach(o=>{e.option&&a.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Ge=new jA;class KA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var E;const w=t.getModelContainer();if(w&&e.option){const C=(E=d.asset)==null?void 0:E.fileLink;if(!C)throw new V(d);await w.applyModelVariant(e.stepName||"",{model:C,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){var i;n(!0);const a=(i=t.asset)==null?void 0:i.fileLink;if(!a)throw new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:a,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const ve=new KA;class VA{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,l;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((l=n==null?void 0:n.storage)==null?void 0:l.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var l;const i=A.getRegionElements(e.stepName),o=(l=A.getStepSpecificServices(e.stepName))==null?void 0:l.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(d,B,w)=>{const E=w||g.generate(),h=A.getLayouts().find(u=>u.panelId===B.panelId);if(!h)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new g.DeleteElementCommand(E)),m.push(new g.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:E,svg:d,type:g.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},h)),{id:E,region:B,command:new g.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const E=o.svgPrint(t,w.region);return r(E,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{const w=d.filter(E=>E).map(E=>E&&{id:E.id,region:E.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=Ye.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const pt=new VA;class WA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n){const a=t.asset;if(!a)throw new V(t);const i=a==null?void 0:a.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new g.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(C=>C.panelId===d.panelId);if(!w)throw new b(d);const E=g.generate();return{regionElement:{id:E,region:d},command:new g.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:E,src:i,type:g.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},w)}},l=e.data.regions.map(r);return{command:new g.GroupCommand([...s,...l.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],l.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const ke=new WA;class XA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A){const n=e.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find(o=>o.id===t):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new XA;class qA{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(l=>l.panelId===(s==null?void 0:s.panelId)))throw new b(s);return new g.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new g.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,l;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((l=t.variant)!=null&&l.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=d=>{const B=d.region;if(!a.find(C=>C.panelId===(B==null?void 0:B.panelId)))throw new b(B);const E=o();return new g.IllustrationColorCommand(d.id,this.shapeFillId,E)},l=A.map(r).filter(d=>!!d);return{command:new g.GroupCommand(l),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const E=a.find(F=>F.panelId===w.panelId);if(!E)throw new b(w);const C=o(),h=`
610
+ `,re=[g.StepType.SilentIllustration,g.StepType.ProductOverlay],kA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:g.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=bA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?re.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:re.includes(A.type)?[]:[A],silentSteps:re.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:g.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},bA=(c,e)=>e.find(t=>t.stepNames.includes(c)),_=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),JA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>_(A,e)),silentSteps:c.silentSteps.filter(A=>_(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ee=(c,e)=>c.map(t=>JA(t,e)).filter(t=>t!==null),TA=async(c,e,t=!1)=>{var i;const A=ee(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===g.StepType.Model||s.type===g.StepType.Material||s.type===g.StepType.Picture||s.type===g.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Re{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Qt(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,l=t.height*o.zoom;return o.x=me(c.x,e.width-r,0),o.y=me(c.y,e.height-l,0),o}const i=c;return i.x=me(i.x,-n,e.width),i.y=me(i.y,-a,e.height),i}function me(c,e,t){return Math.min(Math.max(c,e),t)}class ut{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=tt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await g.getFrameData(o);At(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=g.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,l=t[o]-s*e[o],d=A[o]-r*e[o];return{x:l,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new v("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Qt(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new v("Frame data not set. This is a bug");if(!this.workflowManager)throw new v("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new g.GroupCommand([new g.UpdateFramePattern(s,t,e[r]),new g.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=g.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class mt{constructor(e,t,A){this.processRegion=async n=>{var s,r,l,d;const a=this.layouts.find(B=>B.panelId===n.panelId);if(!a)throw new J(n);let i="";if(this.configuration.type===g.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===g.LayoutElementType.Image){const B=this.configuration.type===g.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(l=this.product)==null?void 0:l.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:g.generate(),src:B,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new g.CreateElementCommand(w,a)}}else{const B=this.configuration.type===g.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((h,m)=>{if(!B){m("Undefined vector silent step source");return}g.fetchAsString(B,!0).then(u=>{h(u)}).catch(u=>console.error(u))}),E=await g.generateSVGWithUnknownColors(await w()),C={stepName:this.configuration.stepName,id:g.generate(),cachedObjectURL:await g.svgObjectURL(E.svg),src:B,svg:E.svg,colors:E.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:C.id,region:n},command:new g.CreateElementCommand(C,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===g.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===g.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new J(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===g.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?g.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),g.LayoutElementType.Illustration)}}const It=async c=>{const e=`${W.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class ft{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class LA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var d,B;const r=(d=n==null?void 0:n.storage)==null?void 0:d.videoShortUrl,l=(B=n==null?void 0:n.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:l})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const l=async()=>{var I,f;const u=(await ct([A]))[0],F=(f=(I=u==null?void 0:u.versions)==null?void 0:I.find(D=>D.name==="mpeg4"))==null?void 0:f.link;return{asset:u,link:F}},d=await new Promise((u,F)=>{new ft(async()=>!!(await l()).link,async()=>{const I=await l();if(!I.link||!I.link)throw new X(I.asset);u({rel:"mpeg4",href:I.link})},()=>{F("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(u=>s(new g.DeleteElementCommand(u.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const E=w.toString();if(E.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const C=await It(E);if(o(C),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),m=await this.command(C,h,a,i.stepName);m&&(m.command&&a.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await a.setSelectionsAndElements(i.stepName,[],h,async()=>{a.updateStorage(i.stepName,{videoShortUrl:C,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:g.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await nt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const l=r.region,d=a.find(B=>B.panelId===(l==null?void 0:l.panelId));if(!d&&l)throw new J(l);if(d&&!l)throw new Error("Region not found");if(!d||!l)throw new Error("Neither a region or layout found!");return new g.CreateElementCommand({stepRegion:l,stepName:n,id:r.id,src:o,type:g.LayoutElementType.Image,y:l.top,x:l.left,width:l.width,height:l.height,rotation:0},d)});return{command:new g.GroupCommand(s),followup:async()=>{}}}}const Dt=new LA;class OA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return g.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new V(e);const n=A.fileLink;if(n)return g.fetchAsString(n,!0);throw new X(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName).map(l=>({id:l.id,region:l.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const l=e.data.regions.map(d=>g.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:l})}if(n){const l=async()=>{var w,E,C,h;const d=(w=n.storage)==null?void 0:w.framePatternSrc,B=(E=n.storage)==null?void 0:E.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(C=t.getStepSpecificServices(e.stepName))==null?void 0:C.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(h=t.getStepSpecificServices(e.stepName))==null?void 0:h.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const d=n.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(E=>this.frameSourceSvg(B,E)));t.updateStorage(e.stepName,{currentFrameSources:w}),await l()})}}else await t.setSelectionsAndElements(e.stepName,[],s,l)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new ft(async()=>{var s;const i=(s=(await k.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{k.getLocalOrFromServer(t.key||"").then(a=>{this.loadPatternFromAsset(a,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({id:e,type:g.LayoutElementType.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await g.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};g.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await g.fetchAsArrayBuffer(e,!0),n=await g.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};g.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var B;const o=(B=n.getStepSpecificServices(e.stepName))==null?void 0:B.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,E)=>{const C=await g.getFrameData(s[E]),h=o.getImageData(),m=A.map(p=>new g.DeleteElementCommand(p.id)),u=h?g.calculateOffsets(h,C):void 0,F=h?{id:g.generate(),src:h.src,x:(u==null?void 0:u.x)||0,y:(u==null?void 0:u.y)||0,width:h.width,height:h.height,scaleX:(u==null?void 0:u.zoom)||1,scaleY:(u==null?void 0:u.zoom)||1,rotation:0}:void 0,I=g.generate(),D=n.getLayouts().find(p=>p.panelId===w.panelId);if(!D)throw new J(w);return{command:this.getCreateElementCommand(I,w,D,{frameData:C,pattern:F,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:m}})),l=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new g.GroupCommand([...l,...d]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const E=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!E)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,E)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new X(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const Ie=new OA;class zA{async getIllustrationBody(e){return new Promise(t=>{g.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new g.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:g.LayoutElementType.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return g.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var l;const i={};for(const[d,B]of a.entries())i[d]={browserValue:B,spotColor:(l=i[d])==null?void 0:l.spotColor};const o=g.modifySVGWithElementProperties(e,t,A,i),s=await g.svgObjectURL(o),r=[];for(const d of n){for(const[B,w]of a.entries())r.push(new g.IllustrationColorCommand(d,B,w));r.push(new g.IllustrationCacheCommand(d,o,s))}return new g.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,E;if(t.length===0)return;const i=g.findElement(t[0].id,n().map(C=>C.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([C,h])=>{const m={browserValue:h.browserValue},u=h.spotColor;u&&(m.spotColor={profileName:u.profileName,namedColor:u.namedColor}),s[C]=m});for(const[C,h]of a.entries())o[C]={browserValue:h,spotColor:(w=o[C])==null?void 0:w.spotColor},s[C]={browserValue:h};let r=Array.from(Object.values(o)).map(C=>C.browserValue);const l=e.data.colorOption;l&&((E=l.variants)==null||E.forEach(C=>{r=r.map(h=>{var m;return h.toLowerCase()===((m=C.color)==null?void 0:m.toLowerCase())?C.name:h})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([C,h])=>{d.set(C,h.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(C=>C.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a){var m;if(!e.data||!e.data.regions)throw new ie(e,"Missing regions.");n(!0);const i=A.map(u=>new g.DeleteElementCommand(u.id));a.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new V(t);const s=o.fileLink;if(!s)throw new X(o);const r=await g.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),l=await g.svgObjectURL(r.svg),d=u=>{const F=a.getLayouts().find(f=>f.panelId===u.panelId);if(!F)throw new J(u);const I=g.generate();return{regionElement:{id:I,region:u},command:this.getCreateElementCommand(I,u,F,{stepName:e.stepName,src:s,objectURL:l,svg:r})}},B=e.data.regions.map(d),E=[...B.map(u=>u.command),...i];let C=Array.from(Object.values(r.colors)).map(u=>u.browserValue);const h=e.data.colorOption;return h&&((m=h.variants)==null||m.forEach(u=>{C=C.map(F=>{var I;return F.toLowerCase()===((I=u.color)==null?void 0:I.toLowerCase())?u.name:F})})),a.updateMetadata(e.stepName,{colors:C}),{command:new g.GroupCommand(E),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],B.map(I=>I.regionElement),async()=>{a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const u=await this.availableColors(e,a)||[],F=Object.keys(r.colors);if(e.data.colorPickerEnabled&&u.length===1&&F.length===1){const I=u[0],f=F[0];await this.changeColors(e,B.map(D=>D.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[f,I.variant.color]]))}}}}}const ce=new zA;class jA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=d.material,w=o.map(E=>({id:E.id,region:E.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const E=t.getModelContainer();if(E){const C=e.data.targetMaterials.map(h=>E.applyMaterialVariant(h,s.id||"",B||{}));Promise.all(C).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){const a=A.getModelContainer();n(!0);const i=t.material;if(!i)throw n(!1),new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{a&&e.data.targetMaterials.forEach(o=>{e.option&&a.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Ge=new jA;class KA{async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{})}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var E;const w=t.getModelContainer();if(w&&e.option){const C=(E=d.asset)==null?void 0:E.fileLink;if(!C)throw new V(d);await w.applyModelVariant(e.stepName||"",{model:C,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n){var i;n(!0);const a=(i=t.asset)==null?void 0:i.fileLink;if(!a)throw new V(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:a,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const ve=new KA;class VA{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,l;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((l=n==null?void 0:n.storage)==null?void 0:l.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var l;const i=A.getRegionElements(e.stepName),o=(l=A.getStepSpecificServices(e.stepName))==null?void 0:l.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(d,B,w)=>{const E=w||g.generate(),h=A.getLayouts().find(u=>u.panelId===B.panelId);if(!h)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new g.DeleteElementCommand(E)),m.push(new g.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:E,svg:d,type:g.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},h)),{id:E,region:B,command:new g.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const E=o.svgPrint(t,w.region);return r(E,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new g.GroupCommand(B),followup:async()=>{const w=d.filter(E=>E).map(E=>E&&{id:E.id,region:E.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=Ye.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const pt=new VA;class WA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n){const a=t.asset;if(!a)throw new V(t);const i=a==null?void 0:a.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new g.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(C=>C.panelId===d.panelId);if(!w)throw new J(d);const E=g.generate();return{regionElement:{id:E,region:d},command:new g.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:E,src:i,type:g.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},w)}},l=e.data.regions.map(r);return{command:new g.GroupCommand([...s,...l.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],l.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const ke=new WA;class XA{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A){const n=e.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find(o=>o.id===t):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new XA;class qA{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(l=>l.panelId===(s==null?void 0:s.panelId)))throw new J(s);return new g.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new g.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ae(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(l=>l.elements).flat().filter(l=>l.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const l=n.selectedVariants[0].id;if(s&&l){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===l);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,l;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((l=t.variant)!=null&&l.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=d=>{const B=d.region;if(!a.find(C=>C.panelId===(B==null?void 0:B.panelId)))throw new J(B);const E=o();return new g.IllustrationColorCommand(d.id,this.shapeFillId,E)},l=A.map(r).filter(d=>!!d);return{command:new g.GroupCommand(l),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const E=a.find(F=>F.panelId===w.panelId);if(!E)throw new J(w);const C=o(),h=`
611
611
  <svg
612
612
  xmlns="http://www.w3.org/2000/svg"
613
613
  xmlnsXlink="http://www.w3.org/1999/xlink"
@@ -1960,7 +1960,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
1960
1960
  }
1961
1961
  }
1962
1962
  }
1963
- `,hn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:wn,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c.name,layouts:c.layouts,workflowId:c.workflowId,transactionId:c.transactionId,previewImage:c.previewImage,useThreeDimPreview:c.useThreeDimPreview,metadata:c.metadata,selectedVariants:c.selectedVariants}})).data)==null?void 0:t.designCreate},Cn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:En,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:c.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(c,e,t)=>{const A=a=>{const i={};if(a.type==="Frame"){const o=c[a.stepName],s=a.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${a.stepTitle} image`]=o.image}if(a.type==="Illustration"){const o=c[a.stepName],s=a.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${a.stepTitle} colors`]=r}}if(a.type==="Module"){const o=c[a.stepName],s=a.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${a.stepTitle} text`]=o.text}if(a.type==="Text"){const o=c[a.stepName];if(!o)return i;const s=a.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${a.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${a.stepTitle} color`]=o.color)}return i},n={};return e.steps.forEach(a=>{Object.assign(n,A(a))}),n},Qn=(c,e,t,A)=>{const n={};let a;if(t){a=je(t,e,!1);for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}else if(A){a=A;for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}for(const i of Object.keys(c)){const o=c[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)n[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)n[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return n},Ot=(c,e,t,A,n,a,i,o)=>{var E,C;const s=e.basePrice||0,r=c.priceModifierTotal||0,l=Qn(A,t,void 0,a),B=(P.getMap("transactionOwnerIds")||new Map).get(c.id),w={additionalExternalProductId:(E=c.integrationProduct)==null?void 0:E.additionalExternalProductId,additionalExternalVariantId:(C=c.integrationProduct)==null?void 0:C.additionalExternalVariantId,baseCost:s,designProductId:c.externalDesignProductId,designProductVariantId:c.externalDesignProductVariantId,event:"onComplete",exportedData:l,externalCartProductId:c.externalCartProductId,externalCartProductVariantId:c.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:r,processExecutionId:o,quantity:c.quantity,transactionId:c.id,transactionOwnerId:B,weight:e.weight,workflowViewerLink:c.workflowViewerLink||"",workflowViewerReadOnlyLink:c.workflowViewerReadOnlyLink||""};return a&&(w.metadata=a),A&&(w.selectedVariants=A),n&&(w.sku=n),w},zt=async(c,e,t,A,n,a,i,o,s,r)=>{var S;await(async()=>{var T;if(r!==void 0)return r;await c.outstandingRequestsPromise();const x=(P.getMap("transactionOwnerIds")||new Map).get(n.id),H=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:[n.id]},fetchPolicy:"no-cache",errorPolicy:"all",context:{transactionOwnerId:x}}),R=(T=H.data)==null?void 0:T.transactions[0].workflowState;return H.errors?(H.errors.forEach(k=>{H.errors&&console.log("Server Error:",k.message)}),null):R??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await c.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=c.getPreviewService(),w=(S=e==null?void 0:e.finalizeStepConfig)==null?void 0:S.lookAtAnimation,E=B&&e.showModelOnFinishStep&&!!w,C=s&&je(s,e,!0),h=s&&je(s,e,!1),m=async y=>{const x={};let Y=0;if(Object.keys(a).length>0)for(const H of Object.keys(a)){const R=a[H],T=e.steps.find(k=>k.stepName===H);for(let k=0;k<R.selections.length;++k){const z=R.selections[k];if(T&&(!y||T.option&&(T.option.variants||[]).length>1&&!T.data.hideSelectionInCart&&!T.data.hideSelectionsInCart)){const $e=T.stepTitle;x[$e]?x[$e].push({id:z.id||"",name:z.name,priceModifier:z.priceModifier}):x[$e]=[{id:z.id||"",name:z.name,priceModifier:z.priceModifier}]}Y+=z.priceModifier}}return[x,Y]},[u]=await m(!0),F=Object.fromEntries(Object.keys(u).map(y=>[y,u[y].map(x=>x.id)])),[I]=await m(!1),f=Object.fromEntries(Object.keys(I).map(y=>[y,I[y].map(x=>x.id)])),D=await o(E,n.id);return{designDetails:(()=>{const y={name:i,layouts:t.map(x=>({index:x.index,panelId:x.panelId})),workflowId:e.id,transactionId:n.id,useThreeDimPreview:!!E,previewImage:D};if(h){const x=[];for(const[Y,H]of Object.entries(h))x.push({key:Y,value:H});y.metadata=x}if(F){const x=[];for(const[Y,H]of Object.entries(f))x.push({key:Y,ids:H});y.selectedVariants=x}return y})(),cartSelectionsWithPrices:u,cartMetadata:C}},jt=async(c,e,t,A,n,a,i,o,s,r,l)=>{var m,u;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:d,cartSelectionsWithPrices:B,cartMetadata:w}=await zt(c,e,t,A,a,i,o,r,l);s("workflow.steps.finish.finalize.creatingDesign");const E=await hn(d),C=(m=E==null?void 0:E.transaction)==null?void 0:m.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const h=E.transaction;return Ot(h,n,e,B,E==null?void 0:E.sku,w,C,(u=E==null?void 0:E.processExecution)==null?void 0:u.id)},un=async(c,e,t)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(c.map(async o=>{await o.workflowManager.outstandingRequestsPromise()}));const n=await(async()=>{var r;const s=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:c.map(l=>l.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return s.errors?(s.errors.forEach(l=>{s.errors&&console.log("Server Error:",l.message)}),null):(r=s.data)!=null&&r.transactions?s.data.transactions.map(l=>l.workflowState??null):null})(),a=await Promise.all(c.map(async(o,s)=>await zt(o.workflowManager,o.workflow,o.layouts,o.getReducerState,o.transaction,o.workflowSelections,o.designName,t??(()=>Promise.resolve(void 0)),o.workflowMetadata,n?n[s]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const i=await Cn(a.map(o=>o.designDetails));if(!i)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),i.map((o,s)=>{var B;const r=c[s],l=a[s],d=o.transaction;return Ot(d,r.product,r.workflow,l.cartSelectionsWithPrices,o.sku,l.cartMetadata,void 0,(B=o.processExecution)==null?void 0:B.id)})};class mn{constructor(){this.localPersistenceKey="designTransactions",this.storageMethod="Local",this.designSavedListeners=[]}attachSaveListener(e){this.designSavedListeners.push(e)}detachSaveListener(e){this.designSavedListeners=this.designSavedListeners.filter(t=>t!==e)}async getSavedDesigns(){if(this.storageMethod==="Local"){const e=P.get(this.localPersistenceKey);return e?JSON.parse(e):[]}throw new v("Unexpected storage method requested")}async getSavedDesignByTransaction(e){return(await this.getSavedDesigns()).find(A=>A.transactionId===e)}async addDesign(e){const A=(await this.getSavedDesigns()).filter(n=>n.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(n=>n(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),n=A.find(a=>a.transactionId===e);if(!n)throw new Error(`No saved design for transaction ${e}.`);n.title=t,await this.setDesigns(A)}async removeDesign(e){const t=await this.getSavedDesigns();await this.setDesigns(t.filter(A=>A.transactionId!==e))}async setDesigns(e){if(this.storageMethod==="Local"){P.set(this.localPersistenceKey,JSON.stringify(e));return}throw new v("Unexpected storage method requested")}}const Fe=new mn,In=M.gql`
1963
+ `,hn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:wn,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:c.name,layouts:c.layouts,workflowId:c.workflowId,transactionId:c.transactionId,previewImage:c.previewImage,useThreeDimPreview:c.useThreeDimPreview,metadata:c.metadata,selectedVariants:c.selectedVariants}})).data)==null?void 0:t.designCreate},Cn=async c=>{var t;return(t=(await N.getShadowGraphqlClient().mutate({mutation:En,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:c.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(c,e,t)=>{const A=a=>{const i={};if(a.type==="Frame"){const o=c[a.stepName],s=a.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${a.stepTitle} image`]=o.image}if(a.type==="Illustration"){const o=c[a.stepName],s=a.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${a.stepTitle} colors`]=r}}if(a.type==="Module"){const o=c[a.stepName],s=a.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${a.stepTitle} text`]=o.text}if(a.type==="Text"){const o=c[a.stepName];if(!o)return i;const s=a.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${a.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${a.stepTitle} color`]=o.color)}return i},n={};return e.steps.forEach(a=>{Object.assign(n,A(a))}),n},Qn=(c,e,t,A)=>{const n={};let a;if(t){a=je(t,e,!1);for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}else if(A){a=A;for(const i of Object.keys(a))n[i]={value:a[i],priceModifier:0}}for(const i of Object.keys(c)){const o=c[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)n[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)n[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return n},Ot=(c,e,t,A,n,a,i,o)=>{var E,C;const s=e.basePrice||0,r=c.priceModifierTotal||0,l=Qn(A,t,void 0,a),B=(P.getMap("transactionOwnerIds")||new Map).get(c.id),w={additionalExternalProductId:(E=c.integrationProduct)==null?void 0:E.additionalExternalProductId,additionalExternalVariantId:(C=c.integrationProduct)==null?void 0:C.additionalExternalVariantId,baseCost:s,designProductId:c.externalDesignProductId,designProductVariantId:c.externalDesignProductVariantId,event:"onComplete",exportedData:l,externalCartProductId:c.externalCartProductId,externalCartProductVariantId:c.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:r,processExecutionId:o,quantity:c.quantity,transactionId:c.id,transactionOwnerId:B,weight:e.weight,workflowViewerLink:c.workflowViewerLink||"",workflowViewerReadOnlyLink:c.workflowViewerReadOnlyLink||""};return a&&(w.metadata=a),A&&(w.selectedVariants=A),n&&(w.sku=n),w},zt=async(c,e,t,A,n,a,i,o,s,r)=>{var S;await(async()=>{var T;if(r!==void 0)return r;await c.outstandingRequestsPromise();const x=(P.getMap("transactionOwnerIds")||new Map).get(n.id),H=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:[n.id]},fetchPolicy:"no-cache",errorPolicy:"all",context:{transactionOwnerId:x}}),R=(T=H.data)==null?void 0:T.transactions[0].workflowState;return H.errors?(H.errors.forEach(b=>{H.errors&&console.log("Server Error:",b.message)}),null):R??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await c.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=c.getPreviewService(),w=(S=e==null?void 0:e.finalizeStepConfig)==null?void 0:S.lookAtAnimation,E=B&&e.showModelOnFinishStep&&!!w,C=s&&je(s,e,!0),h=s&&je(s,e,!1),m=async y=>{const x={};let Y=0;if(Object.keys(a).length>0)for(const H of Object.keys(a)){const R=a[H],T=e.steps.find(b=>b.stepName===H);for(let b=0;b<R.selections.length;++b){const z=R.selections[b];if(T&&(!y||T.option&&(T.option.variants||[]).length>1&&!T.data.hideSelectionInCart&&!T.data.hideSelectionsInCart)){const $e=T.stepTitle;x[$e]?x[$e].push({id:z.id||"",name:z.name,priceModifier:z.priceModifier}):x[$e]=[{id:z.id||"",name:z.name,priceModifier:z.priceModifier}]}Y+=z.priceModifier}}return[x,Y]},[u]=await m(!0),F=Object.fromEntries(Object.keys(u).map(y=>[y,u[y].map(x=>x.id)])),[I]=await m(!1),f=Object.fromEntries(Object.keys(I).map(y=>[y,I[y].map(x=>x.id)])),D=await o(E,n.id);return{designDetails:(()=>{const y={name:i,layouts:t.map(x=>({index:x.index,panelId:x.panelId})),workflowId:e.id,transactionId:n.id,useThreeDimPreview:!!E,previewImage:D};if(h){const x=[];for(const[Y,H]of Object.entries(h))x.push({key:Y,value:H});y.metadata=x}if(F){const x=[];for(const[Y,H]of Object.entries(f))x.push({key:Y,ids:H});y.selectedVariants=x}return y})(),cartSelectionsWithPrices:u,cartMetadata:C}},jt=async(c,e,t,A,n,a,i,o,s,r,l)=>{var m,u;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:d,cartSelectionsWithPrices:B,cartMetadata:w}=await zt(c,e,t,A,a,i,o,r,l);s("workflow.steps.finish.finalize.creatingDesign");const E=await hn(d),C=(m=E==null?void 0:E.transaction)==null?void 0:m.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const h=E.transaction;return Ot(h,n,e,B,E==null?void 0:E.sku,w,C,(u=E==null?void 0:E.processExecution)==null?void 0:u.id)},un=async(c,e,t)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(c.map(async o=>{await o.workflowManager.outstandingRequestsPromise()}));const n=await(async()=>{var r;const s=await N.getShadowGraphqlClient().query({query:ht,variables:{ids:c.map(l=>l.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return s.errors?(s.errors.forEach(l=>{s.errors&&console.log("Server Error:",l.message)}),null):(r=s.data)!=null&&r.transactions?s.data.transactions.map(l=>l.workflowState??null):null})(),a=await Promise.all(c.map(async(o,s)=>await zt(o.workflowManager,o.workflow,o.layouts,o.getReducerState,o.transaction,o.workflowSelections,o.designName,t??(()=>Promise.resolve(void 0)),o.workflowMetadata,n?n[s]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const i=await Cn(a.map(o=>o.designDetails));if(!i)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),i.map((o,s)=>{var B;const r=c[s],l=a[s],d=o.transaction;return Ot(d,r.product,r.workflow,l.cartSelectionsWithPrices,o.sku,l.cartMetadata,void 0,(B=o.processExecution)==null?void 0:B.id)})};class mn{constructor(){this.localPersistenceKey="designTransactions",this.storageMethod="Local",this.designSavedListeners=[]}attachSaveListener(e){this.designSavedListeners.push(e)}detachSaveListener(e){this.designSavedListeners=this.designSavedListeners.filter(t=>t!==e)}async getSavedDesigns(){if(this.storageMethod==="Local"){const e=P.get(this.localPersistenceKey);return e?JSON.parse(e):[]}throw new v("Unexpected storage method requested")}async getSavedDesignByTransaction(e){return(await this.getSavedDesigns()).find(A=>A.transactionId===e)}async addDesign(e){const A=(await this.getSavedDesigns()).filter(n=>n.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(n=>n(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),n=A.find(a=>a.transactionId===e);if(!n)throw new Error(`No saved design for transaction ${e}.`);n.title=t,await this.setDesigns(A)}async removeDesign(e){const t=await this.getSavedDesigns();await this.setDesigns(t.filter(A=>A.transactionId!==e))}async setDesigns(e){if(this.storageMethod==="Local"){P.set(this.localPersistenceKey,JSON.stringify(e));return}throw new v("Unexpected storage method requested")}}const Fe=new mn,In=M.gql`
1964
1964
  mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
1965
1965
  transactionAddStakeholder(id: $id, details: $details, type: $type) {
1966
1966
  id
@@ -1974,7 +1974,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
1974
1974
  }
1975
1975
  }
1976
1976
  }
1977
- `;var Kt=(c=>(c.QuantityChanged="QuantityChanged",c))(Kt||{});class le{constructor(e,t){var n;if(this.cachedStepHandles=new Map,this.renderableScenes=[],this.renderableSceneCallbacks=[],this.eventCallbacks=new Map,this.debouncedSavedDesignUpdate=tt(async()=>{await Fe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async a=>new Promise((i,o)=>{try{a.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new g.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new dn(t.workflow,((n=t.product.profanities)==null?void 0:n.map(a=>a.word))||[],A,this.commandContext,a=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(a)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable,t.delayWorkflowStateSync),this.workflowManager.addSelectionCallback(a=>{const i=a.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s,workflowScene:o}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async createPreviewImage(e,t){var u,F;const A=this.workflowManager.getWorkflow(),n=(u=A==null?void 0:A.finalizeStepConfig)==null?void 0:u.lookAtAnimation;if(e){if(!n)throw new Error("Failed to generate cart preview image!");return await((F=this.workflowManager.getPreviewService())==null?void 0:F.renderSceneScreenshot(t??512,n))||""}let a=2048;t&&t<=2048&&(a=t);const i=g.createCanvas(a,a),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],l=o.find(I=>{var f;return((f=I.layoutState)==null?void 0:f.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=l.layoutState.layout.previewRegion?{x:l.layoutState.layout.previewRegion.left,y:l.layoutState.layout.previewRegion.top,width:l.layoutState.layout.previewRegion.width,height:l.layoutState.layout.previewRegion.height}:{x:0,y:0,width:l.layoutState.layout.width,height:l.layoutState.layout.height},B=this.commandContext.getLayoutById(l.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const E=g.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),C=g.renderPapyrusComponentAsString(E);await(await et.Pith.from(w,C,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===e);if(!t||!this.stepHasHandle(t))return;const A=this.cachedStepHandles.get(t.stepName);if(A)return A;const n=pe.get(this.getWorkflowManager(),t);return this.cachedStepHandles.set(t.stepName,n),n}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.reduce((n,a)=>n+(a.priceModifier||0),0)}),t}getBasePriceSubunits(e){const t=this.getWorkflowManager().getProduct().basePrice||0;if(e){const A=this.getAdditionalProductPriceSubunits()||0;return t+A}return t}getAdditionalProductPriceSubunits(){var t;const e=this.getWorkflowManager().getTransaction().integrationProduct;if((t=e==null?void 0:e.additionalIntegrationProduct)!=null&&t.product)return e.additionalIntegrationProduct.product.basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}async copySelectionsViaGlobalConfiguration(e,t,A){const n=await e.getGlobalProperties(),a=A==null?void 0:A.map(r=>r.getId()),i=this.getSteps().filter(r=>a===void 0||a.includes(r.getId())),o=t.getSteps(),s=r=>n.find(l=>l.getRawProperty().name===r.aspectName);i.forEach(r=>{const l=new Set,d=r.getRaw().globalPropertyAspectConfigurations;d!==void 0&&(d.forEach(B=>l.add(JSON.stringify(B))),o.forEach(B=>{const w=B.getRaw().globalPropertyAspectConfigurations;w!==void 0&&w.forEach(E=>{const C=s(E),h=l.has(JSON.stringify(E));if(h&&(C==null?void 0:C.getType())==="Option"){const m=B.getCurrentVariant();if(!m)return;r.selectVariant(m),l.delete(JSON.stringify(E))}else if(h&&(C==null?void 0:C.getType())==="Text"){const m=B.getText();r.setText(m),l.delete(JSON.stringify(E))}})}))})}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return pe.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>pe.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(n=>n.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>pe.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var i,o,s;const A=(P.getMap("transactionOwnerIds")||new Map).get(this.getWorkflowManager().getTransaction().id),a=(s=(o=(i=(await N.getShadowGraphqlClient().mutate({mutation:In,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"},context:{transactionOwnerId:A}})).data)==null?void 0:i.transactionAddStakeholder)==null?void 0:o.stakeholders)==null?void 0:s.find(r=>{var l;return((l=r.customer)==null?void 0:l.emailAddress)===e.emailAddress});if(a!=null&&a.customer){this.getWorkflowManager().setTransactionCustomer(a.customer);const r=P.getMap("transactionCustomerIds")||new Map;r.set(this.getWorkflowManager().getTransaction().id,a.customer.id),P.setMap("transactionCustomerIds",r)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new v("State undefined!");const n={title:await(async()=>{var s;if(e)return e;const a=this.getWorkflowManager().getTransaction().id,o=(s=(await Fe.getSavedDesigns()).find(r=>r.transactionId===a))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Fe.addDesign(n),n}async copy(){var o;const e=Ee(this.getCommandContext().getState());if(!e)throw new v("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),n=new oA({}),a=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!a)throw new v("Integration product id is undefined!");return await n.initFromIntegrationProduct(a),await n.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return jt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>t?this.createPreviewImage(A,1024):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==g.StepType.SilentIllustration&&e.type!==g.StepType.ProductOverlay}getExportedData(){var n;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===a);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[a];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(n=Object.keys(A))==null||n.forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===a);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[a].selections[0].name)}),e}getQuantity(){return this.getWorkflowManager().getTransaction().quantity||1}async setQuantity(e){if(e<1)throw new RangeError("WorkflowExperience quantity must be greater than zero.");if(this.isReadOnly)throw new Error("Cannot update quantity on a read-only WorkflowExperience");this.getWorkflowManager().getTransaction().quantity=e,this.callEvent("QuantityChanged");const t=P.getMap("transactionOwnerIds")||new Map,A=this.getWorkflowManager().getTransaction(),n=t.get(A.id)||void 0;await N.getShadowGraphqlClient().mutate({mutation:UA,variables:{id:A.id,quantity:e},context:{transactionOwnerId:n}})}addEventListener(e,t){const A=this.eventCallbacks.get(e)||[];A.push(t),this.eventCallbacks.set(e,A)}removeEventListener(e,t){const A=this.eventCallbacks.get(e)||[];this.eventCallbacks.set(e,A.filter(n=>n!==t))}callEvent(e){(this.eventCallbacks.get(e)||[]).forEach(t=>t(this))}}const fn=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Dn=async(c,e,t)=>{const A=e.data,n=t.data.baseUrl,a=A.assetUrl.replace("localhost","localstack"),i=n.slice(0,4)==="http"?"":"https://",o=new URL(i+n);o.searchParams.append("video",g.toBase64(JSON.stringify([{href:a}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),l=`data:image/svg+xml;base64,${g.toBase64(await nt.toString(s,{type:"svg"}))}`,d=w=>{const E=c.find(h=>h.panelId===w.panelId);if(!E)throw new b(w);const C=g.generate();return new g.CreateElementCommand({id:C,src:l,type:g.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},E)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},pn=async(c,e,t,A)=>{const n=t.data,a=n.assetUrl,i=await g.getPatternImageData(a);try{const o=g.getVariant(n,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var C;const l=await g.generateFrameSVG(r||{width:1,height:1},(C=o==null?void 0:o.asset)==null?void 0:C.fileLink),d=await g.getFrameData(l),B=g.generate(),w=c.find(h=>h.panelId===r.panelId);if(!w)throw new b(r);const E=g.calculateOffsets(i,d,{scale:n.scale,left:n.x,top:n.y});return[new g.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:g.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new g.UpdateFramePattern(B,i,E)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Fn=async(c,e,t,A)=>{var f,D;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((f=a.variants)==null?void 0:f.find(p=>p.id===n.illustrationVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(D=i.asset)==null?void 0:D.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.illustrationVariantId}`),[];const s=await g.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,l=s.match(r)||[],d=(l==null?void 0:l.length)>0?l[0]:"",E=g.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!E)return console.error("Failed to read SVG."),[];g.sanitizeSvgTree(E);const C={};g.traverse(E,p=>{fn.includes(p.tagName)&&!p.attributes.getNamedItem("fill")&&p.setAttribute("fill","#000000");const S=p.attributes.getNamedItem("fill");if(S&&S.value!=="none"){const x=S.value,H=`spiff-fill-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}const y=p.attributes.getNamedItem("stroke");if(y&&y.value!=="none"){const x=y.value,H=`spiff-stroke-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}});const m=g.xmlSerializer().serializeToString(E),u=n.colors;if(u){for(const[p,S]of Object.entries(C))for(const y of Object.keys(u))if(S.browserValue===y){C[p]={browserValue:u[y]};break}}const F=p=>{const S=c.find(x=>x.panelId===p.panelId);if(!S)throw new b(p);const y=g.generate();return new g.CreateElementCommand({colors:C,id:y,svg:m,type:g.LayoutElementType.Illustration,y:p.top,x:p.left,rotation:p.rotation,width:p.width,height:p.height,layer:p.layer,layerIndex:p.layerIndex,immutable:p.immutable},S)},I=A.data.regions;try{return I.map(F)}catch(p){return console.error(p),[]}},Mn=async(c,e,t)=>{const A=await xt(t.data.module),n=e.data,a=(o,s)=>{const r=c.find(d=>d.panelId===s.panelId);if(!r)throw new b(s);const l=g.generate();return new g.CreateElementCommand({colors:{},id:l,svg:o,type:g.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>a(A.svgPrint(n.text,o),o))}catch(o){return console.error(o),[]}},Sn=async(c,e,t,A)=>{var l,d;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((l=a.variants)==null?void 0:l.find(B=>B.id===n.pictureVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.pictureVariantId}`),[];const s=B=>{const w=c.find(C=>C.panelId===B.panelId);if(!w)throw new b(B);const E=g.generate();return new g.CreateElementCommand({id:E,src:o,type:g.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},yn=async(c,e,t,A)=>{var r;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=a.variants)==null?void 0:r.find(l=>l.id===n.colorVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=l=>{const d=c.find(h=>h.panelId===l.panelId);if(!d)throw new b(l);const B=`
1977
+ `;var Kt=(c=>(c.QuantityChanged="QuantityChanged",c))(Kt||{});class le{constructor(e,t){var n;if(this.cachedStepHandles=new Map,this.renderableScenes=[],this.renderableSceneCallbacks=[],this.eventCallbacks=new Map,this.debouncedSavedDesignUpdate=tt(async()=>{await Fe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async a=>new Promise((i,o)=>{try{a.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new g.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new dn(t.workflow,((n=t.product.profanities)==null?void 0:n.map(a=>a.word))||[],A,this.commandContext,a=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(a)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable,t.delayWorkflowStateSync),this.workflowManager.addSelectionCallback(a=>{const i=a.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s,workflowScene:o}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async createPreviewImage(e,t){var u,F;const A=this.workflowManager.getWorkflow(),n=(u=A==null?void 0:A.finalizeStepConfig)==null?void 0:u.lookAtAnimation;if(e){if(!n)throw new Error("Failed to generate cart preview image!");return await((F=this.workflowManager.getPreviewService())==null?void 0:F.renderSceneScreenshot(t??512,n))||""}let a=2048;t&&t<=2048&&(a=t);const i=g.createCanvas(a,a),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],l=o.find(I=>{var f;return((f=I.layoutState)==null?void 0:f.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=l.layoutState.layout.previewRegion?{x:l.layoutState.layout.previewRegion.left,y:l.layoutState.layout.previewRegion.top,width:l.layoutState.layout.previewRegion.width,height:l.layoutState.layout.previewRegion.height}:{x:0,y:0,width:l.layoutState.layout.width,height:l.layoutState.layout.height},B=this.commandContext.getLayoutById(l.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const E=g.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),C=g.renderPapyrusComponentAsString(E);await(await et.Pith.from(w,C,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===e);if(!t||!this.stepHasHandle(t))return;const A=this.cachedStepHandles.get(t.stepName);if(A)return A;const n=pe.get(this.getWorkflowManager(),t);return this.cachedStepHandles.set(t.stepName,n),n}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.reduce((n,a)=>n+(a.priceModifier||0),0)}),t}getBasePriceSubunits(e){const t=this.getWorkflowManager().getProduct().basePrice||0;if(e){const A=this.getAdditionalProductPriceSubunits()||0;return t+A}return t}getAdditionalProductPriceSubunits(){var t;const e=this.getWorkflowManager().getTransaction().integrationProduct;if((t=e==null?void 0:e.additionalIntegrationProduct)!=null&&t.product)return e.additionalIntegrationProduct.product.basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}async copySelectionsViaGlobalConfiguration(e,t,A){const n=await e.getGlobalProperties(),a=A==null?void 0:A.map(r=>r.getId()),i=this.getSteps().filter(r=>a===void 0||a.includes(r.getId())),o=t.getSteps(),s=r=>n.find(l=>l.getRawProperty().name===r.aspectName);i.forEach(r=>{const l=new Set,d=r.getRaw().globalPropertyAspectConfigurations;d!==void 0&&(d.forEach(B=>l.add(JSON.stringify(B))),o.forEach(B=>{const w=B.getRaw().globalPropertyAspectConfigurations;w!==void 0&&w.forEach(E=>{const C=s(E),h=l.has(JSON.stringify(E));if(h&&(C==null?void 0:C.getType())==="Option"){const m=B.getCurrentVariant();if(!m)return;r.selectVariant(m),l.delete(JSON.stringify(E))}else if(h&&(C==null?void 0:C.getType())==="Text"){const m=B.getText();r.setText(m),l.delete(JSON.stringify(E))}})}))})}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return pe.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>pe.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(n=>n.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>pe.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var i,o,s;const A=(P.getMap("transactionOwnerIds")||new Map).get(this.getWorkflowManager().getTransaction().id),a=(s=(o=(i=(await N.getShadowGraphqlClient().mutate({mutation:In,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"},context:{transactionOwnerId:A}})).data)==null?void 0:i.transactionAddStakeholder)==null?void 0:o.stakeholders)==null?void 0:s.find(r=>{var l;return((l=r.customer)==null?void 0:l.emailAddress)===e.emailAddress});if(a!=null&&a.customer){this.getWorkflowManager().setTransactionCustomer(a.customer);const r=P.getMap("transactionCustomerIds")||new Map;r.set(this.getWorkflowManager().getTransaction().id,a.customer.id),P.setMap("transactionCustomerIds",r)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new v("State undefined!");const n={title:await(async()=>{var s;if(e)return e;const a=this.getWorkflowManager().getTransaction().id,o=(s=(await Fe.getSavedDesigns()).find(r=>r.transactionId===a))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Fe.addDesign(n),n}async copy(){var o;const e=Ee(this.getCommandContext().getState());if(!e)throw new v("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),n=new oA({}),a=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!a)throw new v("Integration product id is undefined!");return await n.initFromIntegrationProduct(a),await n.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return jt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>t?this.createPreviewImage(A,1024):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==g.StepType.SilentIllustration&&e.type!==g.StepType.ProductOverlay}getExportedData(){var n;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===a);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[a];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(n=Object.keys(A))==null||n.forEach(a=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===a);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[a].selections[0].name)}),e}getQuantity(){return this.getWorkflowManager().getTransaction().quantity||1}async setQuantity(e){if(e<1)throw new RangeError("WorkflowExperience quantity must be greater than zero.");if(this.isReadOnly)throw new Error("Cannot update quantity on a read-only WorkflowExperience");this.getWorkflowManager().getTransaction().quantity=e,this.callEvent("QuantityChanged");const t=P.getMap("transactionOwnerIds")||new Map,A=this.getWorkflowManager().getTransaction(),n=t.get(A.id)||void 0;await N.getShadowGraphqlClient().mutate({mutation:UA,variables:{id:A.id,quantity:e},context:{transactionOwnerId:n}})}addEventListener(e,t){const A=this.eventCallbacks.get(e)||[];A.push(t),this.eventCallbacks.set(e,A)}removeEventListener(e,t){const A=this.eventCallbacks.get(e)||[];this.eventCallbacks.set(e,A.filter(n=>n!==t))}callEvent(e){(this.eventCallbacks.get(e)||[]).forEach(t=>t(this))}}const fn=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Dn=async(c,e,t)=>{const A=e.data,n=t.data.baseUrl,a=A.assetUrl.replace("localhost","localstack"),i=n.slice(0,4)==="http"?"":"https://",o=new URL(i+n);o.searchParams.append("video",g.toBase64(JSON.stringify([{href:a}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),l=`data:image/svg+xml;base64,${g.toBase64(await nt.toString(s,{type:"svg"}))}`,d=w=>{const E=c.find(h=>h.panelId===w.panelId);if(!E)throw new J(w);const C=g.generate();return new g.CreateElementCommand({id:C,src:l,type:g.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},E)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},pn=async(c,e,t,A)=>{const n=t.data,a=n.assetUrl,i=await g.getPatternImageData(a);try{const o=g.getVariant(n,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var C;const l=await g.generateFrameSVG(r||{width:1,height:1},(C=o==null?void 0:o.asset)==null?void 0:C.fileLink),d=await g.getFrameData(l),B=g.generate(),w=c.find(h=>h.panelId===r.panelId);if(!w)throw new J(r);const E=g.calculateOffsets(i,d,{scale:n.scale,left:n.x,top:n.y});return[new g.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:g.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new g.UpdateFramePattern(B,i,E)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Fn=async(c,e,t,A)=>{var f,D;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((f=a.variants)==null?void 0:f.find(p=>p.id===n.illustrationVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(D=i.asset)==null?void 0:D.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.illustrationVariantId}`),[];const s=await g.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,l=s.match(r)||[],d=(l==null?void 0:l.length)>0?l[0]:"",E=g.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!E)return console.error("Failed to read SVG."),[];g.sanitizeSvgTree(E);const C={};g.traverse(E,p=>{fn.includes(p.tagName)&&!p.attributes.getNamedItem("fill")&&p.setAttribute("fill","#000000");const S=p.attributes.getNamedItem("fill");if(S&&S.value!=="none"){const x=S.value,H=`spiff-fill-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}const y=p.attributes.getNamedItem("stroke");if(y&&y.value!=="none"){const x=y.value,H=`spiff-stroke-${x.replace(/\W/g,"")}`;p.classList.add(H),C[H]={browserValue:x}}});const m=g.xmlSerializer().serializeToString(E),u=n.colors;if(u){for(const[p,S]of Object.entries(C))for(const y of Object.keys(u))if(S.browserValue===y){C[p]={browserValue:u[y]};break}}const F=p=>{const S=c.find(x=>x.panelId===p.panelId);if(!S)throw new J(p);const y=g.generate();return new g.CreateElementCommand({colors:C,id:y,svg:m,type:g.LayoutElementType.Illustration,y:p.top,x:p.left,rotation:p.rotation,width:p.width,height:p.height,layer:p.layer,layerIndex:p.layerIndex,immutable:p.immutable},S)},I=A.data.regions;try{return I.map(F)}catch(p){return console.error(p),[]}},Mn=async(c,e,t)=>{const A=await xt(t.data.module),n=e.data,a=(o,s)=>{const r=c.find(d=>d.panelId===s.panelId);if(!r)throw new J(s);const l=g.generate();return new g.CreateElementCommand({colors:{},id:l,svg:o,type:g.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>a(A.svgPrint(n.text,o),o))}catch(o){return console.error(o),[]}},Sn=async(c,e,t,A)=>{var l,d;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((l=a.variants)==null?void 0:l.find(B=>B.id===n.pictureVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${n.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${n.pictureVariantId}`),[];const s=B=>{const w=c.find(C=>C.panelId===B.panelId);if(!w)throw new J(B);const E=g.generate();return new g.CreateElementCommand({id:E,src:o,type:g.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},yn=async(c,e,t,A)=>{var r;const n=t.data,a=A.option;if(!a)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=a.variants)==null?void 0:r.find(l=>l.id===n.colorVariantId))||g.getDefaultVariant(a);if(!i)return console.error(`No variant with ID: ${n.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=l=>{const d=c.find(h=>h.panelId===l.panelId);if(!d)throw new J(l);const B=`
1978
1978
  <svg
1979
1979
  xmlns="http://www.w3.org/2000/svg"
1980
1980
  xmlnsXlink="http://www.w3.org/1999/xlink"
@@ -1994,7 +1994,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
1994
1994
  fill="${i==null?void 0:i.color}"
1995
1995
  />
1996
1996
  </svg>
1997
- `,E={"spiff-fill-shape":{browserValue:i.color||"#000000"}},C=g.generate();return new g.CreateElementCommand({colors:E,id:C,svg:B,type:g.LayoutElementType.Illustration,y:l.top,x:l.left,rotation:l.rotation,width:l.width,height:l.height,layer:l.layer,layerIndex:l.layerIndex,immutable:l.immutable},d)},s=A.data.regions;try{return s.map(o)}catch(l){return console.error(l),[]}},Yn=async(c,e,t)=>{const A=[],a=(()=>{var r,l;return e.type===g.StepType.ProductOverlay?t||((r=e.data.asset)==null?void 0:r.fileLink)||"":((l=e.data.asset)==null?void 0:l.fileLink)||""})(),o=(()=>a.endsWith(".jpeg")||a.endsWith(".jpg")||a.endsWith(".png")?g.LayoutElementType.Image:(a.endsWith(".svg"),g.LayoutElementType.Illustration))(),s=e.data.regions;if(o==="image")try{s.forEach(r=>{const l=c.find(B=>B.panelId===r.panelId);if(!l)throw new b(r);const d={id:g.generate(),src:a,type:o,y:r.top,x:r.left,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,scaleX:1,scaleY:1,rotation:r.rotation,excludeFromExport:e.data.excludeFromPrint,preserveAspectRatio:"none"};A.push(new g.CreateElementCommand(d,l))})}catch(r){console.error(r)}else{const r=await g.fetchAsString(a,!0),l=d=>{const B=/<svg.*?<\/svg>/s,w=d.match(B)||[],E=(w==null?void 0:w.length)>0?w[0]:"",m=g.domParser().parseFromString(E,"image/svg+xml").firstElementChild;if(!m)throw new q("Failed to read SVG.");return g.sanitizeSvgTree(m),g.xmlSerializer().serializeToString(m)};s.forEach(d=>{const B=c.find(E=>E.panelId===d.panelId);if(!B)throw new b(d);const w={id:g.generate(),src:a,asset_key:a,svg:l(r),colors:{},type:o,y:d.top,x:d.left,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,scaleX:1,scaleY:1,rotation:d.rotation,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:e.data.excludeFromPrint};A.push(new g.CreateElementCommand(w,B))})}return A},Pn=async(c,e,t,A)=>{const n=[],a=t.data,i=30,o=h=>h.vertical?"center":h.textAlign||"center",s=()=>{var F;const h=A.option;if(!h)return;const m=((F=h.variants)==null?void 0:F.find(I=>I.id===a.fontVariantId))||g.getDefaultVariant(h);if(!m||!m.asset)return;e[A.stepName]={selectedVariants:[m]};const u=m.asset.fileLink;if(u)return u},l=await(async()=>{const h=s();if(!h)return;const m=await g.loadFont(h);return{assetUrl:h,name:m.names.fullName.en}})(),d=(A.data.replaceableText?A.data.replaceableText.replace("{{}}",a.text):a.text)||"",B=g.applyTextTransformations(d,{vertical:A.data.vertical,uppercase:A.data.uppercase}),w=async h=>{const m=h.colorOption;if(!m)return;const u=L.getDefaultVariant(m);return u==null?void 0:u.color},E=a.color||await w(A.data),C=A.data.regions;for(const h of C){const m=c.find(F=>F.panelId===h.panelId);if(!m)continue;const u={stepName:t.name,id:g.generate(),align:o(A.data),curved:A.data.curved,fill:a.color||E||"#000000",fontData:l,fontSize:A.data.size||i,height:h.height,layer:h.layer,layerIndex:h.layerIndex,paths:A.data.paths,rotation:h.rotation,text:B,type:g.LayoutElementType.Textbox,vertical:A.data.vertical,verticalAlign:A.data.verticalAlign||"middle",width:h.width,x:h.left,y:h.top};if(l){const[F,I]=g.determineCorrectFontSizeAndLines(A.data.size||i,l,h,[g.applyTextTransformations(B,{vertical:A.data.vertical,uppercase:A.data.uppercase})],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});n.push(new g.CreateElementCommand({...u,fontSize:F,text:u.curved?u.text:(I||[]).join(`
1997
+ `,E={"spiff-fill-shape":{browserValue:i.color||"#000000"}},C=g.generate();return new g.CreateElementCommand({colors:E,id:C,svg:B,type:g.LayoutElementType.Illustration,y:l.top,x:l.left,rotation:l.rotation,width:l.width,height:l.height,layer:l.layer,layerIndex:l.layerIndex,immutable:l.immutable},d)},s=A.data.regions;try{return s.map(o)}catch(l){return console.error(l),[]}},Yn=async(c,e,t)=>{const A=[],a=(()=>{var r,l;return e.type===g.StepType.ProductOverlay?t||((r=e.data.asset)==null?void 0:r.fileLink)||"":((l=e.data.asset)==null?void 0:l.fileLink)||""})(),o=(()=>a.endsWith(".jpeg")||a.endsWith(".jpg")||a.endsWith(".png")?g.LayoutElementType.Image:(a.endsWith(".svg"),g.LayoutElementType.Illustration))(),s=e.data.regions;if(o==="image")try{s.forEach(r=>{const l=c.find(B=>B.panelId===r.panelId);if(!l)throw new J(r);const d={id:g.generate(),src:a,type:o,y:r.top,x:r.left,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,scaleX:1,scaleY:1,rotation:r.rotation,excludeFromExport:e.data.excludeFromPrint,preserveAspectRatio:"none"};A.push(new g.CreateElementCommand(d,l))})}catch(r){console.error(r)}else{const r=await g.fetchAsString(a,!0),l=d=>{const B=/<svg.*?<\/svg>/s,w=d.match(B)||[],E=(w==null?void 0:w.length)>0?w[0]:"",m=g.domParser().parseFromString(E,"image/svg+xml").firstElementChild;if(!m)throw new q("Failed to read SVG.");return g.sanitizeSvgTree(m),g.xmlSerializer().serializeToString(m)};s.forEach(d=>{const B=c.find(E=>E.panelId===d.panelId);if(!B)throw new J(d);const w={id:g.generate(),src:a,asset_key:a,svg:l(r),colors:{},type:o,y:d.top,x:d.left,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,scaleX:1,scaleY:1,rotation:d.rotation,productOverlay:e.type===g.StepType.ProductOverlay?!0:void 0,excludeFromExport:e.data.excludeFromPrint};A.push(new g.CreateElementCommand(w,B))})}return A},Pn=async(c,e,t,A)=>{const n=[],a=t.data,i=30,o=h=>h.vertical?"center":h.textAlign||"center",s=()=>{var F;const h=A.option;if(!h)return;const m=((F=h.variants)==null?void 0:F.find(I=>I.id===a.fontVariantId))||g.getDefaultVariant(h);if(!m||!m.asset)return;e[A.stepName]={selectedVariants:[m]};const u=m.asset.fileLink;if(u)return u},l=await(async()=>{const h=s();if(!h)return;const m=await g.loadFont(h);return{assetUrl:h,name:m.names.fullName.en}})(),d=(A.data.replaceableText?A.data.replaceableText.replace("{{}}",a.text):a.text)||"",B=g.applyTextTransformations(d,{vertical:A.data.vertical,uppercase:A.data.uppercase}),w=async h=>{const m=h.colorOption;if(!m)return;const u=L.getDefaultVariant(m);return u==null?void 0:u.color},E=a.color||await w(A.data),C=A.data.regions;for(const h of C){const m=c.find(F=>F.panelId===h.panelId);if(!m)continue;const u={stepName:t.name,id:g.generate(),align:o(A.data),curved:A.data.curved,fill:a.color||E||"#000000",fontData:l,fontSize:A.data.size||i,height:h.height,layer:h.layer,layerIndex:h.layerIndex,paths:A.data.paths,rotation:h.rotation,text:B,type:g.LayoutElementType.Textbox,vertical:A.data.vertical,verticalAlign:A.data.verticalAlign||"middle",width:h.width,x:h.left,y:h.top};if(l){const[F,I]=g.determineCorrectFontSizeAndLines(A.data.size||i,l,h,[g.applyTextTransformations(B,{vertical:A.data.vertical,uppercase:A.data.uppercase})],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});n.push(new g.CreateElementCommand({...u,fontSize:F,text:u.curved?u.text:(I||[]).join(`
1998
1998
  `)},m))}else n.push(new g.CreateElementCommand(u,m))}return n},xn=(c,e)=>c.conditions?c.conditions.every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}):!0,Vt=async(c,e,t,A)=>{const n=[],a={};for(const i of c){const o=e.steps.find(s=>s.stepName===i.name);if(o)switch(o.type){case g.StepType.DigitalContent:n.push(...await Dn(t,i,o));break;case g.StepType.Frame:case g.StepType.Photo:n.push(...await pn(t,a,i,o));break;case g.StepType.Illustration:n.push(...await Fn(t,a,i,o));break;case g.StepType.Module:n.push(...await Mn(t,i,o));break;case g.StepType.Picture:n.push(...await Sn(t,a,i,o));break;case g.StepType.Shape:n.push(...await yn(t,a,i,o));break;case g.StepType.Text:n.push(...await Pn(t,a,i,o));break}}for(const i of e.steps)i.type!==g.StepType.SilentIllustration&&i.type!==g.StepType.ProductOverlay||xn(i,a)&&n.push(...await Yn(t,i,A));return n};class Me{constructor(e){this.handleCompleteRender=null;const t=new Map;e.forEach(A=>t.set(A.id,new Hn(A.id,A.name,this))),this.layouts=t}setCompleteRenderCallback(e){this.handleCompleteRender=e,e(Array.from(this.layouts.values()))}onCompleteRender(){this.handleCompleteRender&&this.handleCompleteRender(Array.from(this.layouts.values()))}getAll(){return this.layouts}}const Nn=(()=>new Promise((c,e)=>{const A=g.createCanvas().getContext("webgl2");c(!!A)}))();class Hn{constructor(e,t,A){this.hasSetStaticContext=!1,this.interactiveDirty=!1,this.staticCtxDirty=!1,this.lastRequestedRenderArguments=void 0,this.lastCompletedStaticRender=void 0,this.lastModificationID=void 0,this.renderQueue=new Ue(2),this.id=e,this.name=t,this.service=A}getID(){return this.id}getName(){return this.name}getStaticContext(){return this.textureCtx}setStaticContext(e){if(this.textureCtx=e,this.lastRequestedRenderArguments){const{workflow:t,layouts:A,productOverlayImageUrl:n}=this.lastRequestedRenderArguments;this.render(t,A,n)}}getStaticContextDirty(){return this.staticCtxDirty}setStaticContextDirty(e){this.staticCtxDirty=e}getInteractiveCanvasDirty(){return this.interactiveDirty}setInteractiveCanvasDirty(e){this.interactiveDirty=e}markLastCompletedStaticRender(){this.lastCompletedStaticRender=Date.now(),this.service.onCompleteRender()}getLastCompletedStaticRender(){return this.lastCompletedStaticRender}getLastModificationID(){return this.lastModificationID}async render(e,t,A){const n=Ee(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,productOverlayImageUrl:A};const a=this.getStaticContext();if(!a){this.markLastCompletedStaticRender(),this.setStaticContextDirty(!1);return}this.renderQueue.enqueue(new Rn(this.getID(),a,await Nn,()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)},e,n,A))}}class Rn extends Re{constructor(e,t,A,n,a,i,o){super(),this.layoutId=e,this.ctx=t,this.nonPOTSupport=A,this.onRender=n,this.workflow=a,this.layouts=i,this.productOverlayImageUrl=o}getDynamicTextureResolution(){return this.getIsMobile()||!this.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}getIsMobile(){return window.innerWidth<=480}offscreenRenderingSupported(){return navigator.userAgent.includes("SamsungBrowser")?!1:!!window.Worker&&!!window.OffscreenCanvas}resizeFit(e,t=4096){const A=t/e.width,n=t/e.height,a=Math.min(A,n);return a>1?e:{width:e.width*a,height:e.height*a}}async execute(){const e=this.layouts.find(B=>B.layoutState.layout.id===this.layoutId);if(!e)return;const t=e.layoutState.elements||[],A=e.layoutState.layout.width,n=e.layoutState.layout.height,a=this.getDynamicTextureResolution().width,i=this.getDynamicTextureResolution().height;let o,s;if(this.nonPOTSupport){const B=a/i;A/n<B?(o=a,s=n*(a/A)):(o=A*(i/n),s=i);const E=this.resizeFit({width:o,height:s});o=E.width,s=E.height}else o=this.getDynamicTextureResolution().width,s=this.getDynamicTextureResolution().height;const r=g.getSvgElement(e.layoutState.layout,t,{renderingConfiguration:{purpose:g.LayoutRenderingPurpose.ThreeD}}),l=g.renderPapyrusComponentAsString(r),d=await et.Pith.from(this.ctx,l,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1,createCanvas:g.createCanvas,createImage:g.loadImage,DOMParser:g.getDomParser(),fetch:g.fetch});d.resize(o,s),await d.render(),this.onRender()}}const Un=(c,e)=>{const t=[];return c.forEach(A=>{const n=e.steps.find(a=>a.stepName===A.stepName);(n==null?void 0:n.type)===g.StepType.Text&&A.stepAspectType==="Text"&&t.push({name:n.stepName,data:{text:A.value}})}),t},Gn=async(c,e,t,A)=>{let n={serializableWorkflow:{steps:[]},layouts:{}};n=new g.GroupCommand(t.map(s=>new g.CreateLayoutCommand(s))).apply(n);const i=await Vt(c,e,t,A);return new g.GroupCommand(i).apply(n)},vn=M.gql`
1999
1999
  ${$}
2000
2000
  fragment ProductFields on Product {
@@ -2279,7 +2279,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
2279
2279
  id
2280
2280
  }
2281
2281
  }
2282
- `;class Zn{constructor(e){this.handleCache={},this.bundle=e}async getHandle(e){if(this.handleCache[e.name])return this.handleCache[e.name];const t=await this.createHandle(e);return this.handleCache[e.name]=t,t}async getHandles(){var t;if(!((t=this.bundle.getProductCollection())!=null&&t.getResource().globalPropertyConfiguration))return[];const e=this.bundle.getProductCollection().getResource().globalPropertyConfiguration;return Promise.all(e.aspects.map(A=>this.getHandle(A)))}applyConditionsFromState(e,t){return t?e.filter(A=>this.aspectConditionsSatisfied(A.getRawProperty(),t)):e}aspectConditionsSatisfied(e,t){return!e.conditions||e.conditions.length===0?!0:e.conditions.some(A=>{const n=t.aspects.find(a=>a.name===A.targetAspectName);return n?A.requiredVariantSelections.some(a=>a===n.value):!1})}async createHandle(e){switch(e.type){case g.AspectType.FileUpload:return new qt(this.bundle,e);case g.AspectType.Option:{const t=e.entityId?await L.getOption(e.entityId):void 0;return(t==null?void 0:t.type)==="Color"?new $t(this.bundle,e,t):new Ke(this.bundle,e,t)}case g.AspectType.Text:return new Zt(this.bundle,e)}}}class Se{constructor(e,t){this.bundle=e,this.property=t}getName(){return this.property.name}getTitle(){return this.property.title}getDescription(){return this.property.description}getType(){return this.property.type}getRawProperty(){return this.property}getSharedSteps(e){return(e??this.bundle.getWorkflowExperiences()).flatMap(n=>n.getSteps().filter(a=>{var i;return(i=a.getRaw().globalPropertyAspectConfigurations)==null?void 0:i.some(o=>{var s,r;return o.globalPropertyConfigurationId===((r=(s=this.bundle.getProductCollection())==null?void 0:s.getResource().globalPropertyConfiguration)==null?void 0:r.id)&&o.aspectName===this.property.name})}))}}class qt extends Se{constructor(e,t){super(e,t)}async selectImage(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.key),this.applyImageSelection(e)])}async applyGlobalState(e){const t=this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);if(!t)return Promise.resolve();const A=await J.getLocalOrFromServer(t);return A?this.applyImageSelection(A,e):Promise.resolve()}async applyImageSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectImage(e));await Promise.all(n)}}class Zt extends Se{constructor(e,t){super(e,t)}getText(){const e=this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);return e||""}async setText(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e),this.applyTextSelection(e)])}async applyGlobalState(e){const t=this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);if(!t)return Promise.resolve();await this.applyTextSelection(t,e)}async applyTextSelection(e,t){const n=this.getSharedSteps(t).map(a=>{a.setText(e)});await Promise.all(n)}}class Ke extends Se{constructor(e,t,A){super(e,t),this.optionResource=A}getCurrentVariant(){var t,A;if(!this.optionResource)return;const e=this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);if(e){const n=(A=this.optionResource.variants)==null?void 0:A.find(a=>a.id===e);return n?new K(n):void 0}else{const n=(t=this.optionResource.variants)==null?void 0:t.find(a=>{var i,o;return a.id===((o=(i=this.optionResource)==null?void 0:i.defaultVariant)==null?void 0:o.id)});return n?new K(n):void 0}}getAvailableVariants(){var t,A;return(((A=(t=this.optionResource)==null?void 0:t.variants)==null?void 0:A.filter(n=>n.enabled))||[]).map(n=>new K(n))}getAllVariants(){var t;return(((t=this.optionResource)==null?void 0:t.variants)||[]).map(A=>new K(A))}async selectVariant(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.getId()),this.applyVariantSelection(e)])}async applyGlobalState(e){var n,a;const t=this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name);if(!t)return Promise.resolve();const A=(a=(n=this.optionResource)==null?void 0:n.variants)==null?void 0:a.find(i=>i.id===t);return A?this.applyVariantSelection(new K(A),e):Promise.resolve()}async applyVariantSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectVariant(e));await Promise.all(n)}}class $t extends Ke{constructor(e,t,A){super(e,t,A)}setCustomColor(e){this.getSharedSteps().forEach(A=>A.setCustomColor(e))}getCustomColor(){return this.getSharedSteps()[0].getCustomColor()}}const $n=M.gql`
2282
+ `;class Zn{constructor(e){this.handleCache={},this.bundle=e}async getHandle(e){if(this.handleCache[e.name])return this.handleCache[e.name];const t=await this.createHandle(e);return this.handleCache[e.name]=t,t}async getHandles(){var t;if(!((t=this.bundle.getProductCollection())!=null&&t.getResource().globalPropertyConfiguration))return[];const e=this.bundle.getProductCollection().getResource().globalPropertyConfiguration;return Promise.all(e.aspects.map(A=>this.getHandle(A)))}applyConditionsFromState(e,t){return t?e.filter(A=>this.aspectConditionsSatisfied(A.getRawProperty(),t)):e}aspectConditionsSatisfied(e,t){return!e.conditions||e.conditions.length===0?!0:e.conditions.some(A=>{const n=t.aspects.find(a=>a.name===A.targetAspectName);return n?A.requiredVariantSelections.some(a=>a===n.value):!1})}async createHandle(e){switch(e.type){case g.AspectType.FileUpload:return new qt(this.bundle,e);case g.AspectType.Option:{const t=e.entityId?await L.getOption(e.entityId):void 0;return(t==null?void 0:t.type)==="Color"?new $t(this.bundle,e,t):new Ke(this.bundle,e,t)}case g.AspectType.Text:return new Zt(this.bundle,e)}}}class Se{constructor(e,t){this.bundle=e,this.property=t}getName(){return this.property.name}getTitle(){return this.property.title}getDescription(){return this.property.description}getType(){return this.property.type}getRawProperty(){return this.property}getSharedSteps(e){const t=e??this.bundle.getWorkflowExperiences(),A=t.flatMap(n=>n.getSteps().filter(a=>{var i;return(i=a.getRaw().globalPropertyAspectConfigurations)==null?void 0:i.some(o=>{var s,r;return o.globalPropertyConfigurationId===((r=(s=this.bundle.getProductCollection())==null?void 0:s.getResource().globalPropertyConfiguration)==null?void 0:r.id)&&o.aspectName===this.property.name})}));return console.log(`getting shared steps for ${t.length} - found ${A.length}`,A),A}getStateValue(){return this.bundle.getGlobalPropertyStateManager().getAspect(this.property.name)}}class qt extends Se{constructor(e,t){super(e,t)}async selectImage(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.key),this.applyImageSelection(e)])}hasImage(){return!!this.getStateValue()}async getImage(){const e=this.getStateValue();if(e)return k.getLocalOrFromServer(e)}async applyGlobalState(e){const t=this.getStateValue();if(!t)return Promise.resolve();const A=await k.getLocalOrFromServer(t);return A?this.applyImageSelection(A,e):Promise.resolve()}async applyImageSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectImage(e));await Promise.all(n)}}class Zt extends Se{constructor(e,t){super(e,t)}getText(){const e=this.getStateValue();return e||""}async setText(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e),this.applyTextSelection(e)])}async applyGlobalState(e){const t=this.getStateValue();if(!t)return Promise.resolve();await this.applyTextSelection(t,e)}async applyTextSelection(e,t){const n=this.getSharedSteps(t).map(a=>{a.setText(e)});await Promise.all(n)}}class Ke extends Se{constructor(e,t,A){super(e,t),this.optionResource=A}getCurrentVariant(){var t,A;if(!this.optionResource)return;const e=this.getStateValue();if(e){const n=(A=this.optionResource.variants)==null?void 0:A.find(a=>a.id===e);return n?new K(n):void 0}else{const n=(t=this.optionResource.variants)==null?void 0:t.find(a=>{var i,o;return a.id===((o=(i=this.optionResource)==null?void 0:i.defaultVariant)==null?void 0:o.id)});return n?new K(n):void 0}}getAvailableVariants(){var t,A;return(((A=(t=this.optionResource)==null?void 0:t.variants)==null?void 0:A.filter(n=>n.enabled))||[]).map(n=>new K(n))}getAllVariants(){var t;return(((t=this.optionResource)==null?void 0:t.variants)||[]).map(A=>new K(A))}async selectVariant(e){await Promise.all([this.bundle.getGlobalPropertyStateManager().setAspect(this.property.name,e.getId()),this.applyVariantSelection(e)])}async applyGlobalState(e){var n,a;const t=this.getStateValue();if(!t)return Promise.resolve();const A=(a=(n=this.optionResource)==null?void 0:n.variants)==null?void 0:a.find(i=>i.id===t);return A?this.applyVariantSelection(new K(A),e):Promise.resolve()}async applyVariantSelection(e,t){const n=this.getSharedSteps(t).map(a=>a.selectVariant(e));await Promise.all(n)}}class $t extends Ke{constructor(e,t,A){super(e,t,A)}setCustomColor(e){this.getSharedSteps().forEach(A=>A.setCustomColor(e))}getCustomColor(){return this.getSharedSteps()[0].getCustomColor()}}const $n=M.gql`
2283
2283
  mutation CreateGlobalPropertyState($bundleId: String!) {
2284
2284
  globalPropertyStateCreate(bundleId: $bundleId) {
2285
2285
  id
@@ -2969,4 +2969,4 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
2969
2969
  }
2970
2970
  }
2971
2971
  }
2972
- `,Ae=async c=>{var e;for(const t in c.layouts){const A=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Illustration);for(let a=0;a<A.length;++a){const i=A[a];i.src&&i.svg&&(i.cachedObjectURL=await g.svgObjectURL(i.svg))}const n=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Textbox);for(let a=0;a<n.length;++a){const i=n[a];(e=i.fontData)!=null&&e.assetUrl&&await g.loadFont(i.fontData.assetUrl)}}},ua=async(c,e)=>{var n;const t=await N.getShadowGraphqlClient().query({query:ga(((n=e==null?void 0:e.assets)==null?void 0:n.metadata)||!1),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}}),A=t.data.workflows;if(A===void 0||A.length!==c.length)throw new Error(`Unable to read workflows: ${t.errors??"Length mismatch in response"}`);return A.forEach(a=>{a.steps.forEach(i=>{var o,s,r;delete i.data.__typename,(o=i.option)!=null&&o.id&&((s=i.option.defaultVariant)!=null&&s.asset&&J.cacheAsset(i.option.defaultVariant.asset),i.option.colorProfile&&J.cacheAsset(i.option.colorProfile),(r=i.option.variants)==null||r.forEach(l=>{l.asset&&J.cacheAsset(l.asset),l.displayImage&&J.cacheAsset(l.displayImage),l.thumbnail&&J.cacheAsset(l.thumbnail),l.material&&J.cacheMaterial(l.material)}),Z.set({id:i.option.id},Promise.resolve(i.option)))})}),A},ma=async(c,e)=>{const A=(await e).find(n=>n.id===c);if(!A)throw new Error(`Workflow not found: ${c}`);return A},qe=async(c,e)=>{const t=c.map(o=>Z.get({id:o,options:e})),A=c.filter((o,s)=>t[s]===void 0);if(A.length===0)return Promise.all(t);const n=ua(A,e),a=A.map(o=>Z.set({id:o,options:e},ma(o,n))),i=t.filter(o=>o!==void 0);return await Promise.all(i.concat(a))},we=async(c,e)=>(await qe([c],e))[0],Ia=c=>c.sort((e,t)=>e.index-t.index).map(e=>({id:g.generate(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion,useEditableArea:e.useEditableArea,editableArea:e.editableArea})),Ze=(c,e)=>{const t=c.workflowState,A=t?JSON.parse(t):void 0;return A?Object.values(A.layouts).map(n=>n.layout):Ia(e.panels)};class oA{constructor(e){this.updateTransactionState=async t=>{try{return N.getShadowGraphqlClient().mutate({...t,mutation:HA})}catch(A){throw console.error(A),new G("Critical - Unable to synchronize workflow state with server.")}},this.initialized=!1,this.options=e,this.options.applicationKey&&dA(this.options.applicationKey)}getAssetManager(){return J}getCurrencyCode(){if(this.currencyCode===void 0)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!wA())throw new Error("Application key required to use Flow Service.");return new nA}async getIntegration(){return(await N.getShadowGraphqlClient().query({query:Ba,errorPolicy:"all"})).data.currentIntegration}async authenticateBundleFromLocalStorage(e){var n,a;const t=P.getMap("bundleOwnerIds");if(t!=null&&t.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const A=P.getMap("bundlePartnerIds")||new Map;if(A.has(e)){const i=A.get(e),s=(P.getMap("partnerCustomerIds")||new Map).get(i);if(s&&await this.authenticateCustomerId(s)){const l=(a=(n=this.customer)==null?void 0:n.bundleStakeholders)==null?void 0:a.find(d=>{var B;return((B=d.bundle)==null?void 0:B.id)===e});if(l)return Promise.resolve({success:!0,stakeholderType:l.type})}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(e){var l,d,B,w,E,C;const t=N.getShadowGraphqlClient(),A=await t.query({query:la,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:e}});if(!A.data.transactions||A.data.transactions.length===0)throw new Error(`Transaction not found: ${e}`);const n=A.data.transactions[0];if(!((d=(l=n.product)==null?void 0:l.partner)==null?void 0:d.id))throw new Error(`Unable to read transaction: ${e}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=P.getMap("transactionOwnerIds");if(i!=null&&i.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const o=P.getMap("transactionCustomerIds");if(o!=null&&o.has(e)){const h=o.get(e);if(h&&await this.authenticateCustomerId(h)){const u=((w=(B=this.customer)==null?void 0:B.bundleStakeholders)==null?void 0:w.find(F=>{var I,f;return(f=(I=F.bundle)==null?void 0:I.transactions)==null?void 0:f.some(D=>D.id===e)}))||((C=(E=this.customer)==null?void 0:E.stakeholders)==null?void 0:C.find(F=>{var I;return((I=F.transaction)==null?void 0:I.id)===e}));if(u)return Promise.resolve({success:!0,stakeholderType:u.type})}}const r=(await t.query({query:da,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(e){const t=P.getMap("transactionCustomerIds");t!=null&&t.has(e)&&(t.delete(e),P.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(e){var A,n;const t=(n=(A=this.customer)==null?void 0:A.stakeholders)==null?void 0:n.find(a=>{var i;return((i=a.transaction)==null?void 0:i.id)===e});if(t)return t.type}async getOrCreateCustomer(e){var i;this.customer=void 0;const t=N.getShadowGraphqlClient(),n=(await t.query({query:wa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e}})).data.customer;if(!n.id){const s=(i=(await t.mutate({mutation:Ea,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:e}}})).data)==null?void 0:i.customerCreate;if(!s)throw new Error("Unable to create customer.");return this.storeCustomer(s),this.customer=s,{customer:s,isAuthenticated:!1}}this.storeCustomer(n);const a=await this.authenticateCustomerId(n.id);return{customer:this.customer||n,isAuthenticated:a}}async authenticateCustomerId(e){var o;const t=N.getShadowGraphqlClient(),A=P.getMap("customerTokens");if(!(A!=null&&A.has(e)))return!1;const n=A.get(e);if(!n)return!1;const i=(o=(await t.mutate({mutation:ha,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data)==null?void 0:o.customerAuthenticate;return i?(this.storeCustomer(i),rt(n),this.customer=i,!0):!1}async generateVerificationCode(e){await N.getShadowGraphqlClient().mutate({mutation:Ca,variables:{emailAddress:e}})}async verifyCode(e,t){var a,i;const n=(a=(await N.getShadowGraphqlClient().mutate({mutation:Qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e,verificationCode:t}})).data)==null?void 0:a.customerVerifyCode;if(n!=null&&n.loginToken){if(!((i=n.partner)!=null&&i.id))throw new Error(`Unable to find customer: ${e}`);const o=P.getMap("customerTokens")||new Map;return o.set(n.id,n.loginToken),P.setMap("customerTokens",o),this.storeCustomer(n),rt(n.loginToken),this.customer={...n,loginToken:void 0},!0}return!1}async getNewBundle(e,t,A){var s,r,l;const a=(l=(await N.getShadowGraphqlClient().mutate({mutation:Ln(((r=(s=A==null?void 0:A.graphql)==null?void 0:s.productCollection)==null?void 0:r.eagerFetchProducts)||!1),variables:{collectionId:e,initialMetadata:t?Object.entries(t).map((d,B)=>({key:d[0],value:d[1]})):void 0},fetchPolicy:"no-cache"})).data)==null?void 0:l.bundleCreate;if(!(a!=null&&a.id))throw new Error("Unable to create bundle");const i=P.getMap("bundlePartnerIds")||new Map;i.set(a.id,a.partner.id),P.setMap("bundlePartnerIds",i);const o=P.getMap("bundleOwnerIds")||new Map;return o.set(a.id,a.bundleOwnerId),P.setMap("bundleOwnerIds",o),new AA(this,a,void 0,void 0,a.bundleOwnerId)}async getExistingBundle(e,t,A,n){var d,B,w,E,C,h;const a=P.getMap("bundleOwnerIds"),i=a==null?void 0:a.get(e),o=await N.getShadowGraphqlClient().query({query:kn(((B=(d=n==null?void 0:n.graphql)==null?void 0:d.productCollection)==null?void 0:B.eagerFetchProducts)||!1),variables:{id:e},fetchPolicy:"no-cache",context:{bundleOwnerId:i}});if(!((w=o.data)!=null&&w.bundles)||((E=o.data)==null?void 0:E.bundles.length)===0||!((C=o.data)!=null&&C.bundles[0]))throw new Error(`Unable to find bundle: ${e}`);const s=(h=o.data)==null?void 0:h.bundles[0],r=P.getMap("bundlePartnerIds")||new Map;r.set(s.id,s.partner.id),P.setMap("bundlePartnerIds",r);const l=new AA(this,s,t,A,i);return await l.getInitializationPromise(),l}async getBundleStakeholders(){var a;if(!this.customer)throw new Error("Customer not authenticated.");const e=await N.getShadowGraphqlClient().query({query:Jn,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!((a=e.data)!=null&&a.customers)||e.data.customers.length===0)throw new Error("Unable to find customer.");const A=e.data.customers[0].bundleStakeholders||[],n=P.getMap("bundlePartnerIds")||new Map;return A.forEach(i=>{var o,s;(o=i.bundle)!=null&&o.id&&((s=i.bundle.partner)!=null&&s.id)&&n.set(i.bundle.id,i.bundle.partner.id)}),P.setMap("bundlePartnerIds",n),A}async getWorkflowExperience(e,t,A,n){var d,B,w,E,C;if(!n)return await this.getWorkflowExperienceDeprecated(e,t,A);const a=async()=>{var m,u;const h=N.getShadowGraphqlClient();if(n.type==="transaction"){const{transactionId:F,readOnly:I}=n,f=await h.query({query:ue,variables:{ids:[F]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!((m=f.data)!=null&&m.transactions)||f.data.transactions.length===0)throw new G("Existing transaction not found.");const D=(u=f.data)==null?void 0:u.transactions[0];if(!D.workflowId)throw new G("Existing transaction has no workflow ID.");const p=await we(D.workflowId);if(!D.product)throw new G("Failed to load transaction, product not available.");return{transaction:D,workflow:p,readOnly:I}}if(n.type==="integration"||n.type==="external"){const F=async()=>{const p=n.type==="integration"?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},S=await h.mutate({mutation:Et,variables:{...p,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!S.data||!S.data.transactionCreate)throw new G("Failed to create transaction!");const y=S.data.transactionCreate;if(!y.product)throw new G("Failed to create transaction, product not available.");return y},I=we(n.workflowId,n==null?void 0:n.graphql),[f,D]=await Promise.all([F(),I]);return{transaction:f,workflow:D}}throw new G("No workflow ID provided.")},{transaction:i,workflow:o,readOnly:s}=await a();this.currencyCode=(d=i.product.partner)==null?void 0:d.currencyCode;const r={product:i.product,transaction:i,layouts:[],singleVariantsRenderable:(B=n==null?void 0:n.workflowConfiguration)==null?void 0:B.singleVariantsRenderable,stateMutationFunc:s?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async h=>{const u=(P.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...h,context:{transactionOwnerId:u}})},readOnly:s,workflow:o};if(n.type==="transaction"&&i.workflowState){const h=JSON.parse(i.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else if(!s&&n.workflowState){const h=JSON.parse(n.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else r.layouts=Ze(r.transaction,r.workflow);if(r.renderableContextService=new Me(r.layouts),n.previewService?(r.previewService=n.previewService,(w=r.product)!=null&&w.modelUrl&&(r.modelContainer=r.previewService.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))):(r.previewService=A&&A(o),(E=r.product)!=null&&E.modelUrl&&(r.modelContainer=(C=r.previewService)==null?void 0:C.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))),n.type!=="transaction"){const h=P.getMap("transactionOwnerIds")||new Map;h.set(i.id,i.transactionOwnerId),P.setMap("transactionOwnerIds",h)}else r.isReloadedTransaction=!0;this.initialized=!0,this.experienceOptions=r;const l=new le(this,r);return await l.getWorkflowManager().getInitializationPromise(),n.type!=="transaction"&&this.customer&&await l.attachCustomerDetails({email:this.customer.emailAddress}),l}async getWorkflowExperiences(e,t){if(e.length===0)throw new G("No options provided!");const A=N.getShadowGraphqlClient(),n=async f=>{var y,x;if(f.length===0)return[];const D=f.map(Y=>Y.option.transactionId),p=await A.query({query:ue,variables:{ids:D},errorPolicy:"all",fetchPolicy:"no-cache"}),S=p.data.transactions;if(S.length!==f.length){const Y=((x=(y=p.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Not all transactions were found: ${Y}`)}return S.map((Y,H)=>{var R;return{transaction:Y,workflowId:Y.workflowId,readOnly:((R=f.find(T=>T.option.transactionId===Y.id))==null?void 0:R.option.readOnly)??!1,index:f[H].index}})},a=async f=>{var S,y,x;if(f.length===0)return[];const D=await A.mutate({mutation:xA,variables:{inputs:f.map(Y=>({integrationProductId:Y.option.type==="integration"?Y.option.integrationProductId:void 0,externalIntegrationId:Y.option.type==="external"?Y.option.externalIntegrationId:void 0,externalProductId:Y.option.type==="external"?Y.option.externalProductId:void 0,workflowId:Y.option.workflowId,claim:!0}))},errorPolicy:"all",fetchPolicy:"no-cache"}),p=(S=D.data)==null?void 0:S.transactionCreateMany;if(!p||p.length===0){const Y=((x=(y=D.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Failed to create transactions: ${Y}`)}return p.map((Y,H)=>({transaction:Y,workflowId:Y.workflowId,readOnly:!1,index:f[H].index}))},i=e.map((f,D)=>({option:f,index:D})),o=i.filter(f=>f.option.type==="transaction"),s=i.filter(f=>f.option.type==="integration"||f.option.type==="external"),r=at(o,10),l=at(s,10),d=(await Promise.all([...r.map(n),...l.map(a)])).flat(),B=[...new Set(d.map(f=>f.workflowId))],w=await qe(B,t),E=new Map(w.map(f=>[f.id,f])),C=P.getMap("transactionOwnerIds")||new Map,h=d.map(async f=>{var T;const{transaction:D,workflowId:p,readOnly:S,index:y}=f,x=E.get(p),Y=e[y];!C.get(D.id)&&D.transactionOwnerId&&C.set(D.id,D.transactionOwnerId);const H=C.get(D.id)||void 0,R={product:D.product,transaction:D,layouts:[],singleVariantsRenderable:(T=Y==null?void 0:Y.workflowConfiguration)==null?void 0:T.singleVariantsRenderable,stateMutationFunc:S?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async k=>this.updateTransactionState({...k,context:{transactionOwnerId:H}}),readOnly:S,workflow:x,isReloadedTransaction:Y.type==="transaction"};if(Y.type==="transaction"&&D.workflowState){const k=JSON.parse(D.workflowState);R.layouts=Object.values(k.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(k),await Ae(k),R.reloadedState=k}else if(!S&&Y.workflowState){const k=JSON.parse(Y.workflowState);R.layouts=Object.values(k.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(k),await Ae(k),R.reloadedState=k}else R.layouts=Ze(R.transaction,R.workflow);return R.renderableContextService=new Me(R.layouts),R.delayWorkflowStateSync=!0,this.initialized=!0,this.experienceOptions=R,{experienceOptions:R,index:y,options:Y}});P.setMap("transactionOwnerIds",C);const F=(await Promise.all(h)).sort((f,D)=>f.index-D.index).map(async f=>{const{experienceOptions:D,options:p}=f,S=new le(this,D);return await S.getWorkflowManager().getInitializationPromise(),p.type!=="transaction"&&this.customer&&await S.attachCustomerDetails({email:this.customer.emailAddress}),S}),I=await Promise.all(F);return I.forEach(f=>f.getWorkflowManager().setWorkflowStateSyncEnabled(!0)),I}async initFromIntegrationProduct(e){var i;if(e==="")throw new G("No integration product ID provided.");const A=await N.getShadowGraphqlClient().mutate({mutation:Et,variables:{integrationProductId:e,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new G("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new G("Failed to create transaction, product not available.");this.currencyCode=(i=n.product.partner)==null?void 0:i.currencyCode;const a=P.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),P.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async o=>this.updateTransactionState({...o,context:{transactionOwnerId:n.transactionOwnerId}})},this.initialized=!0}async initFromTransaction(e,t=!1){var o,s,r,l;if(e==="")throw new G("No transaction ID provided.");const A=N.getShadowGraphqlClient(),n=async()=>{var w,E;const B=(w=(await A.query({query:ue,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:w.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(E=B.product.partner)==null?void 0:E.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async()=>{throw new v("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0};if(t)return await n();const a=P.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){const B=(o=(await A.query({query:ue,variables:{ids:[e]},errorPolicy:"all"})).data)==null?void 0:o.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(s=B.product.partner)==null?void 0:s.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:i}}),readOnly:t},this.initialized=!0;return}try{const B=(r=(await A.mutate({mutation:NA,variables:{id:e},errorPolicy:"all"})).data)==null?void 0:r.transactionClaim;if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(l=B.product.partner)==null?void 0:l.currencyCode,B.transactionOwnerId&&(a.set(B.id,B.transactionOwnerId),P.setMap("transactionOwnerIds",a)),this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:B.transactionOwnerId}}),readOnly:t},this.initialized=!0}catch{throw new G("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(e,t,A){var n,a,i,o;if(!this.initialized||!this.experienceOptions)throw new G("Cannot launch experience: Not initialized.");if(this.experienceOptions.transaction.workflowId){const s=await we(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=s,this.experienceOptions.transaction.workflowState){const l=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(l.layouts).map(d=>d.layout),await g.rehydrateSerializedLayout(l),await Ae(l),this.experienceOptions.reloadedState=l}this.experienceOptions.previewService=A&&A(s),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(n=this.experienceOptions.product)!=null&&n.modelUrl&&(this.experienceOptions.modelContainer=(a=this.experienceOptions.previewService)==null?void 0:a.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const r=new le(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}if(e){const r=(P.getMap("transactionOwnerIds")||new Map).get(this.experienceOptions.transaction.id),l=N.getShadowGraphqlClient().mutate({mutation:RA,variables:{workflowId:e,id:this.experienceOptions.transaction.id},context:{transactionOwnerId:r}}),d=we(e);if(await Promise.all([l,d]),this.experienceOptions.workflow=await d,t){const w=JSON.parse(t);this.experienceOptions.layouts=Object.values(w.layouts).map(E=>E.layout),await g.rehydrateSerializedLayout(w),await Ae(w),this.experienceOptions.reloadedState=w}else this.experienceOptions.layouts=Ze(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await d),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(i=this.experienceOptions.product)!=null&&i.modelUrl&&(this.experienceOptions.modelContainer=(o=this.experienceOptions.previewService)==null?void 0:o.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const B=new le(this,this.experienceOptions);return await B.getWorkflowManager().getInitializationPromise(),B}throw new G("No workflow ID provided.")}getPreviewService(){var e;return(e=this.experienceOptions)==null?void 0:e.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}configureUrls(e,t,A){W.setHubUrl(e),W.setServerUrl(t),W.setServicesApiUrl(A)}storeCustomer(e){const t=P.getMap("partnerCustomerIds")||new Map;t.set(e.partner.id,e.id),P.setMap("partnerCustomerIds",t)}async getIntegrationProductById(e){var a,i;const n=(a=(await N.getShadowGraphqlClient().query({query:GA,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:a.integrationProducts;if(!n||n.length===0||!((i=n[0])!=null&&i.id))throw new Error("Integration product not found.");return new Xe(n[0])}async getIntegrationProductFromExternalIds(e,t){var i;const a=(i=(await N.getShadowGraphqlClient().query({query:vA,variables:{externalProductId:t,externalIntegrationId:e},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:i.integrationProductFromExternalIds;if(!(a!=null&&a.id))throw new Error("Integration product not found.");return new Xe(a)}async getIntegrationProduct(e){return e.type==="integration"?this.getIntegrationProductById(e.integrationProductId):this.getIntegrationProductFromExternalIds(e.externalIntegrationId,e.externalProductId)}}class fa{getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}async reset(){}updateStateWithServer(e){}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,A){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}injectIntoPreviewService(e){return Promise.resolve()}ejectFromPreviewService(){}setWorkflowStateSyncEnabled(e){}}var sA=(c=>(c.SelectFrame="SelectFrame",c.SelectImage="SelectImage",c.Position="Position",c))(sA||{});class rA extends j{constructor(e,t){var A;super(e,t),this.frameService=(A=this.manager.getStepSpecificServices(this.getId()))==null?void 0:A.frameService}selectVariant(e){const t=this.manager.getRegionElements(this.step.stepName);return Ie.selectVariant(this.step,e.getResource(),t,this.manager,A=>this.setUpdateState(A))}onFrameDataChanged(e){this.frameService&&this.frameService.onFrameDataChanged(t=>{t&&e(t)})}selectImage(e){return Ie.selectImage(this.step,e,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(e,t,A,n){return n&&n.length>1&&e===void 0?"SelectFrame":t||A||this.getImageData()?"Position":"SelectImage"}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}}Object.defineProperty(Q,"AspectType",{enumerable:!0,get:()=>g.AspectType}),Object.defineProperty(Q,"AssetType",{enumerable:!0,get:()=>g.AssetType}),Object.defineProperty(Q,"BringForwardCommand",{enumerable:!0,get:()=>g.BringForwardCommand}),Object.defineProperty(Q,"BringToBackCommand",{enumerable:!0,get:()=>g.BringToBackCommand}),Object.defineProperty(Q,"BringToFrontCommand",{enumerable:!0,get:()=>g.BringToFrontCommand}),Object.defineProperty(Q,"CanvasCommand",{enumerable:!0,get:()=>g.CanvasCommand}),Object.defineProperty(Q,"CommandContext",{enumerable:!0,get:()=>g.CommandContext}),Object.defineProperty(Q,"CreateElementCommand",{enumerable:!0,get:()=>g.CreateElementCommand}),Object.defineProperty(Q,"CreateLayoutCommand",{enumerable:!0,get:()=>g.CreateLayoutCommand}),Object.defineProperty(Q,"DeleteElementCommand",{enumerable:!0,get:()=>g.DeleteElementCommand}),Object.defineProperty(Q,"FontAlignmentCommand",{enumerable:!0,get:()=>g.FontAlignmentCommand}),Object.defineProperty(Q,"FontColorCommand",{enumerable:!0,get:()=>g.FontColorCommand}),Object.defineProperty(Q,"FontSizeCommand",{enumerable:!0,get:()=>g.FontSizeCommand}),Object.defineProperty(Q,"FontSourceCommand",{enumerable:!0,get:()=>g.FontSourceCommand}),Object.defineProperty(Q,"GroupCommand",{enumerable:!0,get:()=>g.GroupCommand}),Object.defineProperty(Q,"LayoutElementFactory",{enumerable:!0,get:()=>g.LayoutElementFactory}),Object.defineProperty(Q,"LayoutElementType",{enumerable:!0,get:()=>g.LayoutElementType}),Object.defineProperty(Q,"MoveCommand",{enumerable:!0,get:()=>g.MoveCommand}),Object.defineProperty(Q,"ResizeCommand",{enumerable:!0,get:()=>g.ResizeCommand}),Object.defineProperty(Q,"RotateCommand",{enumerable:!0,get:()=>g.RotateCommand}),Object.defineProperty(Q,"SendBackwardsCommand",{enumerable:!0,get:()=>g.SendBackwardsCommand}),Object.defineProperty(Q,"StepAspectType",{enumerable:!0,get:()=>g.StepAspectType}),Object.defineProperty(Q,"StepType",{enumerable:!0,get:()=>g.StepType}),Object.defineProperty(Q,"TextChangeCommand",{enumerable:!0,get:()=>g.TextChangeCommand}),Object.defineProperty(Q,"UnitOfMeasurement",{enumerable:!0,get:()=>g.UnitOfMeasurement}),Object.defineProperty(Q,"dataUrlFromExternalUrl",{enumerable:!0,get:()=>g.dataUrlFromExternalUrl}),Object.defineProperty(Q,"determineCorrectFontSizeAndLines",{enumerable:!0,get:()=>g.determineCorrectFontSizeAndLines}),Object.defineProperty(Q,"findElement",{enumerable:!0,get:()=>g.findElement}),Object.defineProperty(Q,"frameDataCache",{enumerable:!0,get:()=>g.frameDataCache}),Object.defineProperty(Q,"generate",{enumerable:!0,get:()=>g.generate}),Object.defineProperty(Q,"generateSVGWithUnknownColors",{enumerable:!0,get:()=>g.generateSVGWithUnknownColors}),Object.defineProperty(Q,"getAttributesFromArrayBuffer",{enumerable:!0,get:()=>g.getAttributesFromArrayBuffer}),Object.defineProperty(Q,"getAxisAlignedBoundingBox",{enumerable:!0,get:()=>g.getAxisAlignedBoundingBox}),Object.defineProperty(Q,"getFrameData",{enumerable:!0,get:()=>g.getFrameData}),Object.defineProperty(Q,"getSvgElement",{enumerable:!0,get:()=>g.getSvgElement}),Object.defineProperty(Q,"loadFont",{enumerable:!0,get:()=>g.loadFont}),Object.defineProperty(Q,"patternImageDataCache",{enumerable:!0,get:()=>g.patternImageDataCache}),Object.defineProperty(Q,"registerFetchImplementation",{enumerable:!0,get:()=>g.registerFetchImplementation}),Object.defineProperty(Q,"registerWindowImplementation",{enumerable:!0,get:()=>g.registerWindowImplementation}),Object.defineProperty(Q,"rehydrateSerializedLayout",{enumerable:!0,get:()=>g.rehydrateSerializedLayout}),Object.defineProperty(Q,"setCanvasModule",{enumerable:!0,get:()=>g.setCanvasModule}),Q.ArrayInput=ia,Q.AssetNotFoundError=V,Q.CollectionProduct=ye,Q.ColorOptionGlobalPropertyHandle=$t,Q.ConversionDataType=wt,Q.ConversionLocation=dt,Q.FileUploadGlobalPropertyHandle=qt,Q.FlowExecutionNodeResult=de,Q.FlowExecutionResult=aA,Q.FlowService=nA,Q.FrameService=ut,Q.FrameStep=sA,Q.FrameStepHandle=rA,Q.GlobalPropertyHandle=Se,Q.IllustrationStepHandle=Rt,Q.InformationMessageType=ge,Q.InformationStepHandle=Tt,Q.IntegrationProduct=Xe,Q.IntegrationType=lt,Q.LayoutNotFoundError=b,Q.MaterialStepHandle=Ut,Q.MisconfigurationError=ie,Q.MockWorkflowManager=fa,Q.ModelStepHandle=Gt,Q.ObjectInput=We,Q.ObjectInputType=iA,Q.OptionGlobalPropertyHandle=Ke,Q.OptionNotFoundError=ae,Q.ParseError=q,Q.PictureStepHandle=vt,Q.ProductCameraRig=Bt,Q.ProductCollection=_t,Q.ProductWorkflow=Be,Q.PromiseCache=Z,Q.PromiseQueue=Ue,Q.QuestionStepHandle=kt,Q.QueueablePromise=Re,Q.ResourceNotFoundError=X,Q.ShapeStepHandle=bt,Q.SpiffCommerceClient=oA,Q.StakeholderType=se,Q.StepHandle=j,Q.TextGlobalPropertyHandle=Zt,Q.TextInput=aa,Q.TextStepHandle=Jt,Q.Transform=tA,Q.TransformCollection=eA,Q.UnhandledBehaviorError=v,Q.Variant=K,Q.WorkflowExperienceEventType=Kt,Q.WorkflowExperienceImpl=le,Q.assetService=J,Q.createDesign=jt,Q.designService=Fe,Q.digitalContentStepService=Dt,Q.frameStepService=Ie,Q.generateCommands=Vt,Q.generateStateFromDesignInputSteps=Gn,Q.getBoundedOffsets=Qt,Q.getWorkflow=we,Q.getWorkflows=qe,Q.graphQlManager=N,Q.illustrationStepService=ce,Q.materialStepService=Ge,Q.modelStepService=ve,Q.moduleStepService=pt,Q.optionService=L,Q.persistenceService=P,Q.pictureStepService=ke,Q.questionStepService=be,Q.shapeStepService=te,Q.shortenUrl=It,Q.spiffCoreConfiguration=W,Q.stepAspectValuesToDesignInputSteps=Un,Q.textStepService=O,Q.toast=Ft,Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"})});
2972
+ `,Ae=async c=>{var e;for(const t in c.layouts){const A=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Illustration);for(let a=0;a<A.length;++a){const i=A[a];i.src&&i.svg&&(i.cachedObjectURL=await g.svgObjectURL(i.svg))}const n=c.layouts[t].elements.filter(a=>a.type===g.LayoutElementType.Textbox);for(let a=0;a<n.length;++a){const i=n[a];(e=i.fontData)!=null&&e.assetUrl&&await g.loadFont(i.fontData.assetUrl)}}},ua=async(c,e)=>{var n;const t=await N.getShadowGraphqlClient().query({query:ga(((n=e==null?void 0:e.assets)==null?void 0:n.metadata)||!1),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:c}}),A=t.data.workflows;if(A===void 0||A.length!==c.length)throw new Error(`Unable to read workflows: ${t.errors??"Length mismatch in response"}`);return A.forEach(a=>{a.steps.forEach(i=>{var o,s,r;delete i.data.__typename,(o=i.option)!=null&&o.id&&((s=i.option.defaultVariant)!=null&&s.asset&&k.cacheAsset(i.option.defaultVariant.asset),i.option.colorProfile&&k.cacheAsset(i.option.colorProfile),(r=i.option.variants)==null||r.forEach(l=>{l.asset&&k.cacheAsset(l.asset),l.displayImage&&k.cacheAsset(l.displayImage),l.thumbnail&&k.cacheAsset(l.thumbnail),l.material&&k.cacheMaterial(l.material)}),Z.set({id:i.option.id},Promise.resolve(i.option)))})}),A},ma=async(c,e)=>{const A=(await e).find(n=>n.id===c);if(!A)throw new Error(`Workflow not found: ${c}`);return A},qe=async(c,e)=>{const t=c.map(o=>Z.get({id:o,options:e})),A=c.filter((o,s)=>t[s]===void 0);if(A.length===0)return Promise.all(t);const n=ua(A,e),a=A.map(o=>Z.set({id:o,options:e},ma(o,n))),i=t.filter(o=>o!==void 0);return await Promise.all(i.concat(a))},we=async(c,e)=>(await qe([c],e))[0],Ia=c=>c.sort((e,t)=>e.index-t.index).map(e=>({id:g.generate(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion,useEditableArea:e.useEditableArea,editableArea:e.editableArea})),Ze=(c,e)=>{const t=c.workflowState,A=t?JSON.parse(t):void 0;return A?Object.values(A.layouts).map(n=>n.layout):Ia(e.panels)};class oA{constructor(e){this.updateTransactionState=async t=>{try{return N.getShadowGraphqlClient().mutate({...t,mutation:HA})}catch(A){throw console.error(A),new G("Critical - Unable to synchronize workflow state with server.")}},this.initialized=!1,this.options=e,this.options.applicationKey&&dA(this.options.applicationKey)}getAssetManager(){return k}getCurrencyCode(){if(this.currencyCode===void 0)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!wA())throw new Error("Application key required to use Flow Service.");return new nA}async getIntegration(){return(await N.getShadowGraphqlClient().query({query:Ba,errorPolicy:"all"})).data.currentIntegration}async authenticateBundleFromLocalStorage(e){var n,a;const t=P.getMap("bundleOwnerIds");if(t!=null&&t.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const A=P.getMap("bundlePartnerIds")||new Map;if(A.has(e)){const i=A.get(e),s=(P.getMap("partnerCustomerIds")||new Map).get(i);if(s&&await this.authenticateCustomerId(s)){const l=(a=(n=this.customer)==null?void 0:n.bundleStakeholders)==null?void 0:a.find(d=>{var B;return((B=d.bundle)==null?void 0:B.id)===e});if(l)return Promise.resolve({success:!0,stakeholderType:l.type})}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(e){var l,d,B,w,E,C;const t=N.getShadowGraphqlClient(),A=await t.query({query:la,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:e}});if(!A.data.transactions||A.data.transactions.length===0)throw new Error(`Transaction not found: ${e}`);const n=A.data.transactions[0];if(!((d=(l=n.product)==null?void 0:l.partner)==null?void 0:d.id))throw new Error(`Unable to read transaction: ${e}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=P.getMap("transactionOwnerIds");if(i!=null&&i.has(e))return Promise.resolve({success:!0,stakeholderType:se.Owner});const o=P.getMap("transactionCustomerIds");if(o!=null&&o.has(e)){const h=o.get(e);if(h&&await this.authenticateCustomerId(h)){const u=((w=(B=this.customer)==null?void 0:B.bundleStakeholders)==null?void 0:w.find(F=>{var I,f;return(f=(I=F.bundle)==null?void 0:I.transactions)==null?void 0:f.some(D=>D.id===e)}))||((C=(E=this.customer)==null?void 0:E.stakeholders)==null?void 0:C.find(F=>{var I;return((I=F.transaction)==null?void 0:I.id)===e}));if(u)return Promise.resolve({success:!0,stakeholderType:u.type})}}const r=(await t.query({query:da,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(e){const t=P.getMap("transactionCustomerIds");t!=null&&t.has(e)&&(t.delete(e),P.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(e){var A,n;const t=(n=(A=this.customer)==null?void 0:A.stakeholders)==null?void 0:n.find(a=>{var i;return((i=a.transaction)==null?void 0:i.id)===e});if(t)return t.type}async getOrCreateCustomer(e){var i;this.customer=void 0;const t=N.getShadowGraphqlClient(),n=(await t.query({query:wa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e}})).data.customer;if(!n.id){const s=(i=(await t.mutate({mutation:Ea,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:e}}})).data)==null?void 0:i.customerCreate;if(!s)throw new Error("Unable to create customer.");return this.storeCustomer(s),this.customer=s,{customer:s,isAuthenticated:!1}}this.storeCustomer(n);const a=await this.authenticateCustomerId(n.id);return{customer:this.customer||n,isAuthenticated:a}}async authenticateCustomerId(e){var o;const t=N.getShadowGraphqlClient(),A=P.getMap("customerTokens");if(!(A!=null&&A.has(e)))return!1;const n=A.get(e);if(!n)return!1;const i=(o=(await t.mutate({mutation:ha,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data)==null?void 0:o.customerAuthenticate;return i?(this.storeCustomer(i),rt(n),this.customer=i,!0):!1}async generateVerificationCode(e){await N.getShadowGraphqlClient().mutate({mutation:Ca,variables:{emailAddress:e}})}async verifyCode(e,t){var a,i;const n=(a=(await N.getShadowGraphqlClient().mutate({mutation:Qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:e,verificationCode:t}})).data)==null?void 0:a.customerVerifyCode;if(n!=null&&n.loginToken){if(!((i=n.partner)!=null&&i.id))throw new Error(`Unable to find customer: ${e}`);const o=P.getMap("customerTokens")||new Map;return o.set(n.id,n.loginToken),P.setMap("customerTokens",o),this.storeCustomer(n),rt(n.loginToken),this.customer={...n,loginToken:void 0},!0}return!1}async getNewBundle(e,t,A){var s,r,l;const a=(l=(await N.getShadowGraphqlClient().mutate({mutation:Ln(((r=(s=A==null?void 0:A.graphql)==null?void 0:s.productCollection)==null?void 0:r.eagerFetchProducts)||!1),variables:{collectionId:e,initialMetadata:t?Object.entries(t).map((d,B)=>({key:d[0],value:d[1]})):void 0},fetchPolicy:"no-cache"})).data)==null?void 0:l.bundleCreate;if(!(a!=null&&a.id))throw new Error("Unable to create bundle");const i=P.getMap("bundlePartnerIds")||new Map;i.set(a.id,a.partner.id),P.setMap("bundlePartnerIds",i);const o=P.getMap("bundleOwnerIds")||new Map;return o.set(a.id,a.bundleOwnerId),P.setMap("bundleOwnerIds",o),new AA(this,a,void 0,void 0,a.bundleOwnerId)}async getExistingBundle(e,t,A,n){var d,B,w,E,C,h;const a=P.getMap("bundleOwnerIds"),i=a==null?void 0:a.get(e),o=await N.getShadowGraphqlClient().query({query:kn(((B=(d=n==null?void 0:n.graphql)==null?void 0:d.productCollection)==null?void 0:B.eagerFetchProducts)||!1),variables:{id:e},fetchPolicy:"no-cache",context:{bundleOwnerId:i}});if(!((w=o.data)!=null&&w.bundles)||((E=o.data)==null?void 0:E.bundles.length)===0||!((C=o.data)!=null&&C.bundles[0]))throw new Error(`Unable to find bundle: ${e}`);const s=(h=o.data)==null?void 0:h.bundles[0],r=P.getMap("bundlePartnerIds")||new Map;r.set(s.id,s.partner.id),P.setMap("bundlePartnerIds",r);const l=new AA(this,s,t,A,i);return await l.getInitializationPromise(),l}async getBundleStakeholders(){var a;if(!this.customer)throw new Error("Customer not authenticated.");const e=await N.getShadowGraphqlClient().query({query:Jn,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!((a=e.data)!=null&&a.customers)||e.data.customers.length===0)throw new Error("Unable to find customer.");const A=e.data.customers[0].bundleStakeholders||[],n=P.getMap("bundlePartnerIds")||new Map;return A.forEach(i=>{var o,s;(o=i.bundle)!=null&&o.id&&((s=i.bundle.partner)!=null&&s.id)&&n.set(i.bundle.id,i.bundle.partner.id)}),P.setMap("bundlePartnerIds",n),A}async getWorkflowExperience(e,t,A,n){var d,B,w,E,C;if(!n)return await this.getWorkflowExperienceDeprecated(e,t,A);const a=async()=>{var m,u;const h=N.getShadowGraphqlClient();if(n.type==="transaction"){const{transactionId:F,readOnly:I}=n,f=await h.query({query:ue,variables:{ids:[F]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!((m=f.data)!=null&&m.transactions)||f.data.transactions.length===0)throw new G("Existing transaction not found.");const D=(u=f.data)==null?void 0:u.transactions[0];if(!D.workflowId)throw new G("Existing transaction has no workflow ID.");const p=await we(D.workflowId);if(!D.product)throw new G("Failed to load transaction, product not available.");return{transaction:D,workflow:p,readOnly:I}}if(n.type==="integration"||n.type==="external"){const F=async()=>{const p=n.type==="integration"?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},S=await h.mutate({mutation:Et,variables:{...p,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!S.data||!S.data.transactionCreate)throw new G("Failed to create transaction!");const y=S.data.transactionCreate;if(!y.product)throw new G("Failed to create transaction, product not available.");return y},I=we(n.workflowId,n==null?void 0:n.graphql),[f,D]=await Promise.all([F(),I]);return{transaction:f,workflow:D}}throw new G("No workflow ID provided.")},{transaction:i,workflow:o,readOnly:s}=await a();this.currencyCode=(d=i.product.partner)==null?void 0:d.currencyCode;const r={product:i.product,transaction:i,layouts:[],singleVariantsRenderable:(B=n==null?void 0:n.workflowConfiguration)==null?void 0:B.singleVariantsRenderable,stateMutationFunc:s?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async h=>{const u=(P.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...h,context:{transactionOwnerId:u}})},readOnly:s,workflow:o};if(n.type==="transaction"&&i.workflowState){const h=JSON.parse(i.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else if(!s&&n.workflowState){const h=JSON.parse(n.workflowState);r.layouts=Object.values(h.layouts).map(m=>m.layout),await g.rehydrateSerializedLayout(h),await Ae(h),r.reloadedState=h}else r.layouts=Ze(r.transaction,r.workflow);if(r.renderableContextService=new Me(r.layouts),n.previewService?(r.previewService=n.previewService,(w=r.product)!=null&&w.modelUrl&&(r.modelContainer=r.previewService.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))):(r.previewService=A&&A(o),(E=r.product)!=null&&E.modelUrl&&(r.modelContainer=(C=r.previewService)==null?void 0:C.loadModel({model:r.product.modelUrl,contextService:r.renderableContextService}))),n.type!=="transaction"){const h=P.getMap("transactionOwnerIds")||new Map;h.set(i.id,i.transactionOwnerId),P.setMap("transactionOwnerIds",h)}else r.isReloadedTransaction=!0;this.initialized=!0,this.experienceOptions=r;const l=new le(this,r);return await l.getWorkflowManager().getInitializationPromise(),n.type!=="transaction"&&this.customer&&await l.attachCustomerDetails({email:this.customer.emailAddress}),l}async getWorkflowExperiences(e,t){if(e.length===0)throw new G("No options provided!");const A=N.getShadowGraphqlClient(),n=async f=>{var y,x;if(f.length===0)return[];const D=f.map(Y=>Y.option.transactionId),p=await A.query({query:ue,variables:{ids:D},errorPolicy:"all",fetchPolicy:"no-cache"}),S=p.data.transactions;if(S.length!==f.length){const Y=((x=(y=p.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Not all transactions were found: ${Y}`)}return S.map((Y,H)=>{var R;return{transaction:Y,workflowId:Y.workflowId,readOnly:((R=f.find(T=>T.option.transactionId===Y.id))==null?void 0:R.option.readOnly)??!1,index:f[H].index}})},a=async f=>{var S,y,x;if(f.length===0)return[];const D=await A.mutate({mutation:xA,variables:{inputs:f.map(Y=>({integrationProductId:Y.option.type==="integration"?Y.option.integrationProductId:void 0,externalIntegrationId:Y.option.type==="external"?Y.option.externalIntegrationId:void 0,externalProductId:Y.option.type==="external"?Y.option.externalProductId:void 0,workflowId:Y.option.workflowId,claim:!0}))},errorPolicy:"all",fetchPolicy:"no-cache"}),p=(S=D.data)==null?void 0:S.transactionCreateMany;if(!p||p.length===0){const Y=((x=(y=D.errors)==null?void 0:y[0])==null?void 0:x.message)||"Unknown error";throw new G(`Failed to create transactions: ${Y}`)}return p.map((Y,H)=>({transaction:Y,workflowId:Y.workflowId,readOnly:!1,index:f[H].index}))},i=e.map((f,D)=>({option:f,index:D})),o=i.filter(f=>f.option.type==="transaction"),s=i.filter(f=>f.option.type==="integration"||f.option.type==="external"),r=at(o,10),l=at(s,10),d=(await Promise.all([...r.map(n),...l.map(a)])).flat(),B=[...new Set(d.map(f=>f.workflowId))],w=await qe(B,t),E=new Map(w.map(f=>[f.id,f])),C=P.getMap("transactionOwnerIds")||new Map,h=d.map(async f=>{var T;const{transaction:D,workflowId:p,readOnly:S,index:y}=f,x=E.get(p),Y=e[y];!C.get(D.id)&&D.transactionOwnerId&&C.set(D.id,D.transactionOwnerId);const H=C.get(D.id)||void 0,R={product:D.product,transaction:D,layouts:[],singleVariantsRenderable:(T=Y==null?void 0:Y.workflowConfiguration)==null?void 0:T.singleVariantsRenderable,stateMutationFunc:S?async()=>{throw new v("State mutation is forbidden in read only mode!")}:async b=>this.updateTransactionState({...b,context:{transactionOwnerId:H}}),readOnly:S,workflow:x,isReloadedTransaction:Y.type==="transaction"};if(Y.type==="transaction"&&D.workflowState){const b=JSON.parse(D.workflowState);R.layouts=Object.values(b.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(b),await Ae(b),R.reloadedState=b}else if(!S&&Y.workflowState){const b=JSON.parse(Y.workflowState);R.layouts=Object.values(b.layouts).map(z=>z.layout),await g.rehydrateSerializedLayout(b),await Ae(b),R.reloadedState=b}else R.layouts=Ze(R.transaction,R.workflow);return R.renderableContextService=new Me(R.layouts),R.delayWorkflowStateSync=!0,this.initialized=!0,this.experienceOptions=R,{experienceOptions:R,index:y,options:Y}});P.setMap("transactionOwnerIds",C);const F=(await Promise.all(h)).sort((f,D)=>f.index-D.index).map(async f=>{const{experienceOptions:D,options:p}=f,S=new le(this,D);return await S.getWorkflowManager().getInitializationPromise(),p.type!=="transaction"&&this.customer&&await S.attachCustomerDetails({email:this.customer.emailAddress}),S}),I=await Promise.all(F);return I.forEach(f=>f.getWorkflowManager().setWorkflowStateSyncEnabled(!0)),I}async initFromIntegrationProduct(e){var i;if(e==="")throw new G("No integration product ID provided.");const A=await N.getShadowGraphqlClient().mutate({mutation:Et,variables:{integrationProductId:e,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new G("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new G("Failed to create transaction, product not available.");this.currencyCode=(i=n.product.partner)==null?void 0:i.currencyCode;const a=P.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),P.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async o=>this.updateTransactionState({...o,context:{transactionOwnerId:n.transactionOwnerId}})},this.initialized=!0}async initFromTransaction(e,t=!1){var o,s,r,l;if(e==="")throw new G("No transaction ID provided.");const A=N.getShadowGraphqlClient(),n=async()=>{var w,E;const B=(w=(await A.query({query:ue,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:w.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(E=B.product.partner)==null?void 0:E.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async()=>{throw new v("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0};if(t)return await n();const a=P.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){const B=(o=(await A.query({query:ue,variables:{ids:[e]},errorPolicy:"all"})).data)==null?void 0:o.transactions[0];if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(s=B.product.partner)==null?void 0:s.currencyCode,this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:i}}),readOnly:t},this.initialized=!0;return}try{const B=(r=(await A.mutate({mutation:NA,variables:{id:e},errorPolicy:"all"})).data)==null?void 0:r.transactionClaim;if(!B)throw new G("Failed to read transaction.");if(!B.product)throw new G("Failed to load transaction, product not available.");this.currencyCode=(l=B.product.partner)==null?void 0:l.currencyCode,B.transactionOwnerId&&(a.set(B.id,B.transactionOwnerId),P.setMap("transactionOwnerIds",a)),this.experienceOptions={product:B.product,transaction:B,layouts:[],stateMutationFunc:async w=>this.updateTransactionState({...w,context:{transactionOwnerId:B.transactionOwnerId}}),readOnly:t},this.initialized=!0}catch{throw new G("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(e,t,A){var n,a,i,o;if(!this.initialized||!this.experienceOptions)throw new G("Cannot launch experience: Not initialized.");if(this.experienceOptions.transaction.workflowId){const s=await we(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=s,this.experienceOptions.transaction.workflowState){const l=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(l.layouts).map(d=>d.layout),await g.rehydrateSerializedLayout(l),await Ae(l),this.experienceOptions.reloadedState=l}this.experienceOptions.previewService=A&&A(s),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(n=this.experienceOptions.product)!=null&&n.modelUrl&&(this.experienceOptions.modelContainer=(a=this.experienceOptions.previewService)==null?void 0:a.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const r=new le(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}if(e){const r=(P.getMap("transactionOwnerIds")||new Map).get(this.experienceOptions.transaction.id),l=N.getShadowGraphqlClient().mutate({mutation:RA,variables:{workflowId:e,id:this.experienceOptions.transaction.id},context:{transactionOwnerId:r}}),d=we(e);if(await Promise.all([l,d]),this.experienceOptions.workflow=await d,t){const w=JSON.parse(t);this.experienceOptions.layouts=Object.values(w.layouts).map(E=>E.layout),await g.rehydrateSerializedLayout(w),await Ae(w),this.experienceOptions.reloadedState=w}else this.experienceOptions.layouts=Ze(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await d),this.experienceOptions.renderableContextService=new Me(this.experienceOptions.layouts),(i=this.experienceOptions.product)!=null&&i.modelUrl&&(this.experienceOptions.modelContainer=(o=this.experienceOptions.previewService)==null?void 0:o.loadModel({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}));const B=new le(this,this.experienceOptions);return await B.getWorkflowManager().getInitializationPromise(),B}throw new G("No workflow ID provided.")}getPreviewService(){var e;return(e=this.experienceOptions)==null?void 0:e.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new G("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}configureUrls(e,t,A){W.setHubUrl(e),W.setServerUrl(t),W.setServicesApiUrl(A)}storeCustomer(e){const t=P.getMap("partnerCustomerIds")||new Map;t.set(e.partner.id,e.id),P.setMap("partnerCustomerIds",t)}async getIntegrationProductById(e){var a,i;const n=(a=(await N.getShadowGraphqlClient().query({query:GA,variables:{ids:[e]},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:a.integrationProducts;if(!n||n.length===0||!((i=n[0])!=null&&i.id))throw new Error("Integration product not found.");return new Xe(n[0])}async getIntegrationProductFromExternalIds(e,t){var i;const a=(i=(await N.getShadowGraphqlClient().query({query:vA,variables:{externalProductId:t,externalIntegrationId:e},fetchPolicy:"no-cache",errorPolicy:"all"})).data)==null?void 0:i.integrationProductFromExternalIds;if(!(a!=null&&a.id))throw new Error("Integration product not found.");return new Xe(a)}async getIntegrationProduct(e){return e.type==="integration"?this.getIntegrationProductById(e.integrationProductId):this.getIntegrationProductFromExternalIds(e.externalIntegrationId,e.externalProductId)}}class fa{getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}async reset(){}updateStateWithServer(e){}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,A){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}injectIntoPreviewService(e){return Promise.resolve()}ejectFromPreviewService(){}setWorkflowStateSyncEnabled(e){}}var sA=(c=>(c.SelectFrame="SelectFrame",c.SelectImage="SelectImage",c.Position="Position",c))(sA||{});class rA extends j{constructor(e,t){var A;super(e,t),this.frameService=(A=this.manager.getStepSpecificServices(this.getId()))==null?void 0:A.frameService}selectVariant(e){const t=this.manager.getRegionElements(this.step.stepName);return Ie.selectVariant(this.step,e.getResource(),t,this.manager,A=>this.setUpdateState(A))}onFrameDataChanged(e){this.frameService&&this.frameService.onFrameDataChanged(t=>{t&&e(t)})}selectImage(e){return Ie.selectImage(this.step,e,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(e,t,A,n){return n&&n.length>1&&e===void 0?"SelectFrame":t||A||this.getImageData()?"Position":"SelectImage"}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}}Object.defineProperty(Q,"AspectType",{enumerable:!0,get:()=>g.AspectType}),Object.defineProperty(Q,"AssetType",{enumerable:!0,get:()=>g.AssetType}),Object.defineProperty(Q,"BringForwardCommand",{enumerable:!0,get:()=>g.BringForwardCommand}),Object.defineProperty(Q,"BringToBackCommand",{enumerable:!0,get:()=>g.BringToBackCommand}),Object.defineProperty(Q,"BringToFrontCommand",{enumerable:!0,get:()=>g.BringToFrontCommand}),Object.defineProperty(Q,"CanvasCommand",{enumerable:!0,get:()=>g.CanvasCommand}),Object.defineProperty(Q,"CommandContext",{enumerable:!0,get:()=>g.CommandContext}),Object.defineProperty(Q,"CreateElementCommand",{enumerable:!0,get:()=>g.CreateElementCommand}),Object.defineProperty(Q,"CreateLayoutCommand",{enumerable:!0,get:()=>g.CreateLayoutCommand}),Object.defineProperty(Q,"DeleteElementCommand",{enumerable:!0,get:()=>g.DeleteElementCommand}),Object.defineProperty(Q,"FontAlignmentCommand",{enumerable:!0,get:()=>g.FontAlignmentCommand}),Object.defineProperty(Q,"FontColorCommand",{enumerable:!0,get:()=>g.FontColorCommand}),Object.defineProperty(Q,"FontSizeCommand",{enumerable:!0,get:()=>g.FontSizeCommand}),Object.defineProperty(Q,"FontSourceCommand",{enumerable:!0,get:()=>g.FontSourceCommand}),Object.defineProperty(Q,"GroupCommand",{enumerable:!0,get:()=>g.GroupCommand}),Object.defineProperty(Q,"LayoutElementFactory",{enumerable:!0,get:()=>g.LayoutElementFactory}),Object.defineProperty(Q,"LayoutElementType",{enumerable:!0,get:()=>g.LayoutElementType}),Object.defineProperty(Q,"MoveCommand",{enumerable:!0,get:()=>g.MoveCommand}),Object.defineProperty(Q,"ResizeCommand",{enumerable:!0,get:()=>g.ResizeCommand}),Object.defineProperty(Q,"RotateCommand",{enumerable:!0,get:()=>g.RotateCommand}),Object.defineProperty(Q,"SendBackwardsCommand",{enumerable:!0,get:()=>g.SendBackwardsCommand}),Object.defineProperty(Q,"StepAspectType",{enumerable:!0,get:()=>g.StepAspectType}),Object.defineProperty(Q,"StepType",{enumerable:!0,get:()=>g.StepType}),Object.defineProperty(Q,"TextChangeCommand",{enumerable:!0,get:()=>g.TextChangeCommand}),Object.defineProperty(Q,"UnitOfMeasurement",{enumerable:!0,get:()=>g.UnitOfMeasurement}),Object.defineProperty(Q,"dataUrlFromExternalUrl",{enumerable:!0,get:()=>g.dataUrlFromExternalUrl}),Object.defineProperty(Q,"determineCorrectFontSizeAndLines",{enumerable:!0,get:()=>g.determineCorrectFontSizeAndLines}),Object.defineProperty(Q,"findElement",{enumerable:!0,get:()=>g.findElement}),Object.defineProperty(Q,"frameDataCache",{enumerable:!0,get:()=>g.frameDataCache}),Object.defineProperty(Q,"generate",{enumerable:!0,get:()=>g.generate}),Object.defineProperty(Q,"generateSVGWithUnknownColors",{enumerable:!0,get:()=>g.generateSVGWithUnknownColors}),Object.defineProperty(Q,"getAttributesFromArrayBuffer",{enumerable:!0,get:()=>g.getAttributesFromArrayBuffer}),Object.defineProperty(Q,"getAxisAlignedBoundingBox",{enumerable:!0,get:()=>g.getAxisAlignedBoundingBox}),Object.defineProperty(Q,"getFrameData",{enumerable:!0,get:()=>g.getFrameData}),Object.defineProperty(Q,"getSvgElement",{enumerable:!0,get:()=>g.getSvgElement}),Object.defineProperty(Q,"loadFont",{enumerable:!0,get:()=>g.loadFont}),Object.defineProperty(Q,"patternImageDataCache",{enumerable:!0,get:()=>g.patternImageDataCache}),Object.defineProperty(Q,"registerFetchImplementation",{enumerable:!0,get:()=>g.registerFetchImplementation}),Object.defineProperty(Q,"registerWindowImplementation",{enumerable:!0,get:()=>g.registerWindowImplementation}),Object.defineProperty(Q,"rehydrateSerializedLayout",{enumerable:!0,get:()=>g.rehydrateSerializedLayout}),Object.defineProperty(Q,"setCanvasModule",{enumerable:!0,get:()=>g.setCanvasModule}),Q.ArrayInput=ia,Q.AssetNotFoundError=V,Q.CollectionProduct=ye,Q.ColorOptionGlobalPropertyHandle=$t,Q.ConversionDataType=wt,Q.ConversionLocation=dt,Q.FileUploadGlobalPropertyHandle=qt,Q.FlowExecutionNodeResult=de,Q.FlowExecutionResult=aA,Q.FlowService=nA,Q.FrameService=ut,Q.FrameStep=sA,Q.FrameStepHandle=rA,Q.GlobalPropertyHandle=Se,Q.IllustrationStepHandle=Rt,Q.InformationMessageType=ge,Q.InformationStepHandle=Tt,Q.IntegrationProduct=Xe,Q.IntegrationType=lt,Q.LayoutNotFoundError=J,Q.MaterialStepHandle=Ut,Q.MisconfigurationError=ie,Q.MockWorkflowManager=fa,Q.ModelStepHandle=Gt,Q.ObjectInput=We,Q.ObjectInputType=iA,Q.OptionGlobalPropertyHandle=Ke,Q.OptionNotFoundError=ae,Q.ParseError=q,Q.PictureStepHandle=vt,Q.ProductCameraRig=Bt,Q.ProductCollection=_t,Q.ProductWorkflow=Be,Q.PromiseCache=Z,Q.PromiseQueue=Ue,Q.QuestionStepHandle=kt,Q.QueueablePromise=Re,Q.ResourceNotFoundError=X,Q.ShapeStepHandle=bt,Q.SpiffCommerceClient=oA,Q.StakeholderType=se,Q.StepHandle=j,Q.TextGlobalPropertyHandle=Zt,Q.TextInput=aa,Q.TextStepHandle=Jt,Q.Transform=tA,Q.TransformCollection=eA,Q.UnhandledBehaviorError=v,Q.Variant=K,Q.WorkflowExperienceEventType=Kt,Q.WorkflowExperienceImpl=le,Q.assetService=k,Q.createDesign=jt,Q.designService=Fe,Q.digitalContentStepService=Dt,Q.frameStepService=Ie,Q.generateCommands=Vt,Q.generateStateFromDesignInputSteps=Gn,Q.getBoundedOffsets=Qt,Q.getWorkflow=we,Q.getWorkflows=qe,Q.graphQlManager=N,Q.illustrationStepService=ce,Q.materialStepService=Ge,Q.modelStepService=ve,Q.moduleStepService=pt,Q.optionService=L,Q.persistenceService=P,Q.pictureStepService=ke,Q.questionStepService=be,Q.shapeStepService=te,Q.shortenUrl=It,Q.spiffCoreConfiguration=W,Q.stepAspectValuesToDesignInputSteps=Un,Q.textStepService=O,Q.toast=Ft,Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "21.1.2",
3
+ "version": "21.2.1-alpha.0",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/index.umd.cjs",