@spiffcommerce/core 16.5.1-1 → 16.5.1-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1323,7 +1323,7 @@ const Ve = y`
1323
1323
  for (const i of t)
1324
1324
  for (const o of i.renderableSteps) {
1325
1325
  const r = (((s = o.option) == null ? void 0 : s.variants) || []).length;
1326
- o.silent && (o.type === I.Model || o.type === I.Material || o.type === I.Picture || o.type === I.Shape ? (r > 1 || e) && a.push(o.stepName) : a.push(o.stepName));
1326
+ o.silent || (o.type === I.Model || o.type === I.Material || o.type === I.Picture || o.type === I.Shape ? (r > 1 || e) && a.push(o.stepName) : a.push(o.stepName));
1327
1327
  }
1328
1328
  const n = t.filter((i) => i.renderableSteps.filter(
1329
1329
  (r) => a.includes(r.stepName)
@@ -6779,7 +6779,8 @@ class CA {
6779
6779
  e.reloadedState,
6780
6780
  e.readOnly,
6781
6781
  e.modelContainer,
6782
- e.isReloadedTransaction
6782
+ e.isReloadedTransaction,
6783
+ e.singleVariantsRenderable
6783
6784
  ), this.workflowManager.addSelectionCallback((n) => {
6784
6785
  const s = n.traversableScenes.map((i) => {
6785
6786
  const o = i.renderableSteps.map((r) => r.stepName);
@@ -556,7 +556,7 @@
556
556
  workflowState
557
557
  }
558
558
  }
559
- `,xe=l=>{const e=[];for(const t of l.steps)switch(t.type){case c.StepType.DigitalContent:t.data.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Frame:const a=t.data;a.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),a.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Illustration:const n=t.data;n.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Colors});break;case c.StepType.Material:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Model:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Picture:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Question:t.data.varySelections&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selections});break;case c.StepType.Shape:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Text:const d=t.data;d.varyText&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Text}),d.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),d.varyColor&&d.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Color});break}return e},ce=[c.StepType.SilentIllustration,c.StepType.ProductOverlay],GA=async(l,e,t)=>{var a;const A=[];l.introduction&&A.push({name:"Introduction",title:l.name,renderableSteps:[{type:c.StepType.Introduction,stepName:"Introduction",stepTitle:l.name,helpText:l.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of l.steps){if(e.bulkScene){let o=!1;switch(n.type){case c.StepType.DigitalContent:n.data.varyUpload&&(o=!0);break;case c.StepType.Frame:{const s=n.data;s.varyUpload&&(s.varySelection||!n.option)&&(o=!0)}break;case c.StepType.Illustration:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColors||!s.colorPickerEnabled)&&(o=!0)}break;case c.StepType.Material:n.data.varySelection&&(o=!0);break;case c.StepType.Model:n.data.varySelection&&(o=!0);break;case c.StepType.Picture:n.data.varySelection&&(o=!0);break;case c.StepType.Question:n.data.varySelections&&(o=!0);break;case c.StepType.Shape:n.data.varySelection&&(o=!0);break;case c.StepType.Text:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColor||!s.colorPickerEnabled||!s.colorOption)&&s.varyText&&(o=!0)}break}if(o)continue}const i=vA(n.stepName,l.stepGroups);if(!i)A.push({name:n.stepName,title:n.stepTitle,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]});else{const o=A.find(s=>s.name===i.name);o?ce.includes(n.type)?o.silentSteps.push(n):o.renderableSteps.push(n):A.push({name:i.name,title:i.name,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]})}}if(e.bulkScene){const n=(a=t==null?void 0:t.product)==null?void 0:a.bulkConfiguration;A.push({name:"Bulk",title:(n==null?void 0:n.sceneTitle)??e.bulkSceneTitle,renderableSteps:[{type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(n==null?void 0:n.stepTitle)??e.bulkSceneTitle,helpText:n==null?void 0:n.helpText,data:{aspects:xe(l)},conditions:[]}],silentSteps:[]})}return e.finishScene&&A.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:c.StepType.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:l.finalizeStepConfig?l.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:l.finalizeStepConfig?l.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),A},vA=(l,e)=>e.find(t=>t.stepNames.includes(l)),Z=(l,e)=>(l.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const a=A.selectedVariants;return t.requiredVariantSelections.some(n=>a.find(i=>i.id===n)!==void 0)}return!1}),kA=(l,e)=>{const t={name:l.name,title:l.title,renderableSteps:l.renderableSteps.filter(A=>Z(A,e)),silentSteps:l.silentSteps.filter(A=>Z(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},$=(l,e)=>l.map(t=>kA(t,e)).filter(t=>t!==null),bA=async(l,e,t=!1)=>{var i;const A=$(l,e),a=[];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===c.StepType.Model||s.type===c.StepType.Material||s.type===c.StepType.Picture||s.type===c.StepType.Shape?(r>1||t)&&a.push(s.stepName):a.push(s.stepName))}const n=A.filter(o=>o.renderableSteps.filter(r=>a.includes(r.stepName)).length>0);for(const o of n)o.renderableSteps=o.renderableSteps.filter(s=>a.includes(s.stepName));return n};class He{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e}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.activePromise||(this.activePromise=this.dequeue())}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 Ct(l,e,t,A){const a=t.width*l.zoom,n=t.height*l.zoom;if(A){const o=l,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,l.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=me(l.x,e.width-r,0),o.y=me(l.y,e.height-g,0),o}const i=l;return i.x=me(i.x,-a,e.width),i.y=me(i.y,-n,e.height),i}function me(l,e,t){return Math.min(Math.max(l,e),t)}class Qt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=_e(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const a=A;if(a.currentFrameSources){let n=!1;for(let i=0;i<a.currentFrameSources.length;i++){const o=a.currentFrameSources[i],s=await c.getFrameData(o);et(s,this.frameData)||(this.frameData||(this.frameData=new Array(a.currentFrameSources.length)),this.frameData[i]=s,n=!0)}n&&(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 a=c.frameDataCache.get(t);a&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=a)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,a){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const n=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,g=t[o]-s*e[o],d=A[o]-r*e[o];return{x:g,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(n,a),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 a=this.imageData;if(!a||!this.frameData)return;if(this.frameData.length!==e.length)throw new U("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]=Ct(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,a,this.frameData,this.targetElements,t)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,a,n){if(!A||A.length===0||A.some(o=>!o))throw new U("Frame data not set. This is a bug");if(!this.workflowManager)throw new U("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();a.forEach((o,s)=>{i(new c.UpdateFramePattern(o,t,e[s]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),n&&n()}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,a)=>{const n=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[a]=n,this.maxZoomScale[a]=n*2.5):(this.minZoomScale[a]=n/10,this.maxZoomScale[a]=n*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]=c.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements))}}class ut{constructor(e,t,A){this.processRegion=async a=>{var s,r,g,d;const n=this.layouts.find(B=>B.panelId===a.panelId);if(!n)throw new k(a);let i="";if(this.configuration.type===c.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ne(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===c.LayoutElementType.Image){const B=this.configuration.type===c.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:c.generate(),src:B,type:o,y:a.top,x:a.left,width:a.width,height:a.height,layer:a.layer,layerIndex:a.layerIndex,immutable:a.immutable,productOverlay:this.configuration.type===c.StepType.ProductOverlay?!0:void 0,rotation:a.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:a},command:new c.CreateElementCommand(w,n)}}else{const B=this.configuration.type===c.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((E,m)=>{if(!B){m("Undefined vector silent step source");return}c.fetchAsString(B,!0).then(C=>{E(C)}).catch(C=>console.error(C))}),h=await c.generateSVGWithUnknownColors(await w()),Q={stepName:this.configuration.stepName,id:c.generate(),cachedObjectURL:await c.svgObjectURL(h.svg),src:B,svg:h.svg,colors:h.colors,type:o,y:a.top,x:a.left,width:a.width,height:a.height,layer:a.layer,layerIndex:a.layerIndex,rotation:a.rotation,immutable:a.immutable,productOverlay:this.configuration.type===c.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:Q.id,region:a},command:new c.CreateElementCommand(Q,n)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ne(this.configuration,"Missing regions.");if(this.configuration.type===c.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===c.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new k(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,a;const e=this.configuration.type===c.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(a=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:a.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")?c.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),c.LayoutElementType.Illustration)}}const mt=async l=>{const e=`${ie.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:l}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class It{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,a=3e3,n=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=a,this.maxAttempts=n,this.poll()}}class TA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const a=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=a==null?void 0:a.storage)==null?void 0:d.videoShortUrl,g=(B=a==null?void 0:a.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,a,n,i,o,s,r){if(!t&&A!==""&&a===""){const g=async()=>{var F,D;const C=(await ct([A]))[0],I=(D=(F=C==null?void 0:C.versions)==null?void 0:F.find(p=>p.name==="mpeg4"))==null?void 0:D.link;return{asset:C,link:I}},d=await new Promise((C,I)=>{new It(async()=>!!(await g()).link,async()=>{const F=await g();if(!F.link||!F.link)throw new W(F.asset);C({rel:"mpeg4",href:F.link})},()=>{I("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(C=>s(new c.DeleteElementCommand(C.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 h=w.toString();if(h.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const Q=await mt(h);if(o(Q),!i.data||!i.data.regions)throw new ne(i,"Missing regions.");const E=await this.regionElements(i),m=await this.command(Q,E,n,i.stepName);m&&(m.command&&n.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await n.setSelectionsAndElements(i.stepName,[],E,async()=>{n.updateStorage(i.stepName,{videoShortUrl:Q,videoUrl:a}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:c.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,a){const n=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await tt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,d=n.find(B=>B.panelId===(g==null?void 0:g.panelId));if(!d&&g)throw new k(g);if(d&&!g)throw new Error("Region not found");if(!d||!g)throw new Error("Neither a region or layout found!");return new c.CreateElementCommand({stepRegion:g,stepName:a,id:r.id,src:o,type:c.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},d)});return{command:new c.GroupCommand(s),followup:async()=>{}}}}const ft=new TA;class JA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return c.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new z(e);const a=A.fileLink;if(a)return c.fetchAsString(a,!0);throw new W(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 a=e.option,n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,n,[],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 a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName).map(g=>({id:g.id,region:g.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const g=e.data.regions.map(d=>c.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:g})}if(a){const g=async()=>{var w,h,Q,E;const d=(w=a.storage)==null?void 0:w.framePatternSrc,B=(h=a.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(Q=t.getStepSpecificServices(e.stepName))==null?void 0:Q.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=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(a.selectedVariants&&a.selectedVariants.length>0){const d=a.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(h=>this.frameSourceSvg(B,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new It(async()=>{var s;const i=(s=(await b.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{b.getLocalOrFromServer(t.key||"").then(n=>{this.loadPatternFromAsset(n,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({id:e,type:c.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/a.frameData.width,scaleY:t.height/a.frameData.height,path:a.frameData.path,dataWidth:a.frameData.width,dataHeight:a.frameData.height,stepRegion:t,stepName:a.stepName,disablePlaceholder:a.disablePlaceholder,focalBlur:a.focalBlur,focalBlurStrength:a.focalBlurStrength,focalBlurRadius:a.focalBlurRadius,pattern:a.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await c.GetSVGDimensions(e),a=A.width,n=A.height,i={src:e,width:a,height:n,aspect:a/n};c.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await c.fetchAsArrayBuffer(e,!0),a=await c.getAttributesFromArrayBuffer(A),n={src:e,width:a.width,height:a.height,aspect:a.width/a.height};c.patternImageDataCache.set(e,n),t.setPatternData(n)}}async selectVariantCommand(e,t,A,a,n,i){var B;const o=(B=a.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)));n&&n(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const Q=await c.getFrameData(s[h]),E=o.getImageData(),m=A.map(f=>new c.DeleteElementCommand(f.id)),C=E?c.calculateOffsets(E,Q):void 0,I=E?{id:c.generate(),src:E.src,x:(C==null?void 0:C.x)||0,y:(C==null?void 0:C.y)||0,width:E.width,height:E.height,scaleX:(C==null?void 0:C.zoom)||1,scaleY:(C==null?void 0:C.zoom)||1,rotation:0}:void 0,F=c.generate(),p=a.getLayouts().find(f=>f.panelId===w.panelId);if(!p)throw new k(w);return{command:this.getCreateElementCommand(F,w,p,{frameData:Q,pattern:I,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:F,region:w},removeExistingCommands:m}})),g=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new c.GroupCommand([...g,...d]),followup:async()=>{n&&n(!1),await a.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(a.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=a.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!h)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,h)}})}}}patternSource(e){var a;const t=(a=e.versions)==null?void 0:a.find(n=>n.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new W(e)}async loadPatternFromAsset(e,t,A){var o;const a=this.patternSource(e),n=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(a,i),A.updateMetadata(t.stepName,{image:a}),A.updateStorage(t.stepName,{framePatternSrc:a}),A.markUpdateCompleted(n)}}const Ie=new JA;class LA{async getIllustrationBody(e){return new Promise(t=>{c.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({stepRegion:t,stepName:a.stepName,colors:a.svg.colors,id:e,src:a.src,svg:a.svg.svg,cachedObjectURL:a.objectURL,type:c.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 c.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const a=e.option;if(!a)return null;if(A)return this.reload(e,t,A);{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantCommand(e,n,[],()=>{},t)}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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=a.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 a;const A=e.data.colorOption;return A?A?(a=A.variants)==null?void 0:a.map(n=>({fill:n.color,stroke:n.color,variant:n})):[]:[]}async changeColorsCommand(e,t,A,a,n){var g;const i={};for(const[d,B]of n.entries())i[d]={browserValue:B,spotColor:(g=i[d])==null?void 0:g.spotColor};const o=c.modifySVGWithElementProperties(e,t,A,i),s=await c.svgObjectURL(o),r=[];for(const d of a){for(const[B,w]of n.entries())r.push(new c.IllustrationColorCommand(d,B,w));r.push(new c.IllustrationCacheCommand(d,o,s))}return new c.GroupCommand(r)}async changeColors(e,t,A,a,n){var w,h;if(t.length===0)return;const i=c.findElement(t[0].id,a().map(Q=>Q.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([Q,E])=>{const m={browserValue:E.browserValue},C=E.spotColor;C&&(m.spotColor={profileName:C.profileName,namedColor:C.namedColor}),s[Q]=m});for(const[Q,E]of n.entries())o[Q]={browserValue:E,spotColor:(w=o[Q])==null?void 0:w.spotColor},s[Q]={browserValue:E};let r=Array.from(Object.values(o)).map(Q=>Q.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(Q=>{r=r.map(E=>{var m;return E.toLowerCase()===((m=Q.color)==null?void 0:m.toLowerCase())?Q.name:E})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([Q,E])=>{d.set(Q,E.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(Q=>Q.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,a,n){var m;if(!e.data||!e.data.regions)throw new ne(e,"Missing regions.");a(!0);const i=A.map(C=>new c.DeleteElementCommand(C.id));n.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new z(t);const s=o.fileLink;if(!s)throw new W(o);const r=await c.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),g=await c.svgObjectURL(r.svg),d=C=>{const I=n.getLayouts().find(D=>D.panelId===C.panelId);if(!I)throw new k(C);const F=c.generate();return{regionElement:{id:F,region:C},command:this.getCreateElementCommand(F,C,I,{stepName:e.stepName,src:s,objectURL:g,svg:r})}},B=e.data.regions.map(d),h=[...B.map(C=>C.command),...i];let Q=Array.from(Object.values(r.colors)).map(C=>C.browserValue);const E=e.data.colorOption;return E&&((m=E.variants)==null||m.forEach(C=>{Q=Q.map(I=>{var F;return I.toLowerCase()===((F=C.color)==null?void 0:F.toLowerCase())?C.name:I})})),n.updateMetadata(e.stepName,{colors:Q}),{command:new c.GroupCommand(h),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[t],B.map(C=>C.regionElement),async()=>{n.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ge=new LA;class OA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=d.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const h=t.getModelContainer();if(h){const Q=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",B||{}));Promise.all(Q).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){const n=A.getModelContainer();a(!0);const i=t.material;if(!i)throw a(!1),new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{n&&e.data.targetMaterials.forEach(o=>{e.option&&n.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const Ge=new OA;class zA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const Q=(h=d.asset)==null?void 0:h.fileLink;if(!Q)throw new z(d);await w.applyModelVariant(e.stepName||"",{model:Q,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){var i;a(!0);const n=(i=t.asset)==null?void 0:i.fileLink;if(!n)throw new z(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:n,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const ve=new zA;class jA{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 a=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,g;t.updateStorage(e.stepName,{text:(r=a==null?void 0:a.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=a==null?void 0:a.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,a,n){const i=await this.changeTextCommand(e,t,A,a,n);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,a,n){var g;const i=A.getRegionElements(e.stepName),o=(g=A.getStepSpecificServices(e.stepName))==null?void 0:g.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,n))return A.setMandatoryFulfilled(e.stepName,!1),console.error(a),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 h=w||c.generate(),E=A.getLayouts().find(C=>C.panelId===B.panelId);if(!E)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new c.DeleteElementCommand(h)),m.push(new c.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:h,svg:d,type:c.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},E)),{id:h,region:B,command:new c.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const h=o.svgPrint(t,w.region);return r(h,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new c.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 c.GroupCommand(B),followup:async()=>{const w=d.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,a){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return a("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return a("Unsupported characters."),!1;const n=ye.split(t.toLowerCase());for(const i of n)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return a("Blocked profanity."),!1}return a(""),!0}}const Dt=new jA;class KA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else if(a.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,a.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(e,t,A,a){const n=t.asset;if(!n)throw new z(t);const i=n==null?void 0:n.fileLink;if(!i)return console.error("No URL for picture!"),null;a(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new c.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(Q=>Q.panelId===d.panelId);if(!w)throw new k(d);const h=c.generate();return{regionElement:{id:h,region:d},command:new c.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:h,src:i,type:c.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)}},g=e.data.regions.map(r);return{command:new c.GroupCommand([...s,...g.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],g.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ke=new KA;class VA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else{const n=a.variants;if(T.getDefaultVariant(a)){const o=n==null?void 0:n.find(s=>{var r;return s.id===((r=a.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 a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),n=e.option;if(a!=null&&a.selectedVariants){const o=a.selectedVariants[0].id;if(n&&o){const s=(i=n.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 a=await this.selectVariantLambda(e,t,A);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A){const a=e.option;if(!a)return null;const n=a.variants;if(!n)return null;const i=n.length>1?n.find(o=>o.id===t):n[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 VA;class WA{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(a=>({fill:a.color,stroke:a.color,variant:a})))||[]:[]}setCustomColor(e,t,A){const a=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!a.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new k(s);return new c.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new c.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,{fill:n.color,stroke:n.color,variant:n},[],t):null}return null}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&a.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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=a==null?void 0:a.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,a){var s;const n=a.getLayouts(),i=(s=a.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,g;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((g=t.variant)!=null&&g.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(!n.find(Q=>Q.panelId===(B==null?void 0:B.panelId)))throw new k(B);const h=o();return new c.IllustrationColorCommand(d.id,this.shapeFillId,h)},g=A.map(r).filter(d=>!!d);return{command:new c.GroupCommand(g),followup:async()=>{await a.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),a.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=n.find(I=>I.panelId===w.panelId);if(!h)throw new k(w);const Q=o(),E=`
559
+ `,xe=l=>{const e=[];for(const t of l.steps)switch(t.type){case c.StepType.DigitalContent:t.data.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Frame:const a=t.data;a.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),a.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Illustration:const n=t.data;n.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Colors});break;case c.StepType.Material:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Model:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Picture:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Question:t.data.varySelections&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selections});break;case c.StepType.Shape:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Text:const d=t.data;d.varyText&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Text}),d.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),d.varyColor&&d.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Color});break}return e},ce=[c.StepType.SilentIllustration,c.StepType.ProductOverlay],GA=async(l,e,t)=>{var a;const A=[];l.introduction&&A.push({name:"Introduction",title:l.name,renderableSteps:[{type:c.StepType.Introduction,stepName:"Introduction",stepTitle:l.name,helpText:l.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of l.steps){if(e.bulkScene){let o=!1;switch(n.type){case c.StepType.DigitalContent:n.data.varyUpload&&(o=!0);break;case c.StepType.Frame:{const s=n.data;s.varyUpload&&(s.varySelection||!n.option)&&(o=!0)}break;case c.StepType.Illustration:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColors||!s.colorPickerEnabled)&&(o=!0)}break;case c.StepType.Material:n.data.varySelection&&(o=!0);break;case c.StepType.Model:n.data.varySelection&&(o=!0);break;case c.StepType.Picture:n.data.varySelection&&(o=!0);break;case c.StepType.Question:n.data.varySelections&&(o=!0);break;case c.StepType.Shape:n.data.varySelection&&(o=!0);break;case c.StepType.Text:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColor||!s.colorPickerEnabled||!s.colorOption)&&s.varyText&&(o=!0)}break}if(o)continue}const i=vA(n.stepName,l.stepGroups);if(!i)A.push({name:n.stepName,title:n.stepTitle,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]});else{const o=A.find(s=>s.name===i.name);o?ce.includes(n.type)?o.silentSteps.push(n):o.renderableSteps.push(n):A.push({name:i.name,title:i.name,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]})}}if(e.bulkScene){const n=(a=t==null?void 0:t.product)==null?void 0:a.bulkConfiguration;A.push({name:"Bulk",title:(n==null?void 0:n.sceneTitle)??e.bulkSceneTitle,renderableSteps:[{type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(n==null?void 0:n.stepTitle)??e.bulkSceneTitle,helpText:n==null?void 0:n.helpText,data:{aspects:xe(l)},conditions:[]}],silentSteps:[]})}return e.finishScene&&A.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:c.StepType.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:l.finalizeStepConfig?l.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:l.finalizeStepConfig?l.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),A},vA=(l,e)=>e.find(t=>t.stepNames.includes(l)),Z=(l,e)=>(l.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const a=A.selectedVariants;return t.requiredVariantSelections.some(n=>a.find(i=>i.id===n)!==void 0)}return!1}),kA=(l,e)=>{const t={name:l.name,title:l.title,renderableSteps:l.renderableSteps.filter(A=>Z(A,e)),silentSteps:l.silentSteps.filter(A=>Z(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},$=(l,e)=>l.map(t=>kA(t,e)).filter(t=>t!==null),bA=async(l,e,t=!1)=>{var i;const A=$(l,e),a=[];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===c.StepType.Model||s.type===c.StepType.Material||s.type===c.StepType.Picture||s.type===c.StepType.Shape?(r>1||t)&&a.push(s.stepName):a.push(s.stepName))}const n=A.filter(o=>o.renderableSteps.filter(r=>a.includes(r.stepName)).length>0);for(const o of n)o.renderableSteps=o.renderableSteps.filter(s=>a.includes(s.stepName));return n};class He{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e}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.activePromise||(this.activePromise=this.dequeue())}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 Ct(l,e,t,A){const a=t.width*l.zoom,n=t.height*l.zoom;if(A){const o=l,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,l.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=me(l.x,e.width-r,0),o.y=me(l.y,e.height-g,0),o}const i=l;return i.x=me(i.x,-a,e.width),i.y=me(i.y,-n,e.height),i}function me(l,e,t){return Math.min(Math.max(l,e),t)}class Qt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=_e(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const a=A;if(a.currentFrameSources){let n=!1;for(let i=0;i<a.currentFrameSources.length;i++){const o=a.currentFrameSources[i],s=await c.getFrameData(o);et(s,this.frameData)||(this.frameData||(this.frameData=new Array(a.currentFrameSources.length)),this.frameData[i]=s,n=!0)}n&&(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 a=c.frameDataCache.get(t);a&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=a)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,a){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const n=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,g=t[o]-s*e[o],d=A[o]-r*e[o];return{x:g,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(n,a),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 a=this.imageData;if(!a||!this.frameData)return;if(this.frameData.length!==e.length)throw new U("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]=Ct(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,a,this.frameData,this.targetElements,t)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,a,n){if(!A||A.length===0||A.some(o=>!o))throw new U("Frame data not set. This is a bug");if(!this.workflowManager)throw new U("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();a.forEach((o,s)=>{i(new c.UpdateFramePattern(o,t,e[s]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),n&&n()}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,a)=>{const n=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[a]=n,this.maxZoomScale[a]=n*2.5):(this.minZoomScale[a]=n/10,this.maxZoomScale[a]=n*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]=c.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements))}}class ut{constructor(e,t,A){this.processRegion=async a=>{var s,r,g,d;const n=this.layouts.find(B=>B.panelId===a.panelId);if(!n)throw new k(a);let i="";if(this.configuration.type===c.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ne(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===c.LayoutElementType.Image){const B=this.configuration.type===c.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:c.generate(),src:B,type:o,y:a.top,x:a.left,width:a.width,height:a.height,layer:a.layer,layerIndex:a.layerIndex,immutable:a.immutable,productOverlay:this.configuration.type===c.StepType.ProductOverlay?!0:void 0,rotation:a.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:a},command:new c.CreateElementCommand(w,n)}}else{const B=this.configuration.type===c.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((E,m)=>{if(!B){m("Undefined vector silent step source");return}c.fetchAsString(B,!0).then(C=>{E(C)}).catch(C=>console.error(C))}),h=await c.generateSVGWithUnknownColors(await w()),Q={stepName:this.configuration.stepName,id:c.generate(),cachedObjectURL:await c.svgObjectURL(h.svg),src:B,svg:h.svg,colors:h.colors,type:o,y:a.top,x:a.left,width:a.width,height:a.height,layer:a.layer,layerIndex:a.layerIndex,rotation:a.rotation,immutable:a.immutable,productOverlay:this.configuration.type===c.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:Q.id,region:a},command:new c.CreateElementCommand(Q,n)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ne(this.configuration,"Missing regions.");if(this.configuration.type===c.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===c.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new k(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,a;const e=this.configuration.type===c.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(a=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:a.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")?c.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),c.LayoutElementType.Illustration)}}const mt=async l=>{const e=`${ie.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:l}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class It{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,a=3e3,n=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=a,this.maxAttempts=n,this.poll()}}class TA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const a=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=a==null?void 0:a.storage)==null?void 0:d.videoShortUrl,g=(B=a==null?void 0:a.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,a,n,i,o,s,r){if(!t&&A!==""&&a===""){const g=async()=>{var F,D;const C=(await ct([A]))[0],I=(D=(F=C==null?void 0:C.versions)==null?void 0:F.find(p=>p.name==="mpeg4"))==null?void 0:D.link;return{asset:C,link:I}},d=await new Promise((C,I)=>{new It(async()=>!!(await g()).link,async()=>{const F=await g();if(!F.link||!F.link)throw new W(F.asset);C({rel:"mpeg4",href:F.link})},()=>{I("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(C=>s(new c.DeleteElementCommand(C.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 h=w.toString();if(h.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const Q=await mt(h);if(o(Q),!i.data||!i.data.regions)throw new ne(i,"Missing regions.");const E=await this.regionElements(i),m=await this.command(Q,E,n,i.stepName);m&&(m.command&&n.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await n.setSelectionsAndElements(i.stepName,[],E,async()=>{n.updateStorage(i.stepName,{videoShortUrl:Q,videoUrl:a}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:c.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,a){const n=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await tt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,d=n.find(B=>B.panelId===(g==null?void 0:g.panelId));if(!d&&g)throw new k(g);if(d&&!g)throw new Error("Region not found");if(!d||!g)throw new Error("Neither a region or layout found!");return new c.CreateElementCommand({stepRegion:g,stepName:a,id:r.id,src:o,type:c.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},d)});return{command:new c.GroupCommand(s),followup:async()=>{}}}}const ft=new TA;class JA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return c.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new z(e);const a=A.fileLink;if(a)return c.fetchAsString(a,!0);throw new W(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 a=e.option,n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,n,[],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 a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName).map(g=>({id:g.id,region:g.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const g=e.data.regions.map(d=>c.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:g})}if(a){const g=async()=>{var w,h,Q,E;const d=(w=a.storage)==null?void 0:w.framePatternSrc,B=(h=a.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(Q=t.getStepSpecificServices(e.stepName))==null?void 0:Q.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=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(a.selectedVariants&&a.selectedVariants.length>0){const d=a.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(h=>this.frameSourceSvg(B,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new It(async()=>{var s;const i=(s=(await b.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{b.getLocalOrFromServer(t.key||"").then(n=>{this.loadPatternFromAsset(n,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({id:e,type:c.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/a.frameData.width,scaleY:t.height/a.frameData.height,path:a.frameData.path,dataWidth:a.frameData.width,dataHeight:a.frameData.height,stepRegion:t,stepName:a.stepName,disablePlaceholder:a.disablePlaceholder,focalBlur:a.focalBlur,focalBlurStrength:a.focalBlurStrength,focalBlurRadius:a.focalBlurRadius,pattern:a.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await c.GetSVGDimensions(e),a=A.width,n=A.height,i={src:e,width:a,height:n,aspect:a/n};c.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await c.fetchAsArrayBuffer(e,!0),a=await c.getAttributesFromArrayBuffer(A),n={src:e,width:a.width,height:a.height,aspect:a.width/a.height};c.patternImageDataCache.set(e,n),t.setPatternData(n)}}async selectVariantCommand(e,t,A,a,n,i){var B;const o=(B=a.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)));n&&n(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const Q=await c.getFrameData(s[h]),E=o.getImageData(),m=A.map(f=>new c.DeleteElementCommand(f.id)),C=E?c.calculateOffsets(E,Q):void 0,I=E?{id:c.generate(),src:E.src,x:(C==null?void 0:C.x)||0,y:(C==null?void 0:C.y)||0,width:E.width,height:E.height,scaleX:(C==null?void 0:C.zoom)||1,scaleY:(C==null?void 0:C.zoom)||1,rotation:0}:void 0,F=c.generate(),p=a.getLayouts().find(f=>f.panelId===w.panelId);if(!p)throw new k(w);return{command:this.getCreateElementCommand(F,w,p,{frameData:Q,pattern:I,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:F,region:w},removeExistingCommands:m}})),g=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new c.GroupCommand([...g,...d]),followup:async()=>{n&&n(!1),await a.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(a.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=a.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!h)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,h)}})}}}patternSource(e){var a;const t=(a=e.versions)==null?void 0:a.find(n=>n.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new W(e)}async loadPatternFromAsset(e,t,A){var o;const a=this.patternSource(e),n=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(a,i),A.updateMetadata(t.stepName,{image:a}),A.updateStorage(t.stepName,{framePatternSrc:a}),A.markUpdateCompleted(n)}}const Ie=new JA;class LA{async getIllustrationBody(e){return new Promise(t=>{c.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({stepRegion:t,stepName:a.stepName,colors:a.svg.colors,id:e,src:a.src,svg:a.svg.svg,cachedObjectURL:a.objectURL,type:c.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 c.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const a=e.option;if(!a)return null;if(A)return this.reload(e,t,A);{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantCommand(e,n,[],()=>{},t)}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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=a.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 a;const A=e.data.colorOption;return A?A?(a=A.variants)==null?void 0:a.map(n=>({fill:n.color,stroke:n.color,variant:n})):[]:[]}async changeColorsCommand(e,t,A,a,n){var g;const i={};for(const[d,B]of n.entries())i[d]={browserValue:B,spotColor:(g=i[d])==null?void 0:g.spotColor};const o=c.modifySVGWithElementProperties(e,t,A,i),s=await c.svgObjectURL(o),r=[];for(const d of a){for(const[B,w]of n.entries())r.push(new c.IllustrationColorCommand(d,B,w));r.push(new c.IllustrationCacheCommand(d,o,s))}return new c.GroupCommand(r)}async changeColors(e,t,A,a,n){var w,h;if(t.length===0)return;const i=c.findElement(t[0].id,a().map(Q=>Q.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([Q,E])=>{const m={browserValue:E.browserValue},C=E.spotColor;C&&(m.spotColor={profileName:C.profileName,namedColor:C.namedColor}),s[Q]=m});for(const[Q,E]of n.entries())o[Q]={browserValue:E,spotColor:(w=o[Q])==null?void 0:w.spotColor},s[Q]={browserValue:E};let r=Array.from(Object.values(o)).map(Q=>Q.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(Q=>{r=r.map(E=>{var m;return E.toLowerCase()===((m=Q.color)==null?void 0:m.toLowerCase())?Q.name:E})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([Q,E])=>{d.set(Q,E.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(Q=>Q.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,a,n){var m;if(!e.data||!e.data.regions)throw new ne(e,"Missing regions.");a(!0);const i=A.map(C=>new c.DeleteElementCommand(C.id));n.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new z(t);const s=o.fileLink;if(!s)throw new W(o);const r=await c.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),g=await c.svgObjectURL(r.svg),d=C=>{const I=n.getLayouts().find(D=>D.panelId===C.panelId);if(!I)throw new k(C);const F=c.generate();return{regionElement:{id:F,region:C},command:this.getCreateElementCommand(F,C,I,{stepName:e.stepName,src:s,objectURL:g,svg:r})}},B=e.data.regions.map(d),h=[...B.map(C=>C.command),...i];let Q=Array.from(Object.values(r.colors)).map(C=>C.browserValue);const E=e.data.colorOption;return E&&((m=E.variants)==null||m.forEach(C=>{Q=Q.map(I=>{var F;return I.toLowerCase()===((F=C.color)==null?void 0:F.toLowerCase())?C.name:I})})),n.updateMetadata(e.stepName,{colors:Q}),{command:new c.GroupCommand(h),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[t],B.map(C=>C.regionElement),async()=>{n.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ge=new LA;class OA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(!s)throw new ae(e);if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=d.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const h=t.getModelContainer();if(h){const Q=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",B||{}));Promise.all(Q).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){const n=A.getModelContainer();a(!0);const i=t.material;if(!i)throw a(!1),new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{n&&e.data.targetMaterials.forEach(o=>{e.option&&n.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const Ge=new OA;class zA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const Q=(h=d.asset)==null?void 0:h.fileLink;if(!Q)throw new z(d);await w.applyModelVariant(e.stepName||"",{model:Q,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){var i;a(!0);const n=(i=t.asset)==null?void 0:i.fileLink;if(!n)throw new z(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:n,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const ve=new zA;class jA{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 a=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,g;t.updateStorage(e.stepName,{text:(r=a==null?void 0:a.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=a==null?void 0:a.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,a,n){const i=await this.changeTextCommand(e,t,A,a,n);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,a,n){var g;const i=A.getRegionElements(e.stepName),o=(g=A.getStepSpecificServices(e.stepName))==null?void 0:g.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,n))return A.setMandatoryFulfilled(e.stepName,!1),console.error(a),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 h=w||c.generate(),E=A.getLayouts().find(C=>C.panelId===B.panelId);if(!E)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new c.DeleteElementCommand(h)),m.push(new c.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:h,svg:d,type:c.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},E)),{id:h,region:B,command:new c.GroupCommand(m)}};if(i.length>0){const B=i.map(w=>{if(!w.region)return null;const h=o.svgPrint(t,w.region);return r(h,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new c.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 c.GroupCommand(B),followup:async()=>{const w=d.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,a){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return a("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return a("Unsupported characters."),!1;const n=ye.split(t.toLowerCase());for(const i of n)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return a("Blocked profanity."),!1}return a(""),!0}}const Dt=new jA;class KA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else if(a.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,a.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(e,t,A,a){const n=t.asset;if(!n)throw new z(t);const i=n==null?void 0:n.fileLink;if(!i)return console.error("No URL for picture!"),null;a(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new c.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(Q=>Q.panelId===d.panelId);if(!w)throw new k(d);const h=c.generate();return{regionElement:{id:h,region:d},command:new c.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:h,src:i,type:c.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)}},g=e.data.regions.map(r);return{command:new c.GroupCommand([...s,...g.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],g.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ke=new KA;class VA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else{const n=a.variants;if(T.getDefaultVariant(a)){const o=n==null?void 0:n.find(s=>{var r;return s.id===((r=a.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 a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),n=e.option;if(a!=null&&a.selectedVariants){const o=a.selectedVariants[0].id;if(n&&o){const s=(i=n.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 a=await this.selectVariantLambda(e,t,A);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A){const a=e.option;if(!a)return null;const n=a.variants;if(!n)return null;const i=n.length>1?n.find(o=>o.id===t):n[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 VA;class WA{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(a=>({fill:a.color,stroke:a.color,variant:a})))||[]:[]}setCustomColor(e,t,A){const a=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!a.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new k(s);return new c.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new c.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,{fill:n.color,stroke:n.color,variant:n},[],t):null}return null}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&a.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async reload(e,t,A){var r;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);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=a==null?void 0:a.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,a){var s;const n=a.getLayouts(),i=(s=a.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,g;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((g=t.variant)!=null&&g.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(!n.find(Q=>Q.panelId===(B==null?void 0:B.panelId)))throw new k(B);const h=o();return new c.IllustrationColorCommand(d.id,this.shapeFillId,h)},g=A.map(r).filter(d=>!!d);return{command:new c.GroupCommand(g),followup:async()=>{await a.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),a.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=n.find(I=>I.panelId===w.panelId);if(!h)throw new k(w);const Q=o(),E=`
560
560
  <svg
561
561
  xmlns="http://www.w3.org/2000/svg"
562
562
  xmlnsXlink="http://www.w3.org/1999/xlink"
@@ -1926,7 +1926,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
1926
1926
  }
1927
1927
  }
1928
1928
  }
1929
- `,wa=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:l.name,layouts:l.layouts,workflowId:l.workflowId,transactionId:l.transactionId,previewImage:l.previewImage,useThreeDimPreview:l.useThreeDimPreview,metadata:l.metadata,selectedVariants:l.selectedVariants}})).data)==null?void 0:t.designCreate},Ea=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:da,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:l.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=(l,e,t)=>{const A=n=>{const i={};if(n.type==="Frame"){const o=l[n.stepName],s=n.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${n.stepTitle} image`]=o.image}if(n.type==="Illustration"){const o=l[n.stepName],s=n.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${n.stepTitle} colors`]=r}}if(n.type==="Module"){const o=l[n.stepName],s=n.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${n.stepTitle} text`]=o.text}if(n.type==="Text"){const o=l[n.stepName];if(!o)return i;const s=n.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${n.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${n.stepTitle} color`]=o.color)}return i},a={};return e.steps.forEach(n=>{Object.assign(a,A(n))}),a},ha=(l,e,t,A)=>{const a={};let n;if(t){n=je(t,e,!1);for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}else if(A){n=A;for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}for(const i of Object.keys(l)){const o=l[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)a[`${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++)a[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return a},zt=(l,e,t,A,a,n,i,o,s,r)=>{const d=(P.getMap("transactionOwnerIds")||new Map).get(l.id),B={baseCost:t,designProductId:l.externalDesignProductId,designProductVariantId:l.externalDesignProductVariantId,event:"onComplete",exportedData:n,externalCartProductId:l.externalCartProductId,externalCartProductVariantId:l.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:A,processExecutionId:r,transactionId:l.id,transactionOwnerId:d,weight:e.weight,workflowViewerLink:l.workflowViewerLink||"",workflowViewerReadOnlyLink:l.workflowViewerReadOnlyLink||""};return a&&(B.metadata=a),o&&(B.selectedVariants=o),s&&(B.sku=s),B},Ca=(l,e,t,A)=>{const a=(e.basePrice||0)*(l.variationsCount||0),n=l.priceModifierTotal||0,i={items:{value:l.variationsCount?`${l.variationsCount}`:"0",priceModifier:0}};return zt(l,e,a,n,void 0,i,t,void 0,void 0,A)},jt=async(l,e,t,A,a,n,i,o)=>{const s=e.basePrice||0,r=l.priceModifierTotal||0,g=ha(A,t,void 0,n);return zt(l,e,s,r,n,g,i,A,a,o)},Kt=async(l,e,t,A,a,n,i,o,s,r)=>{var y;await(async()=>{var N;if(r!==void 0)return r;await l.outstandingRequestsPromise();const S=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),G=(N=S.data)==null?void 0:N.transactions[0].workflowState;return S.errors?(S.errors.forEach(v=>{S.errors&&console.log("Server Error:",v.message)}),null):G??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await l.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=l.getPreviewService(),w=(y=e==null?void 0:e.finalizeStepConfig)==null?void 0:y.lookAtAnimation,h=B&&e.showModelOnFinishStep&&!!w,Q=s&&je(s,e,!0),E=s&&je(s,e,!1),m=async Y=>{const S={};let G=0;if(Object.keys(n).length>0)for(const N of Object.keys(n)){const v=n[N],j=e.steps.find(K=>K.stepName===N);for(let K=0;K<v.selections.length;++K){const V=v.selections[K];if(j&&(!Y||j.option&&(j.option.variants||[]).length>1&&!j.data.hideSelectionInCart&&!j.data.hideSelectionsInCart)){const qe=j.stepTitle;S[qe]?S[qe].push({id:V.id||"",name:V.name,priceModifier:V.priceModifier}):S[qe]=[{id:V.id||"",name:V.name,priceModifier:V.priceModifier}]}G+=V.priceModifier}}return[S,G]},[C]=await m(!0),I=Object.fromEntries(Object.keys(C).map(Y=>[Y,C[Y].map(S=>S.id)])),[F]=await m(!1),D=Object.fromEntries(Object.keys(F).map(Y=>[Y,F[Y].map(S=>S.id)])),p=await o(h);return{designDetails:(()=>{const Y={name:i,layouts:t.map(S=>({index:S.index,panelId:S.panelId})),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!h,previewImage:p};if(E){const S=[];for(const[G,N]of Object.entries(E))S.push({key:G,value:N});Y.metadata=S}if(I){const S=[];for(const[G,N]of Object.entries(D))S.push({key:G,ids:N});Y.selectedVariants=S}return Y})(),cartSelectionsWithPrices:C,cartMetadata:Q}},Vt=async(l,e,t,A,a,n,i,o,s,r,g,d,B)=>{var I,F,D;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:w,cartSelectionsWithPrices:h,cartMetadata:Q}=await Kt(l,e,t,A,n,i,o,d,B);s("workflow.steps.finish.finalize.creatingDesign"),n.bulk&&await r(g);const E=await wa(w),m=(I=E==null?void 0:E.transaction)==null?void 0:I.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return n.bulk?Ca(C,a,m,(F=E==null?void 0:E.processExecution)==null?void 0:F.id):await jt(C,a,e,h,E==null?void 0:E.sku,Q,m,(D=E==null?void 0:E.processExecution)==null?void 0:D.id)},Qa=async(l,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(l.map(async i=>{await i.workflowManager.outstandingRequestsPromise()}));const A=await(async()=>{var s;const o=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:l.map(r=>r.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return o.errors?(o.errors.forEach(r=>{o.errors&&console.log("Server Error:",r.message)}),null):(s=o.data)!=null&&s.transactions?o.data.transactions.map(r=>r.workflowState??null):null})(),a=await Promise.all(l.map(async(i,o)=>await Kt(i.workflowManager,i.workflow,i.layouts,i.getReducerState,i.transaction,i.workflowSelections,i.designName,()=>Promise.resolve(void 0),i.workflowMetadata,A?A[o]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const n=await Ea(a.map(i=>i.designDetails));if(!n)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(n.map(async(i,o)=>{var d;const s=l[o],r=a[o],g=i.transaction;return await jt(g,s.product,s.workflow,r.cartSelectionsWithPrices,i.sku,r.cartMetadata,void 0,(d=i.processExecution)==null?void 0:d.id)}))};class ua{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 U("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(a=>a.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(a=>a(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),a=A.find(n=>n.transactionId===e);if(!a)throw new Error(`No saved design for transaction ${e}.`);a.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 U("Unexpected storage method requested")}}const pe=new ua;class de{constructor(e,t){var a;if(this.renderableScenes=[],this.renderableSceneCallbacks=[],this.debouncedSavedDesignUpdate=_e(async()=>{await pe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async n=>new Promise((i,o)=>{try{n.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 c.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new ga(t.workflow,((a=t.product.profanities)==null?void 0:a.map(n=>n.word))||[],A,this.commandContext,n=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(n)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction),this.workflowManager.addSelectionCallback(n=>{const i=n.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s}});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 updateVariationRecords(e){await R.getShadowGraphqlClient().mutate({mutation:UA,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map(t=>({recordNumber:t.recordNumber,values:t.values.map(A=>({aspect:A.aspect,stepName:A.stepName,value:A.value}))}))}})}async createPreviewImage(e,t){var C,I;const A=this.workflowManager.getWorkflow(),a=(C=A==null?void 0:A.finalizeStepConfig)==null?void 0:C.lookAtAnimation;if(e){if(!a)throw new Error("Failed to generate cart preview image!");return await((I=this.workflowManager.getPreviewService())==null?void 0:I.renderSceneScreenshot(512,a))||""}let n=2048;t&&t<=2048&&(n=t);const i=c.createCanvas(n,n),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],g=o.find(F=>{var D;return((D=F.layoutState)==null?void 0:D.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=g.layoutState.layout.previewRegion?{x:g.layoutState.layout.previewRegion.left,y:g.layoutState.layout.previewRegion.top,width:g.layoutState.layout.previewRegion.width,height:g.layoutState.layout.previewRegion.height}:{x:0,y:0,width:g.layoutState.layout.width,height:g.layoutState.layout.height},B=this.commandContext.getLayoutById(g.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const h=c.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:c.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),Q=c.renderPapyrusComponentAsString(h);await(await $e.Pith.from(w,Q,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:c.createCanvas,createImage:c.loadImage,DOMParser:c.getDomParser(),fetch:c.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 Be.get(this.getWorkflowManager(),t)}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.map(a=>a.priceModifier).reduce((a,n)=>a+n)}),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const e=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(e==null?void 0:e.stepTitle)??"workflow.steps.bulk.title",helpText:e==null?void 0:e.helpText,data:{aspects:xe(this.getWorkflowManager().getWorkflow())},conditions:[]};return Be.get(this.getWorkflowManager(),t)}}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>Be.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(a=>a.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>Be.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var a,n,i;const A=(i=(n=(a=(await R.getShadowGraphqlClient().mutate({mutation:xt,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"}})).data)==null?void 0:a.transactionAddStakeholder)==null?void 0:n.stakeholders)==null?void 0:i.find(o=>{var s;return((s=o.customer)==null?void 0:s.emailAddress)===e.emailAddress});if(A!=null&&A.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const o=P.getMap("transactionCustomerIds")||new Map;o.set(this.getWorkflowManager().getTransaction().id,A.customer.id),P.setMap("transactionCustomerIds",o)}}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 U("State undefined!");const a={title:await(async()=>{var s;if(e)return e;const n=this.getWorkflowManager().getTransaction().id,o=(s=(await pe.getSavedDesigns()).find(r=>r.transactionId===n))==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 pe.addDesign(a),a}async copy(){var o;const e=te(this.getCommandContext().getState());if(!e)throw new U("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),a=new sA({}),n=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!n)throw new U("Integration product id is undefined!");return await a.initFromIntegrationProduct(n),await a.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return Vt(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=>this.updateVariationRecords(A),this.workflowManager.getVariationRecords(),A=>t?this.createPreviewImage(A):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==c.StepType.SilentIllustration&&e.type!==c.StepType.ProductOverlay}getExportedData(){var a;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===n);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[n];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(a=Object.keys(A))==null||a.forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===n);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[n].selections[0].name)}),e}}const ma=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Ia=async(l,e,t)=>{const A=e.data,a=t.data.baseUrl,n=A.assetUrl.replace("localhost","localstack"),i=a.slice(0,4)==="http"?"":"https://",o=new URL(i+a);o.searchParams.append("video",c.toBase64(JSON.stringify([{href:n}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),g=`data:image/svg+xml;base64,${c.toBase64(await tt.toString(s,{type:"svg"}))}`,d=w=>{const h=l.find(E=>E.panelId===w.panelId);if(!h)throw new k(w);const Q=c.generate();return new c.CreateElementCommand({id:Q,src:g,type:c.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},h)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},fa=async(l,e,t,A)=>{const a=t.data,n=a.assetUrl,i=await c.getPatternImageData(n);try{const o=c.getVariant(a,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var Q;const g=await c.generateFrameSVG(r||{width:1,height:1},(Q=o==null?void 0:o.asset)==null?void 0:Q.fileLink),d=await c.getFrameData(g),B=c.generate(),w=l.find(E=>E.panelId===r.panelId);if(!w)throw new k(r);const h=c.calculateOffsets(i,d,{scale:a.scale,left:a.x,top:a.y});return[new c.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:c.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 c.UpdateFramePattern(B,i,h)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Da=async(l,e,t,A)=>{var D,p;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((D=n.variants)==null?void 0:D.find(f=>f.id===a.illustrationVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(p=i.asset)==null?void 0:p.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.illustrationVariantId}`),[];const s=await c.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,g=s.match(r)||[],d=(g==null?void 0:g.length)>0?g[0]:"",h=c.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!h)return console.error("Failed to read SVG."),[];c.sanitizeSvgTree(h);const Q={};c.traverse(h,f=>{ma.includes(f.tagName)&&!f.attributes.getNamedItem("fill")&&f.setAttribute("fill","#000000");const y=f.attributes.getNamedItem("fill");if(y&&y.value!=="none"){const S=y.value,N=`spiff-fill-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}const Y=f.attributes.getNamedItem("stroke");if(Y&&Y.value!=="none"){const S=Y.value,N=`spiff-stroke-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}});const m=c.xmlSerializer().serializeToString(h),C=a.colors;if(C){for(const[f,y]of Object.entries(Q))for(const Y of Object.keys(C))if(y.browserValue===Y){Q[f]={browserValue:C[Y]};break}}const I=f=>{const y=l.find(S=>S.panelId===f.panelId);if(!y)throw new k(f);const Y=c.generate();return new c.CreateElementCommand({colors:Q,id:Y,svg:m,type:c.LayoutElementType.Illustration,y:f.top,x:f.left,rotation:f.rotation,width:f.width,height:f.height,layer:f.layer,layerIndex:f.layerIndex,immutable:f.immutable},y)},F=A.data.regions;try{return F.map(I)}catch(f){return console.error(f),[]}},pa=async(l,e,t)=>{const A=await Nt(t.data.module),a=e.data,n=(o,s)=>{const r=l.find(d=>d.panelId===s.panelId);if(!r)throw new k(s);const g=c.generate();return new c.CreateElementCommand({colors:{},id:g,svg:o,type:c.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=>n(A.svgPrint(a.text,o),o))}catch(o){return console.error(o),[]}},Fa=async(l,e,t,A)=>{var g,d;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((g=n.variants)==null?void 0:g.find(B=>B.id===a.pictureVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.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: ${a.pictureVariantId}`),[];const s=B=>{const w=l.find(Q=>Q.panelId===B.panelId);if(!w)throw new k(B);const h=c.generate();return new c.CreateElementCommand({id:h,src:o,type:c.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),[]}},Ma=async(l,e,t,A)=>{var r;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=n.variants)==null?void 0:r.find(g=>g.id===a.colorVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=g=>{const d=l.find(E=>E.panelId===g.panelId);if(!d)throw new k(g);const B=`
1929
+ `,wa=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:l.name,layouts:l.layouts,workflowId:l.workflowId,transactionId:l.transactionId,previewImage:l.previewImage,useThreeDimPreview:l.useThreeDimPreview,metadata:l.metadata,selectedVariants:l.selectedVariants}})).data)==null?void 0:t.designCreate},Ea=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:da,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:l.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=(l,e,t)=>{const A=n=>{const i={};if(n.type==="Frame"){const o=l[n.stepName],s=n.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${n.stepTitle} image`]=o.image}if(n.type==="Illustration"){const o=l[n.stepName],s=n.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${n.stepTitle} colors`]=r}}if(n.type==="Module"){const o=l[n.stepName],s=n.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${n.stepTitle} text`]=o.text}if(n.type==="Text"){const o=l[n.stepName];if(!o)return i;const s=n.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${n.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${n.stepTitle} color`]=o.color)}return i},a={};return e.steps.forEach(n=>{Object.assign(a,A(n))}),a},ha=(l,e,t,A)=>{const a={};let n;if(t){n=je(t,e,!1);for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}else if(A){n=A;for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}for(const i of Object.keys(l)){const o=l[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)a[`${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++)a[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return a},zt=(l,e,t,A,a,n,i,o,s,r)=>{const d=(P.getMap("transactionOwnerIds")||new Map).get(l.id),B={baseCost:t,designProductId:l.externalDesignProductId,designProductVariantId:l.externalDesignProductVariantId,event:"onComplete",exportedData:n,externalCartProductId:l.externalCartProductId,externalCartProductVariantId:l.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:A,processExecutionId:r,transactionId:l.id,transactionOwnerId:d,weight:e.weight,workflowViewerLink:l.workflowViewerLink||"",workflowViewerReadOnlyLink:l.workflowViewerReadOnlyLink||""};return a&&(B.metadata=a),o&&(B.selectedVariants=o),s&&(B.sku=s),B},Ca=(l,e,t,A)=>{const a=(e.basePrice||0)*(l.variationsCount||0),n=l.priceModifierTotal||0,i={items:{value:l.variationsCount?`${l.variationsCount}`:"0",priceModifier:0}};return zt(l,e,a,n,void 0,i,t,void 0,void 0,A)},jt=async(l,e,t,A,a,n,i,o)=>{const s=e.basePrice||0,r=l.priceModifierTotal||0,g=ha(A,t,void 0,n);return zt(l,e,s,r,n,g,i,A,a,o)},Kt=async(l,e,t,A,a,n,i,o,s,r)=>{var y;await(async()=>{var N;if(r!==void 0)return r;await l.outstandingRequestsPromise();const S=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),G=(N=S.data)==null?void 0:N.transactions[0].workflowState;return S.errors?(S.errors.forEach(v=>{S.errors&&console.log("Server Error:",v.message)}),null):G??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await l.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=l.getPreviewService(),w=(y=e==null?void 0:e.finalizeStepConfig)==null?void 0:y.lookAtAnimation,h=B&&e.showModelOnFinishStep&&!!w,Q=s&&je(s,e,!0),E=s&&je(s,e,!1),m=async Y=>{const S={};let G=0;if(Object.keys(n).length>0)for(const N of Object.keys(n)){const v=n[N],j=e.steps.find(K=>K.stepName===N);for(let K=0;K<v.selections.length;++K){const V=v.selections[K];if(j&&(!Y||j.option&&(j.option.variants||[]).length>1&&!j.data.hideSelectionInCart&&!j.data.hideSelectionsInCart)){const qe=j.stepTitle;S[qe]?S[qe].push({id:V.id||"",name:V.name,priceModifier:V.priceModifier}):S[qe]=[{id:V.id||"",name:V.name,priceModifier:V.priceModifier}]}G+=V.priceModifier}}return[S,G]},[C]=await m(!0),I=Object.fromEntries(Object.keys(C).map(Y=>[Y,C[Y].map(S=>S.id)])),[F]=await m(!1),D=Object.fromEntries(Object.keys(F).map(Y=>[Y,F[Y].map(S=>S.id)])),p=await o(h);return{designDetails:(()=>{const Y={name:i,layouts:t.map(S=>({index:S.index,panelId:S.panelId})),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!h,previewImage:p};if(E){const S=[];for(const[G,N]of Object.entries(E))S.push({key:G,value:N});Y.metadata=S}if(I){const S=[];for(const[G,N]of Object.entries(D))S.push({key:G,ids:N});Y.selectedVariants=S}return Y})(),cartSelectionsWithPrices:C,cartMetadata:Q}},Vt=async(l,e,t,A,a,n,i,o,s,r,g,d,B)=>{var I,F,D;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:w,cartSelectionsWithPrices:h,cartMetadata:Q}=await Kt(l,e,t,A,n,i,o,d,B);s("workflow.steps.finish.finalize.creatingDesign"),n.bulk&&await r(g);const E=await wa(w),m=(I=E==null?void 0:E.transaction)==null?void 0:I.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return n.bulk?Ca(C,a,m,(F=E==null?void 0:E.processExecution)==null?void 0:F.id):await jt(C,a,e,h,E==null?void 0:E.sku,Q,m,(D=E==null?void 0:E.processExecution)==null?void 0:D.id)},Qa=async(l,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(l.map(async i=>{await i.workflowManager.outstandingRequestsPromise()}));const A=await(async()=>{var s;const o=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:l.map(r=>r.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return o.errors?(o.errors.forEach(r=>{o.errors&&console.log("Server Error:",r.message)}),null):(s=o.data)!=null&&s.transactions?o.data.transactions.map(r=>r.workflowState??null):null})(),a=await Promise.all(l.map(async(i,o)=>await Kt(i.workflowManager,i.workflow,i.layouts,i.getReducerState,i.transaction,i.workflowSelections,i.designName,()=>Promise.resolve(void 0),i.workflowMetadata,A?A[o]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const n=await Ea(a.map(i=>i.designDetails));if(!n)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(n.map(async(i,o)=>{var d;const s=l[o],r=a[o],g=i.transaction;return await jt(g,s.product,s.workflow,r.cartSelectionsWithPrices,i.sku,r.cartMetadata,void 0,(d=i.processExecution)==null?void 0:d.id)}))};class ua{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 U("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(a=>a.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(a=>a(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),a=A.find(n=>n.transactionId===e);if(!a)throw new Error(`No saved design for transaction ${e}.`);a.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 U("Unexpected storage method requested")}}const pe=new ua;class de{constructor(e,t){var a;if(this.renderableScenes=[],this.renderableSceneCallbacks=[],this.debouncedSavedDesignUpdate=_e(async()=>{await pe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async n=>new Promise((i,o)=>{try{n.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 c.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new ga(t.workflow,((a=t.product.profanities)==null?void 0:a.map(n=>n.word))||[],A,this.commandContext,n=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(n)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable),this.workflowManager.addSelectionCallback(n=>{const i=n.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s}});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 updateVariationRecords(e){await R.getShadowGraphqlClient().mutate({mutation:UA,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map(t=>({recordNumber:t.recordNumber,values:t.values.map(A=>({aspect:A.aspect,stepName:A.stepName,value:A.value}))}))}})}async createPreviewImage(e,t){var C,I;const A=this.workflowManager.getWorkflow(),a=(C=A==null?void 0:A.finalizeStepConfig)==null?void 0:C.lookAtAnimation;if(e){if(!a)throw new Error("Failed to generate cart preview image!");return await((I=this.workflowManager.getPreviewService())==null?void 0:I.renderSceneScreenshot(512,a))||""}let n=2048;t&&t<=2048&&(n=t);const i=c.createCanvas(n,n),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],g=o.find(F=>{var D;return((D=F.layoutState)==null?void 0:D.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=g.layoutState.layout.previewRegion?{x:g.layoutState.layout.previewRegion.left,y:g.layoutState.layout.previewRegion.top,width:g.layoutState.layout.previewRegion.width,height:g.layoutState.layout.previewRegion.height}:{x:0,y:0,width:g.layoutState.layout.width,height:g.layoutState.layout.height},B=this.commandContext.getLayoutById(g.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const h=c.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:c.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),Q=c.renderPapyrusComponentAsString(h);await(await $e.Pith.from(w,Q,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:c.createCanvas,createImage:c.loadImage,DOMParser:c.getDomParser(),fetch:c.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 Be.get(this.getWorkflowManager(),t)}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.map(a=>a.priceModifier).reduce((a,n)=>a+n)}),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const e=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(e==null?void 0:e.stepTitle)??"workflow.steps.bulk.title",helpText:e==null?void 0:e.helpText,data:{aspects:xe(this.getWorkflowManager().getWorkflow())},conditions:[]};return Be.get(this.getWorkflowManager(),t)}}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>Be.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(a=>a.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>Be.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var a,n,i;const A=(i=(n=(a=(await R.getShadowGraphqlClient().mutate({mutation:xt,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"}})).data)==null?void 0:a.transactionAddStakeholder)==null?void 0:n.stakeholders)==null?void 0:i.find(o=>{var s;return((s=o.customer)==null?void 0:s.emailAddress)===e.emailAddress});if(A!=null&&A.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const o=P.getMap("transactionCustomerIds")||new Map;o.set(this.getWorkflowManager().getTransaction().id,A.customer.id),P.setMap("transactionCustomerIds",o)}}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 U("State undefined!");const a={title:await(async()=>{var s;if(e)return e;const n=this.getWorkflowManager().getTransaction().id,o=(s=(await pe.getSavedDesigns()).find(r=>r.transactionId===n))==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 pe.addDesign(a),a}async copy(){var o;const e=te(this.getCommandContext().getState());if(!e)throw new U("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),a=new sA({}),n=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!n)throw new U("Integration product id is undefined!");return await a.initFromIntegrationProduct(n),await a.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return Vt(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=>this.updateVariationRecords(A),this.workflowManager.getVariationRecords(),A=>t?this.createPreviewImage(A):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==c.StepType.SilentIllustration&&e.type!==c.StepType.ProductOverlay}getExportedData(){var a;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===n);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[n];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(a=Object.keys(A))==null||a.forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===n);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[n].selections[0].name)}),e}}const ma=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Ia=async(l,e,t)=>{const A=e.data,a=t.data.baseUrl,n=A.assetUrl.replace("localhost","localstack"),i=a.slice(0,4)==="http"?"":"https://",o=new URL(i+a);o.searchParams.append("video",c.toBase64(JSON.stringify([{href:n}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),g=`data:image/svg+xml;base64,${c.toBase64(await tt.toString(s,{type:"svg"}))}`,d=w=>{const h=l.find(E=>E.panelId===w.panelId);if(!h)throw new k(w);const Q=c.generate();return new c.CreateElementCommand({id:Q,src:g,type:c.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},h)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},fa=async(l,e,t,A)=>{const a=t.data,n=a.assetUrl,i=await c.getPatternImageData(n);try{const o=c.getVariant(a,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var Q;const g=await c.generateFrameSVG(r||{width:1,height:1},(Q=o==null?void 0:o.asset)==null?void 0:Q.fileLink),d=await c.getFrameData(g),B=c.generate(),w=l.find(E=>E.panelId===r.panelId);if(!w)throw new k(r);const h=c.calculateOffsets(i,d,{scale:a.scale,left:a.x,top:a.y});return[new c.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:c.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 c.UpdateFramePattern(B,i,h)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Da=async(l,e,t,A)=>{var D,p;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((D=n.variants)==null?void 0:D.find(f=>f.id===a.illustrationVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(p=i.asset)==null?void 0:p.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.illustrationVariantId}`),[];const s=await c.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,g=s.match(r)||[],d=(g==null?void 0:g.length)>0?g[0]:"",h=c.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!h)return console.error("Failed to read SVG."),[];c.sanitizeSvgTree(h);const Q={};c.traverse(h,f=>{ma.includes(f.tagName)&&!f.attributes.getNamedItem("fill")&&f.setAttribute("fill","#000000");const y=f.attributes.getNamedItem("fill");if(y&&y.value!=="none"){const S=y.value,N=`spiff-fill-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}const Y=f.attributes.getNamedItem("stroke");if(Y&&Y.value!=="none"){const S=Y.value,N=`spiff-stroke-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}});const m=c.xmlSerializer().serializeToString(h),C=a.colors;if(C){for(const[f,y]of Object.entries(Q))for(const Y of Object.keys(C))if(y.browserValue===Y){Q[f]={browserValue:C[Y]};break}}const I=f=>{const y=l.find(S=>S.panelId===f.panelId);if(!y)throw new k(f);const Y=c.generate();return new c.CreateElementCommand({colors:Q,id:Y,svg:m,type:c.LayoutElementType.Illustration,y:f.top,x:f.left,rotation:f.rotation,width:f.width,height:f.height,layer:f.layer,layerIndex:f.layerIndex,immutable:f.immutable},y)},F=A.data.regions;try{return F.map(I)}catch(f){return console.error(f),[]}},pa=async(l,e,t)=>{const A=await Nt(t.data.module),a=e.data,n=(o,s)=>{const r=l.find(d=>d.panelId===s.panelId);if(!r)throw new k(s);const g=c.generate();return new c.CreateElementCommand({colors:{},id:g,svg:o,type:c.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=>n(A.svgPrint(a.text,o),o))}catch(o){return console.error(o),[]}},Fa=async(l,e,t,A)=>{var g,d;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((g=n.variants)==null?void 0:g.find(B=>B.id===a.pictureVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.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: ${a.pictureVariantId}`),[];const s=B=>{const w=l.find(Q=>Q.panelId===B.panelId);if(!w)throw new k(B);const h=c.generate();return new c.CreateElementCommand({id:h,src:o,type:c.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),[]}},Ma=async(l,e,t,A)=>{var r;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=n.variants)==null?void 0:r.find(g=>g.id===a.colorVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=g=>{const d=l.find(E=>E.panelId===g.panelId);if(!d)throw new k(g);const B=`
1930
1930
  <svg
1931
1931
  xmlns="http://www.w3.org/2000/svg"
1932
1932
  xmlnsXlink="http://www.w3.org/1999/xlink"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "16.5.1-1",
3
+ "version": "16.5.1-3",
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",