@spiffcommerce/core 15.3.2 → 15.3.4

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/module.js CHANGED
@@ -556,7 +556,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
556
556
  workflowState
557
557
  }
558
558
  }
559
- `),Vn=t=>{const e=[];for(const A of t.steps)switch(A.type){case m.DigitalContent:A.data.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Upload});break;case m.Frame:const t=A.data;t.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),t.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Upload});break;case m.Illustration:const n=A.data;n.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Colors});break;case m.Material:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Model:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Picture:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Question:A.data.varySelections&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selections});break;case m.Shape:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Text:const a=A.data;a.varyText&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Text}),a.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),a.varyColor&&a.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Color})}return e},Wn=[m.SilentIllustration,m.ProductOverlay],Xn=async(t,e,A)=>{const n=[];t.introduction&&n.push({name:"Introduction",title:t.name,renderableSteps:[{type:m.Introduction,stepName:"Introduction",stepTitle:t.name,helpText:t.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of t.steps){if(e.bulkScene){let t=!1;switch(A.type){case m.DigitalContent:A.data.varyUpload&&(t=!0);break;case m.Frame:{const e=A.data;!e.varyUpload||!e.varySelection&&A.option||(t=!0)}break;case m.Illustration:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColors&&e.colorPickerEnabled||(t=!0)}break;case m.Material:A.data.varySelection&&(t=!0);break;case m.Model:A.data.varySelection&&(t=!0);break;case m.Picture:A.data.varySelection&&(t=!0);break;case m.Question:A.data.varySelections&&(t=!0);break;case m.Shape:A.data.varySelection&&(t=!0);break;case m.Text:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColor&&e.colorPickerEnabled&&e.colorOption||!e.varyText||(t=!0)}}if(t)continue}const a=qn(A.stepName,t.stepGroups);if(a){const t=n.find((t=>t.name===a.name));t?Wn.includes(A.type)?t.silentSteps.push(A):t.renderableSteps.push(A):n.push({name:a.name,title:a.name,renderableSteps:Wn.includes(A.type)?[]:[A],silentSteps:Wn.includes(A.type)?[A]:[]})}else n.push({name:A.stepName,title:A.stepTitle,renderableSteps:Wn.includes(A.type)?[]:[A],silentSteps:Wn.includes(A.type)?[A]:[]})}if(e.bulkScene){const a=A?.product?.bulkConfiguration;n.push({name:"Bulk",title:a?.sceneTitle??e.bulkSceneTitle,renderableSteps:[{type:m.Bulk,stepName:"Bulk",stepTitle:a?.stepTitle??e.bulkSceneTitle,helpText:a?.helpText,data:{aspects:Vn(t)},conditions:[]}],silentSteps:[]})}return e.finishScene&&n.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:m.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:t.finalizeStepConfig?t.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:t.finalizeStepConfig?t.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},qn=(t,e)=>e.find((e=>e.stepNames.includes(t))),Zn=(t,e)=>(t.conditions||[]).every((t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const e=A.selectedVariants;return t.requiredVariantSelections.some((t=>void 0!==e.find((e=>e.id===t))))}return!1})),$n=(t,e)=>t.map((t=>((t,e)=>{const A={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>Zn(t,e))),silentSteps:t.silentSteps.filter((t=>Zn(t,e)))};return 0===A.silentSteps.length&&0===A.renderableSteps.length?null:A})(t,e))).filter((t=>null!==t)),_n=async(t,e)=>{const A=$n(t,e),n=[];for(const t of A)for(const e of t.renderableSteps)if(e.type===m.Model||e.type===m.Material||e.type===m.Picture||e.type===m.Shape){const t=(e.option?.variants||[]).length;t&&t>1&&n.push(e.stepName)}else n.push(e.stepName);const a=A.filter((t=>t.renderableSteps.filter((t=>n.includes(t.stepName))).length>0));for(const t of a)t.renderableSteps=t.renderableSteps.filter((t=>n.includes(t.stepName)));return a};function ta(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}function ea(t,e,A,n){const a=A.width*t.zoom,i=A.height*t.zoom;if(n){const n=t,a=Math.max(e.width/A.width,e.height/A.height);n.zoom=Math.max(a,t.zoom);const i=A.width*n.zoom,r=A.height*n.zoom;return n.x=Aa(t.x,e.width-i,0),n.y=Aa(t.y,e.height-r,0),n}const r=t;return r.x=Aa(r.x,-a,e.width),r.y=Aa(r.y,-i,e.height),r}function Aa(t,e,A){return Math.min(Math.max(t,e),A)}class na{constructor(t){ta(this,"offsets",void 0),ta(this,"forceImageCover",void 0),ta(this,"targetElements",void 0),ta(this,"imageData",void 0),ta(this,"frameData",void 0),ta(this,"_debouncedUpdateFrameOffsets",void 0),ta(this,"minZoomScale",[.03]),ta(this,"maxZoomScale",[20]),ta(this,"onFrameDataChangeListeners",void 0),ta(this,"onZoomChangeListeners",void 0),ta(this,"workflowManager",void 0),ta(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=Xt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=t}connectWorkflowManager(t,e){e&&t.addStepSpecificStorageCallback((async t=>{if(t){const e=t;if(e.currentFrameSources){let t=!1;for(let A=0;A<e.currentFrameSources.length;A++){const n=e.currentFrameSources[A],a=await P(n);Ot(a,this.frameData)||(this.frameData||(this.frameData=new Array(e.currentFrameSources.length)),this.frameData[A]=a,t=!0)}t&&(this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),e),this.workflowManager=t,this.stepName=e}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}setFrameData(t){t?t.forEach(((e,A)=>{const n=M.get(e);n&&(this.frameData||(this.frameData=new Array(t.length)),this.frameData[A]=n)})):this.frameData=void 0}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,e,A,n){if(this.imageData&&this.offsets&&this.frameData){this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length));const a=this.frameData.map(((n,a)=>{const i=(e[a]-this.offsets[a].x)/this.offsets[a].zoom,r=(A[a]-this.offsets[a].y)/this.offsets[a].zoom;return{x:e[a]-i*t[a],y:A[a]-r*t[a],zoom:this.imageData.width*t[a]/this.imageData.width}}));this.updateOffsets(a,n),this.onZoomChangeListeners.forEach((e=>e(t)))}}setPatternData(t){this.imageData=t,t&&this.frameData&&(this.recalculateOffsets(t),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,e,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==t.length)throw new oe("Frame data and offsets are not the same length. This is a bug. Please report it.");this.offsets.some(((e,A)=>t[A].x!==e.x||t[A].y!==e.y||t[A].zoom!==e.zoom))||A?(this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length)),this.frameData.forEach(((e,A)=>{this.offsets[A]=ea(t[A],e,this.imageData,this.forceImageCover)})),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.targetElements,e)):e&&e()}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,e,A,n,a){if(!A||0===A.length||A.some((t=>!t)))throw new oe("Frame data not set. This is a bug");if(!this.workflowManager)throw new oe("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();n.forEach(((A,n)=>{i(new et(A,e,t[n]))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:t}),a&&a()}recalculateZoomLimits(t,e){this.minZoomScale.length===e.length&&this.maxZoomScale.length===e.length||(this.minZoomScale=new Array(e.length),this.maxZoomScale=new Array(e.length)),e.forEach(((e,A)=>{const n=Math.max(e.width/t.width,e.height/t.height);this.forceImageCover?(this.minZoomScale[A]=n,this.maxZoomScale[A]=2.5*n):(this.minZoomScale[A]=n/10,this.maxZoomScale[A]=2.5*n)}))}recalculateOffsets(t){this.frameData&&(this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length)),this.frameData.forEach(((e,A)=>{this.offsets[A]=tt(t,e)})),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements))}}function aa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class ia{constructor(t,e,A){aa(this,"configuration",void 0),aa(this,"layouts",void 0),aa(this,"product",void 0),aa(this,"processRegion",(async t=>{const e=this.layouts.find((e=>e.panelId===t.panelId));if(!e)throw new Ae(t);let A="";if(this.configuration.type===m.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),A=t,!t)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===h.Image){const A=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!A)throw new Error("Undefined raster silent step source");const a={stepName:this.configuration.stepName,id:F(),src:A,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:a.id,region:t},command:new r(a,e)}}{const a=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:A,i=async()=>new Promise(((t,e)=>{a?nt(a).then((e=>{t(e)})).catch((t=>console.error(t))):e("Undefined vector silent step source")})),o=await v(await i()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await wt(o.svg),src:a,svg:o.svg,colors:o.colors,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new r(s,e)}}})),this.configuration=t,this.layouts=e,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===m.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===m.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((e=>t.panelId===e.panelId)))throw new Ae(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===m.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return t?.startsWith("data:image/png")||t?.endsWith(".jpeg")||t?.endsWith(".jpg")||t?.endsWith(".png")?h.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),h.Illustration)}}const ra=async t=>{const e=`${Ee.getServicesApiUrl()}/shortener`;try{const A=await fetch(e,{method:"POST",body:JSON.stringify({longUrl:t}),headers:{"Content-Type":"application/json"}});return(await A.json()).shortUrl}catch(t){throw console.error(t),new ge("Failed to shorten URL, see console.")}};function oa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class sa{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(t){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(t,e,A,n=3e3,a=10){oa(this,"pollingId",void 0),oa(this,"attempts",void 0),oa(this,"interval",void 0),oa(this,"maxAttempts",void 0),oa(this,"predicate",void 0),oa(this,"onSuccess",void 0),oa(this,"onFailure",void 0),this.onSuccess=e,this.onFailure=A,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}const ca=new class{async init(t,e,A){return A&&await this.reload(t,e,A),null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[],a,(async()=>{const A=n?.storage?.videoShortUrl,a=n?.storage?.videoUrl;e.updateStorage(t.stepName,{videoShortUrl:A,videoUrl:a})}))}async regenerateQRCode(t,e,A,n,a,i,r,o,c){if(e||""===A||""!==n)c(!1);else{const e=async()=>{const t=(await Ne([A]))[0],e=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:e}},g=await new Promise(((t,A)=>{new sa((async()=>!!(await e()).link),(async()=>{const A=await e();if(!A.link||!A.link)throw new ae(A.asset);t({rel:"mpeg4",href:A.link})}),(()=>{A("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>o(new s(t.id))));const l="http"===i.data.baseUrl.slice(0,4)?"":"https://",d=new URL(l+i.data.baseUrl);d.searchParams.append("video",btoa(JSON.stringify([g]))),d.pathname=d.pathname+("/"===d.pathname.slice(-1)?"":"/");const B=d.toString();if(B.length>=2e3)throw new ge("Cannot create QR code, URL too long.");const w=await ra(B);if(r(w),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),E=await this.command(w,h,a,i.stepName);E&&(E.command&&a.getCommandDispatcher()(E.command),E.followup&&await E.followup()),await a.setSelectionsAndElements(i.stepName,[],h,(async()=>{a.updateStorage(i.stepName,{videoShortUrl:w,videoUrl:n}),c(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:F(),region:t})))}async command(t,e,A,n){const a=A.getLayouts(),i=`data:image/svg+xml;base64,${btoa(await Vt(t,{type:"svg"}))}`,o=e.map((t=>{const e=t.region,A=a.find((t=>t.panelId===e?.panelId));if(!A&&e)throw new Ae(e);if(A&&!e)throw new Error("Region not found");if(!A||!e)throw new Error("Neither a region or layout found!");return new r({stepRegion:e,stepName:n,id:t.id,src:i,type:h.Image,y:e.top,x:e.left,width:e.width,height:e.height,rotation:0},A)}));return{command:new B(o),followup:async()=>{}}}};function ga(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const la=new class{constructor(){ga(this,"frameSourceSvg",(async(t,e)=>{if(!t)return Et(e);const A=t.asset;if(!A)throw new ne(t);const n=A.fileLink;if(n)return nt(n);throw new ae(A)}))}async init(t,e,A){if(A)return await this.reload(t,e,A),null;if(e.setMandatoryFulfilled(t.stepName,!1),e.markStepsAsInitialised([t.stepName]),t.option&&t.option.variants&&t.option.variants.length>0){const A=t.option,n=Oe.getDefaultVariant(A);return n?this.selectVariantCommand(t,n,[],e,void 0,t.data.placeholderImageUrl):null}return this.selectVariantCommand(t,void 0,[],e,void 0,t.data.placeholderImageUrl)}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));if(!t.option||0===(t.option.variants||[]).length){const A=t.data.regions.map((t=>Et(t)));e.updateStorage(t.stepName,{currentFrameSources:A})}if(n){const A=async()=>{const A=n.storage?.framePatternSrc,a=n.storage?.frameOffsetsList;if(e.updateMetadata(t.stepName,{frameOffsetsList:a,framePatternSrc:A}),A){const n=e.getStepSpecificServices(t.stepName)?.frameService;if(!n)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(A,n),e.updateMetadata(t.stepName,{image:A}),e.updateStorage(t.stepName,{framePatternSrc:A})}if(a?.some((t=>t.zoom))){const A=e.getStepSpecificServices(t.stepName)?.frameService;if(!A)throw new Error("Frame service unavailable, cannot load pattern!");A.updateOffsets(a)}e.setMandatoryFulfilled(t.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const i=n.selectedVariants[0].id;if(t.option&&i){const n=t.option.variants?.find((t=>t.id===i));n&&await e.setSelectionsAndElements(t.stepName,[n],a,(async()=>{const a=await Promise.all(t.data.regions.map((t=>this.frameSourceSvg(n,t))));e.updateStorage(t.stepName,{currentFrameSources:a}),await A()}))}}else await e.setSelectionsAndElements(t.stepName,[],a,A)}}selectImage(t,e,A){A.setEditedStatus(t.stepName,!0);(e.fileLink||"").endsWith("pdf")?A.addPoller(new sa((async()=>{const t=(await be.getLocalOrFromServer(e.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{be.getLocalOrFromServer(e.key||"").then((e=>{this.loadPatternFromAsset(e,t,A)}))}),(()=>{throw new ge("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(e,t,A)}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(t,e,A,n){return new r({id:t,type:h.Frame,x:e.left,y:e.top,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,scaleX:e.width/n.frameData.width,scaleY:e.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:e,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:e.immutable},A)}async loadPatternFromString(t,e){if(t.endsWith("svg")){const A=await ut(t),n=A.width,a=A.height,i={src:t,width:n,height:a,aspect:n/a};k.set(t,i),e.setPatternData(i)}else{const A=await st(t),n=await Y(A),a={src:t,width:n.width,height:n.height,aspect:n.width/n.height};k.set(t,a),e.setPatternData(a)}}async selectVariantCommand(t,e,A,n,a,i){const r=n.getStepSpecificServices(t.stepName)?.frameService;if(!r)throw new Error("Frame service unavailable, cannot load pattern!");const o=await Promise.all(t.data.regions.map((t=>this.frameSourceSvg(e,t))));a&&a(!0);const c=await Promise.all(t.data.regions.map((async(e,a)=>{const i=await P(o[a]),c=r.getImageData(),g=A.map((t=>new s(t.id))),l=c?tt(c,i):void 0,d=c?{id:F(),src:c.src,x:l?.x||0,y:l?.y||0,width:c.width,height:c.height,scaleX:l?.zoom||1,scaleY:l?.zoom||1,rotation:0}:void 0,B=F(),w=n.getLayouts().find((t=>t.panelId===e.panelId));if(!w)throw new Ae(e);return{command:this.getCreateElementCommand(B,e,w,{frameData:i,pattern:d,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:B,region:e},removeExistingCommands:g}}))),g=c.map((t=>t.command)),l=c.map((t=>t.removeExistingCommands)).flat();return{command:new B([...g,...l]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(t.stepName,e?[e]:[],[...c.map((t=>t.regionEl))],(async()=>{if(n.updateStorage(t.stepName,{currentFrameSources:o}),i){const e=n.getStepSpecificServices(t.stepName)?.frameService;if(!e)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,e)}}))}}}patternSource(t){const e=t.versions?.find((t=>"svg"===t.name));if(e)return e.link;const A=t.fileLink;if(A)return A;throw new ae(t)}async loadPatternFromAsset(t,e,A){const n=this.patternSource(t),a=A.markUpdatePending(),i=A.getStepSpecificServices(e.stepName)?.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(e.stepName,{image:n}),A.updateStorage(e.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}};const da=new class{async getIllustrationBody(t){return new Promise((e=>{nt(t).then((t=>{e(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,e,A,n){return new r({stepRegion:e,stepName:n.stepName,colors:n.svg.colors,id:t,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable},A)}getColors(t,e){const A=e.getRegionElements(t.stepName)||[];if(0===A.length)return[];try{return y(A[0].id,e.getAllLayoutData()).colors}catch(t){return[]}}async init(t,e,A){const n=t.option;if(!n)return null;if(A)return this.reload(t,e,A);{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantCommand(t,A,[],(()=>{}),e)}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(!i||!A)throw new Error("Required illustration variant no longer available");{const r=i.variants?.find((t=>t.id===A));if(r){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[r],A,(async()=>{e.updateMetadata(t.stepName,{colors:n.storage?.colors}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}return null}async availableColors(t,e){const A=t.data.colorOption;return A&&A?A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t}))):[]}async changeColorsCommand(t,e,A,n,a){const i={};for(const[t,e]of a.entries())i[t]={browserValue:e,spotColor:i[t]?.spotColor};const r=Ct(t,e,A,i),o=await wt(r),s=[];for(const t of n){for(const[e,A]of a.entries())s.push(new Qt(t,e,A));s.push(new pt(t,r,o))}return new B(s)}async changeColors(t,e,A,n,a){if(0===e.length)return;const i=y(e[0].id,n().map((t=>t.layoutState))),r={...i.colors},o={};Object.entries(r).forEach((([t,e])=>{const A={browserValue:e.browserValue},n=e.spotColor;n&&(A.spotColor={profileName:n.profileName,namedColor:n.namedColor}),o[t]=A}));for(const[t,e]of a.entries())r[t]={browserValue:e,spotColor:r[t]?.spotColor},o[t]={browserValue:e};let s=Array.from(Object.values(r)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{s=s.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),A.updateMetadata(t.stepName,{colors:s});const g=new Map;if(Object.entries(r).forEach((([t,e])=>{g.set(t,e.browserValue)})),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(i.svg,i.width,i.height,e.map((t=>t.id)),g);A.updateStorage(t.stepName,{colors:o}),A.getCommandDispatcher()(l)}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(t,e,A,n,a){if(!t.data||!t.data.regions)throw new ie(t,"Missing regions.");n(!0);const i=A.map((t=>new s(t.id)));a.setMandatoryFulfilled(t.stepName,!1);const r=e.asset;if(!r)throw new ne(e);const o=r.fileLink;if(!o)throw new ae(r);const c=await v(await this.getIllustrationBody(o)),g=await wt(c.svg),l=t.data.regions.map((e=>{const A=a.getLayouts().find((t=>t.panelId===e.panelId));if(!A)throw new Ae(e);const n=F();return{regionElement:{id:n,region:e},command:this.getCreateElementCommand(n,e,A,{stepName:t.stepName,src:o,objectURL:g,svg:c})}})),d=[...l.map((t=>t.command)),...i];let w=Array.from(Object.values(c.colors)).map((t=>t.browserValue));const h=t.data.colorOption;return h&&h.variants?.forEach((t=>{w=w.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),a.updateMetadata(t.stepName,{colors:w}),{command:new B(d),followup:async()=>{await a.setSelectionsAndElements(t.stepName,[e],l.map((t=>t.regionElement)),(async()=>{a.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const Ba=new class{async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(A)await this.reload(t,e,A);else{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(!i)throw new ee(t);if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(A){const n=i.variants?.find((t=>t.id===A));if(n){const A=n.material,r=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],r,(async()=>{const n=e.getModelContainer();if(n){const a=t.data.targetMaterials.map((t=>n.applyMaterialVariant(t,i.id||"",A||{})));Promise.all(a).then((()=>e.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantLambda(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,e,A,n){const a=A.getModelContainer();n(!0);const i=e.material;if(!i)throw n(!1),new ne(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{a&&t.data.targetMaterials.forEach((e=>{t.option&&a.applyMaterialVariant(e,t.option.id||"",i)})),A.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const wa=new class{async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(A)await this.reload(t,e,A);else{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const n=i.variants?.find((t=>t.id===A));if(n){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],A,(async()=>{const A=e.getModelContainer();if(A&&t.option){const a=n.asset?.fileLink;if(!a)throw new ne(n);await A.applyModelVariant(t.option.id||"",{model:a,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantLambda(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,e,A,n){n(!0);const a=e.asset?.fileLink;if(!a)throw new ne(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{const e=A.getModelContainer();e&&t.option&&e.applyModelVariant(t.option.id||"",{model:a,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const ha=new class{async init(t,e,A){return A?(await this.reload(t,e,A),null):(e.updateMetadata(t.stepName,{text:""}),this.changeTextCommand(t,"",e,"",(()=>{})))}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[],a,(async()=>{e.updateStorage(t.stepName,{text:n?.storage?.text}),e.setMandatoryFulfilled(t.stepName,""!==n?.storage?.text)}))}async changeText(t,e,A,n,a){const i=await this.changeTextCommand(t,e,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(t,e,A,n,a){const i=A.getRegionElements(t.stepName),o=A.getStepSpecificServices(t.stepName)?.module;if(!o)return console.error("Missing module."),null;const c=A.getProfanities();if(!this.validateInput(t,e,c,a))return A.setMandatoryFulfilled(t.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(t.stepName,""!==e),!t.data||!t.data.regions||t.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(t.stepName,{text:e});const g=(e,n,a)=>{const i=a||F(),o=A.getLayouts().find((t=>t.panelId===n.panelId));if(!o)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return a&&c.push(new s(i)),c.push(new r({stepRegion:n,stepName:t.stepName,colors:{},id:i,svg:e,type:h.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},o)),{id:i,region:n,command:new B(c)}};if(i.length>0){const t=i.map((t=>{if(!t.region)return null;const A=o.svgPrint(e,t.region);return g(A,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new B(t),followup:async()=>{}}}{const n=t.data.regions.map((t=>g(o.svgPrint(e,t),t))),a=n.filter((t=>!!t)).map((t=>t&&t.command));return{command:new B(a),followup:async()=>{const e=n.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await A.setSelectionsAndElements(t.stepName,[],e)}}}}validateInput(t,e,A,n){if(t.data&&t.data.maxLength){const A=t.data.maxLength;if(e.length>A)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(e))return n("Unsupported characters."),!1;const a=qt(e.toLowerCase());for(const t of a)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const Ea=new class{async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else if(n.defaultVariant)return e.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,n.defaultVariant,e,(()=>{}));return e.markStepsAsInitialised([t.stepName]),null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const n=i.variants?.find((t=>t.id===A));if(n){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],A,(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantCommand(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,e,A,n){const a=e.asset;if(!a)throw new ne(e);const i=a?.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(t.stepName,!1);const o=A.getRegionElements(t.stepName).map((t=>new s(t.id))),c=t.data.regions.map((e=>{const n=A.getLayouts().find((t=>t.panelId===e.panelId));if(!n)throw new Ae(e);const a=F();return{regionElement:{id:a,region:e},command:new r({stepName:t.stepName,stepRegion:e,id:a,src:i,type:h.Image,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,preserveAspectRatio:"none"},n)}}));return{command:new B([...o,...c.map((t=>t.command))]),followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],c.map((t=>t.regionElement)),(async()=>{A.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const ua=new class{async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else{const A=n.variants;if(Oe.getDefaultVariant(n)){const a=A?.find((t=>t.id===n.defaultVariant?.id));return this.selectVariantLambda(t,a?.id||"",e)}}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(a&&A){const n=a.variants?.find((t=>t.id===A));n&&await e.setSelectionsAndElements(t.stepName,[n],[])}}}async selectVariant(t,e,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(t,e,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A){const n=t.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find((t=>t.id===e)):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[i],[],(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}};function Ca(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const Qa=new class{constructor(){Ca(this,"shapeFillId","spiff-fill-shape")}async availableColours(t){const e=t.option;return e&&e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}setCustomColor(t,e,A){const n=A.getLayouts(),a=(A.getRegionElements(e.stepName)||[]).map((e=>{const A=e.region;if(!n.find((t=>t.panelId===A?.panelId)))throw new Ae(A);return new Qt(e.id,this.shapeFillId,t)})).filter((t=>!!t));A.getCommandDispatcher()(new B(a)),A.updateStorage(e.stepName,{colour:t})}async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(!A){const A=Oe.getDefaultVariant(n);return A?this.selectVariantCommand(t,{fill:A.color,stroke:A.color,variant:A},[],e):null}return await this.reload(t,e,A),null}async selectVariant(t,e,A,n){const a=await this.selectVariantCommand(t,e,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const r=i.variants?.find((t=>t.id===A));if(r){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[r],A,(async()=>{e.updateStorage(t.stepName,{colour:n?.storage?.colour||""}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariantCommand(t,e,A,n){const a=n.getLayouts(),i=n.getStepStorage(t.stepName)?.colour,o=()=>{if("#custom"===e.variant?.color)return i||"#FFFFFF";if(e.variant?.color)return e.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const i=t=>{const e=t.region;if(!a.find((t=>t.panelId===e?.panelId)))throw new Ae(e);const A=o();return new Qt(t.id,this.shapeFillId,A)},r=A.map(i).filter((t=>!!t));return{command:new B(r),followup:async()=>{await n.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],A),n.updateStorage(t.stepName,{colour:o()})}}}{const A=e=>{const A=a.find((t=>t.panelId===e.panelId));if(!A)throw new Ae(e);const n=o(),i=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="${this.shapeFillId}"\n fill="${n}"\n />\n </svg>\n `,s={};s[this.shapeFillId]={browserValue:n};const c=F();return{id:c,region:e,command:new r({stepRegion:e,stepName:t.stepName,colors:s,id:c,svg:i,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:t.data.excludeFromPrint},A)}},i=t.data.regions.map(A),s=i.filter((t=>!!t)).map((t=>t?.command)),c=i.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new B(s),followup:async()=>{await n.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],c,(async()=>{n.updateStorage(t.stepName,{colour:o()})}))}}}}};function pa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class ma extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=ma.name}}const fa=["‘","’","“","”","\n"];class Da extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=Da.name}}const Ia=new class{constructor(){pa(this,"cachedColors",new Map),pa(this,"filterUnsupportedCharacters",((t,e)=>{let A=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=e?mt(e.assetUrl):void 0;if(a){const t=A.split("").filter((t=>!fa.includes(t))).join(""),e=t.split("").map((t=>a.getFont().charToGlyph(t)));for(let A=0;A<e.length;A++){".notdef"===e[A].name&&n.push(String.fromCharCode(t.charCodeAt(A)))}}for(let t=0;t<n.length;t++)A=A.replaceAll(n[t],"");return A})),pa(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),pa(this,"getErrorsForText",((t,e,A)=>{const n=[];e.data&&e.data.maxLength&&t.length>e.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=A.getProfanities(),i=qt(t.toLowerCase());for(const t of i)for(const e in a){if(t===a[e].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!e.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else{const A=this.getDefaultImageFillVariant(t.data),a=A?.asset?.fileLink,i=a?await Z(a):void 0,r=i?{src:i.src,height:i.height,width:i.width,scale:t.data.imageFillScale||1}:void 0;e.updateStorage(t.stepName,{inputText:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.color||await this.getDefaultColor(t.data),fillImage:r}),e.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:A?.name});const o=Oe.getDefaultVariant(n);if(o)return this.selectVariantCommand(t,o,{},[],e,(()=>{}),(()=>{}),r)}return null}findLayoutElements(t,e){return t.getRegionElements(e.stepName).map((e=>y(e.id,t.getAllLayoutData())))}availableFillColors(t){const e=this.cachedColors.get(t.stepName);if(e)return e;const A=t.data.colorOption;if(A){const e=A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[];return this.cachedColors.set(t.stepName,e),e}return[]}async changeFillColor(t,e,A,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher();e.variant?n.updateMetadata(t.stepName,{color:e.variant.name}):n.updateMetadata(t.stepName,{color:e.fill});const i=t.data.colorOption,r=i?this.createTextFillSpotColor(i,e.variant):void 0;i?n.updateStorage(t.stepName,{color:e.fill,colorProfileAssetKey:i.colorProfile?.key}):n.updateStorage(t.stepName,{color:e.fill});for(const t of A){if(!e.fill)throw new Error("Fill not set on new color selection!");a(new g(t.id,e.fill,r))}}async availableFillImages(t){const e=t.data.imageFillOption;if(e){const A=e.variants?.map((t=>t.asset?.fileLink))?.filter((t=>!!t))||[];return Promise.all(A.map((async e=>{const A=await Z(e);return{src:e,width:A.width,height:A.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,e,A,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher(),i=t.option?.variants?.find((t=>t.asset?.fileLink===e.src));n.updateMetadata(t.stepName,{fillImage:i?.name}),n.updateStorage(t.stepName,{fillImage:e});for(const t of A){a(new ft(t.id,e))}}getProcessedInput(t,e,A){const n=A?t:this.injectReplaceableText(t,e);return lt(n,{vertical:e.vertical,uppercase:e.uppercase})}updateInputText(t,e,A,n){const a=n.getStepStorage(A.stepName),i=this.getProcessedInput(t,A.data,!!a.customiseAllText),r={command:void 0,helperText:"",errors:this.getErrorsForText(t,A,n)};if(r.errors.length>0)return r.helperText=r.errors[0].localizationKey,r;const o=(A.data.maxLength-i.length).toString();r.helperText=`${o} characters remaining`;const s=n.getTransaction().bulk&&A.data.varyText||!1,c=[],g=new Map,l=new Map;for(const t of e){if(!t.fontData)throw new oe("Failed to resolve font data for text.");const[e,n]=b(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[i],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});g.set(t.id,e),l.set(t.id,n);const a=A.data.curved?i:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(e,A.data,t.id,a,s))}if(!A.data.curved&&e.length>0){if(!Array.from(l.values()).every((t=>t)))return r.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),r}return n.updateStorage(A.stepName,{text:t}),n.updateMetadata(A.stepName,{text:i}),a.defaultCleared&&n.setMandatoryFulfilled(A.stepName,!0),r.command=new B(c),r.command.varying=s,r}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A.getStepStorage(t.stepName)||{},A.getRegionElements(t.stepName),A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}createTextFillSpotColor(t,e){const A=t.colorProfile;if(A){const t=(A.name||"").replace(/\s/g,"-"),n=t.lastIndexOf("/"),a=t.slice(n+1).slice(0,-4);if(!e.namedColor)throw new Error("variant named color not set!");return{profileName:a,namedColor:e.namedColor}}}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const r=i.variants?.find((t=>t.id===A));if(r){const A=await this.fontDataFromVariant(r),i=a.map((t=>({id:t.id,region:t.stepRegion}))),o=n.storage?.color,s=n.storage?.text;await e.setSelectionsAndElements(t.stepName,[r],i,(async()=>{e.updateMetadata(t.stepName,{color:o,text:s}),e.updateStorage(t.stepName,{text:s,inputText:s});const n=a.map((t=>new d(t.id,A))),i=new B(n);e.getCommandDispatcher()(i),e.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=Ia.updateInputText(s||"",a,t,e);c&&e.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const e=t.colorOption;if(e)return Oe.getDefaultVariant(e)}async getDefaultColor(t){const e=t.colorOption;if(!e)return;return Oe.getDefaultVariant(e)?.color}getDefaultImageFillVariant(t){const e=t.imageFillOption;if(e)return Oe.getDefaultVariant(e)}async fontDataFromVariant(t){const e=t.asset;if(!e)throw new ne(t);const A=e.fileLink;if(!A)throw new ae(e);return{assetUrl:A,name:(await H(A)).names.fullName.en}}async selectVariantCommand(t,e,A,n,a,i,r,o){const s=a.markUpdatePending(),c=await this.fontDataFromVariant(e);if(n.length>0){const g=n.map((t=>new d(t.id,c)));if(o){const t=n.map((t=>new ft(t.id,o)));g.push(...t)}const l=await this.changeInputTextWithRegion(t,t.data.size||30,c,A.text||"",A,a,!!A.customiseAllText,i,r);l&&g.push(l);return{command:new B(g),followup:async()=>{a.markUpdateCompleted(s),await a.setSelectionsAndElements(t.stepName,[e],n)}}}{const n=await this.createTextboxRegions(t.stepName,e,t.data,c,A,a),g=await this.changeInputTextWithRegion(t,t.data.size||30,c,n[0]?.newElement.input||A.text||t.data.defaultText||"",A,a,!!A.customiseAllText,i,r),l=n.flatMap((t=>t.commands));if(o){const t=n.map((t=>new ft(t.regionElement.id,o)));l.push(...t)}g&&l.push(g);return{command:new B(l),followup:async()=>{a.markUpdateCompleted(s)}}}}injectReplaceableText(t,e){return e.replaceableText?e.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,e,A,n,a,i){if(!A||!A.regions)throw new Error("Step data not supplied");const o=i.getTransaction().bulk&&A.varyText||!1,s=o?"":a.text||A.defaultText||"",c=this.getProcessedInput(s,A,!1),g=await Promise.all(A.regions.map((async e=>{const g=i.getLayouts().find((t=>t.panelId===e.panelId)),l=F();try{if(!g)throw new Da("Failed to find layout for region: "+e.panelId);const d=A.colorOption;let B;if(d&&d.variants){const e=d.variants.find((t=>t.id===d.defaultVariant?.id))||d.variants[0];B=this.createTextFillSpotColor(d,e),i.updateStorage(t,{colorProfileAssetKey:d.colorProfile?.key})}const w=await this.getDefaultColor(A),E=w||"#000000",u={stepRegion:e,stepName:t,align:this.textAlign(A),fill:a.color?a.color:E,fontSize:A.size||30,fontData:n,id:l,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,text:c,input:s,type:h.Textbox,vertical:A.vertical,x:e.left,y:e.top,height:e.height,width:e.width,immutable:e.immutable,verticalAlign:A.verticalAlign||"middle",curved:A.curved,paths:A.paths,fillSpotColorDefinition:B},C=[],Q=new Map,p=new Map;if(!u.fontData)throw new oe("Failed to resolve font data for text.");const[m,f]=b(u.fontSize,u.fontData,{left:u.x,top:u.y,width:u.width,height:u.height,rotation:u.rotation,panelId:""},[c],{size:A.size,minSize:A.minSize,maxSize:A.maxSize});Q.set(u.id,m),p.set(u.id,f);const D=A.curved||A.vertical?c:(f||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(m,A,u.id,D,o));const I=new r(u,g);return I.varying=o,{regionElement:{id:l,region:e},commands:[I,...C],newElement:u,fontData:n}}catch(t){throw console.log(t),new ma("Error adding font to region")}}))).catch((t=>{throw t instanceof ma?(EA.setLatestToast("Failed to load font.",Ma.Error),t):t instanceof Da?t:new Error(t)}));return await i.setSelectionsAndElements(t,[e],g.map((t=>t.regionElement)),(async()=>{i.updateMetadata(t,{text:s}),i.updateStorage(t,{text:s})})),g}generateTextChangeCommandsForRegion(t,e,A,n,a){const i=[],r=new f(A,n);if(r.varying=a,i.push(r),!e.size){const e=new l(A,t);e.varying=a,i.push(e)}const o=new B(i);return o.varying=a,o}async changeInputTextWithRegion(t,e,A,n,a,i,r,o,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,t.data,r),d=i.getRegionElements(t.stepName),w=new Map,h=new Map;for(const n of d)if(n.region){const[a,i]=b(e,A,n.region,[l],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});w.set(n.id,a),h.set(n.id,i)}const E=(()=>{if(t.data&&t.data.maxLength&&l.length>t.data.maxLength)return c&&c(!0),{info:"0"};const e=i.getProfanities(),A=qt(l.toLowerCase());for(const t of A)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return o(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return o(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(h.values()).every((t=>t)))return o(!0),{error:"Does not fit."}}return o(!1),{info:(t.data.maxLength-l.length).toString()}})();if(E.error)return void s(E.error);if(s(`${E.info} characters remaining`||""),c)return;i.updateStorage(t.stepName,{text:g}),i.updateMetadata(t.stepName,{text:this.injectReplaceableText(g,t.data)});const u=i.getTransaction().bulk&&t.data.varyText||!1;a.defaultCleared&&i.setMandatoryFulfilled(t.stepName,!0);const C=[];for(const e of d){const A=t.data.curved?l:(h.get(e.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(w.get(e.id)||1,t.data,e.id,A,u))}const Q=new B(C);return Q.varying=u,Q}};function ya(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}let Ma;var Fa;(Fa=Ma||(Ma={})).Error="Error",Fa.Warning="Warning",Fa.Info="Info";class Sa extends XA{constructor(t){super(),ya(this,"update",void 0),ya(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class va{constructor(t,e,A,n,a,i,r,o,s,c,g=!1,l,d=!1){ya(this,"reloadedState",void 0),ya(this,"transaction",void 0),ya(this,"ownerCustomer",void 0),ya(this,"updateTransaction",void 0),ya(this,"confirmedDesign",void 0),ya(this,"editedSteps",void 0),ya(this,"informationResults",void 0),ya(this,"layouts",void 0),ya(this,"mandatorySteps",void 0),ya(this,"pendingUpdates",void 0),ya(this,"selectionCost",void 0),ya(this,"workflow",void 0),ya(this,"stepSpecificServices",void 0),ya(this,"previewService",void 0),ya(this,"profanityFilter",void 0),ya(this,"pollers",void 0),ya(this,"commandContext",void 0),ya(this,"stepElements",void 0),ya(this,"stepInitialised",void 0),ya(this,"stepMetadata",void 0),ya(this,"stepSelections",void 0),ya(this,"storage",void 0),ya(this,"confirmCallbacks",void 0),ya(this,"editedCallbacks",void 0),ya(this,"elementsCallbacks",void 0),ya(this,"informationResultCallbacks",void 0),ya(this,"initCallbacks",void 0),ya(this,"makingAdjustmentsCallback",void 0),ya(this,"mandatoryCallbacks",void 0),ya(this,"metadataCallbacks",void 0),ya(this,"selectionCallbacks",void 0),ya(this,"stepSpecificStorageCallbacks",void 0),ya(this,"storageCallbacks",void 0),ya(this,"currentVariationRecordCallbacks",void 0),ya(this,"variationRecordCallbacks",void 0),ya(this,"allScenes",void 0),ya(this,"product",void 0),ya(this,"invalidModelVariants",void 0),ya(this,"currentAdjustingStepId",void 0),ya(this,"renderableContextService",void 0),ya(this,"workflowStatePromiseQueue",new qA(1)),ya(this,"variationRecords",[]),ya(this,"currentVariationRecord",void 0),ya(this,"initializationPromise",void 0),ya(this,"initialized",!1),ya(this,"readOnly",!1),ya(this,"modelContainer",void 0),ya(this,"isReloadedTransaction",!1),ya(this,"render3DScene",(()=>{if(!this.previewService)return;const t=this.getCommandContext().getAllLayouts(),e=this.getLayoutPreviewService()?.getAll();if(e)for(const[,A]of e)A.render(this.getWorkflow(),t,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=a,this.commandContext=n,this.reloadedState=c,this.transaction=i,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=t,this.stepSpecificServices={},this.profanityFilter=e,this.pollers=[],this.allScenes=[],this.layouts=A,this.product=r,this.previewService=o,this.modelContainer=l,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.isReloadedTransaction=d,this.initializationPromise=this.initializeDefaultWorkflowState(t,i),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((t=>{throw console.error(t),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>{this.updateStateWithServer(),this.render3DScene()}))))}async initializeDefaultWorkflowState(t,e){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((t=>{this.storage[t.stepName]=t.storage||{}})),this.allScenes=await Xn(t,{bulkScene:e.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},e);const A=$n(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:n,commands:a}=await this.stepElementsForIntroducedSilentSteps(A,!!this.reloadedState);this.commandContext.apply(new B(a),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.isReloadedTransaction&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const t=this.workflow.finalizeStepConfig;if(!t)return;const e=t.lookAtAnimation,A=t.modelAnimation;e&&this.previewService?.executeCameraAnimation(e),A&&this.modelContainer?.executeAnimation(A)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(t){const e={...t,recordNumber:this.variationRecords.reduce(((t,e)=>e.recordNumber>t?e.recordNumber:t),0)+1};return this.variationRecords.push(e),this.onVariationRecordsChange(),e}removeVariationRecord(t){if(this.variationRecords=this.variationRecords.filter((e=>e.recordNumber!==t)),this.variationRecords.forEach(((t,e)=>t.recordNumber=e+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===t){const t=this.currentVariationRecord.recordNumber,e=t>1?this.variationRecords[t-2]:this.variationRecords[0];this.setCurrentVariationRecord(e||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(t){this.variationRecords=t,this.onVariationRecordsChange(),0===t.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(t[0])}setCurrentVariationRecord(t){if(this.currentVariationRecord=t,this.onCurrentVariationRecordChange(),t){const e=this.variationRecords.find((e=>e.recordNumber===t.recordNumber));e&&(e.values=t.values,this.onVariationRecordsChange())}}addConfirmCallback(t){t(this.confirmedDesign),this.confirmCallbacks.push(t)}addEditedCallback(t){t(this.editedSteps),this.editedCallbacks.push(t)}addElementsCallback(t){t(this.stepElements),this.elementsCallbacks.push(t)}addInformationResultCallback(t){t(this.informationResults),this.informationResultCallbacks.push(t)}addInitCallback(t){t(this.stepInitialised),this.initCallbacks.push(t)}addMandatoryCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}addMetadataCallback(t){t(this.stepMetadata),this.metadataCallbacks.push(t)}async addSelectionCallback(t){t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(t)}addStepSpecificStorageCallback(t,e){Object.keys(this.storage).includes(e)||(this.storage[e]={}),t(this.storage[e]),Object.keys(this.stepSpecificStorageCallbacks).includes(e)||(this.stepSpecificStorageCallbacks[e]=[]),this.stepSpecificStorageCallbacks[e].push(t)}addStorageCallback(t){t(this.storage),this.storageCallbacks.push(t)}addMakingAdjustmentsCallback(t){t(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(t)}addCurrentVariationCallback(t){t(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(t)}addVariationRecordsCallback(t){t(this.variationRecords),this.variationRecordCallbacks.push(t)}addPoller(t){this.pollers.push(t)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((t=>t.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(t){return this.stepElements[t]||[]}getStepSpecificServices(t){return this.stepSpecificServices[t]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(t){this.ownerCustomer=t}setTransactionCustomerDetails(t){this.ownerCustomer={...this.ownerCustomer,emailAddress:t.email}}getModelContainer(){return this.modelContainer}setModelContainer(t){(!t||this.previewService&&this.previewService.getAllModels().includes(t))&&(this.modelContainer=t,t.metadata&&t.metadata instanceof Map&&this.modelContainer.metadata.set("workflowManager",this))}setTransaction(t){this.transaction=t}getWorkflow(){return this.workflow}getCommandDispatcher(){return t=>this.commandContext.apply(t,!this.initialized)}getWorkflowSelections(){const t={};return this.workflow.steps.forEach((e=>{const A=this.stepSelections[e.stepName];A&&A.selectedVariants&&A.selectedVariants.length>0&&(t[e.stepName]={selections:A.selectedVariants})})),t}markStepsAsInitialised(t){const e={...this.stepInitialised};t.forEach((t=>{e[t]=!0})),this.stepInitialised=e,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(t){this.pendingUpdates=this.pendingUpdates.filter((e=>e!==t))}markUpdatePending(){const t=F();return this.pendingUpdates=[...this.pendingUpdates,t],t}setEditedStatus(t,e){this.editedSteps={...this.editedSteps,[t]:e},this.onEditedChange()}setInformationResults(t){this.informationResults=[...t],this.onInformationResultChange()}setCurrentAdjustingStepId(t){this.currentAdjustingStepId=t,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(t,e){this.mandatorySteps[t]!==e&&(this.mandatorySteps={...this.mandatorySteps,[t]:e},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}async injectIntoPreviewService(t){if(this.modelContainer)throw new Error("You must eject from the preview service before injecting again.");if(this.previewService=t,!this.getProduct().modelUrl||!this.previewService)return;const e=t.loadModel({model:this.getProduct().modelUrl,contextService:this.getLayoutPreviewService()});this.setModelContainer(e),await e.getInitializationPromise(),this.render3DScene()}ejectFromPreviewService(){if(this.modelContainer){if(!this.modelContainer.dispose)throw new Error("This feature is not supported in the current preview service.");this.modelContainer.dispose(),this.modelContainer=void 0}this.previewService=void 0}updateStorage(t,e){const A={...this.storage,[t]:{...this.storage[t],...e}};if(!Ot(A,this.storage)){this.storage=A;const e=new ht(this.constructSerializableWorkflow());this.commandContext.apply(e,!0),this.onStepSpecificStorageChange(t),this.onStorageChange()}}constructSerializableWorkflow(){const t=[];return this.allScenes.forEach((e=>{e.renderableSteps.forEach((e=>{const A={stepName:e.stepName};A.storage=this.storage[e.stepName],A.selectedVariants=this.stepSelections[e.stepName]?.selectedVariants?.map((t=>({id:t.id,priceModifier:t.priceModifier}))),t.push(A)}))})),{steps:t}}updateStateWithServer(){if(this.readOnly)return;const t=this.serialize();this.workflowStatePromiseQueue.enqueue(new Sa((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new Sa((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new oe("Attempted to serialize state before it was initialized.");const e=JSON.stringify(this.dehydrateState(zt(t.transaction))),A=t.variation;if(!A)return{transaction:e};const n={layouts:{},serializableWorkflow:{steps:[]},...zt(A)||{}};return{transaction:e,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(t){for(const e of Object.values(t.layouts).map((t=>t.elements)).flat())"illustration"===e.type&&(delete e.cachedObjectURL,e.src&&delete e.svg);return t}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(t,e){this.stepMetadata={...this.stepMetadata,[t]:{...this.stepMetadata[t],...e}},this.onMetadataChange()}removeElements(t){this.stepElements=((t,e)=>Object.keys(t).reduce(((A,n)=>{const a=[...t[n]||[]];return e.forEach((t=>{const e=a.findIndex((e=>e.id===t.id));e>-1&&a.splice(e,1)})),A[n]=a,A}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,e)=>(Zn(e,this.stepSelections)||this.stepElements[e.stepName]&&this.stepElements[e.stepName].forEach((e=>t.push(e))),t)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((t,e)=>("Model"===e.type&&e.option?.id&&!Zn(e,this.stepSelections)&&t.push(e.option.id),t)),[])}async stepElementsForIntroducedSilentSteps(t,e){const A=this.product;if(!A)return Promise.resolve({stepElements:{},commands:[]});const n=async(t,e,A)=>{if(t.type===m.SilentIllustration){return{step:t,results:await new ia(t,e).trigger()}}if(t.type===m.ProductOverlay){return{step:t,results:await new ia(t,e,A).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},a=t.filter((t=>!this.stepInitialised[t.stepName])),i={stepElements:{},commands:[]},r=[];for(const t of a)this.markStepsAsInitialised([t.stepName]),e||r.push(n(t,this.layouts,A));const o=await Promise.all(r);for(const t of o)i.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),i.commands=[...i.commands,...t.results.map((t=>t.command))];return i}getStepStorage(t){return this.storage[t]}getMetadata(t){return this.stepMetadata[t]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(t,e){return e.find((e=>e.stepName===t))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((t=>t.layoutState.elements.forEach((t=>{this.getCommandDispatcher()(new s(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,e,A,n){const a=this.stepSelections;this.stepSelections={...this.stepSelections,[t]:{selectedVariants:e}},this.selectionCost=Object.values(this.stepSelections).reduce(((t,e)=>t+e.selectedVariants.map((t=>t.priceModifier||0)).reduce(((t,e)=>t+e),0)),0),this.workflow.steps.forEach((t=>{Zn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const i=this.allScenes,r=$n(i,a),o=$n(i,this.stepSelections),c=r.map((t=>t.silentSteps)).flat(),g=o.map((t=>t.silentSteps)).flat().filter((t=>!c.some((e=>e.stepName===t.stepName))));c.forEach((t=>{Zn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:d,commands:w}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...d,[t]:A},this.removeElements(l);if(this.workflow.steps.find((e=>e.stepName===t))?.type===m.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(A.map((t=>t.id)))}const h=[...w,...l.map((t=>new s(t.id))),new ht(this.constructSerializableWorkflow())];h.length>0&&this.commandContext.apply(new B(h),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const t=[],e=$n(this.allScenes,this.stepSelections).map((t=>t.renderableSteps)).flat();for(const A of e)if(!this.stepInitialised[A.stepName])switch(this.stepInitialised[A.stepName]=!0,A.type){case m.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case m.DigitalContent:t.push(ca.init(A,this,this.reloadedState));break;case m.Frame:case m.Photo:{const e=new na(A.data.forceImageCover);e.connectWorkflowManager(this,A.stepName),this.stepSpecificServices[A.stepName]={frameService:e},t.push(la.init(A,this,this.reloadedState))}break;case m.Illustration:t.push(da.init(A,this,this.reloadedState));break;case m.Material:t.push(Ba.init(A,this,this.reloadedState));break;case m.Model:t.push(wa.init(A,this,this.reloadedState));break;case m.Module:this.stepSpecificServices[A.stepName]={module:await un(A.data.module)},t.push(ha.init(A,this,this.reloadedState));break;case m.Picture:t.push(Ea.init(A,this,this.reloadedState));break;case m.Question:t.push(ua.init(A,this,this.reloadedState));break;case m.Shape:t.push(Qa.init(A,this,this.reloadedState));break;case m.Text:t.push(Ia.init(A,this,this.reloadedState))}const A=(await Promise.allSettled(t)).map((t=>{if("rejected"===t.status)throw new Error(`Step initialization failed: ${t.reason}`);return t.value})),n=A.filter((t=>!!t&&!!t.command)).map((t=>t.command)),a=A.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));n&&n.length>0&&this.commandContext.apply(new B(n),!0);for(const t of a)await t();a.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((t=>t(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((t=>t(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((t=>t(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((t=>t(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((t=>t(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((t=>{t(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((t=>t(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((t=>{t(this.stepMetadata)}))}async onSelectionChange(){const t=await this.traversableScenes();for(const e of this.selectionCallbacks)e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:t})}onStepSpecificStorageChange(t){Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].forEach((e=>e(this.storage[t])))}onStorageChange(){this.storageCallbacks.forEach((t=>t(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((t=>{t(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((t=>{t(this.variationRecords)})),this.render3DScene()}traversableScenes(){return _n(this.allScenes,this.stepSelections)}}function Ya(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class xa{constructor(t){Ya(this,"variantData",void 0),this.variantData=t}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(t,e){return this.variantData.priceModifier.toLocaleString(t||"en-US",{style:"currency",currency:"USD",...e})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.asset?.versions?.find((t=>"cdn"===t.name))?.link}getAssetResource(){return this.variantData.asset}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name))?.link,e=this.variantData.thumbnail?.fileLink;return t||e}getDisplayImage(){return this.variantData.displayImage?.versions?.find((t=>"medium"===t.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function Pa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class Na{constructor(t,e){Pa(this,"manager",void 0),Pa(this,"step",void 0),this.manager=t,this.step=e}setUpdateState(t){Na.updateState.set(this.step.stepName,t)}getUpdateState(){return!!Na.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new xa(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new xa(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new xa(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}getRaw(){return this.step}getTags(){return this.step.tags||[]}hasTag(t){return this.step.tags?.includes(t)||!1}executeAnimations(){const t=this.manager.getPreviewService(),e=this.manager.getModelContainer(),A=this.step.data.modelAnimation,n=this.step.data.lookAtAnimation;t&&n&&t.executeCameraAnimation(n),e&&A&&e.executeAnimation(A)}}function Ra(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}Pa(Na,"updateState",new Map);const Ha=It`
559
+ `),Vn=t=>{const e=[];for(const A of t.steps)switch(A.type){case m.DigitalContent:A.data.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Upload});break;case m.Frame:const t=A.data;t.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),t.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Upload});break;case m.Illustration:const n=A.data;n.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Colors});break;case m.Material:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Model:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Picture:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Question:A.data.varySelections&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selections});break;case m.Shape:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection});break;case m.Text:const a=A.data;a.varyText&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Text}),a.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Selection}),a.varyColor&&a.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:p.Color})}return e},Wn=[m.SilentIllustration,m.ProductOverlay],Xn=async(t,e,A)=>{const n=[];t.introduction&&n.push({name:"Introduction",title:t.name,renderableSteps:[{type:m.Introduction,stepName:"Introduction",stepTitle:t.name,helpText:t.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of t.steps){if(e.bulkScene){let t=!1;switch(A.type){case m.DigitalContent:A.data.varyUpload&&(t=!0);break;case m.Frame:{const e=A.data;!e.varyUpload||!e.varySelection&&A.option||(t=!0)}break;case m.Illustration:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColors&&e.colorPickerEnabled||(t=!0)}break;case m.Material:A.data.varySelection&&(t=!0);break;case m.Model:A.data.varySelection&&(t=!0);break;case m.Picture:A.data.varySelection&&(t=!0);break;case m.Question:A.data.varySelections&&(t=!0);break;case m.Shape:A.data.varySelection&&(t=!0);break;case m.Text:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColor&&e.colorPickerEnabled&&e.colorOption||!e.varyText||(t=!0)}}if(t)continue}const a=qn(A.stepName,t.stepGroups);if(a){const t=n.find((t=>t.name===a.name));t?Wn.includes(A.type)?t.silentSteps.push(A):t.renderableSteps.push(A):n.push({name:a.name,title:a.name,renderableSteps:Wn.includes(A.type)?[]:[A],silentSteps:Wn.includes(A.type)?[A]:[]})}else n.push({name:A.stepName,title:A.stepTitle,renderableSteps:Wn.includes(A.type)?[]:[A],silentSteps:Wn.includes(A.type)?[A]:[]})}if(e.bulkScene){const a=A?.product?.bulkConfiguration;n.push({name:"Bulk",title:a?.sceneTitle??e.bulkSceneTitle,renderableSteps:[{type:m.Bulk,stepName:"Bulk",stepTitle:a?.stepTitle??e.bulkSceneTitle,helpText:a?.helpText,data:{aspects:Vn(t)},conditions:[]}],silentSteps:[]})}return e.finishScene&&n.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:m.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:t.finalizeStepConfig?t.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:t.finalizeStepConfig?t.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},qn=(t,e)=>e.find((e=>e.stepNames.includes(t))),Zn=(t,e)=>(t.conditions||[]).every((t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const e=A.selectedVariants;return t.requiredVariantSelections.some((t=>void 0!==e.find((e=>e.id===t))))}return!1})),$n=(t,e)=>t.map((t=>((t,e)=>{const A={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>Zn(t,e))),silentSteps:t.silentSteps.filter((t=>Zn(t,e)))};return 0===A.silentSteps.length&&0===A.renderableSteps.length?null:A})(t,e))).filter((t=>null!==t)),_n=async(t,e)=>{const A=$n(t,e),n=[];for(const t of A)for(const e of t.renderableSteps)if(e.type===m.Model||e.type===m.Material||e.type===m.Picture||e.type===m.Shape){const t=(e.option?.variants||[]).length;t&&t>1&&n.push(e.stepName)}else n.push(e.stepName);const a=A.filter((t=>t.renderableSteps.filter((t=>n.includes(t.stepName))).length>0));for(const t of a)t.renderableSteps=t.renderableSteps.filter((t=>n.includes(t.stepName)));return a};function ta(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}function ea(t,e,A,n){const a=A.width*t.zoom,i=A.height*t.zoom;if(n){const n=t,a=Math.max(e.width/A.width,e.height/A.height);n.zoom=Math.max(a,t.zoom);const i=A.width*n.zoom,r=A.height*n.zoom;return n.x=Aa(t.x,e.width-i,0),n.y=Aa(t.y,e.height-r,0),n}const r=t;return r.x=Aa(r.x,-a,e.width),r.y=Aa(r.y,-i,e.height),r}function Aa(t,e,A){return Math.min(Math.max(t,e),A)}class na{constructor(t){ta(this,"offsets",void 0),ta(this,"forceImageCover",void 0),ta(this,"targetElements",void 0),ta(this,"imageData",void 0),ta(this,"frameData",void 0),ta(this,"_debouncedUpdateFrameOffsets",void 0),ta(this,"minZoomScale",[.03]),ta(this,"maxZoomScale",[20]),ta(this,"onFrameDataChangeListeners",void 0),ta(this,"onZoomChangeListeners",void 0),ta(this,"workflowManager",void 0),ta(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=Xt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=t}connectWorkflowManager(t,e){e&&t.addStepSpecificStorageCallback((async t=>{if(t){const e=t;if(e.currentFrameSources){let t=!1;for(let A=0;A<e.currentFrameSources.length;A++){const n=e.currentFrameSources[A],a=await P(n);Ot(a,this.frameData)||(this.frameData||(this.frameData=new Array(e.currentFrameSources.length)),this.frameData[A]=a,t=!0)}t&&(this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),e),this.workflowManager=t,this.stepName=e}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}setFrameData(t){t?t.forEach(((e,A)=>{const n=M.get(e);n&&(this.frameData||(this.frameData=new Array(t.length)),this.frameData[A]=n)})):this.frameData=void 0}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,e,A,n){if(this.imageData&&this.offsets&&this.frameData){this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length));const a=this.frameData.map(((n,a)=>{const i=(e[a]-this.offsets[a].x)/this.offsets[a].zoom,r=(A[a]-this.offsets[a].y)/this.offsets[a].zoom;return{x:e[a]-i*t[a],y:A[a]-r*t[a],zoom:this.imageData.width*t[a]/this.imageData.width}}));this.updateOffsets(a,n),this.onZoomChangeListeners.forEach((e=>e(t)))}}setPatternData(t){this.imageData=t,t&&this.frameData&&(this.recalculateOffsets(t),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,e,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==t.length)throw new oe("Frame data and offsets are not the same length. This is a bug. Please report it.");this.offsets.some(((e,A)=>t[A].x!==e.x||t[A].y!==e.y||t[A].zoom!==e.zoom))||A?(this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length)),this.frameData.forEach(((e,A)=>{this.offsets[A]=ea(t[A],e,this.imageData,this.forceImageCover)})),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.targetElements,e)):e&&e()}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,e,A,n,a){if(!A||0===A.length||A.some((t=>!t)))throw new oe("Frame data not set. This is a bug");if(!this.workflowManager)throw new oe("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();n.forEach(((A,n)=>{i(new et(A,e,t[n]))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:t}),a&&a()}recalculateZoomLimits(t,e){this.minZoomScale.length===e.length&&this.maxZoomScale.length===e.length||(this.minZoomScale=new Array(e.length),this.maxZoomScale=new Array(e.length)),e.forEach(((e,A)=>{const n=Math.max(e.width/t.width,e.height/t.height);this.forceImageCover?(this.minZoomScale[A]=n,this.maxZoomScale[A]=2.5*n):(this.minZoomScale[A]=n/10,this.maxZoomScale[A]=2.5*n)}))}recalculateOffsets(t){this.frameData&&(this.offsets&&this.offsets.length===this.frameData.length||(this.offsets=new Array(this.frameData.length)),this.frameData.forEach(((e,A)=>{this.offsets[A]=tt(t,e)})),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements))}}function aa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class ia{constructor(t,e,A){aa(this,"configuration",void 0),aa(this,"layouts",void 0),aa(this,"product",void 0),aa(this,"processRegion",(async t=>{const e=this.layouts.find((e=>e.panelId===t.panelId));if(!e)throw new Ae(t);let A="";if(this.configuration.type===m.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),A=t,!t)throw new ie(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===h.Image){const A=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!A)throw new Error("Undefined raster silent step source");const a={stepName:this.configuration.stepName,id:F(),src:A,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:a.id,region:t},command:new r(a,e)}}{const a=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:A,i=async()=>new Promise(((t,e)=>{a?nt(a).then((e=>{t(e)})).catch((t=>console.error(t))):e("Undefined vector silent step source")})),o=await v(await i()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await wt(o.svg),src:a,svg:o.svg,colors:o.colors,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new r(s,e)}}})),this.configuration=t,this.layouts=e,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ie(this.configuration,"Missing regions.");if(this.configuration.type===m.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===m.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((e=>t.panelId===e.panelId)))throw new Ae(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===m.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return t?.startsWith("data:image/png")||t?.endsWith(".jpeg")||t?.endsWith(".jpg")||t?.endsWith(".png")?h.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),h.Illustration)}}const ra=async t=>{const e=`${Ee.getServicesApiUrl()}/shortener`;try{const A=await fetch(e,{method:"POST",body:JSON.stringify({longUrl:t}),headers:{"Content-Type":"application/json"}});return(await A.json()).shortUrl}catch(t){throw console.error(t),new ge("Failed to shorten URL, see console.")}};function oa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class sa{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(t){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(t,e,A,n=3e3,a=10){oa(this,"pollingId",void 0),oa(this,"attempts",void 0),oa(this,"interval",void 0),oa(this,"maxAttempts",void 0),oa(this,"predicate",void 0),oa(this,"onSuccess",void 0),oa(this,"onFailure",void 0),this.onSuccess=e,this.onFailure=A,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}const ca=new class{async init(t,e,A){return A&&await this.reload(t,e,A),null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[],a,(async()=>{const A=n?.storage?.videoShortUrl,a=n?.storage?.videoUrl;e.updateStorage(t.stepName,{videoShortUrl:A,videoUrl:a})}))}async regenerateQRCode(t,e,A,n,a,i,r,o,c){if(e||""===A||""!==n)c(!1);else{const e=async()=>{const t=(await Ne([A]))[0],e=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:e}},g=await new Promise(((t,A)=>{new sa((async()=>!!(await e()).link),(async()=>{const A=await e();if(!A.link||!A.link)throw new ae(A.asset);t({rel:"mpeg4",href:A.link})}),(()=>{A("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>o(new s(t.id))));const l="http"===i.data.baseUrl.slice(0,4)?"":"https://",d=new URL(l+i.data.baseUrl);d.searchParams.append("video",btoa(JSON.stringify([g]))),d.pathname=d.pathname+("/"===d.pathname.slice(-1)?"":"/");const B=d.toString();if(B.length>=2e3)throw new ge("Cannot create QR code, URL too long.");const w=await ra(B);if(r(w),!i.data||!i.data.regions)throw new ie(i,"Missing regions.");const h=await this.regionElements(i),E=await this.command(w,h,a,i.stepName);E&&(E.command&&a.getCommandDispatcher()(E.command),E.followup&&await E.followup()),await a.setSelectionsAndElements(i.stepName,[],h,(async()=>{a.updateStorage(i.stepName,{videoShortUrl:w,videoUrl:n}),c(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:F(),region:t})))}async command(t,e,A,n){const a=A.getLayouts(),i=`data:image/svg+xml;base64,${btoa(await Vt(t,{type:"svg"}))}`,o=e.map((t=>{const e=t.region,A=a.find((t=>t.panelId===e?.panelId));if(!A&&e)throw new Ae(e);if(A&&!e)throw new Error("Region not found");if(!A||!e)throw new Error("Neither a region or layout found!");return new r({stepRegion:e,stepName:n,id:t.id,src:i,type:h.Image,y:e.top,x:e.left,width:e.width,height:e.height,rotation:0},A)}));return{command:new B(o),followup:async()=>{}}}};function ga(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const la=new class{constructor(){ga(this,"frameSourceSvg",(async(t,e)=>{if(!t)return Et(e);const A=t.asset;if(!A)throw new ne(t);const n=A.fileLink;if(n)return nt(n);throw new ae(A)}))}async init(t,e,A){if(A)return await this.reload(t,e,A),null;if(e.setMandatoryFulfilled(t.stepName,!1),e.markStepsAsInitialised([t.stepName]),t.option&&t.option.variants&&t.option.variants.length>0){const A=t.option,n=Oe.getDefaultVariant(A);return n?this.selectVariantCommand(t,n,[],e,void 0,t.data.placeholderImageUrl):null}return this.selectVariantCommand(t,void 0,[],e,void 0,t.data.placeholderImageUrl)}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));if(!t.option||0===(t.option.variants||[]).length){const A=t.data.regions.map((t=>Et(t)));e.updateStorage(t.stepName,{currentFrameSources:A})}if(n){const A=async()=>{const A=n.storage?.framePatternSrc,a=n.storage?.frameOffsetsList;if(e.updateMetadata(t.stepName,{frameOffsetsList:a,framePatternSrc:A}),A){const n=e.getStepSpecificServices(t.stepName)?.frameService;if(!n)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(A,n),e.updateMetadata(t.stepName,{image:A}),e.updateStorage(t.stepName,{framePatternSrc:A})}if(a?.some((t=>t.zoom))){const A=e.getStepSpecificServices(t.stepName)?.frameService;if(!A)throw new Error("Frame service unavailable, cannot load pattern!");A.updateOffsets(a)}e.setMandatoryFulfilled(t.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const i=n.selectedVariants[0].id;if(t.option&&i){const n=t.option.variants?.find((t=>t.id===i));n&&await e.setSelectionsAndElements(t.stepName,[n],a,(async()=>{const a=await Promise.all(t.data.regions.map((t=>this.frameSourceSvg(n,t))));e.updateStorage(t.stepName,{currentFrameSources:a}),await A()}))}}else await e.setSelectionsAndElements(t.stepName,[],a,A)}}selectImage(t,e,A){A.setEditedStatus(t.stepName,!0);(e.fileLink||"").endsWith("pdf")?A.addPoller(new sa((async()=>{const t=(await be.getLocalOrFromServer(e.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{be.getLocalOrFromServer(e.key||"").then((e=>{this.loadPatternFromAsset(e,t,A)}))}),(()=>{throw new ge("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(e,t,A)}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(t,e,A,n){return new r({id:t,type:h.Frame,x:e.left,y:e.top,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,scaleX:e.width/n.frameData.width,scaleY:e.height/n.frameData.height,path:n.frameData.path,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:e,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:e.immutable},A)}async loadPatternFromString(t,e){if(t.endsWith("svg")){const A=await ut(t),n=A.width,a=A.height,i={src:t,width:n,height:a,aspect:n/a};k.set(t,i),e.setPatternData(i)}else{const A=await st(t),n=await Y(A),a={src:t,width:n.width,height:n.height,aspect:n.width/n.height};k.set(t,a),e.setPatternData(a)}}async selectVariantCommand(t,e,A,n,a,i){const r=n.getStepSpecificServices(t.stepName)?.frameService;if(!r)throw new Error("Frame service unavailable, cannot load pattern!");const o=await Promise.all(t.data.regions.map((t=>this.frameSourceSvg(e,t))));a&&a(!0);const c=await Promise.all(t.data.regions.map((async(e,a)=>{const i=await P(o[a]),c=r.getImageData(),g=A.map((t=>new s(t.id))),l=c?tt(c,i):void 0,d=c?{id:F(),src:c.src,x:l?.x||0,y:l?.y||0,width:c.width,height:c.height,scaleX:l?.zoom||1,scaleY:l?.zoom||1,rotation:0}:void 0,B=F(),w=n.getLayouts().find((t=>t.panelId===e.panelId));if(!w)throw new Ae(e);return{command:this.getCreateElementCommand(B,e,w,{frameData:i,pattern:d,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:B,region:e},removeExistingCommands:g}}))),g=c.map((t=>t.command)),l=c.map((t=>t.removeExistingCommands)).flat();return{command:new B([...g,...l]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(t.stepName,e?[e]:[],[...c.map((t=>t.regionEl))],(async()=>{if(n.updateStorage(t.stepName,{currentFrameSources:o}),i){const e=n.getStepSpecificServices(t.stepName)?.frameService;if(!e)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,e)}}))}}}patternSource(t){const e=t.versions?.find((t=>"svg"===t.name));if(e)return e.link;const A=t.fileLink;if(A)return A;throw new ae(t)}async loadPatternFromAsset(t,e,A){const n=this.patternSource(t),a=A.markUpdatePending(),i=A.getStepSpecificServices(e.stepName)?.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(e.stepName,{image:n}),A.updateStorage(e.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}};const da=new class{async getIllustrationBody(t){return new Promise((e=>{nt(t).then((t=>{e(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,e,A,n){return new r({stepRegion:e,stepName:n.stepName,colors:n.svg.colors,id:t,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable},A)}getColors(t,e){const A=e.getRegionElements(t.stepName)||[];if(0===A.length)return[];try{return y(A[0].id,e.getAllLayoutData()).colors}catch(t){return[]}}async init(t,e,A){const n=t.option;if(!n)return null;if(A)return this.reload(t,e,A);{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantCommand(t,A,[],(()=>{}),e)}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(!i||!A)throw new Error("Required illustration variant no longer available");{const r=i.variants?.find((t=>t.id===A));if(r){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[r],A,(async()=>{e.updateMetadata(t.stepName,{colors:n.storage?.colors}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}return null}async availableColors(t,e){const A=t.data.colorOption;return A&&A?A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t}))):[]}async changeColorsCommand(t,e,A,n,a){const i={};for(const[t,e]of a.entries())i[t]={browserValue:e,spotColor:i[t]?.spotColor};const r=Ct(t,e,A,i),o=await wt(r),s=[];for(const t of n){for(const[e,A]of a.entries())s.push(new Qt(t,e,A));s.push(new pt(t,r,o))}return new B(s)}async changeColors(t,e,A,n,a){if(0===e.length)return;const i=y(e[0].id,n().map((t=>t.layoutState))),r={...i.colors},o={};Object.entries(r).forEach((([t,e])=>{const A={browserValue:e.browserValue},n=e.spotColor;n&&(A.spotColor={profileName:n.profileName,namedColor:n.namedColor}),o[t]=A}));for(const[t,e]of a.entries())r[t]={browserValue:e,spotColor:r[t]?.spotColor},o[t]={browserValue:e};let s=Array.from(Object.values(r)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{s=s.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),A.updateMetadata(t.stepName,{colors:s});const g=new Map;if(Object.entries(r).forEach((([t,e])=>{g.set(t,e.browserValue)})),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(i.svg,i.width,i.height,e.map((t=>t.id)),g);A.updateStorage(t.stepName,{colors:o}),A.getCommandDispatcher()(l)}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(t,e,A,n,a){if(!t.data||!t.data.regions)throw new ie(t,"Missing regions.");n(!0);const i=A.map((t=>new s(t.id)));a.setMandatoryFulfilled(t.stepName,!1);const r=e.asset;if(!r)throw new ne(e);const o=r.fileLink;if(!o)throw new ae(r);const c=await v(await this.getIllustrationBody(o)),g=await wt(c.svg),l=t.data.regions.map((e=>{const A=a.getLayouts().find((t=>t.panelId===e.panelId));if(!A)throw new Ae(e);const n=F();return{regionElement:{id:n,region:e},command:this.getCreateElementCommand(n,e,A,{stepName:t.stepName,src:o,objectURL:g,svg:c})}})),d=[...l.map((t=>t.command)),...i];let w=Array.from(Object.values(c.colors)).map((t=>t.browserValue));const h=t.data.colorOption;return h&&h.variants?.forEach((t=>{w=w.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),a.updateMetadata(t.stepName,{colors:w}),{command:new B(d),followup:async()=>{await a.setSelectionsAndElements(t.stepName,[e],l.map((t=>t.regionElement)),(async()=>{a.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const Ba=new class{async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(A)await this.reload(t,e,A);else{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(!i)throw new ee(t);if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(A){const n=i.variants?.find((t=>t.id===A));if(n){const A=n.material,r=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],r,(async()=>{const n=e.getModelContainer();if(n){const a=t.data.targetMaterials.map((t=>n.applyMaterialVariant(t,i.id||"",A||{})));Promise.all(a).then((()=>e.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantLambda(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,e,A,n){const a=A.getModelContainer();n(!0);const i=e.material;if(!i)throw n(!1),new ne(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{a&&t.data.targetMaterials.forEach((e=>{t.option&&a.applyMaterialVariant(e,t.option.id||"",i)})),A.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const wa=new class{async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(A)await this.reload(t,e,A);else{const A=Oe.getDefaultVariant(n);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const n=i.variants?.find((t=>t.id===A));if(n){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],A,(async()=>{const A=e.getModelContainer();if(A&&t.option){const a=n.asset?.fileLink;if(!a)throw new ne(n);await A.applyModelVariant(t.option.id||"",{model:a,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantLambda(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,e,A,n){n(!0);const a=e.asset?.fileLink;if(!a)throw new ne(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{const e=A.getModelContainer();e&&t.option&&e.applyModelVariant(t.option.id||"",{model:a,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const ha=new class{async init(t,e,A){return A?(await this.reload(t,e,A),null):(e.updateMetadata(t.stepName,{text:""}),this.changeTextCommand(t,"",e,"",(()=>{})))}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[],a,(async()=>{e.updateStorage(t.stepName,{text:n?.storage?.text}),e.setMandatoryFulfilled(t.stepName,""!==n?.storage?.text)}))}async changeText(t,e,A,n,a){const i=await this.changeTextCommand(t,e,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(t,e,A,n,a){const i=A.getRegionElements(t.stepName),o=A.getStepSpecificServices(t.stepName)?.module;if(!o)return console.error("Missing module."),null;const c=A.getProfanities();if(!this.validateInput(t,e,c,a))return A.setMandatoryFulfilled(t.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(t.stepName,""!==e),!t.data||!t.data.regions||t.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(t.stepName,{text:e});const g=(e,n,a)=>{const i=a||F(),o=A.getLayouts().find((t=>t.panelId===n.panelId));if(!o)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return a&&c.push(new s(i)),c.push(new r({stepRegion:n,stepName:t.stepName,colors:{},id:i,svg:e,type:h.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},o)),{id:i,region:n,command:new B(c)}};if(i.length>0){const t=i.map((t=>{if(!t.region)return null;const A=o.svgPrint(e,t.region);return g(A,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new B(t),followup:async()=>{}}}{const n=t.data.regions.map((t=>g(o.svgPrint(e,t),t))),a=n.filter((t=>!!t)).map((t=>t&&t.command));return{command:new B(a),followup:async()=>{const e=n.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await A.setSelectionsAndElements(t.stepName,[],e)}}}}validateInput(t,e,A,n){if(t.data&&t.data.maxLength){const A=t.data.maxLength;if(e.length>A)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(e))return n("Unsupported characters."),!1;const a=qt(e.toLowerCase());for(const t of a)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const Ea=new class{async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else if(n.defaultVariant)return e.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,n.defaultVariant,e,(()=>{}));return e.markStepsAsInitialised([t.stepName]),null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const n=i.variants?.find((t=>t.id===A));if(n){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[n],A,(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,n){const a=await this.selectVariantCommand(t,e,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,e,A,n){const a=e.asset;if(!a)throw new ne(e);const i=a?.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),A.setMandatoryFulfilled(t.stepName,!1);const o=A.getRegionElements(t.stepName).map((t=>new s(t.id))),c=t.data.regions.map((e=>{const n=A.getLayouts().find((t=>t.panelId===e.panelId));if(!n)throw new Ae(e);const a=F();return{regionElement:{id:a,region:e},command:new r({stepName:t.stepName,stepRegion:e,id:a,src:i,type:h.Image,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,preserveAspectRatio:"none"},n)}}));return{command:new B([...o,...c.map((t=>t.command))]),followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],c.map((t=>t.regionElement)),(async()=>{A.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const ua=new class{async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else{const A=n.variants;if(Oe.getDefaultVariant(n)){const a=A?.find((t=>t.id===n.defaultVariant?.id));return this.selectVariantLambda(t,a?.id||"",e)}}return null}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(a&&A){const n=a.variants?.find((t=>t.id===A));n&&await e.setSelectionsAndElements(t.stepName,[n],[])}}}async selectVariant(t,e,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(t,e,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A){const n=t.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find((t=>t.id===e)):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[i],[],(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}};function Ca(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const Qa=new class{constructor(){Ca(this,"shapeFillId","spiff-fill-shape")}async availableColours(t){const e=t.option;return e&&e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}setCustomColor(t,e,A){const n=A.getLayouts(),a=(A.getRegionElements(e.stepName)||[]).map((e=>{const A=e.region;if(!n.find((t=>t.panelId===A?.panelId)))throw new Ae(A);return new Qt(e.id,this.shapeFillId,t)})).filter((t=>!!t));A.getCommandDispatcher()(new B(a)),A.updateStorage(e.stepName,{colour:t})}async init(t,e,A){const n=t.option;if(!n)throw new ee(t);if(!A){const A=Oe.getDefaultVariant(n);return A?this.selectVariantCommand(t,{fill:A.color,stroke:A.color,variant:A},[],e):null}return await this.reload(t,e,A),null}async selectVariant(t,e,A,n){const a=await this.selectVariantCommand(t,e,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const r=i.variants?.find((t=>t.id===A));if(r){const A=a.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[r],A,(async()=>{e.updateStorage(t.stepName,{colour:n?.storage?.colour||""}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariantCommand(t,e,A,n){const a=n.getLayouts(),i=n.getStepStorage(t.stepName)?.colour,o=()=>{if("#custom"===e.variant?.color)return i||"#FFFFFF";if(e.variant?.color)return e.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const i=t=>{const e=t.region;if(!a.find((t=>t.panelId===e?.panelId)))throw new Ae(e);const A=o();return new Qt(t.id,this.shapeFillId,A)},r=A.map(i).filter((t=>!!t));return{command:new B(r),followup:async()=>{await n.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],A),n.updateStorage(t.stepName,{colour:o()})}}}{const A=e=>{const A=a.find((t=>t.panelId===e.panelId));if(!A)throw new Ae(e);const n=o(),i=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="${this.shapeFillId}"\n fill="${n}"\n />\n </svg>\n `,s={};s[this.shapeFillId]={browserValue:n};const c=F();return{id:c,region:e,command:new r({stepRegion:e,stepName:t.stepName,colors:s,id:c,svg:i,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:t.data.excludeFromPrint},A)}},i=t.data.regions.map(A),s=i.filter((t=>!!t)).map((t=>t?.command)),c=i.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new B(s),followup:async()=>{await n.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],c,(async()=>{n.updateStorage(t.stepName,{colour:o()})}))}}}}};function pa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class ma extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=ma.name}}const fa=["‘","’","“","”","\n"];class Da extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=Da.name}}const Ia=new class{constructor(){pa(this,"cachedColors",new Map),pa(this,"filterUnsupportedCharacters",((t,e)=>{let A=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=e?mt(e.assetUrl):void 0;if(a){const t=A.split("").filter((t=>!fa.includes(t))).join(""),e=t.split("").map((t=>a.getFont().charToGlyph(t)));for(let A=0;A<e.length;A++){".notdef"===e[A].name&&n.push(String.fromCharCode(t.charCodeAt(A)))}}for(let t=0;t<n.length;t++)A=A.replaceAll(n[t],"");return A})),pa(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),pa(this,"getErrorsForText",((t,e,A)=>{const n=[];e.data&&e.data.maxLength&&t.length>e.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=A.getProfanities(),i=qt(t.toLowerCase());for(const t of i)for(const e in a){if(t===a[e].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!e.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(t,e,A){const n=t.option;if(!n)return null;if(A)await this.reload(t,e,A);else{const A=this.getDefaultImageFillVariant(t.data),a=A?.asset?.fileLink,i=a?await Z(a):void 0,r=i?{src:i.src,height:i.height,width:i.width,scale:t.data.imageFillScale||1}:void 0;e.updateStorage(t.stepName,{inputText:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.color||await this.getDefaultColor(t.data),fillImage:r}),e.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:A?.name});const o=Oe.getDefaultVariant(n);if(o)return this.selectVariantCommand(t,o,{},[],e,(()=>{}),(()=>{}),r)}return null}findLayoutElements(t,e){return t.getRegionElements(e.stepName).map((e=>y(e.id,t.getAllLayoutData())))}availableFillColors(t){const e=this.cachedColors.get(t.stepName);if(e)return e;const A=t.data.colorOption;if(A){const e=A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[];return this.cachedColors.set(t.stepName,e),e}return[]}async changeFillColor(t,e,A,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher();e.variant?n.updateMetadata(t.stepName,{color:e.variant.name}):n.updateMetadata(t.stepName,{color:e.fill});const i=t.data.colorOption,r=i?this.createTextFillSpotColor(i,e.variant):void 0;i?n.updateStorage(t.stepName,{color:e.fill,colorProfileAssetKey:i.colorProfile?.key}):n.updateStorage(t.stepName,{color:e.fill});for(const t of A){if(!e.fill)throw new Error("Fill not set on new color selection!");a(new g(t.id,e.fill,r))}}async availableFillImages(t){const e=t.data.imageFillOption;if(e){const A=e.variants?.map((t=>t.asset?.fileLink))?.filter((t=>!!t))||[];return Promise.all(A.map((async e=>{const A=await Z(e);return{src:e,width:A.width,height:A.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,e,A,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher(),i=t.option?.variants?.find((t=>t.asset?.fileLink===e.src));n.updateMetadata(t.stepName,{fillImage:i?.name}),n.updateStorage(t.stepName,{fillImage:e});for(const t of A){a(new ft(t.id,e))}}getProcessedInput(t,e,A){const n=A?t:this.injectReplaceableText(t,e);return lt(n,{vertical:e.vertical,uppercase:e.uppercase})}updateInputText(t,e,A,n){const a=n.getStepStorage(A.stepName),i=this.getProcessedInput(t,A.data,!!a.customiseAllText),r={command:void 0,helperText:"",errors:this.getErrorsForText(t,A,n)};if(r.errors.length>0)return r.helperText=r.errors[0].localizationKey,r;const o=(A.data.maxLength-i.length).toString();r.helperText=`${o} characters remaining`;const s=n.getTransaction().bulk&&A.data.varyText||!1,c=[],g=new Map,l=new Map;for(const t of e){if(!t.fontData)throw new oe("Failed to resolve font data for text.");const[e,n]=b(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[i],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});g.set(t.id,e),l.set(t.id,n);const a=A.data.curved?i:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(e,A.data,t.id,a,s))}if(!A.data.curved&&e.length>0){if(!Array.from(l.values()).every((t=>t)))return r.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),r}return n.updateStorage(A.stepName,{text:t}),n.updateMetadata(A.stepName,{text:i}),a.defaultCleared&&n.setMandatoryFulfilled(A.stepName,!0),r.command=new B(c),r.command.varying=s,r}async selectVariant(t,e,A,n,a){const i=await this.selectVariantCommand(t,e,A.getStepStorage(t.stepName)||{},A.getRegionElements(t.stepName),A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}createTextFillSpotColor(t,e){const A=t.colorProfile;if(A){const t=(A.name||"").replace(/\s/g,"-"),n=t.lastIndexOf("/"),a=t.slice(n+1).slice(0,-4);if(!e.namedColor)throw new Error("variant named color not set!");return{profileName:a,namedColor:e.namedColor}}}async reload(t,e,A){const n=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),a=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const A=n.selectedVariants[0].id;if(i&&A){const r=i.variants?.find((t=>t.id===A));if(r){const A=await this.fontDataFromVariant(r),i=a.map((t=>({id:t.id,region:t.stepRegion}))),o=n.storage?.color,s=n.storage?.text;await e.setSelectionsAndElements(t.stepName,[r],i,(async()=>{e.updateMetadata(t.stepName,{color:o,text:s}),e.updateStorage(t.stepName,{text:s,inputText:s});const n=a.map((t=>new d(t.id,A))),i=new B(n);e.getCommandDispatcher()(i),e.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=Ia.updateInputText(s||"",a,t,e);c&&e.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const e=t.colorOption;if(e)return Oe.getDefaultVariant(e)}async getDefaultColor(t){const e=t.colorOption;if(!e)return;return Oe.getDefaultVariant(e)?.color}getDefaultImageFillVariant(t){const e=t.imageFillOption;if(e)return Oe.getDefaultVariant(e)}async fontDataFromVariant(t){const e=t.asset;if(!e)throw new ne(t);const A=e.fileLink;if(!A)throw new ae(e);return{assetUrl:A,name:(await H(A)).names.fullName.en}}async selectVariantCommand(t,e,A,n,a,i,r,o){const s=a.markUpdatePending(),c=await this.fontDataFromVariant(e);if(n.length>0){const g=n.map((t=>new d(t.id,c)));if(o){const t=n.map((t=>new ft(t.id,o)));g.push(...t)}const l=await this.changeInputTextWithRegion(t,t.data.size||30,c,A.text||"",A,a,!!A.customiseAllText,i,r);l&&g.push(l);return{command:new B(g),followup:async()=>{a.markUpdateCompleted(s),await a.setSelectionsAndElements(t.stepName,[e],n)}}}{const n=await this.createTextboxRegions(t.stepName,e,t.data,c,A,a),g=await this.changeInputTextWithRegion(t,t.data.size||30,c,n[0]?.newElement.input||A.text||t.data.defaultText||"",A,a,!!A.customiseAllText,i,r),l=n.flatMap((t=>t.commands));if(o){const t=n.map((t=>new ft(t.regionElement.id,o)));l.push(...t)}g&&l.push(g);return{command:new B(l),followup:async()=>{a.markUpdateCompleted(s)}}}}injectReplaceableText(t,e){return e.replaceableText?e.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,e,A,n,a,i){if(!A||!A.regions)throw new Error("Step data not supplied");const o=i.getTransaction().bulk&&A.varyText||!1,s=o?"":a.text||A.defaultText||"",c=this.getProcessedInput(s,A,!1),g=await Promise.all(A.regions.map((async e=>{const g=i.getLayouts().find((t=>t.panelId===e.panelId)),l=F();try{if(!g)throw new Da("Failed to find layout for region: "+e.panelId);const d=A.colorOption;let B;if(d&&d.variants){const e=d.variants.find((t=>t.id===d.defaultVariant?.id))||d.variants[0];B=this.createTextFillSpotColor(d,e),i.updateStorage(t,{colorProfileAssetKey:d.colorProfile?.key})}const w=await this.getDefaultColor(A),E=w||"#000000",u={stepRegion:e,stepName:t,align:this.textAlign(A),fill:a.color?a.color:E,fontSize:A.size||30,fontData:n,id:l,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,text:c,input:s,type:h.Textbox,vertical:A.vertical,x:e.left,y:e.top,height:e.height,width:e.width,immutable:e.immutable,verticalAlign:A.verticalAlign||"middle",curved:A.curved,paths:A.paths,fillSpotColorDefinition:B},C=[],Q=new Map,p=new Map;if(!u.fontData)throw new oe("Failed to resolve font data for text.");const[m,f]=b(u.fontSize,u.fontData,{left:u.x,top:u.y,width:u.width,height:u.height,rotation:u.rotation,panelId:""},[c],{size:A.size,minSize:A.minSize,maxSize:A.maxSize});Q.set(u.id,m),p.set(u.id,f);const D=A.curved||A.vertical?c:(f||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(m,A,u.id,D,o));const I=new r(u,g);return I.varying=o,{regionElement:{id:l,region:e},commands:[I,...C],newElement:u,fontData:n}}catch(t){throw console.log(t),new ma("Error adding font to region")}}))).catch((t=>{throw t instanceof ma?(EA.setLatestToast("Failed to load font.",Ma.Error),t):t instanceof Da?t:new Error(t)}));return await i.setSelectionsAndElements(t,[e],g.map((t=>t.regionElement)),(async()=>{i.updateMetadata(t,{text:s}),i.updateStorage(t,{text:s})})),g}generateTextChangeCommandsForRegion(t,e,A,n,a){const i=[],r=new f(A,n);if(r.varying=a,i.push(r),!e.size){const e=new l(A,t);e.varying=a,i.push(e)}const o=new B(i);return o.varying=a,o}async changeInputTextWithRegion(t,e,A,n,a,i,r,o,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,t.data,r),d=i.getRegionElements(t.stepName),w=new Map,h=new Map;for(const n of d)if(n.region){const[a,i]=b(e,A,n.region,[l],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});w.set(n.id,a),h.set(n.id,i)}const E=(()=>{if(t.data&&t.data.maxLength&&l.length>t.data.maxLength)return c&&c(!0),{info:"0"};const e=i.getProfanities(),A=qt(l.toLowerCase());for(const t of A)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return o(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return o(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(h.values()).every((t=>t)))return o(!0),{error:"Does not fit."}}return o(!1),{info:(t.data.maxLength-l.length).toString()}})();if(E.error)return void s(E.error);if(s(`${E.info} characters remaining`||""),c)return;i.updateStorage(t.stepName,{text:g}),i.updateMetadata(t.stepName,{text:this.injectReplaceableText(g,t.data)});const u=i.getTransaction().bulk&&t.data.varyText||!1;a.defaultCleared&&i.setMandatoryFulfilled(t.stepName,!0);const C=[];for(const e of d){const A=t.data.curved?l:(h.get(e.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(w.get(e.id)||1,t.data,e.id,A,u))}const Q=new B(C);return Q.varying=u,Q}};function ya(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}let Ma;var Fa;(Fa=Ma||(Ma={})).Error="Error",Fa.Warning="Warning",Fa.Info="Info";class Sa extends XA{constructor(t){super(),ya(this,"update",void 0),ya(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class va{constructor(t,e,A,n,a,i,r,o,s,c,g=!1,l,d=!1){ya(this,"reloadedState",void 0),ya(this,"transaction",void 0),ya(this,"ownerCustomer",void 0),ya(this,"updateTransaction",void 0),ya(this,"confirmedDesign",void 0),ya(this,"editedSteps",void 0),ya(this,"informationResults",void 0),ya(this,"layouts",void 0),ya(this,"mandatorySteps",void 0),ya(this,"pendingUpdates",void 0),ya(this,"selectionCost",void 0),ya(this,"workflow",void 0),ya(this,"stepSpecificServices",void 0),ya(this,"previewService",void 0),ya(this,"profanityFilter",void 0),ya(this,"pollers",void 0),ya(this,"commandContext",void 0),ya(this,"stepElements",void 0),ya(this,"stepInitialised",void 0),ya(this,"stepMetadata",void 0),ya(this,"stepSelections",void 0),ya(this,"storage",void 0),ya(this,"confirmCallbacks",void 0),ya(this,"editedCallbacks",void 0),ya(this,"elementsCallbacks",void 0),ya(this,"informationResultCallbacks",void 0),ya(this,"initCallbacks",void 0),ya(this,"makingAdjustmentsCallback",void 0),ya(this,"mandatoryCallbacks",void 0),ya(this,"metadataCallbacks",void 0),ya(this,"selectionCallbacks",void 0),ya(this,"stepSpecificStorageCallbacks",void 0),ya(this,"storageCallbacks",void 0),ya(this,"currentVariationRecordCallbacks",void 0),ya(this,"variationRecordCallbacks",void 0),ya(this,"allScenes",void 0),ya(this,"product",void 0),ya(this,"invalidModelVariants",void 0),ya(this,"currentAdjustingStepId",void 0),ya(this,"renderableContextService",void 0),ya(this,"workflowStatePromiseQueue",new qA(1)),ya(this,"variationRecords",[]),ya(this,"currentVariationRecord",void 0),ya(this,"initializationPromise",void 0),ya(this,"initialized",!1),ya(this,"readOnly",!1),ya(this,"modelContainer",void 0),ya(this,"isReloadedTransaction",!1),ya(this,"render3DScene",(()=>{if(!this.previewService)return;const t=this.getCommandContext().getAllLayouts(),e=this.getLayoutPreviewService()?.getAll();if(e)for(const[,A]of e)A.render(this.getWorkflow(),t,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=a,this.commandContext=n,this.reloadedState=c,this.transaction=i,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=t,this.stepSpecificServices={},this.profanityFilter=e,this.pollers=[],this.allScenes=[],this.layouts=A,this.product=r,this.previewService=o,this.modelContainer=l,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.isReloadedTransaction=d,this.initializationPromise=this.initializeDefaultWorkflowState(t,i),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((t=>{throw console.error(t),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>{this.updateStateWithServer(),this.render3DScene()}))))}async initializeDefaultWorkflowState(t,e){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((t=>{this.storage[t.stepName]=t.storage||{}})),this.allScenes=await Xn(t,{bulkScene:e.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},e);const A=$n(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:n,commands:a}=await this.stepElementsForIntroducedSilentSteps(A,!!this.reloadedState);this.commandContext.apply(new B(a),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.isReloadedTransaction&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const t=this.workflow.finalizeStepConfig;if(!t)return;const e=t.lookAtAnimation,A=t.modelAnimation;e&&this.previewService?.executeCameraAnimation(e),A&&this.modelContainer?.executeAnimation(A)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(t){const e={...t,recordNumber:this.variationRecords.reduce(((t,e)=>e.recordNumber>t?e.recordNumber:t),0)+1};return this.variationRecords.push(e),this.onVariationRecordsChange(),e}removeVariationRecord(t){if(this.variationRecords=this.variationRecords.filter((e=>e.recordNumber!==t)),this.variationRecords.forEach(((t,e)=>t.recordNumber=e+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===t){const t=this.currentVariationRecord.recordNumber,e=t>1?this.variationRecords[t-2]:this.variationRecords[0];this.setCurrentVariationRecord(e||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(t){this.variationRecords=t,this.onVariationRecordsChange(),0===t.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(t[0])}setCurrentVariationRecord(t){if(this.currentVariationRecord=t,this.onCurrentVariationRecordChange(),t){const e=this.variationRecords.find((e=>e.recordNumber===t.recordNumber));e&&(e.values=t.values,this.onVariationRecordsChange())}}addConfirmCallback(t){t(this.confirmedDesign),this.confirmCallbacks.push(t)}addEditedCallback(t){t(this.editedSteps),this.editedCallbacks.push(t)}addElementsCallback(t){t(this.stepElements),this.elementsCallbacks.push(t)}addInformationResultCallback(t){t(this.informationResults),this.informationResultCallbacks.push(t)}addInitCallback(t){t(this.stepInitialised),this.initCallbacks.push(t)}addMandatoryCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}addMetadataCallback(t){t(this.stepMetadata),this.metadataCallbacks.push(t)}async addSelectionCallback(t){t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(t)}addStepSpecificStorageCallback(t,e){Object.keys(this.storage).includes(e)||(this.storage[e]={}),t(this.storage[e]),Object.keys(this.stepSpecificStorageCallbacks).includes(e)||(this.stepSpecificStorageCallbacks[e]=[]),this.stepSpecificStorageCallbacks[e].push(t)}addStorageCallback(t){t(this.storage),this.storageCallbacks.push(t)}addMakingAdjustmentsCallback(t){t(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(t)}addCurrentVariationCallback(t){t(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(t)}addVariationRecordsCallback(t){t(this.variationRecords),this.variationRecordCallbacks.push(t)}addPoller(t){this.pollers.push(t)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((t=>t.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(t){return this.stepElements[t]||[]}getStepSpecificServices(t){return this.stepSpecificServices[t]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(t){this.ownerCustomer=t}setTransactionCustomerDetails(t){this.ownerCustomer={...this.ownerCustomer,emailAddress:t.email}}getModelContainer(){return this.modelContainer}setModelContainer(t){(!t||this.previewService&&this.previewService.getAllModels().includes(t))&&(this.modelContainer=t,t.metadata&&t.metadata instanceof Map&&this.modelContainer.metadata.set("workflowManager",this))}setTransaction(t){this.transaction=t}getWorkflow(){return this.workflow}getCommandDispatcher(){return t=>this.commandContext.apply(t,!this.initialized)}getWorkflowSelections(){const t={};return this.workflow.steps.forEach((e=>{const A=this.stepSelections[e.stepName];A&&A.selectedVariants&&A.selectedVariants.length>0&&(t[e.stepName]={selections:A.selectedVariants})})),t}markStepsAsInitialised(t){const e={...this.stepInitialised};t.forEach((t=>{e[t]=!0})),this.stepInitialised=e,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(t){this.pendingUpdates=this.pendingUpdates.filter((e=>e!==t))}markUpdatePending(){const t=F();return this.pendingUpdates=[...this.pendingUpdates,t],t}setEditedStatus(t,e){this.editedSteps={...this.editedSteps,[t]:e},this.onEditedChange()}setInformationResults(t){this.informationResults=[...t],this.onInformationResultChange()}setCurrentAdjustingStepId(t){this.currentAdjustingStepId=t,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(t,e){this.mandatorySteps[t]!==e&&(this.mandatorySteps={...this.mandatorySteps,[t]:e},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}async injectIntoPreviewService(t){if(this.modelContainer)throw new Error("You must eject from the preview service before injecting again.");if(this.previewService=t,!this.getProduct().modelUrl||!this.previewService)return;const e=t.loadModel({model:this.getProduct().modelUrl,contextService:this.getLayoutPreviewService()});this.setModelContainer(e);$n(this.allScenes,this.stepSelections).filter((t=>t)).map((t=>t.renderableSteps)).flat().filter((t=>t.type===m.Model||t.type===m.Material)).forEach((t=>{if(!t.option?.id)return void console.error(`Failed to read option id from step: ${t.stepName}`);const e=this.stepSelections[t.stepName]?.selectedVariants||[];if(0===e.length)return;const A=e[0];if(t.type===m.Model){const e=A.asset?.fileLink;if(!e)return void console.error(`Failed to read model url from variant: ${A.id} for step: ${t.stepName}`);const n=t.data;this.modelContainer.applyModelVariant(t.option.id,{model:e,contextService:this.getLayoutPreviewService()},n.replaceProductModel)}else{const e=A.material;if(!e)return void console.error(`Failed to read material from variant: ${A.id} for step: ${t.stepName}`);t.data.targetMaterials.forEach((A=>{this.modelContainer.applyMaterialVariant(A,t.option.id,e)}))}})),await e.getInitializationPromise(),this.render3DScene()}ejectFromPreviewService(){if(this.modelContainer){if(!this.modelContainer.dispose)throw new Error("This feature is not supported in the current preview service.");this.modelContainer.dispose(),this.modelContainer=void 0}this.previewService=void 0}updateStorage(t,e){const A={...this.storage,[t]:{...this.storage[t],...e}};if(!Ot(A,this.storage)){this.storage=A;const e=new ht(this.constructSerializableWorkflow());this.commandContext.apply(e,!0),this.onStepSpecificStorageChange(t),this.onStorageChange()}}constructSerializableWorkflow(){const t=[];return this.allScenes.forEach((e=>{e.renderableSteps.forEach((e=>{const A={stepName:e.stepName};A.storage=this.storage[e.stepName],A.selectedVariants=this.stepSelections[e.stepName]?.selectedVariants?.map((t=>({id:t.id,priceModifier:t.priceModifier}))),t.push(A)}))})),{steps:t}}updateStateWithServer(){if(this.readOnly)return;const t=this.serialize();this.workflowStatePromiseQueue.enqueue(new Sa((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new Sa((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new oe("Attempted to serialize state before it was initialized.");const e=JSON.stringify(this.dehydrateState(zt(t.transaction))),A=t.variation;if(!A)return{transaction:e};const n={layouts:{},serializableWorkflow:{steps:[]},...zt(A)||{}};return{transaction:e,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(t){for(const e of Object.values(t.layouts).map((t=>t.elements)).flat())"illustration"===e.type&&(delete e.cachedObjectURL,e.src&&delete e.svg);return t}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(t,e){this.stepMetadata={...this.stepMetadata,[t]:{...this.stepMetadata[t],...e}},this.onMetadataChange()}removeElements(t){this.stepElements=((t,e)=>Object.keys(t).reduce(((A,n)=>{const a=[...t[n]||[]];return e.forEach((t=>{const e=a.findIndex((e=>e.id===t.id));e>-1&&a.splice(e,1)})),A[n]=a,A}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,e)=>(Zn(e,this.stepSelections)||this.stepElements[e.stepName]&&this.stepElements[e.stepName].forEach((e=>t.push(e))),t)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((t,e)=>("Model"===e.type&&e.option?.id&&!Zn(e,this.stepSelections)&&t.push(e.option.id),t)),[])}async stepElementsForIntroducedSilentSteps(t,e){const A=this.product;if(!A)return Promise.resolve({stepElements:{},commands:[]});const n=async(t,e,A)=>{if(t.type===m.SilentIllustration){return{step:t,results:await new ia(t,e).trigger()}}if(t.type===m.ProductOverlay){return{step:t,results:await new ia(t,e,A).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},a=t.filter((t=>!this.stepInitialised[t.stepName])),i={stepElements:{},commands:[]},r=[];for(const t of a)this.markStepsAsInitialised([t.stepName]),e||r.push(n(t,this.layouts,A));const o=await Promise.all(r);for(const t of o)i.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),i.commands=[...i.commands,...t.results.map((t=>t.command))];return i}getStepStorage(t){return this.storage[t]}getMetadata(t){return this.stepMetadata[t]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(t,e){return e.find((e=>e.stepName===t))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((t=>t.layoutState.elements.forEach((t=>{this.getCommandDispatcher()(new s(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,e,A,n){const a=this.stepSelections;this.stepSelections={...this.stepSelections,[t]:{selectedVariants:e}},this.selectionCost=Object.values(this.stepSelections).reduce(((t,e)=>t+e.selectedVariants.map((t=>t.priceModifier||0)).reduce(((t,e)=>t+e),0)),0),this.workflow.steps.forEach((t=>{Zn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const i=this.allScenes,r=$n(i,a),o=$n(i,this.stepSelections),c=r.map((t=>t.silentSteps)).flat(),g=o.map((t=>t.silentSteps)).flat().filter((t=>!c.some((e=>e.stepName===t.stepName))));c.forEach((t=>{Zn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:d,commands:w}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...d,[t]:A},this.removeElements(l);if(this.workflow.steps.find((e=>e.stepName===t))?.type===m.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(A.map((t=>t.id)))}const h=[...w,...l.map((t=>new s(t.id))),new ht(this.constructSerializableWorkflow())];h.length>0&&this.commandContext.apply(new B(h),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const t=[],e=$n(this.allScenes,this.stepSelections).map((t=>t.renderableSteps)).flat();for(const A of e)if(!this.stepInitialised[A.stepName])switch(this.stepInitialised[A.stepName]=!0,A.type){case m.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case m.DigitalContent:t.push(ca.init(A,this,this.reloadedState));break;case m.Frame:case m.Photo:{const e=new na(A.data.forceImageCover);e.connectWorkflowManager(this,A.stepName),this.stepSpecificServices[A.stepName]={frameService:e},t.push(la.init(A,this,this.reloadedState))}break;case m.Illustration:t.push(da.init(A,this,this.reloadedState));break;case m.Material:t.push(Ba.init(A,this,this.reloadedState));break;case m.Model:t.push(wa.init(A,this,this.reloadedState));break;case m.Module:this.stepSpecificServices[A.stepName]={module:await un(A.data.module)},t.push(ha.init(A,this,this.reloadedState));break;case m.Picture:t.push(Ea.init(A,this,this.reloadedState));break;case m.Question:t.push(ua.init(A,this,this.reloadedState));break;case m.Shape:t.push(Qa.init(A,this,this.reloadedState));break;case m.Text:t.push(Ia.init(A,this,this.reloadedState))}const A=(await Promise.allSettled(t)).map((t=>{if("rejected"===t.status)throw new Error(`Step initialization failed: ${t.reason}`);return t.value})),n=A.filter((t=>!!t&&!!t.command)).map((t=>t.command)),a=A.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));n&&n.length>0&&this.commandContext.apply(new B(n),!0);for(const t of a)await t();a.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((t=>t(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((t=>t(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((t=>t(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((t=>t(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((t=>t(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((t=>{t(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((t=>t(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((t=>{t(this.stepMetadata)}))}async onSelectionChange(){const t=await this.traversableScenes();for(const e of this.selectionCallbacks)e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:t})}onStepSpecificStorageChange(t){Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].forEach((e=>e(this.storage[t])))}onStorageChange(){this.storageCallbacks.forEach((t=>t(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((t=>{t(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((t=>{t(this.variationRecords)})),this.render3DScene()}traversableScenes(){return _n(this.allScenes,this.stepSelections)}}function Ya(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class xa{constructor(t){Ya(this,"variantData",void 0),this.variantData=t}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(t,e){return this.variantData.priceModifier.toLocaleString(t||"en-US",{style:"currency",currency:"USD",...e})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.asset?.versions?.find((t=>"cdn"===t.name))?.link}getAssetResource(){return this.variantData.asset}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name))?.link,e=this.variantData.thumbnail?.fileLink;return t||e}getDisplayImage(){return this.variantData.displayImage?.versions?.find((t=>"medium"===t.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function Pa(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class Na{constructor(t,e){Pa(this,"manager",void 0),Pa(this,"step",void 0),this.manager=t,this.step=e}setUpdateState(t){Na.updateState.set(this.step.stepName,t)}getUpdateState(){return!!Na.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new xa(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new xa(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new xa(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}getRaw(){return this.step}getTags(){return this.step.tags||[]}hasTag(t){return this.step.tags?.includes(t)||!1}executeAnimations(){const t=this.manager.getPreviewService(),e=this.manager.getModelContainer(),A=this.step.data.modelAnimation,n=this.step.data.lookAtAnimation;t&&n&&t.executeCameraAnimation(n),e&&A&&e.executeAnimation(A)}}function Ra(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}Pa(Na,"updateState",new Map);const Ha=It`
560
560
  mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
561
561
  transactionAddStakeholder(id: $id, details: $details, type: $type) {
562
562
  id
@@ -576,7 +576,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
576
576
  id
577
577
  }
578
578
  }
579
- `;class ka extends Na{constructor(t,e){super(t,e),Ra(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(t){await ye.getShadowGraphqlClient().mutate({mutation:ba,variables:{transactionId:this.manager.getTransaction().id,designName:t}});const e=this.manager.getTransaction();this.manager.setTransaction({...e,designName:t})}addVariationRecord(){const t=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(t),t}updateBulkIsConnected(t){this.manager.updateStorage(this.getId(),{bulkIsConnected:t})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(t){await ye.getShadowGraphqlClient().mutate({mutation:Ha,variables:{id:this.transaction.id,details:{emailAddress:t},type:"Owner"}}),this.openBulkSourceUrl()}deleteVariationRecord(t){this.manager.removeVariationRecord(t)}getAspects(){return this.step.data.aspects}}class Ua extends Na{constructor(t,e){super(t,e)}async selectVariant(t){if(this.getCurrentVariant()!==t)return da.selectVariant(this.step,t.getResource(),this.manager.getRegionElements(this.step.stepName)||[],(t=>this.setUpdateState(t)),this.manager)}getColors(){const t=this.manager.getRegionElements(this.step.stepName)||[];if(0!==t.length)try{return y(t[0].id,this.manager.getAllLayoutData()).colors}catch(t){console.error(t)}}setColor(t,e){const A=new Map;return A.set(t,e),da.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),A)}async getColorOption(){return this.step.data.colorOption}getAvailableColors(){return this.step.data.colorPickerEnabled?da.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colorPickerEnabled}}class Ga extends Na{constructor(t,e){super(t,e)}selectVariant(t){return Ba.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class Ja extends Na{constructor(t,e){super(t,e)}selectVariant(t){return wa.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class Ta extends Na{constructor(t,e){super(t,e)}selectVariant(t){return Ea.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class La extends Na{constructor(t,e){super(t,e)}async selectVariant(t){if(!t.getId())throw new Error("Unable to select variant with a null ID");await ua.selectVariant(this.step,t.getId(),this.manager)}getDisplayType(){return this.step.option?.displayType}}class Oa extends Na{constructor(t,e){super(t,e)}selectVariant(t){const e=t.getResource();return Qa.selectVariant(this.step,{fill:e.color,stroke:e.color,variant:e},this.manager.getRegionElements(this.step.stepName)||[],this.manager)}setColor(t){return Qa.selectVariant(this.step,t,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return Qa.availableColours(this.step)}setCustomColor(t){if("#custom"!==this.getCurrentVariant()?.getColor())throw new Error("Custom colors can only be set on a non-custom variant. Please add a custom variant to the step.");return Qa.setCustomColor(t,this.step,this.manager)}getCustomColor(){const t=this.manager.getStepStorage(this.step.stepName)?.colour;if("#custom"!==this.getCurrentVariant()?.getColor())throw new Error("Custom colors can only be set on a non-custom variant. Please add a custom variant to the step.");if(!t)throw new Error("Color not available on step. Set a default on the workflow to fix this.");return t}}class za extends Na{constructor(t,e){super(t,e)}async selectVariant(t){Ia.selectVariant(this.step,t.getResource(),this.manager,(t=>{if(t)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:Ma.Error,stepID:this.step.stepName}]);else{const t=this.manager.getInformationResults().filter((t=>t.stepID!==this.step.stepName));this.manager.setInformationResults(t)}}),(t=>{}))}getAvailableFillColors(){return this.step.data.colorPickerEnabled?Ia.availableFillColors(this.step):[]}async setFillColor(t){const e=this.manager.getRegionElements(this.step.stepName);await Ia.changeFillColor(this.step,t,e,this.manager)}getFillColor(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}getAvailableFillImages(){return Ia.availableFillImages(this.step)}async setFillImage(t){const e=this.manager.getRegionElements(this.step.stepName);await Ia.changeFillImage(this.step,t,e,this.manager)}getFillImage(){return this.manager.getStepStorage(this.step.stepName)?.fillImage}setFullTextCustomization(t){const e=this.manager.getStepStorage(this.step.stepName)?.inputText||"",A=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",e):e,n=t?A:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:t,text:n,defaultCleared:!1});return this.setText(n)}setText(t){const e={input:t},A=Ia.findLayoutElements(this.manager,this.step),n=Ia.filterUnsupportedCharacters(t,A[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(e.input=n);const a=A.length<=0,i=a?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,i),this.manager.updateMetadata(this.step.stepName,{text:n}),a)return e;const{command:r,errors:o,helperText:s}=Ia.updateInputText(n,A,this.step,this.manager);r&&this.manager.getCommandDispatcher()(r);const c=this.manager.getInformationResults(),g=o[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:Ma.Error,stepID:this.step.stepName}]);else{const t=c.filter((t=>t.stepID!==this.step.stepName));this.manager.setInformationResults(t)}return e.helperText=g||s,e.errorText=g,e}getText(){const t=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||t||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const t=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),t}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colorPickerEnabled}getRegions(){return this.step.data.regions}getCharacterLimit(){return this.step.data.maxLength}getCharactersRemaining(){const t=this.step.data.maxLength;if(void 0===t)return;return t-this.getText().length}}class ja extends Na{constructor(t,e){super(t,e)}async selectVariant(){}getContent(){return this.step.data.content}}class Ka{static get(t,e){switch(e.type){case m.Information:return new ja(t,e);case m.Question:return new La(t,e);case m.Text:return new za(t,e);case m.Illustration:return new Ua(t,e);case m.Picture:return new Ta(t,e);case m.Shape:return new Oa(t,e);case m.Material:return new Ga(t,e);case m.Model:return new Ja(t,e);case m.Frame:return new Qr(t,e);case m.Bulk:return new ka(t,e);default:throw new oe(`Step type ${e.type} not yet supported in Core SDK`)}}}function Va(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const Wa=It`
579
+ `;class ka extends Na{constructor(t,e){super(t,e),Ra(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(t){await ye.getShadowGraphqlClient().mutate({mutation:ba,variables:{transactionId:this.manager.getTransaction().id,designName:t}});const e=this.manager.getTransaction();this.manager.setTransaction({...e,designName:t})}addVariationRecord(){const t=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(t),t}updateBulkIsConnected(t){this.manager.updateStorage(this.getId(),{bulkIsConnected:t})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(t){await ye.getShadowGraphqlClient().mutate({mutation:Ha,variables:{id:this.transaction.id,details:{emailAddress:t},type:"Owner"}}),this.openBulkSourceUrl()}deleteVariationRecord(t){this.manager.removeVariationRecord(t)}getAspects(){return this.step.data.aspects}}class Ua extends Na{constructor(t,e){super(t,e)}async selectVariant(t){if(this.getCurrentVariant()!==t)return da.selectVariant(this.step,t.getResource(),this.manager.getRegionElements(this.step.stepName)||[],(t=>this.setUpdateState(t)),this.manager)}getColors(){const t=this.manager.getRegionElements(this.step.stepName)||[];if(0!==t.length)try{return y(t[0].id,this.manager.getAllLayoutData()).colors}catch(t){console.error(t)}}setColor(t,e){const A=new Map;return A.set(t,e),da.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),A)}async getColorOption(){return this.step.data.colorOption}getAvailableColors(){return this.step.data.colorPickerEnabled?da.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colorPickerEnabled}}class Ga extends Na{constructor(t,e){super(t,e)}selectVariant(t){return Ba.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class Ja extends Na{constructor(t,e){super(t,e)}selectVariant(t){return wa.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class Ta extends Na{constructor(t,e){super(t,e)}selectVariant(t){return Ea.selectVariant(this.step,t.getResource(),this.manager,(t=>this.setUpdateState(t)))}}class La extends Na{constructor(t,e){super(t,e)}async selectVariant(t){if(!t.getId())throw new Error("Unable to select variant with a null ID");await ua.selectVariant(this.step,t.getId(),this.manager)}getDisplayType(){return this.step.option?.displayType}}class Oa extends Na{constructor(t,e){super(t,e)}selectVariant(t){const e=t.getResource();return Qa.selectVariant(this.step,{fill:e.color,stroke:e.color,variant:e},this.manager.getRegionElements(this.step.stepName)||[],this.manager)}setColor(t){return Qa.selectVariant(this.step,t,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return Qa.availableColours(this.step)}setCustomColor(t){if("#custom"!==this.getCurrentVariant()?.getColor())throw new Error("Custom colors can only be set on a non-custom variant. Please add a custom variant to the step.");return Qa.setCustomColor(t,this.step,this.manager)}getCustomColor(){const t=this.manager.getStepStorage(this.step.stepName)?.colour;if("#custom"!==this.getCurrentVariant()?.getColor())throw new Error("Custom colors can only be set on a non-custom variant. Please add a custom variant to the step.");if(!t)throw new Error("Color not available on step. Set a default on the workflow to fix this.");return t}}class za extends Na{constructor(t,e){super(t,e)}async selectVariant(t){Ia.selectVariant(this.step,t.getResource(),this.manager,(t=>{if(t)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:Ma.Error,stepID:this.step.stepName}]);else{const t=this.manager.getInformationResults().filter((t=>t.stepID!==this.step.stepName));this.manager.setInformationResults(t)}}),(t=>{}))}getAvailableFillColors(){return this.step.data.colorPickerEnabled?Ia.availableFillColors(this.step):[]}async setFillColor(t){const e=this.manager.getRegionElements(this.step.stepName);await Ia.changeFillColor(this.step,t,e,this.manager)}getFillColor(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}getAvailableFillImages(){return Ia.availableFillImages(this.step)}async setFillImage(t){const e=this.manager.getRegionElements(this.step.stepName);await Ia.changeFillImage(this.step,t,e,this.manager)}getFillImage(){return this.manager.getStepStorage(this.step.stepName)?.fillImage}setFullTextCustomization(t){const e=this.manager.getStepStorage(this.step.stepName)?.inputText||"",A=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",e):e,n=t?A:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:t,text:n,defaultCleared:!1});return this.setText(n)}setText(t){const e={input:t},A=Ia.findLayoutElements(this.manager,this.step),n=Ia.filterUnsupportedCharacters(t,A[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(e.input=n);const a=A.length<=0,i=a?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,i),this.manager.updateMetadata(this.step.stepName,{text:n}),a)return e;const{command:r,errors:o,helperText:s}=Ia.updateInputText(n,A,this.step,this.manager);r&&this.manager.getCommandDispatcher()(r);const c=this.manager.getInformationResults(),g=o[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:Ma.Error,stepID:this.step.stepName}]);else{const t=c.filter((t=>t.stepID!==this.step.stepName));this.manager.setInformationResults(t)}return e.helperText=g||s,e.errorText=g,e}getText(){const t=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||t||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const t=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),t}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colorPickerEnabled}getRegions(){return this.step.data.regions}getCharacterLimit(){return this.step.data.maxLength}getCharactersRemaining(){const t=this.step.data.maxLength;if(void 0===t)return;return t-this.getText().length}}class ja extends Na{constructor(t,e){super(t,e)}async selectVariant(){}getContent(){return this.step.data.content}}class Ka{static get(t,e){switch(e.type){case m.Information:return new ja(t,e);case m.Question:return new La(t,e);case m.Text:return new za(t,e);case m.Illustration:return new Ua(t,e);case m.Picture:return new Ta(t,e);case m.Shape:return new Oa(t,e);case m.Material:return new Ga(t,e);case m.Model:return new Ja(t,e);case m.Frame:return new Cr(t,e);case m.Bulk:return new ka(t,e);default:throw new oe(`Step type ${e.type} not yet supported in Core SDK`)}}}function Va(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const Wa=It`
580
580
  fragment CreateDesignTransaction on Transaction {
581
581
  id
582
582
  bulk
@@ -639,7 +639,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
639
639
  }
640
640
  }
641
641
  }
642
- `,Za=(t,e,A)=>{const n={};return e.steps.forEach((e=>{Object.assign(n,(e=>{const n={};if("Frame"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideImageInCart&&A)return n;n[`${e.stepTitle} image`]=a.image}if("Illustration"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideColorsInCart&&A||!a.colors)return n;if(a.colors.length>0){const t=a.colors.join(", ").toUpperCase();n[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideTextInCart&&A)return n;n[`${e.stepTitle} text`]=a.text}if("Text"===e.type){const a=t[e.stepName];if(!a)return n;const i=e.data;i.hideTextInCart&&A||(n[`${e.stepTitle} text`]=a.text),!a.color||i.hideColorInCart&&A||(n[`${e.stepTitle} color`]=a.color)}return n})(e))})),n},$a=(t,e,A,n,a,i,r,o,s,c)=>{const g=(we.getMap("transactionOwnerIds")||new Map).get(t.id),l={baseCost:A,designProductId:t.externalDesignProductId,designProductVariantId:t.externalDesignProductVariantId,event:"onComplete",exportedData:i,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,lineItemImageUrl:r||"",optionsCost:n,processExecutionId:c,transactionId:t.id,transactionOwnerId:g,weight:e.weight,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||""};return a&&(l.metadata=a),o&&(l.selectedVariants=o),s&&(l.sku=s),l},_a=async(t,e,A,n,a,i,r,o)=>{const s=e.basePrice||0,c=t.priceModifierTotal||0,g=((t,e,A,n)=>{const a={};let i;if(A){i=Za(A,e,!1);for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}else if(n){i=n;for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}for(const A of Object.keys(t)){const n=t[A],i=e.steps.find((t=>t.stepTitle===A));if(1===n.length)a[`${i?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)a[`${i?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return a})(n,A,void 0,i);return $a(t,e,s,c,i,g,r,n,a,o)},ti=async(t,e,A,n,a,i,r,o,s,c)=>{await(async()=>{if(void 0!==c)return c;await t.outstandingRequestsPromise();const e=ye.getShadowGraphqlClient(),A=await e.query({query:Kn,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),n=A.data?.transactions[0].workflowState;return A.errors?(A.errors.forEach((t=>{A.errors&&console.log("Server Error:",t.message)})),null):n??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),await t.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const g=t.getPreviewService(),l=e?.finalizeStepConfig?.lookAtAnimation,d=g&&100===g.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!l,B=s&&Za(s,e,!0),w=s&&Za(s,e,!1),h=async t=>{const A={};let n=0;if(Object.keys(i).length>0)for(const a of Object.keys(i)){const r=i[a],o=e.steps.find((t=>t.stepName===a));for(let e=0;e<r.selections.length;++e){const a=r.selections[e];if(o&&(!t||o.option&&(o.option.variants||[]).length>1&&!o.data.hideSelectionInCart&&!o.data.hideSelectionsInCart)){const t=o.stepTitle;A[t]?A[t].push({id:a.id||"",name:a.name,priceModifier:a.priceModifier}):A[t]=[{id:a.id||"",name:a.name,priceModifier:a.priceModifier}]}n+=a.priceModifier}}return[A,n]},[E]=await h(!0),u=Object.fromEntries(Object.keys(E).map((t=>[t,E[t].map((t=>t.id))]))),[C]=await h(!1),Q=Object.fromEntries(Object.keys(C).map((t=>[t,C[t].map((t=>t.id))]))),p=await o(d);return{designDetails:(()=>{const t={name:r,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!d,previewImage:p};if(w){const e=[];for(const[t,A]of Object.entries(w))e.push({key:t,value:A});t.metadata=e}if(u){const e=[];for(const[t,A]of Object.entries(Q))e.push({key:t,ids:A});t.selectedVariants=e}return t})(),cartSelectionsWithPrices:E,cartMetadata:B}},ei=async(t,e,A,n,a,i,r,o,s,c,g,l,d)=>{s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:B,cartSelectionsWithPrices:w,cartMetadata:h}=await ti(t,e,A,n,i,r,o,l,d);s("workflow.steps.finish.finalize.creatingDesign"),i.bulk&&await c(g);const E=await(async t=>(await ye.getShadowGraphqlClient().mutate({mutation:Xa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)(B),u=E?.transaction?.previewImageLink;if(!E?.transaction)throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return i.bulk?((t,e,A,n)=>{const a=(e.basePrice||0)*(t.variationsCount||0),i=t.priceModifierTotal||0,r={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return $a(t,e,a,i,void 0,r,A,void 0,void 0,n)})(C,a,u,E?.processExecution?.id):await _a(C,a,e,w,E?.sku,h,u,E?.processExecution?.id)},Ai=async(t,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(t.map((async t=>{await t.workflowManager.outstandingRequestsPromise()})));const A=await(async()=>{const e=ye.getShadowGraphqlClient(),A=await e.query({query:Kn,variables:{ids:t.map((t=>t.transaction.id))},fetchPolicy:"no-cache",errorPolicy:"all"});return A.errors?(A.errors.forEach((t=>{A.errors&&console.log("Server Error:",t.message)})),null):A.data?.transactions?A.data.transactions.map((t=>t.workflowState??null)):null})(),n=await Promise.all(t.map((async(t,e)=>await ti(t.workflowManager,t.workflow,t.layouts,t.getReducerState,t.transaction,t.workflowSelections,t.designName,(()=>Promise.resolve(void 0)),t.workflowMetadata,A?A[e]:void 0))));e("workflow.steps.finish.finalize.creatingDesign");const a=await(async t=>(await ye.getShadowGraphqlClient().mutate({mutation:qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:t.map((t=>({name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants})))}})).data?.designCreateMany)(n.map((t=>t.designDetails)));if(!a)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(a.map((async(e,A)=>{const a=t[A],i=n[A],r=e.transaction;return await _a(r,a.product,a.workflow,i.cartSelectionsWithPrices,e.sku,i.cartMetadata,void 0,e.processExecution?.id)})))};let ni;var ai;(ai=ni||(ni={})).Local="Local",ai.Remote="Remote";const ii=new class{constructor(){Va(this,"localPersistenceKey","designTransactions"),Va(this,"storageMethod",ni.Local),Va(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===ni.Local){const t=we.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new oe("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((e=>e.transactionId===t))}async addDesign(t){const e=(await this.getSavedDesigns()).filter((e=>e.transactionId!==t.transactionId));e.unshift(t),await this.setDesigns(e),this.designSavedListeners.forEach((e=>e(t)))}async renameDesign(t,e){const A=await this.getSavedDesigns(),n=A.find((e=>e.transactionId===t));if(!n)throw new Error(`No saved design for transaction ${t}.`);n.title=e,await this.setDesigns(A)}async removeDesign(t){const e=await this.getSavedDesigns();await this.setDesigns(e.filter((e=>e.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==ni.Local)throw new oe("Unexpected storage method requested");we.set(this.localPersistenceKey,JSON.stringify(t))}};function ri(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class oi{constructor(e,A){if(ri(this,"client",void 0),ri(this,"commandContext",void 0),ri(this,"workflowManager",void 0),ri(this,"isReadOnly",void 0),ri(this,"renderableScenes",[]),ri(this,"renderableSceneCallbacks",[]),ri(this,"debouncedSavedDesignUpdate",Xt((async()=>{await ii.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),ri(this,"getCanvasObjectURLAsync",(async t=>new Promise(((e,A)=>{try{t.toBlob((t=>{if(t){const A=URL.createObjectURL(t);e(A)}}))}catch(t){A(t)}})))),!A.workflow)throw new Error("No Workflow ID provided.");this.client=e;const n=A.layouts;this.commandContext=new t,this.commandContext.initialize(n,A.reloadedState),this.isReadOnly=A.transaction.isOrdered||!!A.readOnly,this.workflowManager=new va(A.workflow,A.product.profanities?.map((t=>t.word))||[],n,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return A.stateMutationFunc(t)}),A.transaction,A.product,A.previewService,A.renderableContextService,A.reloadedState,A.readOnly,A.modelContainer,A.isReloadedTransaction),this.workflowManager.addSelectionCallback((t=>{const e=t.traversableScenes.map((t=>{const e=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:e}}));this.renderableScenes=e,this.renderableSceneCallbacks.forEach((t=>t(e)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await ye.getShadowGraphqlClient().mutate({mutation:jn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,e){const A=this.workflowManager.getWorkflow(),n=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const a=document.createElement("canvas");let i=2048;e&&e<=2048&&(i=e),a.width=i,a.height=i;const r=this.commandContext.getAllLayouts(),o=A.defaultPreviewPanelIndex||0,s=A.panels[o],c=r.find((t=>t.layoutState?.layout.panelId===s?.name))||r[0],g=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},l=this.commandContext.getLayoutById(c.layoutState.layout.id),d=a.getContext("2d");if(!d)throw new ge("Failed to obtain 2D context for preview image creation");const B=N(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),w=Kt.renderToStaticMarkup(B),h=await jt.from(d,w,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await h.render();const E=await this.getCanvasObjectURLAsync(a);return a.toDataURL(E)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Ka.get(this.getWorkflowManager(),e)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let e=0;return Object.values(t).forEach((t=>{e+=t.selections.map((t=>t.priceModifier)).reduce(((t,e)=>t+e))})),e}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:m.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Vn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Ka.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Ka.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Ka.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((e=>e.name===t.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 t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>Ka.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await ye.getShadowGraphqlClient().mutate({mutation:Ha,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((e=>e.customer?.emailAddress===t.emailAddress));if(e?.customer){this.getWorkflowManager().setTransactionCustomer(e.customer);const t=we.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),we.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((e=>e!==t))}async save(t){if(!this.getCommandContext().getState())throw new oe("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await ii.getSavedDesigns()).find((t=>t.transactionId===e))?.title;return A||"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 ii.addDesign(e),e}async copy(){const t=zt(this.getCommandContext().getState());if(!t)throw new oe("Internal state is undefined! Cannot copy experience!");const e=JSON.stringify(t.transaction),A=this.getWorkflowManager().getWorkflow(),n=new Br({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new oe("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(A.id,e,void 0)}async onDesignFinished(t,e=!0){return ei(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>e?this.createPreviewImage(t):Promise.resolve(void 0)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==m.SilentIllustration&&t.type!==m.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const a=e[A];Object.keys(a).forEach((e=>{t.get(n.stepTitle)[e]=a[e]}))})),Object.keys(A)?.forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=A[e].selections[0].name)})),t}}const si=Zt`
642
+ `,Za=(t,e,A)=>{const n={};return e.steps.forEach((e=>{Object.assign(n,(e=>{const n={};if("Frame"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideImageInCart&&A)return n;n[`${e.stepTitle} image`]=a.image}if("Illustration"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideColorsInCart&&A||!a.colors)return n;if(a.colors.length>0){const t=a.colors.join(", ").toUpperCase();n[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const a=t[e.stepName],i=e.data;if(!a||i.hideTextInCart&&A)return n;n[`${e.stepTitle} text`]=a.text}if("Text"===e.type){const a=t[e.stepName];if(!a)return n;const i=e.data;i.hideTextInCart&&A||(n[`${e.stepTitle} text`]=a.text),!a.color||i.hideColorInCart&&A||(n[`${e.stepTitle} color`]=a.color)}return n})(e))})),n},$a=(t,e,A,n,a,i,r,o,s,c)=>{const g=(we.getMap("transactionOwnerIds")||new Map).get(t.id),l={baseCost:A,designProductId:t.externalDesignProductId,designProductVariantId:t.externalDesignProductVariantId,event:"onComplete",exportedData:i,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,lineItemImageUrl:r||"",optionsCost:n,processExecutionId:c,transactionId:t.id,transactionOwnerId:g,weight:e.weight,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||""};return a&&(l.metadata=a),o&&(l.selectedVariants=o),s&&(l.sku=s),l},_a=async(t,e,A,n,a,i,r,o)=>{const s=e.basePrice||0,c=t.priceModifierTotal||0,g=((t,e,A,n)=>{const a={};let i;if(A){i=Za(A,e,!1);for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}else if(n){i=n;for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}for(const A of Object.keys(t)){const n=t[A],i=e.steps.find((t=>t.stepTitle===A));if(1===n.length)a[`${i?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)a[`${i?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return a})(n,A,void 0,i);return $a(t,e,s,c,i,g,r,n,a,o)},ti=async(t,e,A,n,a,i,r,o,s,c)=>{await(async()=>{if(void 0!==c)return c;await t.outstandingRequestsPromise();const e=ye.getShadowGraphqlClient(),A=await e.query({query:Kn,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),n=A.data?.transactions[0].workflowState;return A.errors?(A.errors.forEach((t=>{A.errors&&console.log("Server Error:",t.message)})),null):n??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),await t.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const g=t.getPreviewService(),l=e?.finalizeStepConfig?.lookAtAnimation,d=g&&100===g.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!l,B=s&&Za(s,e,!0),w=s&&Za(s,e,!1),h=async t=>{const A={};let n=0;if(Object.keys(i).length>0)for(const a of Object.keys(i)){const r=i[a],o=e.steps.find((t=>t.stepName===a));for(let e=0;e<r.selections.length;++e){const a=r.selections[e];if(o&&(!t||o.option&&(o.option.variants||[]).length>1&&!o.data.hideSelectionInCart&&!o.data.hideSelectionsInCart)){const t=o.stepTitle;A[t]?A[t].push({id:a.id||"",name:a.name,priceModifier:a.priceModifier}):A[t]=[{id:a.id||"",name:a.name,priceModifier:a.priceModifier}]}n+=a.priceModifier}}return[A,n]},[E]=await h(!0),u=Object.fromEntries(Object.keys(E).map((t=>[t,E[t].map((t=>t.id))]))),[C]=await h(!1),Q=Object.fromEntries(Object.keys(C).map((t=>[t,C[t].map((t=>t.id))]))),p=await o(d);return{designDetails:(()=>{const t={name:r,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!d,previewImage:p};if(w){const e=[];for(const[t,A]of Object.entries(w))e.push({key:t,value:A});t.metadata=e}if(u){const e=[];for(const[t,A]of Object.entries(Q))e.push({key:t,ids:A});t.selectedVariants=e}return t})(),cartSelectionsWithPrices:E,cartMetadata:B}},ei=async(t,e,A,n,a,i,r,o,s,c,g,l,d)=>{s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:B,cartSelectionsWithPrices:w,cartMetadata:h}=await ti(t,e,A,n,i,r,o,l,d);s("workflow.steps.finish.finalize.creatingDesign"),i.bulk&&await c(g);const E=await(async t=>(await ye.getShadowGraphqlClient().mutate({mutation:Xa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)(B),u=E?.transaction?.previewImageLink;if(!E?.transaction)throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return i.bulk?((t,e,A,n)=>{const a=(e.basePrice||0)*(t.variationsCount||0),i=t.priceModifierTotal||0,r={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return $a(t,e,a,i,void 0,r,A,void 0,void 0,n)})(C,a,u,E?.processExecution?.id):await _a(C,a,e,w,E?.sku,h,u,E?.processExecution?.id)},Ai=async(t,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(t.map((async t=>{await t.workflowManager.outstandingRequestsPromise()})));const A=await(async()=>{const e=ye.getShadowGraphqlClient(),A=await e.query({query:Kn,variables:{ids:t.map((t=>t.transaction.id))},fetchPolicy:"no-cache",errorPolicy:"all"});return A.errors?(A.errors.forEach((t=>{A.errors&&console.log("Server Error:",t.message)})),null):A.data?.transactions?A.data.transactions.map((t=>t.workflowState??null)):null})(),n=await Promise.all(t.map((async(t,e)=>await ti(t.workflowManager,t.workflow,t.layouts,t.getReducerState,t.transaction,t.workflowSelections,t.designName,(()=>Promise.resolve(void 0)),t.workflowMetadata,A?A[e]:void 0))));e("workflow.steps.finish.finalize.creatingDesign");const a=await(async t=>(await ye.getShadowGraphqlClient().mutate({mutation:qa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:t.map((t=>({name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants})))}})).data?.designCreateMany)(n.map((t=>t.designDetails)));if(!a)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(a.map((async(e,A)=>{const a=t[A],i=n[A],r=e.transaction;return await _a(r,a.product,a.workflow,i.cartSelectionsWithPrices,e.sku,i.cartMetadata,void 0,e.processExecution?.id)})))};let ni;var ai;(ai=ni||(ni={})).Local="Local",ai.Remote="Remote";const ii=new class{constructor(){Va(this,"localPersistenceKey","designTransactions"),Va(this,"storageMethod",ni.Local),Va(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===ni.Local){const t=we.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new oe("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((e=>e.transactionId===t))}async addDesign(t){const e=(await this.getSavedDesigns()).filter((e=>e.transactionId!==t.transactionId));e.unshift(t),await this.setDesigns(e),this.designSavedListeners.forEach((e=>e(t)))}async renameDesign(t,e){const A=await this.getSavedDesigns(),n=A.find((e=>e.transactionId===t));if(!n)throw new Error(`No saved design for transaction ${t}.`);n.title=e,await this.setDesigns(A)}async removeDesign(t){const e=await this.getSavedDesigns();await this.setDesigns(e.filter((e=>e.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==ni.Local)throw new oe("Unexpected storage method requested");we.set(this.localPersistenceKey,JSON.stringify(t))}};function ri(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class oi{constructor(e,A){if(ri(this,"client",void 0),ri(this,"commandContext",void 0),ri(this,"workflowManager",void 0),ri(this,"isReadOnly",void 0),ri(this,"renderableScenes",[]),ri(this,"renderableSceneCallbacks",[]),ri(this,"debouncedSavedDesignUpdate",Xt((async()=>{await ii.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),ri(this,"getCanvasObjectURLAsync",(async t=>new Promise(((e,A)=>{try{t.toBlob((t=>{if(t){const A=URL.createObjectURL(t);e(A)}}))}catch(t){A(t)}})))),!A.workflow)throw new Error("No Workflow ID provided.");this.client=e;const n=A.layouts;this.commandContext=new t,this.commandContext.initialize(n,A.reloadedState),this.isReadOnly=A.transaction.isOrdered||!!A.readOnly,this.workflowManager=new va(A.workflow,A.product.profanities?.map((t=>t.word))||[],n,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return A.stateMutationFunc(t)}),A.transaction,A.product,A.previewService,A.renderableContextService,A.reloadedState,A.readOnly,A.modelContainer,A.isReloadedTransaction),this.workflowManager.addSelectionCallback((t=>{const e=t.traversableScenes.map((t=>{const e=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:e}}));this.renderableScenes=e,this.renderableSceneCallbacks.forEach((t=>t(e)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await ye.getShadowGraphqlClient().mutate({mutation:jn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,e){const A=this.workflowManager.getWorkflow(),n=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const a=document.createElement("canvas");let i=2048;e&&e<=2048&&(i=e),a.width=i,a.height=i;const r=this.commandContext.getAllLayouts(),o=A.defaultPreviewPanelIndex||0,s=A.panels[o],c=r.find((t=>t.layoutState?.layout.panelId===s?.name))||r[0],g=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},l=this.commandContext.getLayoutById(c.layoutState.layout.id),d=a.getContext("2d");if(!d)throw new ge("Failed to obtain 2D context for preview image creation");const B=N(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),w=Kt.renderToStaticMarkup(B),h=await jt.from(d,w,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await h.render();const E=await this.getCanvasObjectURLAsync(a);return a.toDataURL(E)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Ka.get(this.getWorkflowManager(),e)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let e=0;return Object.values(t).forEach((t=>{e+=t.selections.map((t=>t.priceModifier)).reduce(((t,e)=>t+e))})),e}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,e={type:m.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Vn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Ka.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Ka.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Ka.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((e=>e.name===t.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 t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>Ka.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await ye.getShadowGraphqlClient().mutate({mutation:Ha,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((e=>e.customer?.emailAddress===t.emailAddress));if(e?.customer){this.getWorkflowManager().setTransactionCustomer(e.customer);const t=we.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),we.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((e=>e!==t))}async save(t){if(!this.getCommandContext().getState())throw new oe("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await ii.getSavedDesigns()).find((t=>t.transactionId===e))?.title;return A||"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 ii.addDesign(e),e}async copy(){const t=zt(this.getCommandContext().getState());if(!t)throw new oe("Internal state is undefined! Cannot copy experience!");const e=JSON.stringify(t.transaction),A=this.getWorkflowManager().getWorkflow(),n=new dr({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new oe("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(A.id,e,void 0)}async onDesignFinished(t,e=!0){return ei(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>e?this.createPreviewImage(t):Promise.resolve(void 0)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==m.SilentIllustration&&t.type!==m.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const a=e[A];Object.keys(a).forEach((e=>{t.get(n.stepTitle)[e]=a[e]}))})),Object.keys(A)?.forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=A[e].selections[0].name)})),t}}const si=Zt`
643
643
  ${Zt`
644
644
  fragment ProductCollectionProductFields on Product {
645
645
  id
@@ -933,7 +933,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
933
933
  id
934
934
  }
935
935
  }
936
- `;let Li;var Oi;(Oi=Li||(Li={})).Split="Split",Oi.TextJoin="TextJoin",Oi.TextSlice="TextSlice",Oi.TextUpper="TextUpper",Oi.TextLower="TextLower",Oi.ParseJson="ParseJson",Oi.TextBuilder="TextBuilder",Oi.Design="Design",Oi.OverlayImage="OverlayImage",Oi.OverlayText="OverlayText",Oi.TableGenerator="TableGenerator",Oi.QR="QR",Oi.CSV="CSV",Oi.PDF="PDF",Oi.PNG="PNG",Oi.Email="Email",Oi.LocationDelivery="LocationDelivery",Oi.TemplateEmail="TemplateEmail",Oi.Map="Map",Oi.Sort="Sort",Oi.Group="Group",Oi.InnerJoin="InnerJoin",Oi.Contains="Contains",Oi.Flatten="Flatten",Oi.KeyValuePairs="KeyValuePairs",Oi.ListConcatenate="ListConcatenate",Oi.Repeat="Repeat",Oi.Size="Size",Oi.ListBuilder="ListBuilder",Oi.MapBuilder="MapBuilder",Oi.PairBuilder="PairBuilder",Oi.AND="AND",Oi.OR="OR",Oi.NOT="NOT",Oi.Equals="Equals",Oi.Present="Present",Oi.ManualOperation="ManualOperation",Oi.Switch="Switch",Oi.AssetMetadata="AssetMetadata",Oi.DataSelect="DataSelect",Oi.LayoutSelect="LayoutSelect",Oi.TransactionMetadata="TransactionMetadata",Oi.VariantSelection="VariantSelection",Oi.StartTerminal="StartTerminal",Oi.EndTerminal="EndTerminal",Oi.MiscNote="MiscNote",Oi.Assign="Assign",Oi.CsvVlookup="CsvVlookup",Oi.ProcessFlow="ProcessFlow",Oi.TemporaryAssetUrl="TemporaryAssetUrl",Oi.WebRequest="WebRequest";class zi{async execute(t,e,A){const n=(await ye.getShadowGraphqlClient().mutate({mutation:Ti,variables:{processFlowId:t,inputs:[...e.map((t=>t.getValueForTransmission()))]}})).data?.processExecutionCreate?.id;if(!n)throw new Error("Failed to create process execution.");function a(t){return new Promise((e=>{setTimeout(e,t)}))}let i,r=!1,o=0;for(;!r;){if(await a(A?.sleepTime?Math.max(A.sleepTime,500):2e3),i=await ye.getShadowGraphqlClient().query({query:It`
936
+ `;let Li;var Oi;(Oi=Li||(Li={})).Split="Split",Oi.TextJoin="TextJoin",Oi.TextSlice="TextSlice",Oi.TextUpper="TextUpper",Oi.TextLower="TextLower",Oi.ParseJson="ParseJson",Oi.TextBuilder="TextBuilder",Oi.Design="Design",Oi.OverlayImage="OverlayImage",Oi.OverlayText="OverlayText",Oi.TableGenerator="TableGenerator",Oi.QR="QR",Oi.CSV="CSV",Oi.PDF="PDF",Oi.PNG="PNG",Oi.Email="Email",Oi.LocationDelivery="LocationDelivery",Oi.TemplateEmail="TemplateEmail",Oi.Map="Map",Oi.Sort="Sort",Oi.Group="Group",Oi.InnerJoin="InnerJoin",Oi.Contains="Contains",Oi.Flatten="Flatten",Oi.KeyValuePairs="KeyValuePairs",Oi.ListConcatenate="ListConcatenate",Oi.Repeat="Repeat",Oi.Size="Size",Oi.ListBuilder="ListBuilder",Oi.MapBuilder="MapBuilder",Oi.PairBuilder="PairBuilder",Oi.AND="AND",Oi.OR="OR",Oi.NOT="NOT",Oi.Equals="Equals",Oi.Present="Present",Oi.ManualOperation="ManualOperation",Oi.Switch="Switch",Oi.AssetMetadata="AssetMetadata",Oi.DataSelect="DataSelect",Oi.LayoutSelect="LayoutSelect",Oi.TransactionMetadata="TransactionMetadata",Oi.VariantSelection="VariantSelection",Oi.StartTerminal="StartTerminal",Oi.EndTerminal="EndTerminal",Oi.MiscNote="MiscNote",Oi.Assign="Assign",Oi.CsvVlookup="CsvVlookup",Oi.ProcessFlow="ProcessFlow",Oi.TemporaryAssetUrl="TemporaryAssetUrl",Oi.WebRequest="WebRequest";class zi{async execute(t,e,A){const n=(await ye.getShadowGraphqlClient().mutate({mutation:Ti,variables:{processFlowId:t,inputs:[...e.map((t=>t.getValueForTransmission()))]}})).data?.processExecutionCreate?.id;if(!n)throw new Error("Failed to create process execution.");function a(t){return new Promise((e=>{setTimeout(e,t)}))}let i,r,o=!1,s=0;for(;!o;){i=await ye.getShadowGraphqlClient().query({query:It`
937
937
  query getProcessFlowExecution($ids: [String]!) {
938
938
  processExecutions(ids: $ids) {
939
939
  id
@@ -946,7 +946,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
946
946
  }
947
947
  }
948
948
  }
949
- `,variables:{ids:[n]}}),!i||!i.data?.getProcessFlowExecution)throw new Error("Failed to retrieve server response for execution.");const t=i.data?.getProcessFlowExecution?.completedAt;if(t){r=!0;break}if(i.data?.getProcessFlowExecution?.failedAt)throw new Error("Execution has failed to complete. See Executions tab in partner account on SpiffCommerce Hub.");o+=1;if(o>=(A?.repeats?A?.repeats:5))throw new Error("Maximum wait time exceeded for execution result.")}return Promise.resolve(new ji(i.data?.getProcessFlowExecution))}}class ji{constructor(t){Ji(this,"execution",void 0),this.execution=t}getRaw(){return this.execution}getNodes(){return this.execution.nodes.map((t=>new Ki(t)))}getNodesByType(t){return this.execution.nodes.filter((e=>e.type===t)).map((t=>new Ki(t)))}getInputs(){return this.execution.nodes.filter((t=>t.type===Li.StartTerminal)).map((t=>new Ki(t)))}getOutputs(){return this.execution.nodes.filter((t=>t.type===Li.EndTerminal)).map((t=>new Ki(t)))}getCompletedAt(){if(this.execution.completedAt)return new Date(this.execution.completedAt)}getFailedAt(){if(this.execution.failedAt)return new Date(this.execution.failedAt)}}class Ki{constructor(t){Ji(this,"node",void 0),this.node=t}getId(){return this.node.id}getType(){return this.node.type}getArtifacts(){return new Map(Object.entries(JSON.parse(this.node.artifacts).value))}getArtifactByName(t){return console.log(this.getArtifacts()),this.getArtifacts().get(t)}}class Vi{constructor(t){Ji(this,"value",void 0),this.value=t}getRaw(){return this.value}getValueForTransmission(){const t=this.value;return t.startsWith("[")?JSON.stringify(JSON.parse(t)):JSON.stringify(t)}}let Wi;var Xi;(Xi=Wi||(Wi={})).Transaction="Transaction",Xi.Bundle="Bundle",Xi.Product="Product",Xi.Variant="Variant",Xi.Option="Option",Xi.LineItem="LineItem",Xi.Asset="Asset";class qi extends Vi{constructor(t,e){if("Asset"!==e&&!qi.validUUID(t))throw new Error("Invalid ID, must be a valid v4 UUID. https://www.uuidgenerator.net/");super(`{"isSpiffObject": true, "id": "${t}", "type": "${e}"}`)}static validUUID(t){return t.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)}}class Zi extends Vi{constructor(t){super(t)}}function $i(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const _i=It`
949
+ `,variables:{ids:[n]}});const t=i.data?.processExecutions[0];if(!i||!t)throw new Error("Failed to retrieve server response for execution.");if(t.failedAt)throw new Error("Execution has failed to complete. See Automation > FLows in Flight on partner account on SpiffCommerce Hub.");if(t.completedAt){o=!0,r=new ji(t);break}s+=1;if(s>=(A?.repeats?A?.repeats:5))throw new Error("Maximum wait time exceeded for execution result.");await a(A?.sleepTime?Math.max(A.sleepTime,500):2e3)}if(!r)throw new Error("Failed to retrieve server response for execution.");return Promise.resolve(r)}}class ji{constructor(t){Ji(this,"execution",void 0),this.execution=t}getRaw(){return this.execution}getNodes(){return this.execution.nodes.map((t=>new Ki(t)))}getNodesByType(t){return this.execution.nodes.filter((e=>e.type===t)).map((t=>new Ki(t)))}getInputs(){return this.execution.nodes.filter((t=>t.type===Li.StartTerminal)).map((t=>new Ki(t)))}getOutputs(){return this.execution.nodes.filter((t=>t.type===Li.EndTerminal)).map((t=>new Ki(t)))}getCompletedAt(){if(this.execution.completedAt)return new Date(this.execution.completedAt)}getFailedAt(){if(this.execution.failedAt)return new Date(this.execution.failedAt)}}class Ki{constructor(t){Ji(this,"node",void 0),this.node=t}getId(){return this.node.id}getType(){return this.node.type}getArtifacts(){return new Map(Object.entries(JSON.parse(this.node.artifacts).value))}getArtifactByName(t){return console.log(this.getArtifacts()),this.getArtifacts().get(t)}}class Vi{constructor(t){Ji(this,"value",void 0),this.value=t}getRaw(){return this.value}getValueForTransmission(){const t=this.value;return t.startsWith("[")?JSON.stringify(JSON.parse(t)):t}}let Wi;var Xi;(Xi=Wi||(Wi={})).Transaction="Transaction",Xi.Bundle="Bundle",Xi.Product="Product",Xi.Variant="Variant",Xi.Option="Option",Xi.LineItem="LineItem",Xi.Asset="Asset";class qi extends Vi{constructor(t,e){if("Asset"!==e&&!qi.validUUID(t))throw new Error("Invalid ID, must be a valid v4 UUID. https://www.uuidgenerator.net/");super(`{"isSpiffObject": true, "id": "${t}", "type": "${e}"}`)}static validUUID(t){return t.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)}}function Zi(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}const $i=It`
950
950
  fragment RegionFields on Region {
951
951
  width
952
952
  top
@@ -964,7 +964,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
964
964
  height
965
965
  }
966
966
  }
967
- `,tr=It`
967
+ `,_i=It`
968
968
  fragment LookAtAnimationFields on LookAtAnimation {
969
969
  latDeg
970
970
  lonDeg
@@ -975,7 +975,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
975
975
  z
976
976
  }
977
977
  }
978
- `,er=It`
978
+ `,tr=It`
979
979
  fragment RenderingPipelineConfigurationFields on RenderingPipelineConfiguration {
980
980
  antiAliasing {
981
981
  samples
@@ -1059,14 +1059,14 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1059
1059
  weight
1060
1060
  }
1061
1061
  }
1062
- `,Ar=It`
1062
+ `,er=It`
1063
1063
  fragment ModelAnimationFields on ModelAnimation {
1064
1064
  from
1065
1065
  to
1066
1066
  loop
1067
1067
  name
1068
1068
  }
1069
- `,nr=It`
1069
+ `,Ar=It`
1070
1070
  query GetTransactionForPartner($id: String!) {
1071
1071
  transactions(ids: [$id]) {
1072
1072
  id
@@ -1083,7 +1083,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1083
1083
  }
1084
1084
  }
1085
1085
  }
1086
- `,ar=It`
1086
+ `,nr=It`
1087
1087
  ${Se(!1)}
1088
1088
  query GetWorkflowForTheme($id: String!) {
1089
1089
  workflow(id: $id) {
@@ -1105,7 +1105,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1105
1105
  }
1106
1106
  }
1107
1107
  }
1108
- `,ir=It`
1108
+ `,ar=It`
1109
1109
  query GetCustomer($emailAddress: String!) {
1110
1110
  customer(emailAddress: $emailAddress) {
1111
1111
  id
@@ -1115,7 +1115,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1115
1115
  }
1116
1116
  }
1117
1117
  }
1118
- `,rr=It`
1118
+ `,ir=It`
1119
1119
  mutation CustomerCreate($details: CustomerDetailsInput!) {
1120
1120
  customerCreate(details: $details) {
1121
1121
  id
@@ -1125,7 +1125,7 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1125
1125
  }
1126
1126
  }
1127
1127
  }
1128
- `,or=It`
1128
+ `,rr=It`
1129
1129
  mutation CustomerAuthenticate($loginToken: String!) {
1130
1130
  customerAuthenticate(loginToken: $loginToken) {
1131
1131
  id
@@ -1152,11 +1152,11 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1152
1152
  }
1153
1153
  }
1154
1154
  }
1155
- `,sr=It`
1155
+ `,or=It`
1156
1156
  mutation CustomerGenerateVerificationCode($emailAddress: String!) {
1157
1157
  customerGenerateVerificationCode(emailAddress: $emailAddress)
1158
1158
  }
1159
- `,cr=It`
1159
+ `,sr=It`
1160
1160
  mutation CustomerVerifyCode($emailAddress: String!, $verificationCode: String!) {
1161
1161
  customerVerifyCode(emailAddress: $emailAddress, verificationCode: $verificationCode) {
1162
1162
  id
@@ -1184,14 +1184,14 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1184
1184
  }
1185
1185
  }
1186
1186
  }
1187
- `,gr=async(t,e)=>{const A=t.map((t=>Ue.get({id:t,options:e}))),n=t.filter(((t,e)=>void 0===A[e]));if(0===n.length)return Promise.all(A);const a=(async(t,e)=>{const A=await ye.getShadowGraphqlClient().query({query:(n=e?.assets?.metadata||!1,It`
1187
+ `,cr=async(t,e)=>{const A=t.map((t=>Ue.get({id:t,options:e}))),n=t.filter(((t,e)=>void 0===A[e]));if(0===n.length)return Promise.all(A);const a=(async(t,e)=>{const A=await ye.getShadowGraphqlClient().query({query:(n=e?.assets?.metadata||!1,It`
1188
1188
  ${Se(n)}
1189
1189
  ${Ye}
1190
1190
  ${Je}
1191
+ ${$i}
1191
1192
  ${_i}
1192
1193
  ${tr}
1193
1194
  ${er}
1194
- ${Ar}
1195
1195
  query GetWorkflows($ids: [String!]!) {
1196
1196
  workflows(ids: $ids) {
1197
1197
  allowProofDownload
@@ -1579,5 +1579,5 @@ import{CommandContext as t,AssetType as e,BringForwardCommand as A,BringToFrontC
1579
1579
  }
1580
1580
  }
1581
1581
  }
1582
- `),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:t}});var n;const a=A.data.workflows;if(void 0===a||a.length!==t.length)throw new Error(`Unable to read workflows: ${A.errors??"Length mismatch in response"}`);return a.forEach((t=>{t.steps.forEach((t=>{delete t.data.__typename,t.option?.id&&(t.option.defaultVariant?.asset&&be.cacheAsset(t.option.defaultVariant.asset),t.option.colorProfile&&be.cacheAsset(t.option.colorProfile),t.option.variants?.forEach((t=>{t.asset&&be.cacheAsset(t.asset),t.displayImage&&be.cacheAsset(t.displayImage),t.thumbnail&&be.cacheAsset(t.thumbnail),t.material&&be.cacheMaterial(t.material)})),Ue.set({id:t.option.id},Promise.resolve(t.option)))}))})),a})(n,e),i=n.map((t=>Ue.set({id:t,options:e},(async(t,e)=>{const A=(await e).find((e=>e.id===t));if(!A)throw new Error(`Workflow not found: ${t}`);return A})(t,a)))),r=A.filter((t=>void 0!==t));return await Promise.all(r.concat(i))},lr=async(t,e)=>(await gr([t],e))[0],dr=(t,e)=>{const A=t.workflowState,n=A?JSON.parse(A):void 0;return n?Object.values(n.layouts).map((t=>t.layout)):e.panels.sort(((t,e)=>t.index-e.index)).map((t=>({id:F(),panelId:t.name,name:t.name,index:t.index,createdAt:new Date,updatedAt:new Date,transparentBackground:t.transparentBackground,height:t.height,width:t.width,previewRegion:t.previewRegion,useEditableArea:t.useEditableArea,editableArea:t.editableArea})))};class Br{constructor(t){var e;$i(this,"options",void 0),$i(this,"initialized",void 0),$i(this,"currencyCode",void 0),$i(this,"customer",void 0),$i(this,"experienceOptions",void 0),$i(this,"updateTransactionState",(async t=>{try{return ye.getShadowGraphqlClient().mutate({...t,mutation:On})}catch(t){throw console.error(t),new ce("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(e=this.options.applicationKey,Ie=e)}getAssetManager(){return be}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!this.options.applicationKey)throw new Error("Application key required to use Flow Service.");return new zi}async authenticateBundleFromLocalStorage(t){const e=we.getMap("bundleOwnerIds");if(e?.has(t)){const A=e.get(t);return me(A),Promise.resolve({success:!0,stakeholderType:dA.Owner})}const A=we.getMap("bundlePartnerIds")||new Map;if(A.has(t)){const e=A.get(t),n=(we.getMap("partnerCustomerIds")||new Map).get(e);if(n){if(await this.authenticateCustomerId(n)){const e=this.customer?.bundleStakeholders?.find((e=>e.bundle?.id===t));if(e)return Promise.resolve({success:!0,stakeholderType:e.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(t){const e=ye.getShadowGraphqlClient(),A=await e.query({query:nr,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}});if(!A.data.transactions||0===A.data.transactions.length)throw new Error(`Transaction not found: ${t}`);const n=A.data.transactions[0],a=n.product?.partner?.id;if(!a)throw new Error(`Unable to read transaction: ${t}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=we.getMap("transactionOwnerIds");if(i?.has(t)){const e=i.get(t);return Qe(e),Promise.resolve({success:!0,stakeholderType:dA.Owner})}const r=we.getMap("transactionCustomerIds");if(r?.has(t)){const e=r.get(t);if(e){if(await this.authenticateCustomerId(e)){const e=this.customer?.bundleStakeholders?.find((e=>e.bundle?.transactions?.some((e=>e.id===t))))||this.customer?.stakeholders?.find((e=>e.transaction?.id===t));if(e)return Promise.resolve({success:!0,stakeholderType:e.type})}}}const o=(await e.query({query:ar,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!o)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:o.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const e=we.getMap("transactionCustomerIds");e?.has(t)&&(e.delete(t),we.setMap("transactionCustomerIds",e))}getStakeholderTypeForTransaction(t){const e=this.customer?.stakeholders?.find((e=>e.transaction?.id===t));if(e)return e.type}async getOrCreateCustomer(t){this.customer=void 0;const e=ye.getShadowGraphqlClient(),A=(await e.query({query:ir,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!A.id){const A=(await e.mutate({mutation:rr,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!A)throw new Error("Unable to create customer.");return this.storeCustomer(A),this.customer=A,{customer:A,isAuthenticated:!1}}this.storeCustomer(A);const n=await this.authenticateCustomerId(A.id);return{customer:this.customer||A,isAuthenticated:n}}async authenticateCustomerId(t){const e=ye.getShadowGraphqlClient(),A=we.getMap("customerTokens");if(!A?.has(t))return!1;const n=A.get(t);if(!n)return!1;const a=(await e.mutate({mutation:or,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!a&&(this.storeCustomer(a),De(n),this.customer=a,!0)}async generateVerificationCode(t){await ye.getShadowGraphqlClient().mutate({mutation:sr,variables:{emailAddress:t}})}async verifyCode(t,e){const A=(await ye.getShadowGraphqlClient().mutate({mutation:cr,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t,verificationCode:e}})).data?.customerVerifyCode;if(A?.loginToken){if(!A.partner?.id)throw new Error(`Unable to find customer: ${t}`);const e=we.getMap("customerTokens")||new Map;return e.set(A.id,A.loginToken),we.setMap("customerTokens",e),this.storeCustomer(A),De(A.loginToken),this.customer={...A,loginToken:void 0},!0}return!1}async getNewBundle(t){const e=(await ye.getShadowGraphqlClient().mutate({mutation:di,variables:{collectionId:t},fetchPolicy:"no-cache"})).data?.bundleCreate;if(!e?.id)throw new Error("Unable to create bundle");const A=we.getMap("bundlePartnerIds")||new Map;A.set(e.id,e.partner.id),we.setMap("bundlePartnerIds",A),me(e.bundleOwnerId);const n=we.getMap("bundleOwnerIds")||new Map;return n.set(e.id,e.bundleOwnerId),we.setMap("bundleOwnerIds",n),new Gi(this,e)}async getExistingBundle(t,e,A){const n=we.getMap("bundleOwnerIds")?.get(t);n&&me(n);const a=await ye.getShadowGraphqlClient().query({query:ci,variables:{id:t},fetchPolicy:"no-cache"});if(!a.data?.bundles||0===a.data?.bundles.length||!a.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const i=a.data?.bundles[0],r=we.getMap("bundlePartnerIds")||new Map;r.set(i.id,i.partner.id),we.setMap("bundlePartnerIds",r);const o=new Gi(this,i,e,A);return await o.getInitializationPromise(),o}async getBundleStakeholders(){if(!this.customer)throw new Error("Customer not authenticated.");const t=await ye.getShadowGraphqlClient().query({query:li,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!t.data?.customers||0===t.data.customers.length)throw new Error("Unable to find customer.");const e=t.data.customers[0].bundleStakeholders||[],A=we.getMap("bundlePartnerIds")||new Map;return e.forEach((t=>{t.bundle?.id&&t.bundle.partner?.id&&A.set(t.bundle.id,t.bundle.partner.id)})),we.setMap("bundlePartnerIds",A),e}async getWorkflowExperience(t,e,A,n){if(!n)return await this.getWorkflowExperienceDeprecated(t,e,A);const a=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}},{transaction:i,workflow:r,readOnly:o}=await(async()=>{const t=ye.getShadowGraphqlClient();if("transaction"===n.type){const{transactionId:e,readOnly:A}=n,a=await t.query({query:Ln,variables:{ids:[e]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!a.data?.transactions||0===a.data.transactions.length)throw new ce("Existing transaction not found.");const i=a.data?.transactions[0];if(!i.workflowId)throw new ce("Existing transaction has no workflow ID.");const r=await lr(i.workflowId);if(!i.product)throw new ce("Failed to load transaction, product not available.");return{transaction:i,workflow:r,readOnly:A}}if("integration"===n.type||"external"===n.type){const e=async()=>{const e="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},A=await t.mutate({mutation:Gn,variables:{...e,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new ce("Failed to create transaction!");const a=A.data.transactionCreate;if(!a.product)throw new ce("Failed to create transaction, product not available.");return a},A=lr(n.workflowId,n?.graphql),[a,i]=await Promise.all([e(),A]);return{transaction:a,workflow:i}}throw new ce("No workflow ID provided.")})();this.currencyCode=i.product.partner?.currencyCode;const s={product:i.product,transaction:i,layouts:[],stateMutationFunc:o?async()=>{throw new oe("State mutation is forbidden in read only mode!")}:async t=>{const e=(we.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...t,context:{transactionOwnerId:e}})},readOnly:o,workflow:r};if("transaction"===n.type&&i.workflowState){const t=JSON.parse(i.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else if(!o&&n.workflowState){const t=JSON.parse(n.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else s.layouts=dr(s.transaction,s.workflow);if(s.renderableContextService=new Yn(s.layouts),n.previewService?(s.previewService=n.previewService,s.product?.modelUrl&&(s.modelContainer=s.previewService.loadModel({model:s.product.modelUrl,contextService:s.renderableContextService}))):(s.previewService=A&&A(r),s.product?.modelUrl&&(s.previewService?.initialize({model:s.product.modelUrl,contextService:s.renderableContextService}),s.modelContainer=s.previewService?.getAllModels()[0])),"transaction"!==n.type){const t=we.getMap("transactionOwnerIds")||new Map;t.set(i.id,i.transactionOwnerId),Qe(i.transactionOwnerId||""),we.setMap("transactionOwnerIds",t)}else{const t=(we.getMap("transactionOwnerIds")||new Map).get(i.id);t&&Qe(t),s.isReloadedTransaction=!0}this.initialized=!0,this.experienceOptions=s;const c=new oi(this,s);return await c.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await c.attachCustomerDetails({email:this.customer.emailAddress}),c}async getWorkflowExperiences(t,e){if(0===t.length)throw new ce("No options provided!");const A=ye.getShadowGraphqlClient(),n=t.map(((t,e)=>({option:t,index:e}))),a=n.filter((t=>"transaction"===t.option.type)),i=n.filter((t=>"integration"===t.option.type||"external"===t.option.type)),r=(await Promise.all([(async()=>{if(0===a.length)return[];const t=a.map((t=>t.option.transactionId)),e=await A.query({query:Ln,variables:{ids:t},errorPolicy:"all",fetchPolicy:"no-cache"}),n=e.data.transactions;if(n.length!==a.length){const t=e.errors?.[0]?.message||"Unknown error";throw new ce(`Not all transactions were found: ${t}`)}return n.map(((t,e)=>({transaction:t,workflowId:t.workflowId,readOnly:a.find((e=>e.option.transactionId===t.id))?.option.readOnly??!1,index:a[e].index})))})(),(async()=>{if(0===i.length)return[];const t=await A.mutate({mutation:Jn,variables:{inputs:i.map((t=>({integrationProductId:"integration"===t.option.type?t.option.integrationProductId:void 0,externalIntegrationId:"external"===t.option.type?t.option.externalIntegrationId:void 0,externalProductId:"external"===t.option.type?t.option.externalProductId:void 0,workflowId:t.option.workflowId,bulk:t.option.bulk,claim:!0})))},errorPolicy:"all",fetchPolicy:"no-cache"}),e=t.data?.transactionCreateMany;if(!e||0===e.length){const e=t.errors?.[0]?.message||"Unknown error";throw new ce(`Failed to create transactions: ${e}`)}return e.map(((t,e)=>({transaction:t,workflowId:t.workflowId,readOnly:!1,index:i[e].index})))})()])).flat(),o=[...new Set(r.map((t=>t.workflowId)))],s=await gr(o,e),c=new Map(s.map((t=>[t.id,t]))),g=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}},l=we.getMap("transactionOwnerIds")||new Map,d=r.map((async e=>{const{transaction:A,workflowId:n,readOnly:a,index:i}=e,r=c.get(n),o=t[i];!l.get(A.id)&&A.transactionOwnerId&&l.set(A.id,A.transactionOwnerId);const s=l.get(A.id)||void 0,d={product:A.product,transaction:A,layouts:[],stateMutationFunc:a?async()=>{throw new oe("State mutation is forbidden in read only mode!")}:async t=>this.updateTransactionState({...t,context:{transactionOwnerId:s}}),readOnly:a,workflow:r,isReloadedTransaction:"transaction"===o.type};if("transaction"===o.type&&A.workflowState){const t=JSON.parse(A.workflowState);d.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await g(t),d.reloadedState=t}else if(!a&&o.workflowState){const t=JSON.parse(o.workflowState);d.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await g(t),d.reloadedState=t}else d.layouts=dr(d.transaction,d.workflow);return d.renderableContextService=new Yn(d.layouts),this.initialized=!0,this.experienceOptions=d,{experienceOptions:d,index:i,options:o}}));we.setMap("transactionOwnerIds",l);const B=(await Promise.all(d)).sort(((t,e)=>t.index-e.index)).map((async t=>{const{experienceOptions:e,options:A}=t,n=new oi(this,e);return await n.getWorkflowManager().getInitializationPromise(),"transaction"!==A.type&&this.customer&&await n.attachCustomerDetails({email:this.customer.emailAddress}),n}));return await Promise.all(B)}async initFromIntegrationProduct(t){if(""===t)throw new ce("No integration product ID provided.");const e=ye.getShadowGraphqlClient(),A=await e.mutate({mutation:Gn,variables:{integrationProductId:t,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new ce("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new ce("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const a=we.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),Qe(n.transactionOwnerId||""),we.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,e=!1){if(""===t)throw new ce("No transaction ID provided.");const A=ye.getShadowGraphqlClient();if(e)return await(async()=>{const n=(await A.query({query:Ln,variables:{ids:[t]},fetchPolicy:"no-cache",errorPolicy:"all"})).data?.transactions[0];if(!n)throw new ce("Failed to read transaction.");if(!n.product)throw new ce("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new oe("State mutation is forbidden in read only mode!")},readOnly:e},this.initialized=!0})();const n=we.getMap("transactionOwnerIds")||new Map,a=n.get(t);if(a){Qe(a);const n=(await A.query({query:Ln,variables:{ids:[t]},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new ce("Failed to read transaction.");if(!n.product)throw new ce("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},void(this.initialized=!0)}try{const a=(await A.mutate({mutation:Tn,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!a)throw new ce("Failed to read transaction.");if(!a.product)throw new ce("Failed to load transaction, product not available.");this.currencyCode=a.product.partner?.currencyCode,a.transactionOwnerId&&(n.set(a.id,a.transactionOwnerId),Qe(a.transactionOwnerId),we.setMap("transactionOwnerIds",n)),this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},this.initialized=!0}catch{throw new ce("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,e,A){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot launch experience: Not initialized.");const n=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await lr(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=t,this.experienceOptions.transaction.workflowState){const t=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=A&&A(t),this.experienceOptions.renderableContextService=new Yn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const e=new oi(this,this.experienceOptions);return await e.getWorkflowManager().getInitializationPromise(),e}if(t){const a=ye.getShadowGraphqlClient().mutate({mutation:zn,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),i=lr(t);if(await Promise.all([a,i]),this.experienceOptions.workflow=await i,e){const t=JSON.parse(e);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=dr(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await i),this.experienceOptions.renderableContextService=new Yn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const r=new oi(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}throw new ce("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}storeCustomer(t){const e=we.getMap("partnerCustomerIds")||new Map;e.set(t.partner.id,t.id),we.setMap("partnerCustomerIds",e)}}function wr(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class hr{constructor(){wr(this,"getProduct",void 0),wr(this,"getCommandContext",void 0),wr(this,"getAllLayoutData",void 0),wr(this,"getMetadata",void 0),wr(this,"getWorkflowMetadata",void 0),wr(this,"getStepStorage",void 0),wr(this,"setModelContainer",void 0),wr(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(t){}addVariationRecord(t){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(t){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(t){}addPoller(t){}addConfirmCallback(t){}addCurrentVariationCallback(t){}addEditedCallback(t){}addElementsCallback(t){}addInformationResultCallback(t){}addInitCallback(t){}addMakingAdjustmentsCallback(t){}addMandatoryCallback(t){}addMetadataCallback(t){}addSelectionCallback(t){}addStepSpecificStorageCallback(t,e){}addStorageCallback(t){}addVariationRecordsCallback(t){}getCommandDispatcher(){return t=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(t){return[]}getSerializedStep(t,e){}getStepSpecificServices(t){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(t){}markUpdateCompleted(t){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(t){}setCurrentVariationRecord(t){}setEditedStatus(t,e){}setInformationResults(t){}setMandatoryFulfilled(t,e){}async setSelectionsAndElements(t,e,A){}setVariationRecords(t){}toggleDesignConfirmed(){}updateMetadata(t,e){}async updateStorage(t,e){}injectIntoPreviewService(t){return Promise.resolve()}ejectFromPreviewService(){}}function Er(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}let ur;var Cr;(Cr=ur||(ur={})).SelectFrame="SelectFrame",Cr.SelectImage="SelectImage",Cr.Position="Position";class Qr extends Na{constructor(t,e){super(t,e),Er(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const e=this.manager.getRegionElements(this.step.stepName);return la.selectVariant(this.step,t.getResource(),e,this.manager,(t=>this.setUpdateState(t)))}onFrameDataChanged(t){this.frameService&&this.frameService.onFrameDataChanged((e=>{e&&t(e)}))}selectImage(t){return la.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,e,A,n){return n&&n.length>1&&void 0===t?ur.SelectFrame:e||A||this.getImageData()?ur.Position:ur.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const pr=t=>{const e=Gt(null),A=Gt(void 0),[n,a]=Nt(void 0),{addEvent:i,removeEvent:r,updateEvent:o,eventCache:s}=je(),[c,g]=Nt(!1),[l,d]=Nt(!1),{state:B,uiDispatcher:w}=eA(),h=Rt((t=>{const e=t;w(new tA({zoom:Math.max(.1,Math.min(e,B.maxZoom))}))}),[w,B.maxZoom]),E=Rt((t=>{r(t),1===s.length&&(A.current=void 0),2===s.length&&a(void 0);"touch"===t.pointerType&&s.length>1&&s.length-1==1&&(d(!1),g(!1))}),[r,s.length]),u=Rt((t=>{i(t);"touch"===t.pointerType&&1===s.length&&(w(new tA({selectedElement:void 0})),d(!0),g(!0))}),[i,s.length,w]),C=Rt((t=>{o(t);const e=1===s.length&&"touch"!==s[0].pointerType,i=2===s.length&&"touch"===s[0].pointerType;if(c&&i){const[t,e]=s,A=Math.abs(t.clientX-e.clientX),i=n;i&&h(B.zoom-.0055*(i-A)),a(A)}if(l&&(e||i)&&t.isPrimary){const e=(A?.current?.x||t.screenX)-t.screenX,n=(A?.current?.y||t.screenY)-t.screenY;w(new tA({selectedElement:void 0,xTranslation:B.xTranslation-e/B.zoom,yTranslation:B.yTranslation-n/B.zoom}))}t.isPrimary&&(A.current={x:t.screenX,y:t.screenY})}),[o,s,c,l,n,h,B.zoom,B.xTranslation,B.yTranslation,w]),Q=Rt((t=>{c&&h(B.zoom-.035*Math.sign(t.deltaY))}),[h,B.zoom,c]);bt((()=>{if(!e.current||0===s.length)return;const t=s[0].pointerId,A=e.current.hasPointerCapture(t);l&&!A&&e.current.setPointerCapture(t),!l&&A&&e.current.releasePointerCapture(t)}),[e,l,s]),KA([" "],(()=>{d(!0),w(new tA({selectedElement:void 0}))}),(()=>d(!1))),KA(["Control"],(()=>g(!0)),(()=>g(!1)));const p=Ut((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return Jt("div",{ref:e,className:"transform-wrapper",onWheel:Q,onPointerDown:u,onPointerUp:E,onPointerCancel:E,onPointerLeave:E,onPointerMove:C,style:p,children:t.children})};export{Br as SpiffCommerceClient,t as CommandContext,Ee as spiffCoreConfiguration,qA as PromiseQueue,XA as QueueablePromise,hr as MockWorkflowManager,Ma as InformationMessageType,Na as StepHandle,za as TextStepHandle,Qr as FrameStepHandle,ka as BulkStepHandle,Oa as ShapeStepHandle,ja as InformationStepHandle,Ua as IllustrationStepHandle,Ga as MaterialStepHandle,Ja as ModelStepHandle,Ta as PictureStepHandle,La as QuestionStepHandle,Di as GlobalPropertyHandle,rA as BulkPriceCalculationStrategy,xa as Variant,oi as WorkflowExperienceImpl,ji as FlowExecutionResult,Ki as FlowExecutionNodeResult,zi as FlowService,ee as OptionNotFoundError,Ae as LayoutNotFoundError,ne as AssetNotFoundError,ae as ResourceNotFoundError,ie as MisconfigurationError,se as ParseError,oe as UnhandledBehaviorError,be as assetService,ii as designService,ei as createDesign,Oe as optionService,we as persistenceService,ye as graphQlManager,EA as toast,na as FrameService,ea as getBoundedOffsets,la as frameStepService,wa as modelStepService,Ba as materialStepService,Qa as shapeStepService,ua as questionStepService,ca as digitalContentStepService,ha as moduleStepService,Ea as pictureStepService,Ia as textStepService,da as illustrationStepService,aA as ProductCameraRig,ur as FrameStep,sA as ConversionLocation,gA as ConversionDataType,lr as getWorkflow,gr as getWorkflows,ra as shortenUrl,qi as ObjectInput,Zi as TextInput,Wi as ObjectInputType,bi as ProductCollection,ki as CollectionProduct,e as AssetType,A as BringForwardCommand,n as BringToFrontCommand,a as BringToBackCommand,i as CanvasCommand,r as CreateElementCommand,o as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,d as FontSourceCommand,B as GroupCommand,w as LayoutElementFactory,h as LayoutElementType,E as MoveCommand,u as ResizeCommand,C as RotateCommand,Q as SendBackwardsCommand,dA as StakeholderType,p as StepAspectType,m as StepType,f as TextChangeCommand,D as UnitOfMeasurement,I as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,S as getAxisAlignedBoundingBox,v as generateSVGWithUnknownColors,Y as getAttributesFromArrayBuffer,x as rehydrateSerializedLayout,P as getFrameData,N as getSvgElement,R as loadFontFromDataUrl,H as loadFontFromExternalUrl,b as determineCorrectFontSizeAndLines,k as patternImageDataCache,Sn as generateCommands,U as registerJSDOM,OA as minZoom,Un as AdvancedEditor,pr as TransformWrapper,kn as EditorCore,Ke as useLayouts,eA as useEditorState,jA as useEditorInteraction,KA as useShortcutCombination,Ze as commandReducer,qe as getDefaultState,ze as CommandContextContext,_e as AdvancedEditorStateProvider,$e as AdvancedEditorContext,tA as UICommand,We as EditorSubMenu,uA as ElementEventType,QA as KeyEvent,Vn as gatherVaryingStepAspects};
1582
+ `),errorPolicy:"all",fetchPolicy:"no-cache",variables:{ids:t}});var n;const a=A.data.workflows;if(void 0===a||a.length!==t.length)throw new Error(`Unable to read workflows: ${A.errors??"Length mismatch in response"}`);return a.forEach((t=>{t.steps.forEach((t=>{delete t.data.__typename,t.option?.id&&(t.option.defaultVariant?.asset&&be.cacheAsset(t.option.defaultVariant.asset),t.option.colorProfile&&be.cacheAsset(t.option.colorProfile),t.option.variants?.forEach((t=>{t.asset&&be.cacheAsset(t.asset),t.displayImage&&be.cacheAsset(t.displayImage),t.thumbnail&&be.cacheAsset(t.thumbnail),t.material&&be.cacheMaterial(t.material)})),Ue.set({id:t.option.id},Promise.resolve(t.option)))}))})),a})(n,e),i=n.map((t=>Ue.set({id:t,options:e},(async(t,e)=>{const A=(await e).find((e=>e.id===t));if(!A)throw new Error(`Workflow not found: ${t}`);return A})(t,a)))),r=A.filter((t=>void 0!==t));return await Promise.all(r.concat(i))},gr=async(t,e)=>(await cr([t],e))[0],lr=(t,e)=>{const A=t.workflowState,n=A?JSON.parse(A):void 0;return n?Object.values(n.layouts).map((t=>t.layout)):e.panels.sort(((t,e)=>t.index-e.index)).map((t=>({id:F(),panelId:t.name,name:t.name,index:t.index,createdAt:new Date,updatedAt:new Date,transparentBackground:t.transparentBackground,height:t.height,width:t.width,previewRegion:t.previewRegion,useEditableArea:t.useEditableArea,editableArea:t.editableArea})))};class dr{constructor(t){var e;Zi(this,"options",void 0),Zi(this,"initialized",void 0),Zi(this,"currencyCode",void 0),Zi(this,"customer",void 0),Zi(this,"experienceOptions",void 0),Zi(this,"updateTransactionState",(async t=>{try{return ye.getShadowGraphqlClient().mutate({...t,mutation:On})}catch(t){throw console.error(t),new ce("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(e=this.options.applicationKey,Ie=e)}getAssetManager(){return be}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}getFlowService(){if(!this.options.applicationKey)throw new Error("Application key required to use Flow Service.");return new zi}async authenticateBundleFromLocalStorage(t){const e=we.getMap("bundleOwnerIds");if(e?.has(t)){const A=e.get(t);return me(A),Promise.resolve({success:!0,stakeholderType:dA.Owner})}const A=we.getMap("bundlePartnerIds")||new Map;if(A.has(t)){const e=A.get(t),n=(we.getMap("partnerCustomerIds")||new Map).get(e);if(n){if(await this.authenticateCustomerId(n)){const e=this.customer?.bundleStakeholders?.find((e=>e.bundle?.id===t));if(e)return Promise.resolve({success:!0,stakeholderType:e.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(t){const e=ye.getShadowGraphqlClient(),A=await e.query({query:Ar,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}});if(!A.data.transactions||0===A.data.transactions.length)throw new Error(`Transaction not found: ${t}`);const n=A.data.transactions[0],a=n.product?.partner?.id;if(!a)throw new Error(`Unable to read transaction: ${t}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=we.getMap("transactionOwnerIds");if(i?.has(t)){const e=i.get(t);return Qe(e),Promise.resolve({success:!0,stakeholderType:dA.Owner})}const r=we.getMap("transactionCustomerIds");if(r?.has(t)){const e=r.get(t);if(e){if(await this.authenticateCustomerId(e)){const e=this.customer?.bundleStakeholders?.find((e=>e.bundle?.transactions?.some((e=>e.id===t))))||this.customer?.stakeholders?.find((e=>e.transaction?.id===t));if(e)return Promise.resolve({success:!0,stakeholderType:e.type})}}}const o=(await e.query({query:nr,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!o)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:o.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const e=we.getMap("transactionCustomerIds");e?.has(t)&&(e.delete(t),we.setMap("transactionCustomerIds",e))}getStakeholderTypeForTransaction(t){const e=this.customer?.stakeholders?.find((e=>e.transaction?.id===t));if(e)return e.type}async getOrCreateCustomer(t){this.customer=void 0;const e=ye.getShadowGraphqlClient(),A=(await e.query({query:ar,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!A.id){const A=(await e.mutate({mutation:ir,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!A)throw new Error("Unable to create customer.");return this.storeCustomer(A),this.customer=A,{customer:A,isAuthenticated:!1}}this.storeCustomer(A);const n=await this.authenticateCustomerId(A.id);return{customer:this.customer||A,isAuthenticated:n}}async authenticateCustomerId(t){const e=ye.getShadowGraphqlClient(),A=we.getMap("customerTokens");if(!A?.has(t))return!1;const n=A.get(t);if(!n)return!1;const a=(await e.mutate({mutation:rr,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!a&&(this.storeCustomer(a),De(n),this.customer=a,!0)}async generateVerificationCode(t){await ye.getShadowGraphqlClient().mutate({mutation:or,variables:{emailAddress:t}})}async verifyCode(t,e){const A=(await ye.getShadowGraphqlClient().mutate({mutation:sr,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t,verificationCode:e}})).data?.customerVerifyCode;if(A?.loginToken){if(!A.partner?.id)throw new Error(`Unable to find customer: ${t}`);const e=we.getMap("customerTokens")||new Map;return e.set(A.id,A.loginToken),we.setMap("customerTokens",e),this.storeCustomer(A),De(A.loginToken),this.customer={...A,loginToken:void 0},!0}return!1}async getNewBundle(t){const e=(await ye.getShadowGraphqlClient().mutate({mutation:di,variables:{collectionId:t},fetchPolicy:"no-cache"})).data?.bundleCreate;if(!e?.id)throw new Error("Unable to create bundle");const A=we.getMap("bundlePartnerIds")||new Map;A.set(e.id,e.partner.id),we.setMap("bundlePartnerIds",A),me(e.bundleOwnerId);const n=we.getMap("bundleOwnerIds")||new Map;return n.set(e.id,e.bundleOwnerId),we.setMap("bundleOwnerIds",n),new Gi(this,e)}async getExistingBundle(t,e,A){const n=we.getMap("bundleOwnerIds")?.get(t);n&&me(n);const a=await ye.getShadowGraphqlClient().query({query:ci,variables:{id:t},fetchPolicy:"no-cache"});if(!a.data?.bundles||0===a.data?.bundles.length||!a.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const i=a.data?.bundles[0],r=we.getMap("bundlePartnerIds")||new Map;r.set(i.id,i.partner.id),we.setMap("bundlePartnerIds",r);const o=new Gi(this,i,e,A);return await o.getInitializationPromise(),o}async getBundleStakeholders(){if(!this.customer)throw new Error("Customer not authenticated.");const t=await ye.getShadowGraphqlClient().query({query:li,variables:{id:this.customer.id},fetchPolicy:"no-cache"});if(!t.data?.customers||0===t.data.customers.length)throw new Error("Unable to find customer.");const e=t.data.customers[0].bundleStakeholders||[],A=we.getMap("bundlePartnerIds")||new Map;return e.forEach((t=>{t.bundle?.id&&t.bundle.partner?.id&&A.set(t.bundle.id,t.bundle.partner.id)})),we.setMap("bundlePartnerIds",A),e}async getWorkflowExperience(t,e,A,n){if(!n)return await this.getWorkflowExperienceDeprecated(t,e,A);const a=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}},{transaction:i,workflow:r,readOnly:o}=await(async()=>{const t=ye.getShadowGraphqlClient();if("transaction"===n.type){const{transactionId:e,readOnly:A}=n,a=await t.query({query:Ln,variables:{ids:[e]},errorPolicy:"all",fetchPolicy:"no-cache"});if(!a.data?.transactions||0===a.data.transactions.length)throw new ce("Existing transaction not found.");const i=a.data?.transactions[0];if(!i.workflowId)throw new ce("Existing transaction has no workflow ID.");const r=await gr(i.workflowId);if(!i.product)throw new ce("Failed to load transaction, product not available.");return{transaction:i,workflow:r,readOnly:A}}if("integration"===n.type||"external"===n.type){const e=async()=>{const e="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},A=await t.mutate({mutation:Gn,variables:{...e,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new ce("Failed to create transaction!");const a=A.data.transactionCreate;if(!a.product)throw new ce("Failed to create transaction, product not available.");return a},A=gr(n.workflowId,n?.graphql),[a,i]=await Promise.all([e(),A]);return{transaction:a,workflow:i}}throw new ce("No workflow ID provided.")})();this.currencyCode=i.product.partner?.currencyCode;const s={product:i.product,transaction:i,layouts:[],stateMutationFunc:o?async()=>{throw new oe("State mutation is forbidden in read only mode!")}:async t=>{const e=(we.getMap("transactionOwnerIds")||new Map).get(i.id)||void 0;return this.updateTransactionState({...t,context:{transactionOwnerId:e}})},readOnly:o,workflow:r};if("transaction"===n.type&&i.workflowState){const t=JSON.parse(i.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else if(!o&&n.workflowState){const t=JSON.parse(n.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else s.layouts=lr(s.transaction,s.workflow);if(s.renderableContextService=new Yn(s.layouts),n.previewService?(s.previewService=n.previewService,s.product?.modelUrl&&(s.modelContainer=s.previewService.loadModel({model:s.product.modelUrl,contextService:s.renderableContextService}))):(s.previewService=A&&A(r),s.product?.modelUrl&&(s.previewService?.initialize({model:s.product.modelUrl,contextService:s.renderableContextService}),s.modelContainer=s.previewService?.getAllModels()[0])),"transaction"!==n.type){const t=we.getMap("transactionOwnerIds")||new Map;t.set(i.id,i.transactionOwnerId),Qe(i.transactionOwnerId||""),we.setMap("transactionOwnerIds",t)}else{const t=(we.getMap("transactionOwnerIds")||new Map).get(i.id);t&&Qe(t),s.isReloadedTransaction=!0}this.initialized=!0,this.experienceOptions=s;const c=new oi(this,s);return await c.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await c.attachCustomerDetails({email:this.customer.emailAddress}),c}async getWorkflowExperiences(t,e){if(0===t.length)throw new ce("No options provided!");const A=ye.getShadowGraphqlClient(),n=t.map(((t,e)=>({option:t,index:e}))),a=n.filter((t=>"transaction"===t.option.type)),i=n.filter((t=>"integration"===t.option.type||"external"===t.option.type)),r=(await Promise.all([(async()=>{if(0===a.length)return[];const t=a.map((t=>t.option.transactionId)),e=await A.query({query:Ln,variables:{ids:t},errorPolicy:"all",fetchPolicy:"no-cache"}),n=e.data.transactions;if(n.length!==a.length){const t=e.errors?.[0]?.message||"Unknown error";throw new ce(`Not all transactions were found: ${t}`)}return n.map(((t,e)=>({transaction:t,workflowId:t.workflowId,readOnly:a.find((e=>e.option.transactionId===t.id))?.option.readOnly??!1,index:a[e].index})))})(),(async()=>{if(0===i.length)return[];const t=await A.mutate({mutation:Jn,variables:{inputs:i.map((t=>({integrationProductId:"integration"===t.option.type?t.option.integrationProductId:void 0,externalIntegrationId:"external"===t.option.type?t.option.externalIntegrationId:void 0,externalProductId:"external"===t.option.type?t.option.externalProductId:void 0,workflowId:t.option.workflowId,bulk:t.option.bulk,claim:!0})))},errorPolicy:"all",fetchPolicy:"no-cache"}),e=t.data?.transactionCreateMany;if(!e||0===e.length){const e=t.errors?.[0]?.message||"Unknown error";throw new ce(`Failed to create transactions: ${e}`)}return e.map(((t,e)=>({transaction:t,workflowId:t.workflowId,readOnly:!1,index:i[e].index})))})()])).flat(),o=[...new Set(r.map((t=>t.workflowId)))],s=await cr(o,e),c=new Map(s.map((t=>[t.id,t]))),g=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}},l=we.getMap("transactionOwnerIds")||new Map,d=r.map((async e=>{const{transaction:A,workflowId:n,readOnly:a,index:i}=e,r=c.get(n),o=t[i];!l.get(A.id)&&A.transactionOwnerId&&l.set(A.id,A.transactionOwnerId);const s=l.get(A.id)||void 0,d={product:A.product,transaction:A,layouts:[],stateMutationFunc:a?async()=>{throw new oe("State mutation is forbidden in read only mode!")}:async t=>this.updateTransactionState({...t,context:{transactionOwnerId:s}}),readOnly:a,workflow:r,isReloadedTransaction:"transaction"===o.type};if("transaction"===o.type&&A.workflowState){const t=JSON.parse(A.workflowState);d.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await g(t),d.reloadedState=t}else if(!a&&o.workflowState){const t=JSON.parse(o.workflowState);d.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await g(t),d.reloadedState=t}else d.layouts=lr(d.transaction,d.workflow);return d.renderableContextService=new Yn(d.layouts),this.initialized=!0,this.experienceOptions=d,{experienceOptions:d,index:i,options:o}}));we.setMap("transactionOwnerIds",l);const B=(await Promise.all(d)).sort(((t,e)=>t.index-e.index)).map((async t=>{const{experienceOptions:e,options:A}=t,n=new oi(this,e);return await n.getWorkflowManager().getInitializationPromise(),"transaction"!==A.type&&this.customer&&await n.attachCustomerDetails({email:this.customer.emailAddress}),n}));return await Promise.all(B)}async initFromIntegrationProduct(t){if(""===t)throw new ce("No integration product ID provided.");const e=ye.getShadowGraphqlClient(),A=await e.mutate({mutation:Gn,variables:{integrationProductId:t,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!A.data||!A.data.transactionCreate)throw new ce("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new ce("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const a=we.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),Qe(n.transactionOwnerId||""),we.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,e=!1){if(""===t)throw new ce("No transaction ID provided.");const A=ye.getShadowGraphqlClient();if(e)return await(async()=>{const n=(await A.query({query:Ln,variables:{ids:[t]},fetchPolicy:"no-cache",errorPolicy:"all"})).data?.transactions[0];if(!n)throw new ce("Failed to read transaction.");if(!n.product)throw new ce("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new oe("State mutation is forbidden in read only mode!")},readOnly:e},this.initialized=!0})();const n=we.getMap("transactionOwnerIds")||new Map,a=n.get(t);if(a){Qe(a);const n=(await A.query({query:Ln,variables:{ids:[t]},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new ce("Failed to read transaction.");if(!n.product)throw new ce("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},void(this.initialized=!0)}try{const a=(await A.mutate({mutation:Tn,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!a)throw new ce("Failed to read transaction.");if(!a.product)throw new ce("Failed to load transaction, product not available.");this.currencyCode=a.product.partner?.currencyCode,a.transactionOwnerId&&(n.set(a.id,a.transactionOwnerId),Qe(a.transactionOwnerId),we.setMap("transactionOwnerIds",n)),this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},this.initialized=!0}catch{throw new ce("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,e,A){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot launch experience: Not initialized.");const n=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await wt(e.svg))}const n=t.layouts[e].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const e=n[t];e.fontData?.assetUrl&&H(e.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await gr(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=t,this.experienceOptions.transaction.workflowState){const t=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=A&&A(t),this.experienceOptions.renderableContextService=new Yn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const e=new oi(this,this.experienceOptions);return await e.getWorkflowManager().getInitializationPromise(),e}if(t){const a=ye.getShadowGraphqlClient().mutate({mutation:zn,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),i=gr(t);if(await Promise.all([a,i]),this.experienceOptions.workflow=await i,e){const t=JSON.parse(e);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=lr(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await i),this.experienceOptions.renderableContextService=new Yn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const r=new oi(this,this.experienceOptions);return await r.getWorkflowManager().getInitializationPromise(),r}throw new ce("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new ce("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}storeCustomer(t){const e=we.getMap("partnerCustomerIds")||new Map;e.set(t.partner.id,t.id),we.setMap("partnerCustomerIds",e)}}function Br(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}class wr{constructor(){Br(this,"getProduct",void 0),Br(this,"getCommandContext",void 0),Br(this,"getAllLayoutData",void 0),Br(this,"getMetadata",void 0),Br(this,"getWorkflowMetadata",void 0),Br(this,"getStepStorage",void 0),Br(this,"setModelContainer",void 0),Br(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(t){}addVariationRecord(t){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(t){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(t){}addPoller(t){}addConfirmCallback(t){}addCurrentVariationCallback(t){}addEditedCallback(t){}addElementsCallback(t){}addInformationResultCallback(t){}addInitCallback(t){}addMakingAdjustmentsCallback(t){}addMandatoryCallback(t){}addMetadataCallback(t){}addSelectionCallback(t){}addStepSpecificStorageCallback(t,e){}addStorageCallback(t){}addVariationRecordsCallback(t){}getCommandDispatcher(){return t=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(t){return[]}getSerializedStep(t,e){}getStepSpecificServices(t){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(t){}markUpdateCompleted(t){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(t){}setCurrentVariationRecord(t){}setEditedStatus(t,e){}setInformationResults(t){}setMandatoryFulfilled(t,e){}async setSelectionsAndElements(t,e,A){}setVariationRecords(t){}toggleDesignConfirmed(){}updateMetadata(t,e){}async updateStorage(t,e){}injectIntoPreviewService(t){return Promise.resolve()}ejectFromPreviewService(){}}function hr(t,e,A){return(e=function(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var A=t[Symbol.toPrimitive];if(void 0!==A){var n=A.call(t,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}(e))in t?Object.defineProperty(t,e,{value:A,enumerable:!0,configurable:!0,writable:!0}):t[e]=A,t}let Er;var ur;(ur=Er||(Er={})).SelectFrame="SelectFrame",ur.SelectImage="SelectImage",ur.Position="Position";class Cr extends Na{constructor(t,e){super(t,e),hr(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const e=this.manager.getRegionElements(this.step.stepName);return la.selectVariant(this.step,t.getResource(),e,this.manager,(t=>this.setUpdateState(t)))}onFrameDataChanged(t){this.frameService&&this.frameService.onFrameDataChanged((e=>{e&&t(e)}))}selectImage(t){return la.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,e,A,n){return n&&n.length>1&&void 0===t?Er.SelectFrame:e||A||this.getImageData()?Er.Position:Er.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const Qr=t=>{const e=Gt(null),A=Gt(void 0),[n,a]=Nt(void 0),{addEvent:i,removeEvent:r,updateEvent:o,eventCache:s}=je(),[c,g]=Nt(!1),[l,d]=Nt(!1),{state:B,uiDispatcher:w}=eA(),h=Rt((t=>{const e=t;w(new tA({zoom:Math.max(.1,Math.min(e,B.maxZoom))}))}),[w,B.maxZoom]),E=Rt((t=>{r(t),1===s.length&&(A.current=void 0),2===s.length&&a(void 0);"touch"===t.pointerType&&s.length>1&&s.length-1==1&&(d(!1),g(!1))}),[r,s.length]),u=Rt((t=>{i(t);"touch"===t.pointerType&&1===s.length&&(w(new tA({selectedElement:void 0})),d(!0),g(!0))}),[i,s.length,w]),C=Rt((t=>{o(t);const e=1===s.length&&"touch"!==s[0].pointerType,i=2===s.length&&"touch"===s[0].pointerType;if(c&&i){const[t,e]=s,A=Math.abs(t.clientX-e.clientX),i=n;i&&h(B.zoom-.0055*(i-A)),a(A)}if(l&&(e||i)&&t.isPrimary){const e=(A?.current?.x||t.screenX)-t.screenX,n=(A?.current?.y||t.screenY)-t.screenY;w(new tA({selectedElement:void 0,xTranslation:B.xTranslation-e/B.zoom,yTranslation:B.yTranslation-n/B.zoom}))}t.isPrimary&&(A.current={x:t.screenX,y:t.screenY})}),[o,s,c,l,n,h,B.zoom,B.xTranslation,B.yTranslation,w]),Q=Rt((t=>{c&&h(B.zoom-.035*Math.sign(t.deltaY))}),[h,B.zoom,c]);bt((()=>{if(!e.current||0===s.length)return;const t=s[0].pointerId,A=e.current.hasPointerCapture(t);l&&!A&&e.current.setPointerCapture(t),!l&&A&&e.current.releasePointerCapture(t)}),[e,l,s]),KA([" "],(()=>{d(!0),w(new tA({selectedElement:void 0}))}),(()=>d(!1))),KA(["Control"],(()=>g(!0)),(()=>g(!1)));const p=Ut((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return Jt("div",{ref:e,className:"transform-wrapper",onWheel:Q,onPointerDown:u,onPointerUp:E,onPointerCancel:E,onPointerLeave:E,onPointerMove:C,style:p,children:t.children})};export{dr as SpiffCommerceClient,t as CommandContext,Ee as spiffCoreConfiguration,qA as PromiseQueue,XA as QueueablePromise,wr as MockWorkflowManager,Ma as InformationMessageType,Na as StepHandle,za as TextStepHandle,Cr as FrameStepHandle,ka as BulkStepHandle,Oa as ShapeStepHandle,ja as InformationStepHandle,Ua as IllustrationStepHandle,Ga as MaterialStepHandle,Ja as ModelStepHandle,Ta as PictureStepHandle,La as QuestionStepHandle,Di as GlobalPropertyHandle,rA as BulkPriceCalculationStrategy,xa as Variant,oi as WorkflowExperienceImpl,ji as FlowExecutionResult,Ki as FlowExecutionNodeResult,zi as FlowService,ee as OptionNotFoundError,Ae as LayoutNotFoundError,ne as AssetNotFoundError,ae as ResourceNotFoundError,ie as MisconfigurationError,se as ParseError,oe as UnhandledBehaviorError,be as assetService,ii as designService,ei as createDesign,Oe as optionService,we as persistenceService,ye as graphQlManager,EA as toast,na as FrameService,ea as getBoundedOffsets,la as frameStepService,wa as modelStepService,Ba as materialStepService,Qa as shapeStepService,ua as questionStepService,ca as digitalContentStepService,ha as moduleStepService,Ea as pictureStepService,Ia as textStepService,da as illustrationStepService,aA as ProductCameraRig,Er as FrameStep,sA as ConversionLocation,gA as ConversionDataType,gr as getWorkflow,cr as getWorkflows,ra as shortenUrl,qi as ObjectInput,Wi as ObjectInputType,bi as ProductCollection,ki as CollectionProduct,e as AssetType,A as BringForwardCommand,n as BringToFrontCommand,a as BringToBackCommand,i as CanvasCommand,r as CreateElementCommand,o as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,d as FontSourceCommand,B as GroupCommand,w as LayoutElementFactory,h as LayoutElementType,E as MoveCommand,u as ResizeCommand,C as RotateCommand,Q as SendBackwardsCommand,dA as StakeholderType,p as StepAspectType,m as StepType,f as TextChangeCommand,D as UnitOfMeasurement,I as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,S as getAxisAlignedBoundingBox,v as generateSVGWithUnknownColors,Y as getAttributesFromArrayBuffer,x as rehydrateSerializedLayout,P as getFrameData,N as getSvgElement,R as loadFontFromDataUrl,H as loadFontFromExternalUrl,b as determineCorrectFontSizeAndLines,k as patternImageDataCache,Sn as generateCommands,U as registerJSDOM,OA as minZoom,Un as AdvancedEditor,Qr as TransformWrapper,kn as EditorCore,Ke as useLayouts,eA as useEditorState,jA as useEditorInteraction,KA as useShortcutCombination,Ze as commandReducer,qe as getDefaultState,ze as CommandContextContext,_e as AdvancedEditorStateProvider,$e as AdvancedEditorContext,tA as UICommand,We as EditorSubMenu,uA as ElementEventType,QA as KeyEvent,Vn as gatherVaryingStepAspects};
1583
1583
  //# sourceMappingURL=module.js.map