@spiffcommerce/core 11.5.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -439,7 +439,7 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
439
439
  workflowState
440
440
  }
441
441
  }
442
- `,Rs=t=>{const e=[];for(const A of t.steps)switch(A.type){case nA.DigitalContent:A.data.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Upload});break;case nA.Frame:const t=A.data;t.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),t.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Upload});break;case nA.Illustration:const i=A.data;i.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),i.varyColors&&i.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Colors});break;case nA.Material:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Model:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Picture:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Question:A.data.varySelections&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selections});break;case nA.Shape:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Text:const n=A.data;n.varyText&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Text}),n.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),n.varyColor&&n.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Color})}return e},ks=[nA.SilentIllustration,nA.ProductOverlay],Hs=async(t,e,A)=>{const i=[];t.introduction&&i.push({name:"Introduction",title:t.name,renderableSteps:[{type:nA.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 nA.DigitalContent:A.data.varyUpload&&(t=!0);break;case nA.Frame:{const e=A.data;!e.varyUpload||!e.varySelection&&A.option||(t=!0)}break;case nA.Illustration:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColors&&e.colorPickerEnabled||(t=!0)}break;case nA.Material:A.data.varySelection&&(t=!0);break;case nA.Model:A.data.varySelection&&(t=!0);break;case nA.Picture:A.data.varySelection&&(t=!0);break;case nA.Question:A.data.varySelections&&(t=!0);break;case nA.Shape:A.data.varySelection&&(t=!0);break;case nA.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 n=Us(A.stepName,t.stepGroups);if(n){const t=i.find((t=>t.name===n.name));t?ks.includes(A.type)?t.silentSteps.push(A):t.renderableSteps.push(A):i.push({name:n.name,title:n.name,renderableSteps:ks.includes(A.type)?[]:[A],silentSteps:ks.includes(A.type)?[A]:[]})}else i.push({name:A.stepName,title:A.stepTitle,renderableSteps:ks.includes(A.type)?[]:[A],silentSteps:ks.includes(A.type)?[A]:[]})}if(e.bulkScene){const n=A?.product?.bulkConfiguration;i.push({name:"Bulk",title:n?.sceneTitle??e.bulkSceneTitle,renderableSteps:[{type:nA.Bulk,stepName:"Bulk",stepTitle:n?.stepTitle??e.bulkSceneTitle,helpText:n?.helpText,data:{aspects:Rs(t)},conditions:[]}],silentSteps:[]})}return e.finishScene&&i.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:nA.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:[]}),i},Us=(t,e)=>e.find((e=>e.stepNames.includes(t))),Gs=(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})),Ts=(t,e)=>t.map((t=>((t,e)=>{const A={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>Gs(t,e))),silentSteps:t.silentSteps.filter((t=>Gs(t,e)))};return 0===A.silentSteps.length&&0===A.renderableSteps.length?null:A})(t,e))).filter((t=>null!==t)),Os=async(t,e)=>{const A=Ts(t,e),i=[];for(const t of A)for(const e of t.renderableSteps)if(e.type===nA.Model||e.type===nA.Material||e.type===nA.Picture||e.type===nA.Shape){const t=(e.option?.variants||[]).length;t&&t>1&&i.push(e.stepName)}else i.push(e.stepName);const n=A.filter((t=>t.renderableSteps.filter((t=>i.includes(t.stepName))).length>0));for(const t of n)t.renderableSteps=t.renderableSteps.filter((t=>i.includes(t.stepName)));return n};function Js(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 Ls(t,e,A,i){const n=A.width*t.zoom,r=A.height*t.zoom;if(i){const i=t,n=Math.max(e.width/A.width,e.height/A.height);i.zoom=Math.max(n,t.zoom);const r=A.width*i.zoom,a=A.height*i.zoom;return i.x=zs(t.x,e.width-r,0),i.y=zs(t.y,e.height-a,0),i}const a=t;return a.x=zs(a.x,-n,e.width),a.y=zs(a.y,-r,e.height),a}function zs(t,e,A){return Math.min(Math.max(t,e),A)}class js{constructor(t){Js(this,"offsets",void 0),Js(this,"forceImageCover",void 0),Js(this,"targetElements",void 0),Js(this,"imageData",void 0),Js(this,"frameData",void 0),Js(this,"_debouncedUpdateFrameOffsets",void 0),Js(this,"minZoomScale",.03),Js(this,"maxZoomScale",20),Js(this,"onFrameDataChangeListeners",void 0),Js(this,"onZoomChangeListeners",void 0),Js(this,"workflowManager",void 0),Js(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=S(I)(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.currentFrameSource){const t=await Yn(e.currentFrameSource);S(f)(t,this.frameData)||(this.frameData=t,this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.offsets=Pn(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),e),this.workflowManager=t,this.stepName=e}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}async setFrameData(t){const e=vn.get(t);this.frameData=e}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,e,A,i){if(this.imageData&&this.offsets&&this.frameData){const n=(e-this.offsets.x)/this.offsets.zoom,r=(A-this.offsets.y)/this.offsets.zoom,a={x:e-n*t,y:A-r*t,zoom:this.imageData.width*t/this.imageData.width};this.updateOffsets(Ls(a,this.frameData,this.imageData,this.forceImageCover),i),this.onZoomChangeListeners.forEach((e=>e(t)))}}setPatternData(t){(t&&this.frameData||t&&this.frameData&&!this.imageData)&&(this.offsets=Pn(t,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements),this.updateOffsets(Ls(this.offsets,this.frameData,t,this.forceImageCover))),this.imageData=t,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,e){const A=this.imageData;A&&this.frameData&&(this.offsets&&t.x===this.offsets.x&&t.y===this.offsets.y&&t.zoom===this.offsets.zoom?e&&e():(this.offsets=Ls(t,this.frameData,A,this.forceImageCover),this._debouncedUpdateFrameOffsets(t,A,this.frameData,this.targetElements,e)))}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,e,A,i,n){if(!A)throw new Ar("Frame data not set. This is a bug");if(!this.workflowManager)throw new Ar("No workflow manager set, cannot update offsets.");const r=this.workflowManager.getCommandDispatcher();i.forEach((A=>{r(new gn(A,e,t))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:t}),n&&n()}recalculateZoomLimits(t,e){const A=Math.max(e.width/t.width,e.height/t.height);this.forceImageCover?(this.minZoomScale=A,this.maxZoomScale=2.5*A):(this.minZoomScale=A/10,this.maxZoomScale=2.5*A)}}function Vs(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 Ks{constructor(t,e,A){Vs(this,"configuration",void 0),Vs(this,"layouts",void 0),Vs(this,"product",void 0),Vs(this,"processRegion",(async t=>{const e=this.layouts.find((e=>e.panelId===t.panelId));if(!e)throw new Zn(t);let A="";if(this.configuration.type===nA.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),A=t,!t)throw new tr(this.configuration,"Couldn't find an asset for product overlay step")}const i=this.evaluateAssetType();if(i===ze.Image){const A=this.configuration.type===nA.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!A)throw new Error("Undefined raster silent step source");const n={stepName:this.configuration.stepName,id:Te(),src:A,type:i,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===nA.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:n.id,region:t},command:new en(n,e)}}{const n=this.configuration.type===nA.SilentIllustration?this.configuration.data.asset?.fileLink:A,r=async()=>new Promise(((t,e)=>{n?zA(n).then((e=>{t(e)})).catch((t=>console.error(t))):e("Undefined vector silent step source")})),a=await ki(await r()),s={stepName:this.configuration.stepName,id:Te(),cachedObjectURL:await zn(a.svg),src:n,svg:a.svg,colors:a.colors,type:i,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===nA.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new en(s,e)}}})),this.configuration=t,this.layouts=e,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new tr(this.configuration,"Missing regions.");if(this.configuration.type===nA.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===nA.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((e=>t.panelId===e.panelId)))throw new Zn(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===nA.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")?ze.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),ze.Illustration)}}const Ws=async t=>{const e=`${gr.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 rr("Failed to shorten URL, see console.")}};function Xs(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 qs{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,i=3e3,n=10){Xs(this,"pollingId",void 0),Xs(this,"attempts",void 0),Xs(this,"interval",void 0),Xs(this,"maxAttempts",void 0),Xs(this,"predicate",void 0),Xs(this,"onSuccess",void 0),Xs(this,"onFailure",void 0),this.onSuccess=e,this.onFailure=A,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=i,this.maxAttempts=n,this.poll()}}const Zs=new class{async init(t,e,A){return A&&await this.reload(t,e,A),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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,[],n,(async()=>{const A=i?.storage?.videoShortUrl,n=i?.storage?.videoUrl;e.updateStorage(t.stepName,{videoShortUrl:A,videoUrl:n})}))}async regenerateQRCode(t,e,A,i,n,r,a,s,o){if(e||""===A||""!==i)o(!1);else{const e=async()=>{const t=(await Mr([A]))[0],e=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:e}},c=await new Promise(((t,A)=>{new qs((async()=>!!(await e()).link),(async()=>{const A=await e();if(!A.link||!A.link)throw new _n(A.asset);t({rel:"mpeg4",href:A.link})}),(()=>{A("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>s(new An(t.id))));const l="http"===r.data.baseUrl.slice(0,4)?"":"https://",g=new URL(l+r.data.baseUrl);g.searchParams.append("video",btoa(JSON.stringify([c]))),g.pathname=g.pathname+("/"===g.pathname.slice(-1)?"":"/");const h=g.toString();if(h.length>=2e3)throw new rr("Cannot create QR code, URL too long.");const d=await Ws(h);if(a(d),!r.data||!r.data.regions)throw new tr(r,"Missing regions.");const u=await this.regionElements(r),B=await this.command(d,u,n,r.stepName);B&&(B.command&&n.getCommandDispatcher()(B.command),B.followup&&await B.followup()),await n.setSelectionsAndElements(r.stepName,[],u,(async()=>{n.updateStorage(r.stepName,{videoShortUrl:d,videoUrl:i}),o(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:Te(),region:t})))}async command(t,e,A,i){const n=A.getLayouts(),r=`data:image/svg+xml;base64,${btoa(await(0,y.toString)(t,{type:"svg"}))}`,a=e.map((t=>{const e=t.region,A=n.find((t=>t.panelId===e?.panelId));if(!A&&e)throw new Zn(e);if(A&&!e)throw new Error("Region not found");if(!A||!e)throw new Error("Neither a region or layout found!");return new en({stepRegion:e,stepName:i,id:t.id,src:r,type:ze.Image,y:e.top,x:e.left,width:e.width,height:e.height,rotation:0},A)}));return{command:new $i(a),followup:async()=>{}}}};function $s(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 _s=new class{constructor(){$s(this,"frameSourceSvg",(async(t,e)=>{if(!t)return Sn(e.data.regions[0]);const A=t.asset;if(!A)throw new $n(t);const i=A.fileLink;if(i)return zA(i);throw new _n(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,i=Nr.getDefaultVariant(A);return i?this.selectVariantCommand(t,i,[],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 i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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=Sn(t.data.regions[0]);e.updateStorage(t.stepName,{currentFrameSource:A})}if(i){const A=async()=>{const A=i.storage?.framePatternSrc,n=i.storage?.frameOffsets;if(e.updateMetadata(t.stepName,{frameOffsets:n,framePatternSrc:A}),A){const i=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(A,i),e.updateMetadata(t.stepName,{image:A}),e.updateStorage(t.stepName,{framePatternSrc:A})}if(n?.zoom){const A=e.getStepSpecificServices(t.stepName)?.frameService;A.updateOffsets(n)}e.setMandatoryFulfilled(t.stepName,!0)};if(i.selectedVariants&&i.selectedVariants.length>0){const r=i.selectedVariants[0].id;if(t.option&&r){const i=t.option.variants?.find((t=>t.id===r));i&&await e.setSelectionsAndElements(t.stepName,[i],n,(async()=>{const n=await this.frameSourceSvg(i,t);e.updateStorage(t.stepName,{currentFrameSource:n}),await A()}))}}else await e.setSelectionsAndElements(t.stepName,[],n,A)}}selectImage(t,e,A){A.setEditedStatus(t.stepName,!0);(e.fileLink||"").endsWith("pdf")?A.addPoller(new qs((async()=>{const t=(await Sr.getLocalOrFromServer(e.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{Sr.getLocalOrFromServer(e.key||"").then((e=>{this.loadPatternFromAsset(e,t,A)}))}),(()=>{throw new rr("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(e,t,A)}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A,i,n);r&&(r.command&&i.getCommandDispatcher()(r.command),r.followup&&await r.followup())}getCreateElementCommand(t,e,A,i){return new en({id:t,type:ze.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/i.frameData.width,scaleY:e.height/i.frameData.height,path:i.frameData.path,stepRegion:e,stepName:i.stepName,disablePlaceholder:i.disablePlaceholder,focalBlur:i.focalBlur,focalBlurStrength:i.focalBlurStrength,focalBlurRadius:i.focalBlurRadius,pattern:i.pattern,immutable:e.immutable},A)}async loadPatternFromString(t,e){if(t.endsWith("svg")){const A=await Rn(t),i=A.width,n=A.height,r={src:t,width:i,height:n,aspect:i/n};Mn.set(t,r),e.setPatternData(r)}else{const A=await LA(t),i=await In(A),n={src:t,width:i.width,height:i.height,aspect:i.width/i.height};Mn.set(t,n),e.setPatternData(n)}}async selectVariantCommand(t,e,A,i,n,r){const a=i.getStepSpecificServices(t.stepName)?.frameService,s=await this.frameSourceSvg(e,t),o=await Yn(s),c=a.getImageData(),l=A.map((t=>new An(t.id))),g=c?Pn(c,o):void 0,h=c?{id:Te(),src:c.src,x:g?.x||0,y:g?.y||0,width:c.width,height:c.height,scaleX:g?.zoom||1,scaleY:g?.zoom||1,rotation:0}:void 0;n&&n(!0);const d=t.data.regions.map((e=>{const A=Te(),n=i.getLayouts().find((t=>t.panelId===e.panelId));if(!n)throw new Zn(e);return{command:this.getCreateElementCommand(A,e,n,{frameData:o,pattern:h,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:A,region:e}}})),u=d.map((t=>t.command));return{command:new $i([...u,...l]),followup:async()=>{n&&n(!1),await i.setSelectionsAndElements(t.stepName,e?[e]:[],[...d.map((t=>t.regionEl))],(async()=>{if(i.updateStorage(t.stepName,{currentFrameSource:s}),r){const e=i.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(r,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 _n(t)}async loadPatternFromAsset(t,e,A){const i=this.patternSource(t),n=A.markUpdatePending(),r=A.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(i,r),A.updateMetadata(e.stepName,{image:i}),A.updateStorage(e.stepName,{framePatternSrc:i}),A.markUpdateCompleted(n)}};const to=new class{async getIllustrationBody(t){return new Promise((e=>{zA(t).then((t=>{e(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,e,A,i){return new en({stepRegion:e,stepName:i.stepName,colors:i.svg.colors,id:t,src:i.src,svg:i.svg.svg,cachedObjectURL:i.objectURL,type:ze.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 Li(A[0].id,e.getAllLayoutData()).colors}catch(t){return[]}}async init(t,e,A){const i=t.option;if(!i)return null;if(A)return this.reload(t,e,A);{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantCommand(t,A,[],(()=>{}),e)}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(!r||!A)throw new Error("Required illustration variant no longer available");{const a=r.variants?.find((t=>t.id===A));if(a){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[a],A,(async()=>{e.updateMetadata(t.stepName,{colors:i.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,i,n){const r={};for(const[t,e]of n.entries())r[t]={browserValue:e,spotColor:r[t]?.spotColor};const a=Ri(t,e,A,r),s=await zn(a),o=[];for(const t of i){for(const[e,A]of n.entries())o.push(new dn(t,e,A));o.push(new un(t,a,s))}return new $i(o)}async changeColors(t,e,A,i,n){if(0===e.length)return;const r=Li(e[0].id,i().map((t=>t.layoutState))),a={...r.colors},s={};Object.entries(a).forEach((([t,e])=>{const A={browserValue:e.browserValue},i=e.spotColor;i&&(A.spotColor={profileName:i.profileName,namedColor:i.namedColor}),s[t]=A}));for(const[t,e]of n.entries())a[t]={browserValue:e,spotColor:a[t]?.spotColor},s[t]={browserValue:e};let o=Array.from(Object.values(a)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{o=o.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),A.updateMetadata(t.stepName,{colors:o});const l=new Map;if(Object.entries(a).forEach((([t,e])=>{l.set(t,e.browserValue)})),!r.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const g=await this.changeColorsCommand(r.svg,r.width,r.height,e.map((t=>t.id)),l);A.updateStorage(t.stepName,{colors:s}),A.getCommandDispatcher()(g)}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A,i,n);r&&(r.command&&n.getCommandDispatcher()(r.command),r.followup&&await r.followup())}async selectVariantCommand(t,e,A,i,n){if(!t.data||!t.data.regions)throw new tr(t,"Missing regions.");i(!0);const r=A.map((t=>new An(t.id)));n.setMandatoryFulfilled(t.stepName,!1);const a=e.asset;if(!a)throw new $n(e);const s=a.fileLink;if(!s)throw new _n(a);const o=await ki(await this.getIllustrationBody(s)),c=await zn(o.svg),l=t.data.regions.map((e=>{const A=n.getLayouts().find((t=>t.panelId===e.panelId));if(!A)throw new Zn(e);const i=Te();return{regionElement:{id:i,region:e},command:this.getCreateElementCommand(i,e,A,{stepName:t.stepName,src:s,objectURL:c,svg:o})}})),g=[...l.map((t=>t.command)),...r];let h=Array.from(Object.values(o.colors)).map((t=>t.browserValue));const d=t.data.colorOption;return d&&d.variants?.forEach((t=>{h=h.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),n.updateMetadata(t.stepName,{colors:h}),{command:new $i(g),followup:async()=>{await n.setSelectionsAndElements(t.stepName,[e],l.map((t=>t.regionElement)),(async()=>{n.setMandatoryFulfilled(t.stepName,!0),i(!1)}))}}}};const eo=new class{async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(A)await this.reload(t,e,A);else{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(!r)throw new qn(t);if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(A){const i=r.variants?.find((t=>t.id===A));if(i){const A=i.material,a=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],a,(async()=>{const i=e.getPreviewService();if(i){const n=t.data.targetMaterials.map((t=>i.applyMaterialVariant(t,r.id,A)));Promise.all(n).then((()=>e.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantLambda(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A,i){const n=A.getPreviewService();i(!0);const r=e.material;if(!r)throw i(!1),new $n(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{n&&t.data.targetMaterials.forEach((e=>{t.option&&n.applyMaterialVariant(e,t.option.id,r)})),A.setMandatoryFulfilled(t.stepName,!0)}finally{i(!1)}}))}}}};const Ao=new class{async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(A)await this.reload(t,e,A);else{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{const A=e.getPreviewService();if(A&&t.option){const n=i.asset?.fileLink;if(!n)throw new $n(i);await A.applyModelVariant(t.option.id,{model:n,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantLambda(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A,i){i(!0);const n=e.asset?.fileLink;if(!n)throw new $n(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{const e=A.getPreviewService();e&&t.option&&e.applyModelVariant(t.option.id,{model:n,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}finally{i(!1)}}))}}}};const io=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 i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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,[],n,(async()=>{e.updateStorage(t.stepName,{text:i?.storage?.text}),e.setMandatoryFulfilled(t.stepName,""!==i?.storage?.text)}))}async changeText(t,e,A,i,n){const r=await this.changeTextCommand(t,e,A,i,n);r&&(r.command&&A.getCommandDispatcher()(r.command),r.followup&&await r.followup())}async changeTextCommand(t,e,A,i,n){const r=A.getRegionElements(t.stepName),a=A.getStepSpecificServices(t.stepName)?.module;if(!a)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(t,e,s,n))return A.setMandatoryFulfilled(t.stepName,!1),console.error(i),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 o=(e,i,n)=>{const r=n||Te(),a=A.getLayouts().find((t=>t.panelId===i.panelId));if(!a)return console.error(`Can not find layout for region: ${i.panelId}`),null;const s=[];return n&&s.push(new An(r)),s.push(new en({stepRegion:i,stepName:t.stepName,colors:{},id:r,svg:e,type:ze.Illustration,y:i.top,x:i.left,rotation:i.rotation,width:i.width,height:i.height,layer:i.layer,layerIndex:i.layerIndex,immutable:i.immutable},a)),{id:r,region:i,command:new $i(s)}};if(r.length>0){const t=r.map((t=>{if(!t.region)return null;const A=a.svgPrint(e,t.region);return o(A,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new $i(t),followup:async()=>{}}}{const i=t.data.regions.map((t=>o(a.svgPrint(e,t),t))),n=i.filter((t=>!!t)).map((t=>t&&t.command));return{command:new $i(n),followup:async()=>{const e=i.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await A.setSelectionsAndElements(t.stepName,[],e)}}}}validateInput(t,e,A,i){if(t.data&&t.data.maxLength){const A=t.data.maxLength;if(e.length>A)return i("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(e))return i("Unsupported characters."),!1;const n=(0,x.split)(e.toLowerCase());for(const t of n)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return i("Blocked profanity."),!1}return i(""),!0}};const no=new class{async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else if(i.defaultVariant)return e.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,i.defaultVariant,e,(()=>{}));return e.markStepsAsInitialised([t.stepName]),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantCommand(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(t,e,A,i){const n=e.asset;if(!n)throw new $n(e);const r=n?.fileLink;if(!r)return console.error("No URL for picture!"),null;i(!0),A.setMandatoryFulfilled(t.stepName,!1);const a=A.getRegionElements(t.stepName).map((t=>new An(t.id))),s=t.data.regions.map((e=>{const i=A.getLayouts().find((t=>t.panelId===e.panelId));if(!i)throw new Zn(e);const n=Te();return{regionElement:{id:n,region:e},command:new en({stepName:t.stepName,stepRegion:e,id:n,src:r,type:ze.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"},i)}}));return{command:new $i([...a,...s.map((t=>t.command))]),followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],s.map((t=>t.regionElement)),(async()=>{A.setMandatoryFulfilled(t.stepName,!0),i(!1)}))}}}};const ro=new class{async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else{const A=i.variants;if(Nr.getDefaultVariant(i)){const n=A?.find((t=>t.id===i.defaultVariant?.id));return this.selectVariantLambda(t,n?.id||"",e)}}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(n&&A){const i=n.variants?.find((t=>t.id===A));i&&await e.setSelectionsAndElements(t.stepName,[i],[])}}}async selectVariant(t,e,A){await A.getInitializationPromise();const i=await this.selectVariantLambda(t,e,A);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(t,e,A){const i=t.option;if(!i)return null;const n=i.variants;if(!n)return null;const r=n.length>1?n.find((t=>t.id===e)):n[0];if(!r)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,[r],[],(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}};const ao=new class{async availableColours(t){const e=t.option;return e&&e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(!A){const A=Nr.getDefaultVariant(i);if(!A)return null;const n={fill:A.color,stroke:A.color,variant:A};return this.selectVariantCommand(t,n,[],e)}return await this.reload(t,e,A),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{e.updateStorage(t.stepName,{colour:i.color||""}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantCommand(t,e,A,i);n&&(n.command&&i.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(t,e,A,i){const n=i.getLayouts();if(A.length>0){const r=t=>{const A=t.region;if(!n.find((t=>t.panelId===A?.panelId)))throw new Zn(A);const i=e.variant?.color;return i?new dn(t.id,"spiff-fill-shape",i):(console.error("Failed to change color."),null)},a=A.map(r).filter((t=>!!t));return{command:new $i(a),followup:async()=>{await i.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],A),i.updateStorage(t.stepName,{colour:e.fill||""})}}}{const A=A=>{const i=n.find((t=>t.panelId===A.panelId));if(!i)throw new Zn(A);const r=`\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="spiff-fill-shape"\n fill="${e.variant?.color}"\n />\n </svg>\n `,a={};a["spiff-fill-shape"]={browserValue:e.variant.color};const s=Te();return{id:s,region:A,command:new en({stepRegion:A,stepName:t.stepName,colors:a,id:s,svg:r,type:ze.Illustration,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,excludeFromExport:t.data.excludeFromPrint},i)}},r=t.data.regions.map(A),a=r.filter((t=>!!t)).map((t=>t?.command)),s=r.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new $i(a),followup:async()=>{await i.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],s,(async()=>{i.updateStorage(t.stepName,{colour:e.fill||""})}))}}}}};function so(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 oo extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=oo.name}}const co=["‘","’","“","”","\n"];class lo extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=lo.name}}const go=new class{constructor(){so(this,"cachedColors",new Map),so(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 i=[],n=e?ri(e):void 0;if(n){const t=A.split("").filter((t=>!co.includes(t))).join(""),e=t.split("").map((t=>n.getFont().charToGlyph(t)));for(let A=0;A<e.length;A++){".notdef"===e[A].name&&i.push(String.fromCharCode(t.charCodeAt(A)))}}for(let t=0;t<i.length;t++)A=A.replaceAll(i[t],"");return A})),so(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),so(this,"getErrorsForText",((t,e,A)=>{const i=[];e.data&&e.data.maxLength&&t.length>e.data.maxLength&&i.push({localizationKey:"workflow.steps.text.characterLimit"});const n=A.getProfanities(),r=(0,x.split)(t.toLowerCase());for(const t of r)for(const e in n){if(t===n[e].toLowerCase().replace(/\s/g,"")){i.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!e.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&i.push({localizationKey:"workflow.steps.text.multipleLines"}),i}))}async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else{const A=this.getDefaultImageFillVariant(t.data),n=A?.asset?.fileLink,r=n?await Nn(n):void 0,a=r?{src:r.src,height:r.height,width:r.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:a}),e.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:A?.name});const s=Nr.getDefaultVariant(i);if(s)return this.selectVariantCommand(t,s,{},[],e,(()=>{}),(()=>{}),a)}return null}findLayoutElements(t,e){return t.getRegionElements(e.stepName).map((e=>Li(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,i){if(!t.data||!t.data.regions)return;const n=i.getCommandDispatcher();e.variant?i.updateMetadata(t.stepName,{color:e.variant.name}):i.updateMetadata(t.stepName,{color:e.fill});const r=t.data.colorOption,a=r?this.createTextFillSpotColor(r,e.variant):void 0;r?i.updateStorage(t.stepName,{color:e.fill,colorProfileAssetKey:r.colorProfile?.key}):i.updateStorage(t.stepName,{color:e.fill});for(const t of A){if(!e.fill)throw new Error("Fill not set on new color selection!");n(new rn(t.id,e.fill,a))}}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 Nn(e);return{src:e,width:A.width,height:A.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,e,A,i){if(!t.data||!t.data.regions)return;const n=i.getCommandDispatcher(),r=t.option?.variants?.find((t=>t.asset?.fileLink===e.src));i.updateMetadata(t.stepName,{fillImage:r?.name}),i.updateStorage(t.stepName,{fillImage:e});for(const t of A){n(new an(t.id,e))}}getProcessedInput(t,e,A){const i=A?t:this.injectReplaceableText(t,e);return pi(i,{vertical:e.vertical,uppercase:e.uppercase})}updateInputText(t,e,A,i){const n=i.getStepStorage(A.stepName),r=this.getProcessedInput(t,A.data,!!n.customiseAllText),a={command:void 0,helperText:"",errors:this.getErrorsForText(t,A,i)};if(a.errors.length>0)return a.helperText=a.errors[0].localizationKey,a;const s=(A.data.maxLength-r.length).toString();a.helperText=`${s} characters remaining`;const o=i.getTransaction().bulk&&A.data.varyText||!1,c=[],l=new Map,g=new Map;for(const t of e){if(!t.fontData)throw new Ar("Failed to resolve font data for text.");const[e,i]=Gn(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[r],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});l.set(t.id,e),g.set(t.id,i);const n=A.data.curved?r:(i||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(e,A.data,t.id,n,o))}if(!A.data.curved&&e.length>0){if(!Array.from(g.values()).every((t=>t)))return a.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),a}return i.updateStorage(A.stepName,{text:t}),i.updateMetadata(A.stepName,{text:r}),n.defaultCleared&&i.setMandatoryFulfilled(A.stepName,!0),a.command=new $i(c),a.command.varying=o,a}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A.getStepStorage(t.stepName)||{},A.getRegionElements(t.stepName),A,i,n);r&&(r.command&&A.getCommandDispatcher()(r.command),r.followup&&await r.followup())}createTextFillSpotColor(t,e){const A=t.colorProfile;if(A){const t=(A.name||"").replace(/\s/g,"-"),i=t.lastIndexOf("/"),n=t.slice(i+1).slice(0,-4);if(!e.namedColor)throw new Error("variant named color not set!");return{profileName:n,namedColor:e.namedColor}}}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const a=r.variants?.find((t=>t.id===A));if(a){const A=await this.fontDataFromVariant(a),r=n.map((t=>({id:t.id,region:t.stepRegion}))),s=i.storage?.color,o=i.storage?.text;await e.setSelectionsAndElements(t.stepName,[a],r,(async()=>{e.updateMetadata(t.stepName,{color:s,text:o}),e.updateStorage(t.stepName,{text:o,inputText:o});const i=n.map((t=>new cn(t.id,A))),r=new $i(i);e.getCommandDispatcher()(r),e.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=go.updateInputText(o||"",n,t,e);c&&e.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const e=t.colorOption;if(e)return Nr.getDefaultVariant(e)}async getDefaultColor(t){const e=t.colorOption;if(!e)return;return Nr.getDefaultVariant(e)?.color}getDefaultImageFillVariant(t){const e=t.imageFillOption;if(e)return Nr.getDefaultVariant(e)}async fontDataFromVariant(t){const e=t.asset;if(!e)throw new $n(t);const A=e.fileLink;if(!A)throw new _n(e);return{assetUrl:A,name:(await ii(A)).names.fullName.en}}async selectVariantCommand(t,e,A,i,n,r,a,s){const o=n.markUpdatePending(),c=await this.fontDataFromVariant(e);if(i.length>0){const l=i.map((t=>new cn(t.id,c)));if(s){const t=i.map((t=>new an(t.id,s)));l.push(...t)}const g=await this.changeInputTextWithRegion(t,t.data.size||30,c,A.text||"",A,n,!!A.customiseAllText,r,a);g&&l.push(g);return{command:new $i(l),followup:async()=>{n.markUpdateCompleted(o),await n.setSelectionsAndElements(t.stepName,[e],i)}}}{const i=await this.createTextboxRegions(t.stepName,e,t.data,c,A,n),l=await this.changeInputTextWithRegion(t,t.data.size||30,c,i[0]?.newElement.input||A.text||t.data.defaultText||"",A,n,!!A.customiseAllText,r,a),g=i.flatMap((t=>t.commands));if(s){const t=i.map((t=>new an(t.regionElement.id,s)));g.push(...t)}l&&g.push(l);return{command:new $i(g),followup:async()=>{n.markUpdateCompleted(o)}}}}injectReplaceableText(t,e){return e.replaceableText?e.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,e,A,i,n,r){if(!A||!A.regions)throw new Error("Step data not supplied");const a=r.getTransaction().bulk&&A.varyText||!1,s=a?"":n.text||A.defaultText||"",o=this.getProcessedInput(s,A,!1),c=await Promise.all(A.regions.map((async e=>{const c=r.getLayouts().find((t=>t.panelId===e.panelId)),l=Te();try{if(!c)throw new lo("Failed to find layout for region: "+e.panelId);const g=A.colorOption;let h;if(g&&g.variants){const e=g.variants.find((t=>t.id===g.defaultVariant?.id))||g.variants[0];h=this.createTextFillSpotColor(g,e),r.updateStorage(t,{colorProfileAssetKey:g.colorProfile?.key})}const d=await this.getDefaultColor(A),u=d||"#000000",B={stepRegion:e,stepName:t,align:this.textAlign(A),fill:n.color?n.color:u,fontSize:A.size||30,fontData:i,id:l,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,text:o,input:s,type:ze.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:h},w=[],E=new Map,p=new Map;if(!B.fontData)throw new Ar("Failed to resolve font data for text.");const[m,C]=Gn(B.fontSize,B.fontData,{left:B.x,top:B.y,width:B.width,height:B.height,rotation:B.rotation,panelId:""},[o],{size:A.size,minSize:A.minSize,maxSize:A.maxSize});E.set(B.id,m),p.set(B.id,C);const f=A.curved||A.vertical?o:(C||[]).join("\n");w.push(this.generateTextChangeCommandsForRegion(m,A,B.id,f,a));const Q=new en(B,c);return Q.varying=a,{regionElement:{id:l,region:e},commands:[Q,...w],newElement:B,fontData:i}}catch(t){throw console.log(t),new oo("Error adding font to region")}}))).catch((t=>{throw t instanceof oo?(ra.setLatestToast("Failed to load font.",uo.Error),t):t instanceof lo?t:new Error(t)}));return await r.setSelectionsAndElements(t,[e],c.map((t=>t.regionElement)),(async()=>{r.updateMetadata(t,{text:s}),r.updateStorage(t,{text:s})})),c}generateTextChangeCommandsForRegion(t,e,A,i,n){const r=[],a=new hn(A,i);if(a.varying=n,r.push(a),!e.size){const e=new sn(A,t);e.varying=n,r.push(e)}const s=new $i(r);return s.varying=n,s}async changeInputTextWithRegion(t,e,A,i,n,r,a,s,o,c){const l=(i||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),g=this.getProcessedInput(l,t.data,a),h=r.getRegionElements(t.stepName),d=new Map,u=new Map;for(const i of h)if(i.region){const[n,r]=Gn(e,A,i.region,[g],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});d.set(i.id,n),u.set(i.id,r)}const B=(()=>{if(t.data&&t.data.maxLength&&g.length>t.data.maxLength)return c&&c(!0),{info:"0"};const e=r.getProfanities(),A=(0,x.split)(g.toLowerCase());for(const t of A)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return s(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(g.includes("\n")||g.includes("\r")))return s(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(u.values()).every((t=>t)))return s(!0),{error:"Does not fit."}}return s(!1),{info:(t.data.maxLength-g.length).toString()}})();if(B.error)return void o(B.error);if(o(`${B.info} characters remaining`||""),c)return;r.updateStorage(t.stepName,{text:l}),r.updateMetadata(t.stepName,{text:this.injectReplaceableText(l,t.data)});const w=r.getTransaction().bulk&&t.data.varyText||!1;n.defaultCleared&&r.setMandatoryFulfilled(t.stepName,!0);const E=[];for(const e of h){const A=t.data.curved?g:(u.get(e.id)||[]).join("\n");E.push(this.generateTextChangeCommandsForRegion(d.get(e.id)||1,t.data,e.id,A,w))}const p=new $i(E);return p.varying=w,p}};function ho(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 uo;var Bo;(Bo=uo||(uo={})).Error="Error",Bo.Warning="Warning",Bo.Info="Info";class wo extends Ua{constructor(t){super(),ho(this,"update",void 0),ho(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class Eo{constructor(t,e,A,i,n,r,a,s,o,c,l=!1){ho(this,"reloadedState",void 0),ho(this,"transaction",void 0),ho(this,"ownerCustomer",void 0),ho(this,"updateTransaction",void 0),ho(this,"confirmedDesign",void 0),ho(this,"editedSteps",void 0),ho(this,"informationResults",void 0),ho(this,"layouts",void 0),ho(this,"mandatorySteps",void 0),ho(this,"pendingUpdates",void 0),ho(this,"selectionCost",void 0),ho(this,"workflow",void 0),ho(this,"stepSpecificServices",void 0),ho(this,"previewService",void 0),ho(this,"profanityFilter",void 0),ho(this,"pollers",void 0),ho(this,"commandContext",void 0),ho(this,"stepElements",void 0),ho(this,"stepInitialised",void 0),ho(this,"stepMetadata",void 0),ho(this,"stepSelections",void 0),ho(this,"storage",void 0),ho(this,"confirmCallbacks",void 0),ho(this,"editedCallbacks",void 0),ho(this,"elementsCallbacks",void 0),ho(this,"informationResultCallbacks",void 0),ho(this,"initCallbacks",void 0),ho(this,"makingAdjustmentsCallback",void 0),ho(this,"mandatoryCallbacks",void 0),ho(this,"metadataCallbacks",void 0),ho(this,"selectionCallbacks",void 0),ho(this,"stepSpecificStorageCallbacks",void 0),ho(this,"storageCallbacks",void 0),ho(this,"currentVariationRecordCallbacks",void 0),ho(this,"variationRecordCallbacks",void 0),ho(this,"allScenes",void 0),ho(this,"product",void 0),ho(this,"invalidModelVariants",void 0),ho(this,"currentAdjustingStepId",void 0),ho(this,"renderableContextService",void 0),ho(this,"workflowStatePromiseQueue",new Ga(1)),ho(this,"variationRecords",[]),ho(this,"currentVariationRecord",void 0),ho(this,"initializationPromise",void 0),ho(this,"initialized",!1),ho(this,"readOnly",!1),ho(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=n,this.commandContext=i,this.reloadedState=c,this.transaction=r,this.readOnly=l,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=a,this.previewService=s,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=o,this.currentVariationRecord=null,this.initializationPromise=this.initializeDefaultWorkflowState(t,r),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 Hs(t,{bulkScene:e.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},e);const A=Ts(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:i,commands:n}=await this.stepElementsForIntroducedSilentSteps(A,!!this.reloadedState);this.commandContext.apply(new $i(n),!0),this.stepElements={...this.stepElements,...i},await this.ensureStepsAreLoaded(),!this.readOnly&&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.previewService?.executeModelAnimation(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}}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=Te();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 updateStorage(t,e){const A={...this.storage,[t]:{...this.storage[t],...e}};if(!S(f)(A,this.storage)){this.storage=A;const e=new Wi(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 wo((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new wo((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new Ar("Attempted to serialize state before it was initialized.");const A=JSON.stringify(this.dehydrateState(S(e)(t.transaction))),i=t.variation;if(!i)return{transaction:A};const n={layouts:{},serializableWorkflow:{steps:[]},...S(e)(i)||{}};return{transaction:A,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,i)=>{const n=[...t[i]||[]];return e.forEach((t=>{const e=n.findIndex((e=>e.id===t.id));e>-1&&n.splice(e,1)})),A[i]=n,A}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,e)=>(Gs(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&&!Gs(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 i=async(t,e,A)=>{if(t.type===nA.SilentIllustration){return{step:t,results:await new Ks(t,e).trigger()}}if(t.type===nA.ProductOverlay){return{step:t,results:await new Ks(t,e,A).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},n=t.filter((t=>!this.stepInitialised[t.stepName])),r={stepElements:{},commands:[]},a=[];for(const t of n)this.markStepsAsInitialised([t.stepName]),e||a.push(i(t,this.layouts,A));const s=await Promise.all(a);for(const t of s)r.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),r.commands=[...r.commands,...t.results.map((t=>t.command))];return r}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 An(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,e,A,i){const n=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=>{Gs(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const r=this.allScenes,a=Ts(r,n),s=Ts(r,this.stepSelections),o=a.map((t=>t.silentSteps)).flat(),c=s.map((t=>t.silentSteps)).flat().filter((t=>!o.some((e=>e.stepName===t.stepName))));o.forEach((t=>{Gs(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:g,commands:h}=await this.stepElementsForIntroducedSilentSteps(c,!1);this.stepElements={...this.stepElements,...g,[t]:A},this.removeElements(l);if(this.workflow.steps.find((e=>e.stepName===t))?.type===nA.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(A.map((t=>t.id)))}const d=[...h,...l.map((t=>new An(t.id))),new Wi(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new $i(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),i&&await i()}async ensureStepsAreLoaded(){const t=[],e=Ts(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 nA.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case nA.DigitalContent:t.push(Zs.init(A,this,this.reloadedState));break;case nA.Frame:case nA.Photo:{const e=new js(A.data.forceImageCover);e.connectWorkflowManager(this,A.stepName),this.stepSpecificServices[A.stepName]={frameService:e},t.push(_s.init(A,this,this.reloadedState))}break;case nA.Illustration:t.push(to.init(A,this,this.reloadedState));break;case nA.Material:t.push(eo.init(A,this,this.reloadedState));break;case nA.Model:t.push(Ao.init(A,this,this.reloadedState));break;case nA.Module:this.stepSpecificServices[A.stepName]={module:await rs(A.data.module)},t.push(io.init(A,this,this.reloadedState));break;case nA.Picture:t.push(no.init(A,this,this.reloadedState));break;case nA.Question:t.push(ro.init(A,this,this.reloadedState));break;case nA.Shape:t.push(ao.init(A,this,this.reloadedState));break;case nA.Text:t.push(go.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})),i=A.filter((t=>!!t&&!!t.command)).map((t=>t.command)),n=A.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));i&&i.length>0&&this.commandContext.apply(new $i(i),!0);for(const t of n)await t();n.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 Os(this.allScenes,this.stepSelections)}}function po(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 mo{constructor(t){po(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.thumbnail?.versions?.find((t=>"cdn"===t.name))?.link}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name));return t?t.link:this.variantData.asset?.versions?.find((t=>"thumbnail"===t.name))?.link}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 Co(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 fo{constructor(t,e){Co(this,"manager",void 0),Co(this,"step",void 0),this.manager=t,this.step=e}setUpdateState(t){fo.updateState.set(this.step.stepName,t)}getUpdateState(){return!!fo.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new mo(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new mo(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new mo(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}executeAnimations(){const t=this.manager.getPreviewService(),e=this.step.data.modelAnimation,A=this.step.data.lookAtAnimation;t&&(A&&t.executeCameraAnimation(A),e&&t.executeModelAnimation(e))}}function Qo(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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}Co(fo,"updateState",new Map);const yo=t.gql`
442
+ `,Rs=t=>{const e=[];for(const A of t.steps)switch(A.type){case nA.DigitalContent:A.data.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Upload});break;case nA.Frame:const t=A.data;t.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),t.varyUpload&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Upload});break;case nA.Illustration:const i=A.data;i.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),i.varyColors&&i.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Colors});break;case nA.Material:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Model:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Picture:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Question:A.data.varySelections&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selections});break;case nA.Shape:A.data.varySelection&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection});break;case nA.Text:const n=A.data;n.varyText&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Text}),n.varySelection&&A.option&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Selection}),n.varyColor&&n.colorPickerEnabled&&e.push({stepName:A.stepName,stepType:A.type,aspectType:aA.Color})}return e},ks=[nA.SilentIllustration,nA.ProductOverlay],Hs=async(t,e,A)=>{const i=[];t.introduction&&i.push({name:"Introduction",title:t.name,renderableSteps:[{type:nA.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 nA.DigitalContent:A.data.varyUpload&&(t=!0);break;case nA.Frame:{const e=A.data;!e.varyUpload||!e.varySelection&&A.option||(t=!0)}break;case nA.Illustration:{const e=A.data;!e.varySelection&&A.option&&1!==(A.option.variants||[]).length||!e.varyColors&&e.colorPickerEnabled||(t=!0)}break;case nA.Material:A.data.varySelection&&(t=!0);break;case nA.Model:A.data.varySelection&&(t=!0);break;case nA.Picture:A.data.varySelection&&(t=!0);break;case nA.Question:A.data.varySelections&&(t=!0);break;case nA.Shape:A.data.varySelection&&(t=!0);break;case nA.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 n=Us(A.stepName,t.stepGroups);if(n){const t=i.find((t=>t.name===n.name));t?ks.includes(A.type)?t.silentSteps.push(A):t.renderableSteps.push(A):i.push({name:n.name,title:n.name,renderableSteps:ks.includes(A.type)?[]:[A],silentSteps:ks.includes(A.type)?[A]:[]})}else i.push({name:A.stepName,title:A.stepTitle,renderableSteps:ks.includes(A.type)?[]:[A],silentSteps:ks.includes(A.type)?[A]:[]})}if(e.bulkScene){const n=A?.product?.bulkConfiguration;i.push({name:"Bulk",title:n?.sceneTitle??e.bulkSceneTitle,renderableSteps:[{type:nA.Bulk,stepName:"Bulk",stepTitle:n?.stepTitle??e.bulkSceneTitle,helpText:n?.helpText,data:{aspects:Rs(t)},conditions:[]}],silentSteps:[]})}return e.finishScene&&i.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:nA.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:[]}),i},Us=(t,e)=>e.find((e=>e.stepNames.includes(t))),Gs=(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})),Ts=(t,e)=>t.map((t=>((t,e)=>{const A={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>Gs(t,e))),silentSteps:t.silentSteps.filter((t=>Gs(t,e)))};return 0===A.silentSteps.length&&0===A.renderableSteps.length?null:A})(t,e))).filter((t=>null!==t)),Os=async(t,e)=>{const A=Ts(t,e),i=[];for(const t of A)for(const e of t.renderableSteps)if(e.type===nA.Model||e.type===nA.Material||e.type===nA.Picture||e.type===nA.Shape){const t=(e.option?.variants||[]).length;t&&t>1&&i.push(e.stepName)}else i.push(e.stepName);const n=A.filter((t=>t.renderableSteps.filter((t=>i.includes(t.stepName))).length>0));for(const t of n)t.renderableSteps=t.renderableSteps.filter((t=>i.includes(t.stepName)));return n};function Js(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 Ls(t,e,A,i){const n=A.width*t.zoom,r=A.height*t.zoom;if(i){const i=t,n=Math.max(e.width/A.width,e.height/A.height);i.zoom=Math.max(n,t.zoom);const r=A.width*i.zoom,a=A.height*i.zoom;return i.x=zs(t.x,e.width-r,0),i.y=zs(t.y,e.height-a,0),i}const a=t;return a.x=zs(a.x,-n,e.width),a.y=zs(a.y,-r,e.height),a}function zs(t,e,A){return Math.min(Math.max(t,e),A)}class js{constructor(t){Js(this,"offsets",void 0),Js(this,"forceImageCover",void 0),Js(this,"targetElements",void 0),Js(this,"imageData",void 0),Js(this,"frameData",void 0),Js(this,"_debouncedUpdateFrameOffsets",void 0),Js(this,"minZoomScale",.03),Js(this,"maxZoomScale",20),Js(this,"onFrameDataChangeListeners",void 0),Js(this,"onZoomChangeListeners",void 0),Js(this,"workflowManager",void 0),Js(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=S(I)(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.currentFrameSource){const t=await Yn(e.currentFrameSource);S(f)(t,this.frameData)||(this.frameData=t,this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.offsets=Pn(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),e),this.workflowManager=t,this.stepName=e}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}async setFrameData(t){const e=vn.get(t);this.frameData=e}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,e,A,i){if(this.imageData&&this.offsets&&this.frameData){const n=(e-this.offsets.x)/this.offsets.zoom,r=(A-this.offsets.y)/this.offsets.zoom,a={x:e-n*t,y:A-r*t,zoom:this.imageData.width*t/this.imageData.width};this.updateOffsets(Ls(a,this.frameData,this.imageData,this.forceImageCover),i),this.onZoomChangeListeners.forEach((e=>e(t)))}}setPatternData(t){(t&&this.frameData||t&&this.frameData&&!this.imageData)&&(this.offsets=Pn(t,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements),this.updateOffsets(Ls(this.offsets,this.frameData,t,this.forceImageCover))),this.imageData=t,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,e){const A=this.imageData;A&&this.frameData&&(this.offsets&&t.x===this.offsets.x&&t.y===this.offsets.y&&t.zoom===this.offsets.zoom?e&&e():(this.offsets=Ls(t,this.frameData,A,this.forceImageCover),this._debouncedUpdateFrameOffsets(t,A,this.frameData,this.targetElements,e)))}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,e,A,i,n){if(!A)throw new Ar("Frame data not set. This is a bug");if(!this.workflowManager)throw new Ar("No workflow manager set, cannot update offsets.");const r=this.workflowManager.getCommandDispatcher();i.forEach((A=>{r(new gn(A,e,t))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:t}),n&&n()}recalculateZoomLimits(t,e){const A=Math.max(e.width/t.width,e.height/t.height);this.forceImageCover?(this.minZoomScale=A,this.maxZoomScale=2.5*A):(this.minZoomScale=A/10,this.maxZoomScale=2.5*A)}}function Vs(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 Ks{constructor(t,e,A){Vs(this,"configuration",void 0),Vs(this,"layouts",void 0),Vs(this,"product",void 0),Vs(this,"processRegion",(async t=>{const e=this.layouts.find((e=>e.panelId===t.panelId));if(!e)throw new Zn(t);let A="";if(this.configuration.type===nA.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),A=t,!t)throw new tr(this.configuration,"Couldn't find an asset for product overlay step")}const i=this.evaluateAssetType();if(i===ze.Image){const A=this.configuration.type===nA.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!A)throw new Error("Undefined raster silent step source");const n={stepName:this.configuration.stepName,id:Te(),src:A,type:i,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===nA.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:n.id,region:t},command:new en(n,e)}}{const n=this.configuration.type===nA.SilentIllustration?this.configuration.data.asset?.fileLink:A,r=async()=>new Promise(((t,e)=>{n?zA(n).then((e=>{t(e)})).catch((t=>console.error(t))):e("Undefined vector silent step source")})),a=await ki(await r()),s={stepName:this.configuration.stepName,id:Te(),cachedObjectURL:await zn(a.svg),src:n,svg:a.svg,colors:a.colors,type:i,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===nA.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new en(s,e)}}})),this.configuration=t,this.layouts=e,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new tr(this.configuration,"Missing regions.");if(this.configuration.type===nA.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===nA.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((e=>t.panelId===e.panelId)))throw new Zn(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===nA.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")?ze.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),ze.Illustration)}}const Ws=async t=>{const e=`${gr.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 rr("Failed to shorten URL, see console.")}};function Xs(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 qs{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,i=3e3,n=10){Xs(this,"pollingId",void 0),Xs(this,"attempts",void 0),Xs(this,"interval",void 0),Xs(this,"maxAttempts",void 0),Xs(this,"predicate",void 0),Xs(this,"onSuccess",void 0),Xs(this,"onFailure",void 0),this.onSuccess=e,this.onFailure=A,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=i,this.maxAttempts=n,this.poll()}}const Zs=new class{async init(t,e,A){return A&&await this.reload(t,e,A),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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,[],n,(async()=>{const A=i?.storage?.videoShortUrl,n=i?.storage?.videoUrl;e.updateStorage(t.stepName,{videoShortUrl:A,videoUrl:n})}))}async regenerateQRCode(t,e,A,i,n,r,a,s,o){if(e||""===A||""!==i)o(!1);else{const e=async()=>{const t=(await Mr([A]))[0],e=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:e}},c=await new Promise(((t,A)=>{new qs((async()=>!!(await e()).link),(async()=>{const A=await e();if(!A.link||!A.link)throw new _n(A.asset);t({rel:"mpeg4",href:A.link})}),(()=>{A("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>s(new An(t.id))));const l="http"===r.data.baseUrl.slice(0,4)?"":"https://",g=new URL(l+r.data.baseUrl);g.searchParams.append("video",btoa(JSON.stringify([c]))),g.pathname=g.pathname+("/"===g.pathname.slice(-1)?"":"/");const h=g.toString();if(h.length>=2e3)throw new rr("Cannot create QR code, URL too long.");const d=await Ws(h);if(a(d),!r.data||!r.data.regions)throw new tr(r,"Missing regions.");const u=await this.regionElements(r),B=await this.command(d,u,n,r.stepName);B&&(B.command&&n.getCommandDispatcher()(B.command),B.followup&&await B.followup()),await n.setSelectionsAndElements(r.stepName,[],u,(async()=>{n.updateStorage(r.stepName,{videoShortUrl:d,videoUrl:i}),o(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:Te(),region:t})))}async command(t,e,A,i){const n=A.getLayouts(),r=`data:image/svg+xml;base64,${btoa(await(0,y.toString)(t,{type:"svg"}))}`,a=e.map((t=>{const e=t.region,A=n.find((t=>t.panelId===e?.panelId));if(!A&&e)throw new Zn(e);if(A&&!e)throw new Error("Region not found");if(!A||!e)throw new Error("Neither a region or layout found!");return new en({stepRegion:e,stepName:i,id:t.id,src:r,type:ze.Image,y:e.top,x:e.left,width:e.width,height:e.height,rotation:0},A)}));return{command:new $i(a),followup:async()=>{}}}};function $s(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 _s=new class{constructor(){$s(this,"frameSourceSvg",(async(t,e)=>{if(!t)return Sn(e.data.regions[0]);const A=t.asset;if(!A)throw new $n(t);const i=A.fileLink;if(i)return zA(i);throw new _n(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,i=Nr.getDefaultVariant(A);return i?this.selectVariantCommand(t,i,[],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 i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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=Sn(t.data.regions[0]);e.updateStorage(t.stepName,{currentFrameSource:A})}if(i){const A=async()=>{const A=i.storage?.framePatternSrc,n=i.storage?.frameOffsets;if(e.updateMetadata(t.stepName,{frameOffsets:n,framePatternSrc:A}),A){const i=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(A,i),e.updateMetadata(t.stepName,{image:A}),e.updateStorage(t.stepName,{framePatternSrc:A})}if(n?.zoom){const A=e.getStepSpecificServices(t.stepName)?.frameService;A.updateOffsets(n)}e.setMandatoryFulfilled(t.stepName,!0)};if(i.selectedVariants&&i.selectedVariants.length>0){const r=i.selectedVariants[0].id;if(t.option&&r){const i=t.option.variants?.find((t=>t.id===r));i&&await e.setSelectionsAndElements(t.stepName,[i],n,(async()=>{const n=await this.frameSourceSvg(i,t);e.updateStorage(t.stepName,{currentFrameSource:n}),await A()}))}}else await e.setSelectionsAndElements(t.stepName,[],n,A)}}selectImage(t,e,A){A.setEditedStatus(t.stepName,!0);(e.fileLink||"").endsWith("pdf")?A.addPoller(new qs((async()=>{const t=(await Sr.getLocalOrFromServer(e.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{Sr.getLocalOrFromServer(e.key||"").then((e=>{this.loadPatternFromAsset(e,t,A)}))}),(()=>{throw new rr("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(e,t,A)}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A,i,n);r&&(r.command&&i.getCommandDispatcher()(r.command),r.followup&&await r.followup())}getCreateElementCommand(t,e,A,i){return new en({id:t,type:ze.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/i.frameData.width,scaleY:e.height/i.frameData.height,path:i.frameData.path,stepRegion:e,stepName:i.stepName,disablePlaceholder:i.disablePlaceholder,focalBlur:i.focalBlur,focalBlurStrength:i.focalBlurStrength,focalBlurRadius:i.focalBlurRadius,pattern:i.pattern,immutable:e.immutable},A)}async loadPatternFromString(t,e){if(t.endsWith("svg")){const A=await Rn(t),i=A.width,n=A.height,r={src:t,width:i,height:n,aspect:i/n};Mn.set(t,r),e.setPatternData(r)}else{const A=await LA(t),i=await In(A),n={src:t,width:i.width,height:i.height,aspect:i.width/i.height};Mn.set(t,n),e.setPatternData(n)}}async selectVariantCommand(t,e,A,i,n,r){const a=i.getStepSpecificServices(t.stepName)?.frameService,s=await this.frameSourceSvg(e,t),o=await Yn(s),c=a.getImageData(),l=A.map((t=>new An(t.id))),g=c?Pn(c,o):void 0,h=c?{id:Te(),src:c.src,x:g?.x||0,y:g?.y||0,width:c.width,height:c.height,scaleX:g?.zoom||1,scaleY:g?.zoom||1,rotation:0}:void 0;n&&n(!0);const d=t.data.regions.map((e=>{const A=Te(),n=i.getLayouts().find((t=>t.panelId===e.panelId));if(!n)throw new Zn(e);return{command:this.getCreateElementCommand(A,e,n,{frameData:o,pattern:h,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:A,region:e}}})),u=d.map((t=>t.command));return{command:new $i([...u,...l]),followup:async()=>{n&&n(!1),await i.setSelectionsAndElements(t.stepName,e?[e]:[],[...d.map((t=>t.regionEl))],(async()=>{if(i.updateStorage(t.stepName,{currentFrameSource:s}),r){const e=i.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(r,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 _n(t)}async loadPatternFromAsset(t,e,A){const i=this.patternSource(t),n=A.markUpdatePending(),r=A.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(i,r),A.updateMetadata(e.stepName,{image:i}),A.updateStorage(e.stepName,{framePatternSrc:i}),A.markUpdateCompleted(n)}};const to=new class{async getIllustrationBody(t){return new Promise((e=>{zA(t).then((t=>{e(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,e,A,i){return new en({stepRegion:e,stepName:i.stepName,colors:i.svg.colors,id:t,src:i.src,svg:i.svg.svg,cachedObjectURL:i.objectURL,type:ze.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 Li(A[0].id,e.getAllLayoutData()).colors}catch(t){return[]}}async init(t,e,A){const i=t.option;if(!i)return null;if(A)return this.reload(t,e,A);{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantCommand(t,A,[],(()=>{}),e)}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(!r||!A)throw new Error("Required illustration variant no longer available");{const a=r.variants?.find((t=>t.id===A));if(a){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[a],A,(async()=>{e.updateMetadata(t.stepName,{colors:i.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,i,n){const r={};for(const[t,e]of n.entries())r[t]={browserValue:e,spotColor:r[t]?.spotColor};const a=Ri(t,e,A,r),s=await zn(a),o=[];for(const t of i){for(const[e,A]of n.entries())o.push(new dn(t,e,A));o.push(new un(t,a,s))}return new $i(o)}async changeColors(t,e,A,i,n){if(0===e.length)return;const r=Li(e[0].id,i().map((t=>t.layoutState))),a={...r.colors},s={};Object.entries(a).forEach((([t,e])=>{const A={browserValue:e.browserValue},i=e.spotColor;i&&(A.spotColor={profileName:i.profileName,namedColor:i.namedColor}),s[t]=A}));for(const[t,e]of n.entries())a[t]={browserValue:e,spotColor:a[t]?.spotColor},s[t]={browserValue:e};let o=Array.from(Object.values(a)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{o=o.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),A.updateMetadata(t.stepName,{colors:o});const l=new Map;if(Object.entries(a).forEach((([t,e])=>{l.set(t,e.browserValue)})),!r.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const g=await this.changeColorsCommand(r.svg,r.width,r.height,e.map((t=>t.id)),l);A.updateStorage(t.stepName,{colors:s}),A.getCommandDispatcher()(g)}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A,i,n);r&&(r.command&&n.getCommandDispatcher()(r.command),r.followup&&await r.followup())}async selectVariantCommand(t,e,A,i,n){if(!t.data||!t.data.regions)throw new tr(t,"Missing regions.");i(!0);const r=A.map((t=>new An(t.id)));n.setMandatoryFulfilled(t.stepName,!1);const a=e.asset;if(!a)throw new $n(e);const s=a.fileLink;if(!s)throw new _n(a);const o=await ki(await this.getIllustrationBody(s)),c=await zn(o.svg),l=t.data.regions.map((e=>{const A=n.getLayouts().find((t=>t.panelId===e.panelId));if(!A)throw new Zn(e);const i=Te();return{regionElement:{id:i,region:e},command:this.getCreateElementCommand(i,e,A,{stepName:t.stepName,src:s,objectURL:c,svg:o})}})),g=[...l.map((t=>t.command)),...r];let h=Array.from(Object.values(o.colors)).map((t=>t.browserValue));const d=t.data.colorOption;return d&&d.variants?.forEach((t=>{h=h.map((e=>e.toLowerCase()===t.color?.toLowerCase()?t.name:e))})),n.updateMetadata(t.stepName,{colors:h}),{command:new $i(g),followup:async()=>{await n.setSelectionsAndElements(t.stepName,[e],l.map((t=>t.regionElement)),(async()=>{n.setMandatoryFulfilled(t.stepName,!0),i(!1)}))}}}};const eo=new class{async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(A)await this.reload(t,e,A);else{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(!r)throw new qn(t);if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(A){const i=r.variants?.find((t=>t.id===A));if(i){const A=i.material,a=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],a,(async()=>{const i=e.getModelContainer();if(i){const n=t.data.targetMaterials.map((t=>i.applyMaterialVariant(t,r.id||"",A||{})));Promise.all(n).then((()=>e.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantLambda(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A,i){const n=A.getModelContainer();i(!0);const r=e.material;if(!r)throw i(!1),new $n(e);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],[],(async()=>{try{n&&t.data.targetMaterials.forEach((e=>{t.option&&n.applyMaterialVariant(e,t.option.id||"",r)})),A.setMandatoryFulfilled(t.stepName,!0)}finally{i(!1)}}))}}}};const Ao=new class{async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(A)await this.reload(t,e,A);else{const A=Nr.getDefaultVariant(i);if(A)return await this.selectVariantLambda(t,A,e,(()=>{}))}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{const A=e.getModelContainer();if(A&&t.option){const n=i.asset?.fileLink;if(!n)throw new $n(i);await A.applyModelVariant(t.option.id||"",{model:n,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantLambda(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,e,A,i){i(!0);const n=e.asset?.fileLink;if(!n)throw new $n(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:n,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}finally{i(!1)}}))}}}};const io=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 i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=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,[],n,(async()=>{e.updateStorage(t.stepName,{text:i?.storage?.text}),e.setMandatoryFulfilled(t.stepName,""!==i?.storage?.text)}))}async changeText(t,e,A,i,n){const r=await this.changeTextCommand(t,e,A,i,n);r&&(r.command&&A.getCommandDispatcher()(r.command),r.followup&&await r.followup())}async changeTextCommand(t,e,A,i,n){const r=A.getRegionElements(t.stepName),a=A.getStepSpecificServices(t.stepName)?.module;if(!a)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(t,e,s,n))return A.setMandatoryFulfilled(t.stepName,!1),console.error(i),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 o=(e,i,n)=>{const r=n||Te(),a=A.getLayouts().find((t=>t.panelId===i.panelId));if(!a)return console.error(`Can not find layout for region: ${i.panelId}`),null;const s=[];return n&&s.push(new An(r)),s.push(new en({stepRegion:i,stepName:t.stepName,colors:{},id:r,svg:e,type:ze.Illustration,y:i.top,x:i.left,rotation:i.rotation,width:i.width,height:i.height,layer:i.layer,layerIndex:i.layerIndex,immutable:i.immutable},a)),{id:r,region:i,command:new $i(s)}};if(r.length>0){const t=r.map((t=>{if(!t.region)return null;const A=a.svgPrint(e,t.region);return o(A,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new $i(t),followup:async()=>{}}}{const i=t.data.regions.map((t=>o(a.svgPrint(e,t),t))),n=i.filter((t=>!!t)).map((t=>t&&t.command));return{command:new $i(n),followup:async()=>{const e=i.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await A.setSelectionsAndElements(t.stepName,[],e)}}}}validateInput(t,e,A,i){if(t.data&&t.data.maxLength){const A=t.data.maxLength;if(e.length>A)return i("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(e))return i("Unsupported characters."),!1;const n=(0,x.split)(e.toLowerCase());for(const t of n)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return i("Blocked profanity."),!1}return i(""),!0}};const no=new class{async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else if(i.defaultVariant)return e.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,i.defaultVariant,e,(()=>{}));return e.markStepsAsInitialised([t.stepName]),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantCommand(t,e,A,i);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(t,e,A,i){const n=e.asset;if(!n)throw new $n(e);const r=n?.fileLink;if(!r)return console.error("No URL for picture!"),null;i(!0),A.setMandatoryFulfilled(t.stepName,!1);const a=A.getRegionElements(t.stepName).map((t=>new An(t.id))),s=t.data.regions.map((e=>{const i=A.getLayouts().find((t=>t.panelId===e.panelId));if(!i)throw new Zn(e);const n=Te();return{regionElement:{id:n,region:e},command:new en({stepName:t.stepName,stepRegion:e,id:n,src:r,type:ze.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"},i)}}));return{command:new $i([...a,...s.map((t=>t.command))]),followup:async()=>{await A.setSelectionsAndElements(t.stepName,[e],s.map((t=>t.regionElement)),(async()=>{A.setMandatoryFulfilled(t.stepName,!0),i(!1)}))}}}};const ro=new class{async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else{const A=i.variants;if(Nr.getDefaultVariant(i)){const n=A?.find((t=>t.id===i.defaultVariant?.id));return this.selectVariantLambda(t,n?.id||"",e)}}return null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(n&&A){const i=n.variants?.find((t=>t.id===A));i&&await e.setSelectionsAndElements(t.stepName,[i],[])}}}async selectVariant(t,e,A){await A.getInitializationPromise();const i=await this.selectVariantLambda(t,e,A);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(t,e,A){const i=t.option;if(!i)return null;const n=i.variants;if(!n)return null;const r=n.length>1?n.find((t=>t.id===e)):n[0];if(!r)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,[r],[],(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}};const ao=new class{async availableColours(t){const e=t.option;return e&&e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}async init(t,e,A){const i=t.option;if(!i)throw new qn(t);if(!A){const A=Nr.getDefaultVariant(i);if(!A)return null;const n={fill:A.color,stroke:A.color,variant:A};return this.selectVariantCommand(t,n,[],e)}return await this.reload(t,e,A),null}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const i=r.variants?.find((t=>t.id===A));if(i){const A=n.map((t=>({id:t.id,region:t.stepRegion})));await e.setSelectionsAndElements(t.stepName,[i],A,(async()=>{e.updateStorage(t.stepName,{colour:i.color||""}),e.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,e,A,i){const n=await this.selectVariantCommand(t,e,A,i);n&&(n.command&&i.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(t,e,A,i){const n=i.getLayouts();if(A.length>0){const r=t=>{const A=t.region;if(!n.find((t=>t.panelId===A?.panelId)))throw new Zn(A);const i=e.variant?.color;return i?new dn(t.id,"spiff-fill-shape",i):(console.error("Failed to change color."),null)},a=A.map(r).filter((t=>!!t));return{command:new $i(a),followup:async()=>{await i.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],A),i.updateStorage(t.stepName,{colour:e.fill||""})}}}{const A=A=>{const i=n.find((t=>t.panelId===A.panelId));if(!i)throw new Zn(A);const r=`\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="spiff-fill-shape"\n fill="${e.variant?.color}"\n />\n </svg>\n `,a={};a["spiff-fill-shape"]={browserValue:e.variant.color};const s=Te();return{id:s,region:A,command:new en({stepRegion:A,stepName:t.stepName,colors:a,id:s,svg:r,type:ze.Illustration,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,excludeFromExport:t.data.excludeFromPrint},i)}},r=t.data.regions.map(A),a=r.filter((t=>!!t)).map((t=>t?.command)),s=r.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new $i(a),followup:async()=>{await i.setSelectionsAndElements(t.stepName,e.variant?[e.variant]:[],s,(async()=>{i.updateStorage(t.stepName,{colour:e.fill||""})}))}}}}};function so(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 oo extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=oo.name}}const co=["‘","’","“","”","\n"];class lo extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=lo.name}}const go=new class{constructor(){so(this,"cachedColors",new Map),so(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 i=[],n=e?ri(e):void 0;if(n){const t=A.split("").filter((t=>!co.includes(t))).join(""),e=t.split("").map((t=>n.getFont().charToGlyph(t)));for(let A=0;A<e.length;A++){".notdef"===e[A].name&&i.push(String.fromCharCode(t.charCodeAt(A)))}}for(let t=0;t<i.length;t++)A=A.replaceAll(i[t],"");return A})),so(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),so(this,"getErrorsForText",((t,e,A)=>{const i=[];e.data&&e.data.maxLength&&t.length>e.data.maxLength&&i.push({localizationKey:"workflow.steps.text.characterLimit"});const n=A.getProfanities(),r=(0,x.split)(t.toLowerCase());for(const t of r)for(const e in n){if(t===n[e].toLowerCase().replace(/\s/g,"")){i.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!e.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&i.push({localizationKey:"workflow.steps.text.multipleLines"}),i}))}async init(t,e,A){const i=t.option;if(!i)return null;if(A)await this.reload(t,e,A);else{const A=this.getDefaultImageFillVariant(t.data),n=A?.asset?.fileLink,r=n?await Nn(n):void 0,a=r?{src:r.src,height:r.height,width:r.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:a}),e.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:A?.name});const s=Nr.getDefaultVariant(i);if(s)return this.selectVariantCommand(t,s,{},[],e,(()=>{}),(()=>{}),a)}return null}findLayoutElements(t,e){return t.getRegionElements(e.stepName).map((e=>Li(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,i){if(!t.data||!t.data.regions)return;const n=i.getCommandDispatcher();e.variant?i.updateMetadata(t.stepName,{color:e.variant.name}):i.updateMetadata(t.stepName,{color:e.fill});const r=t.data.colorOption,a=r?this.createTextFillSpotColor(r,e.variant):void 0;r?i.updateStorage(t.stepName,{color:e.fill,colorProfileAssetKey:r.colorProfile?.key}):i.updateStorage(t.stepName,{color:e.fill});for(const t of A){if(!e.fill)throw new Error("Fill not set on new color selection!");n(new rn(t.id,e.fill,a))}}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 Nn(e);return{src:e,width:A.width,height:A.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,e,A,i){if(!t.data||!t.data.regions)return;const n=i.getCommandDispatcher(),r=t.option?.variants?.find((t=>t.asset?.fileLink===e.src));i.updateMetadata(t.stepName,{fillImage:r?.name}),i.updateStorage(t.stepName,{fillImage:e});for(const t of A){n(new an(t.id,e))}}getProcessedInput(t,e,A){const i=A?t:this.injectReplaceableText(t,e);return pi(i,{vertical:e.vertical,uppercase:e.uppercase})}updateInputText(t,e,A,i){const n=i.getStepStorage(A.stepName),r=this.getProcessedInput(t,A.data,!!n.customiseAllText),a={command:void 0,helperText:"",errors:this.getErrorsForText(t,A,i)};if(a.errors.length>0)return a.helperText=a.errors[0].localizationKey,a;const s=(A.data.maxLength-r.length).toString();a.helperText=`${s} characters remaining`;const o=i.getTransaction().bulk&&A.data.varyText||!1,c=[],l=new Map,g=new Map;for(const t of e){if(!t.fontData)throw new Ar("Failed to resolve font data for text.");const[e,i]=Gn(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[r],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});l.set(t.id,e),g.set(t.id,i);const n=A.data.curved?r:(i||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(e,A.data,t.id,n,o))}if(!A.data.curved&&e.length>0){if(!Array.from(g.values()).every((t=>t)))return a.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),a}return i.updateStorage(A.stepName,{text:t}),i.updateMetadata(A.stepName,{text:r}),n.defaultCleared&&i.setMandatoryFulfilled(A.stepName,!0),a.command=new $i(c),a.command.varying=o,a}async selectVariant(t,e,A,i,n){const r=await this.selectVariantCommand(t,e,A.getStepStorage(t.stepName)||{},A.getRegionElements(t.stepName),A,i,n);r&&(r.command&&A.getCommandDispatcher()(r.command),r.followup&&await r.followup())}createTextFillSpotColor(t,e){const A=t.colorProfile;if(A){const t=(A.name||"").replace(/\s/g,"-"),i=t.lastIndexOf("/"),n=t.slice(i+1).slice(0,-4);if(!e.namedColor)throw new Error("variant named color not set!");return{profileName:n,namedColor:e.namedColor}}}async reload(t,e,A){const i=e.getSerializedStep(t.stepName,A.serializableWorkflow.steps),n=Object.values(A.layouts).map((t=>t.elements)).flat().filter((e=>e.stepName===t.stepName)),r=t.option;if(i?.selectedVariants){const A=i.selectedVariants[0].id;if(r&&A){const a=r.variants?.find((t=>t.id===A));if(a){const A=await this.fontDataFromVariant(a),r=n.map((t=>({id:t.id,region:t.stepRegion}))),s=i.storage?.color,o=i.storage?.text;await e.setSelectionsAndElements(t.stepName,[a],r,(async()=>{e.updateMetadata(t.stepName,{color:s,text:o}),e.updateStorage(t.stepName,{text:o,inputText:o});const i=n.map((t=>new cn(t.id,A))),r=new $i(i);e.getCommandDispatcher()(r),e.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=go.updateInputText(o||"",n,t,e);c&&e.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const e=t.colorOption;if(e)return Nr.getDefaultVariant(e)}async getDefaultColor(t){const e=t.colorOption;if(!e)return;return Nr.getDefaultVariant(e)?.color}getDefaultImageFillVariant(t){const e=t.imageFillOption;if(e)return Nr.getDefaultVariant(e)}async fontDataFromVariant(t){const e=t.asset;if(!e)throw new $n(t);const A=e.fileLink;if(!A)throw new _n(e);return{assetUrl:A,name:(await ii(A)).names.fullName.en}}async selectVariantCommand(t,e,A,i,n,r,a,s){const o=n.markUpdatePending(),c=await this.fontDataFromVariant(e);if(i.length>0){const l=i.map((t=>new cn(t.id,c)));if(s){const t=i.map((t=>new an(t.id,s)));l.push(...t)}const g=await this.changeInputTextWithRegion(t,t.data.size||30,c,A.text||"",A,n,!!A.customiseAllText,r,a);g&&l.push(g);return{command:new $i(l),followup:async()=>{n.markUpdateCompleted(o),await n.setSelectionsAndElements(t.stepName,[e],i)}}}{const i=await this.createTextboxRegions(t.stepName,e,t.data,c,A,n),l=await this.changeInputTextWithRegion(t,t.data.size||30,c,i[0]?.newElement.input||A.text||t.data.defaultText||"",A,n,!!A.customiseAllText,r,a),g=i.flatMap((t=>t.commands));if(s){const t=i.map((t=>new an(t.regionElement.id,s)));g.push(...t)}l&&g.push(l);return{command:new $i(g),followup:async()=>{n.markUpdateCompleted(o)}}}}injectReplaceableText(t,e){return e.replaceableText?e.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,e,A,i,n,r){if(!A||!A.regions)throw new Error("Step data not supplied");const a=r.getTransaction().bulk&&A.varyText||!1,s=a?"":n.text||A.defaultText||"",o=this.getProcessedInput(s,A,!1),c=await Promise.all(A.regions.map((async e=>{const c=r.getLayouts().find((t=>t.panelId===e.panelId)),l=Te();try{if(!c)throw new lo("Failed to find layout for region: "+e.panelId);const g=A.colorOption;let h;if(g&&g.variants){const e=g.variants.find((t=>t.id===g.defaultVariant?.id))||g.variants[0];h=this.createTextFillSpotColor(g,e),r.updateStorage(t,{colorProfileAssetKey:g.colorProfile?.key})}const d=await this.getDefaultColor(A),u=d||"#000000",B={stepRegion:e,stepName:t,align:this.textAlign(A),fill:n.color?n.color:u,fontSize:A.size||30,fontData:i,id:l,layer:e.layer,layerIndex:e.layerIndex,rotation:e.rotation,text:o,input:s,type:ze.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:h},w=[],E=new Map,p=new Map;if(!B.fontData)throw new Ar("Failed to resolve font data for text.");const[m,C]=Gn(B.fontSize,B.fontData,{left:B.x,top:B.y,width:B.width,height:B.height,rotation:B.rotation,panelId:""},[o],{size:A.size,minSize:A.minSize,maxSize:A.maxSize});E.set(B.id,m),p.set(B.id,C);const f=A.curved||A.vertical?o:(C||[]).join("\n");w.push(this.generateTextChangeCommandsForRegion(m,A,B.id,f,a));const Q=new en(B,c);return Q.varying=a,{regionElement:{id:l,region:e},commands:[Q,...w],newElement:B,fontData:i}}catch(t){throw console.log(t),new oo("Error adding font to region")}}))).catch((t=>{throw t instanceof oo?(ra.setLatestToast("Failed to load font.",uo.Error),t):t instanceof lo?t:new Error(t)}));return await r.setSelectionsAndElements(t,[e],c.map((t=>t.regionElement)),(async()=>{r.updateMetadata(t,{text:s}),r.updateStorage(t,{text:s})})),c}generateTextChangeCommandsForRegion(t,e,A,i,n){const r=[],a=new hn(A,i);if(a.varying=n,r.push(a),!e.size){const e=new sn(A,t);e.varying=n,r.push(e)}const s=new $i(r);return s.varying=n,s}async changeInputTextWithRegion(t,e,A,i,n,r,a,s,o,c){const l=(i||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),g=this.getProcessedInput(l,t.data,a),h=r.getRegionElements(t.stepName),d=new Map,u=new Map;for(const i of h)if(i.region){const[n,r]=Gn(e,A,i.region,[g],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});d.set(i.id,n),u.set(i.id,r)}const B=(()=>{if(t.data&&t.data.maxLength&&g.length>t.data.maxLength)return c&&c(!0),{info:"0"};const e=r.getProfanities(),A=(0,x.split)(g.toLowerCase());for(const t of A)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return s(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(g.includes("\n")||g.includes("\r")))return s(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(u.values()).every((t=>t)))return s(!0),{error:"Does not fit."}}return s(!1),{info:(t.data.maxLength-g.length).toString()}})();if(B.error)return void o(B.error);if(o(`${B.info} characters remaining`||""),c)return;r.updateStorage(t.stepName,{text:l}),r.updateMetadata(t.stepName,{text:this.injectReplaceableText(l,t.data)});const w=r.getTransaction().bulk&&t.data.varyText||!1;n.defaultCleared&&r.setMandatoryFulfilled(t.stepName,!0);const E=[];for(const e of h){const A=t.data.curved?g:(u.get(e.id)||[]).join("\n");E.push(this.generateTextChangeCommandsForRegion(d.get(e.id)||1,t.data,e.id,A,w))}const p=new $i(E);return p.varying=w,p}};function ho(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 uo;var Bo;(Bo=uo||(uo={})).Error="Error",Bo.Warning="Warning",Bo.Info="Info";class wo extends Ua{constructor(t){super(),ho(this,"update",void 0),ho(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class Eo{constructor(t,e,A,i,n,r,a,s,o,c,l=!1,g){ho(this,"reloadedState",void 0),ho(this,"transaction",void 0),ho(this,"ownerCustomer",void 0),ho(this,"updateTransaction",void 0),ho(this,"confirmedDesign",void 0),ho(this,"editedSteps",void 0),ho(this,"informationResults",void 0),ho(this,"layouts",void 0),ho(this,"mandatorySteps",void 0),ho(this,"pendingUpdates",void 0),ho(this,"selectionCost",void 0),ho(this,"workflow",void 0),ho(this,"stepSpecificServices",void 0),ho(this,"previewService",void 0),ho(this,"profanityFilter",void 0),ho(this,"pollers",void 0),ho(this,"commandContext",void 0),ho(this,"stepElements",void 0),ho(this,"stepInitialised",void 0),ho(this,"stepMetadata",void 0),ho(this,"stepSelections",void 0),ho(this,"storage",void 0),ho(this,"confirmCallbacks",void 0),ho(this,"editedCallbacks",void 0),ho(this,"elementsCallbacks",void 0),ho(this,"informationResultCallbacks",void 0),ho(this,"initCallbacks",void 0),ho(this,"makingAdjustmentsCallback",void 0),ho(this,"mandatoryCallbacks",void 0),ho(this,"metadataCallbacks",void 0),ho(this,"selectionCallbacks",void 0),ho(this,"stepSpecificStorageCallbacks",void 0),ho(this,"storageCallbacks",void 0),ho(this,"currentVariationRecordCallbacks",void 0),ho(this,"variationRecordCallbacks",void 0),ho(this,"allScenes",void 0),ho(this,"product",void 0),ho(this,"invalidModelVariants",void 0),ho(this,"currentAdjustingStepId",void 0),ho(this,"renderableContextService",void 0),ho(this,"workflowStatePromiseQueue",new Ga(1)),ho(this,"variationRecords",[]),ho(this,"currentVariationRecord",void 0),ho(this,"initializationPromise",void 0),ho(this,"initialized",!1),ho(this,"readOnly",!1),ho(this,"modelContainer",void 0),ho(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=n,this.commandContext=i,this.reloadedState=c,this.transaction=r,this.readOnly=l,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=a,this.previewService=s,this.modelContainer=g,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=o,this.currentVariationRecord=null,this.initializationPromise=this.initializeDefaultWorkflowState(t,r),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 Hs(t,{bulkScene:e.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},e);const A=Ts(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:i,commands:n}=await this.stepElementsForIntroducedSilentSteps(A,!!this.reloadedState);this.commandContext.apply(new $i(n),!0),this.stepElements={...this.stepElements,...i},await this.ensureStepsAreLoaded(),!this.readOnly&&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)}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=Te();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 updateStorage(t,e){const A={...this.storage,[t]:{...this.storage[t],...e}};if(!S(f)(A,this.storage)){this.storage=A;const e=new Wi(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 wo((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new wo((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new Ar("Attempted to serialize state before it was initialized.");const A=JSON.stringify(this.dehydrateState(S(e)(t.transaction))),i=t.variation;if(!i)return{transaction:A};const n={layouts:{},serializableWorkflow:{steps:[]},...S(e)(i)||{}};return{transaction:A,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,i)=>{const n=[...t[i]||[]];return e.forEach((t=>{const e=n.findIndex((e=>e.id===t.id));e>-1&&n.splice(e,1)})),A[i]=n,A}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,e)=>(Gs(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&&!Gs(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 i=async(t,e,A)=>{if(t.type===nA.SilentIllustration){return{step:t,results:await new Ks(t,e).trigger()}}if(t.type===nA.ProductOverlay){return{step:t,results:await new Ks(t,e,A).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},n=t.filter((t=>!this.stepInitialised[t.stepName])),r={stepElements:{},commands:[]},a=[];for(const t of n)this.markStepsAsInitialised([t.stepName]),e||a.push(i(t,this.layouts,A));const s=await Promise.all(a);for(const t of s)r.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),r.commands=[...r.commands,...t.results.map((t=>t.command))];return r}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 An(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,e,A,i){const n=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=>{Gs(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const r=this.allScenes,a=Ts(r,n),s=Ts(r,this.stepSelections),o=a.map((t=>t.silentSteps)).flat(),c=s.map((t=>t.silentSteps)).flat().filter((t=>!o.some((e=>e.stepName===t.stepName))));o.forEach((t=>{Gs(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:g,commands:h}=await this.stepElementsForIntroducedSilentSteps(c,!1);this.stepElements={...this.stepElements,...g,[t]:A},this.removeElements(l);if(this.workflow.steps.find((e=>e.stepName===t))?.type===nA.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(A.map((t=>t.id)))}const d=[...h,...l.map((t=>new An(t.id))),new Wi(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new $i(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),i&&await i()}async ensureStepsAreLoaded(){const t=[],e=Ts(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 nA.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case nA.DigitalContent:t.push(Zs.init(A,this,this.reloadedState));break;case nA.Frame:case nA.Photo:{const e=new js(A.data.forceImageCover);e.connectWorkflowManager(this,A.stepName),this.stepSpecificServices[A.stepName]={frameService:e},t.push(_s.init(A,this,this.reloadedState))}break;case nA.Illustration:t.push(to.init(A,this,this.reloadedState));break;case nA.Material:t.push(eo.init(A,this,this.reloadedState));break;case nA.Model:t.push(Ao.init(A,this,this.reloadedState));break;case nA.Module:this.stepSpecificServices[A.stepName]={module:await rs(A.data.module)},t.push(io.init(A,this,this.reloadedState));break;case nA.Picture:t.push(no.init(A,this,this.reloadedState));break;case nA.Question:t.push(ro.init(A,this,this.reloadedState));break;case nA.Shape:t.push(ao.init(A,this,this.reloadedState));break;case nA.Text:t.push(go.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})),i=A.filter((t=>!!t&&!!t.command)).map((t=>t.command)),n=A.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));i&&i.length>0&&this.commandContext.apply(new $i(i),!0);for(const t of n)await t();n.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 Os(this.allScenes,this.stepSelections)}}function po(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 mo{constructor(t){po(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.thumbnail?.versions?.find((t=>"cdn"===t.name))?.link}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name));return t?t.link:this.variantData.asset?.versions?.find((t=>"thumbnail"===t.name))?.link}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 Co(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 fo{constructor(t,e){Co(this,"manager",void 0),Co(this,"step",void 0),this.manager=t,this.step=e}setUpdateState(t){fo.updateState.set(this.step.stepName,t)}getUpdateState(){return!!fo.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new mo(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new mo(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new mo(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}executeAnimations(){const t=this.manager.getPreviewService(),e=this.manager.getModelContainer(),A=this.step.data.modelAnimation,i=this.step.data.lookAtAnimation;t&&i&&t.executeCameraAnimation(i),e&&A&&e.executeAnimation(A)}}function Qo(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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}Co(fo,"updateState",new Map);const yo=t.gql`
443
443
  mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
444
444
  transactionAddStakeholder(id: $id, details: $details, type: $type) {
445
445
  id
@@ -488,7 +488,7 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
488
488
  }
489
489
  }
490
490
  }
491
- `,ko=(t,e,A)=>{const i={};return e.steps.forEach((e=>{Object.assign(i,(e=>{const i={};if("Frame"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideImageInCart&&A)return i;i[`${e.stepTitle} image`]=n.image}if("Illustration"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideColorsInCart&&A||!n.colors)return i;if(n.colors.length>0){const t=n.colors.join(", ").toUpperCase();i[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideTextInCart&&A)return i;i[`${e.stepTitle} text`]=n.text}if("Text"===e.type){const n=t[e.stepName];if(!n)return i;const r=e.data;r.hideTextInCart&&A||(i[`${e.stepTitle} text`]=n.text),!n.color||r.hideColorInCart&&A||(i[`${e.stepTitle} color`]=n.color)}return i})(e))})),i},Ho=(t,e,A,i,n,r,a,s,o)=>{const c=(cr.getMap("transactionOwnerIds")||new Map).get(t.id),l={event:"onComplete",lineItemImageUrl:a||"",transactionId:t.id,designProductVariantId:t.externalDesignProductVariantId,designProductId:t.externalDesignProductId,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,baseCost:A,weight:e.weight,optionsCost:i,exportedData:r,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return n&&(l.metadata=n),s&&(l.selectedVariants=s),o&&(l.sku=o),l},Uo=async(t,e,A,i,n,r,a)=>{const s=t.product?.basePrice||0,o=t.priceModifierTotal||0,c=((t,e,A,i)=>{const n={};let r;if(A){r=ko(A,e,!1);for(const t of Object.keys(r))n[t]={value:r[t],priceModifier:0}}else if(i){r=i;for(const t of Object.keys(r))n[t]={value:r[t],priceModifier:0}}for(const A of Object.keys(t)){const i=t[A],r=e.steps.find((t=>t.stepTitle===A));if(1===i.length)n[`${r?.stepTitle} selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let t=0;t<i.length;t++)n[`${r?.stepTitle} selection ${t+1}`]={value:i[t].name,priceModifier:i[t].priceModifier}}return n})(i,A,void 0,r);return Ho(t,e,s,o,r,c,a,i,n)},Go=async(t,e,A,i,n,r,a,s,o,c,l,g,h)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const d=Cr.getShadowGraphqlClient();await d.resetStore();const u=await d.query({query:Ns,variables:{id:r.id},errorPolicy:"all"}),B=u.data?.transactions[0].workflowState;!u.errors&&B||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),u.errors&&u.errors.forEach((t=>{u.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const w=t.getPreviewService(),E=e?.finalizeStepConfig?.lookAtAnimation,p=w&&100===w.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!E,m=h&&ko(h,e,!0),C=h&&ko(h,e,!1),f=async t=>{const A={};let i=0;if(Object.keys(a).length>0)for(const n of Object.keys(a)){const r=a[n],s=e.steps.find((t=>t.stepName===n));for(let e=0;e<r.selections.length;++e){const n=r.selections[e];if(s&&(!t||s.option&&(s.option.variants||[]).length>1&&!s.data.hideSelectionInCart&&!s.data.hideSelectionsInCart)){const t=s.stepTitle;A[t]?A[t].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):A[t]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[A,i]},[Q]=await f(!0),y=Object.fromEntries(Object.keys(Q).map((t=>[t,Q[t].map((t=>t.id))]))),[D]=await f(!1),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),x=await g(p);o("workflow.steps.finish.finalize.creatingDesign"),r.bulk&&await c(l);const M=await(async t=>(await Cr.getShadowGraphqlClient().mutate({mutation:Ro,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)((()=>{const t={name:s,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:r.id,useThreeDimPreview:p,previewImage:x};if(C){const e=[];for(const[t,A]of Object.entries(C))e.push({key:t,value:A});t.metadata=e}if(y){const e=[];for(const[t,A]of Object.entries(I))e.push({key:t,ids:A});t.selectedVariants=e}return t})()),v=M?.transaction?.previewImageLink;o("workflow.steps.finish.finalize.updatingTransaction");const F=(await Cr.getShadowGraphqlClient().query({query:Ps,variables:{id:r.id}})).data.transactions[0];return r.bulk?((t,e,A)=>{const i=(t.product?.basePrice||0)*(t.variationsCount||0),n=t.priceModifierTotal||0,r={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ho(t,e,i,n,void 0,r,A)})(F,n,v):await Uo(F,n,e,Q,M?.sku,m,v)};let To;var Oo;(Oo=To||(To={})).Local="Local",Oo.Remote="Remote";const Jo=new class{constructor(){No(this,"localPersistenceKey","designTransactions"),No(this,"storageMethod",To.Local),No(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===To.Local){const t=cr.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new Ar("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(),i=A.find((e=>e.transactionId===t));if(!i)throw new Error(`No saved design for transaction ${t}.`);i.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!==To.Local)throw new Ar("Unexpected storage method requested");cr.set(this.localPersistenceKey,JSON.stringify(t))}};function Lo(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 zo{constructor(t,e){if(Lo(this,"client",void 0),Lo(this,"commandContext",void 0),Lo(this,"workflowManager",void 0),Lo(this,"isReadOnly",void 0),Lo(this,"renderableScenes",[]),Lo(this,"renderableSceneCallbacks",[]),Lo(this,"debouncedSavedDesignUpdate",S(I)((async()=>{await Jo.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Lo(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)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const A=e.layouts;this.commandContext=new Ui,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Eo(e.workflow,e.product.profanities?.map((t=>t.word))||[],A,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),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 Cr.getShadowGraphqlClient().mutate({mutation:Ys,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(),i=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!i)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,i))||""}const n=document.createElement("canvas");let r=2048;e&&e<=2048&&(r=e),n.width=r,n.height=r;const a=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,o=A.panels[s],c=a.find((t=>t.layoutState?.layout.panelId===o?.name))||a[0],l=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},g=this.commandContext.getLayoutById(c.layoutState.layout.id),h=n.getContext("2d");if(!h)throw new rr("Failed to obtain 2D context for preview image creation");const d=Ti(g.layoutState.layout,g.layoutState.elements,{renderingConfiguration:{purpose:Ve.Print,region:{left:l.x,top:l.y,width:l.width,height:l.height}}}),u=S(Q).renderToStaticMarkup(d),B=await ke.from(h,u,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await this.getCanvasObjectURLAsync(n);return n.toDataURL(w)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Po.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:nA.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Rs(this.getWorkflowManager().getWorkflow())},conditions:[]};return Po.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Po.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=>Po.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await Cr.getShadowGraphqlClient().mutate({mutation:yo,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=cr.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),cr.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 Ar("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Jo.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 Jo.addDesign(e),e}async copy(){const t=S(e)(this.getCommandContext().getState());if(!t)throw new Ar("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),i=this.getWorkflowManager().getWorkflow(),n=new uc({}),r=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!r)throw new Ar("Integration product id is undefined!");await n.initFromIntegrationProduct(r);return await n.getWorkflowExperience(i.id,A,void 0)}async onDesignFinished(t){return Go(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=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==nA.SilentIllustration&&t.type!==nA.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!i)return;t.has(i.stepTitle)||t.set(i.stepTitle,{});const n=e[A];Object.keys(n).forEach((e=>{t.get(i.stepTitle)[e]=n[e]}))})),Object.keys(A)?.forEach((e=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));i&&(t.has(i.stepTitle)||t.set(i.stepTitle,{}),t.get(i.stepTitle).selection=A[e].selections[0].name)})),t}}const jo=M.gql`
491
+ `,ko=(t,e,A)=>{const i={};return e.steps.forEach((e=>{Object.assign(i,(e=>{const i={};if("Frame"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideImageInCart&&A)return i;i[`${e.stepTitle} image`]=n.image}if("Illustration"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideColorsInCart&&A||!n.colors)return i;if(n.colors.length>0){const t=n.colors.join(", ").toUpperCase();i[`${e.stepTitle} colors`]=t}}if("Module"===e.type){const n=t[e.stepName],r=e.data;if(!n||r.hideTextInCart&&A)return i;i[`${e.stepTitle} text`]=n.text}if("Text"===e.type){const n=t[e.stepName];if(!n)return i;const r=e.data;r.hideTextInCart&&A||(i[`${e.stepTitle} text`]=n.text),!n.color||r.hideColorInCart&&A||(i[`${e.stepTitle} color`]=n.color)}return i})(e))})),i},Ho=(t,e,A,i,n,r,a,s,o)=>{const c=(cr.getMap("transactionOwnerIds")||new Map).get(t.id),l={event:"onComplete",lineItemImageUrl:a||"",transactionId:t.id,designProductVariantId:t.externalDesignProductVariantId,designProductId:t.externalDesignProductId,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,baseCost:A,weight:e.weight,optionsCost:i,exportedData:r,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return n&&(l.metadata=n),s&&(l.selectedVariants=s),o&&(l.sku=o),l},Uo=async(t,e,A,i,n,r,a)=>{const s=t.product?.basePrice||0,o=t.priceModifierTotal||0,c=((t,e,A,i)=>{const n={};let r;if(A){r=ko(A,e,!1);for(const t of Object.keys(r))n[t]={value:r[t],priceModifier:0}}else if(i){r=i;for(const t of Object.keys(r))n[t]={value:r[t],priceModifier:0}}for(const A of Object.keys(t)){const i=t[A],r=e.steps.find((t=>t.stepTitle===A));if(1===i.length)n[`${r?.stepTitle} selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let t=0;t<i.length;t++)n[`${r?.stepTitle} selection ${t+1}`]={value:i[t].name,priceModifier:i[t].priceModifier}}return n})(i,A,void 0,r);return Ho(t,e,s,o,r,c,a,i,n)},Go=async(t,e,A,i,n,r,a,s,o,c,l,g,h)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const d=Cr.getShadowGraphqlClient();await d.resetStore();const u=await d.query({query:Ns,variables:{id:r.id},errorPolicy:"all"}),B=u.data?.transactions[0].workflowState;!u.errors&&B||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),u.errors&&u.errors.forEach((t=>{u.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const w=t.getPreviewService(),E=e?.finalizeStepConfig?.lookAtAnimation,p=w&&100===w.getSceneInitializationProgress()&&e.showModelOnFinishStep&&!!E,m=h&&ko(h,e,!0),C=h&&ko(h,e,!1),f=async t=>{const A={};let i=0;if(Object.keys(a).length>0)for(const n of Object.keys(a)){const r=a[n],s=e.steps.find((t=>t.stepName===n));for(let e=0;e<r.selections.length;++e){const n=r.selections[e];if(s&&(!t||s.option&&(s.option.variants||[]).length>1&&!s.data.hideSelectionInCart&&!s.data.hideSelectionsInCart)){const t=s.stepTitle;A[t]?A[t].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):A[t]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[A,i]},[Q]=await f(!0),y=Object.fromEntries(Object.keys(Q).map((t=>[t,Q[t].map((t=>t.id))]))),[D]=await f(!1),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),x=await g(p);o("workflow.steps.finish.finalize.creatingDesign"),r.bulk&&await c(l);const M=await(async t=>(await Cr.getShadowGraphqlClient().mutate({mutation:Ro,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)((()=>{const t={name:s,layouts:A.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:e.id,transactionId:r.id,useThreeDimPreview:!!p,previewImage:x};if(C){const e=[];for(const[t,A]of Object.entries(C))e.push({key:t,value:A});t.metadata=e}if(y){const e=[];for(const[t,A]of Object.entries(I))e.push({key:t,ids:A});t.selectedVariants=e}return t})()),v=M?.transaction?.previewImageLink;o("workflow.steps.finish.finalize.updatingTransaction");const F=(await Cr.getShadowGraphqlClient().query({query:Ps,variables:{id:r.id}})).data.transactions[0];return r.bulk?((t,e,A)=>{const i=(t.product?.basePrice||0)*(t.variationsCount||0),n=t.priceModifierTotal||0,r={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ho(t,e,i,n,void 0,r,A)})(F,n,v):await Uo(F,n,e,Q,M?.sku,m,v)};let To;var Oo;(Oo=To||(To={})).Local="Local",Oo.Remote="Remote";const Jo=new class{constructor(){No(this,"localPersistenceKey","designTransactions"),No(this,"storageMethod",To.Local),No(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((e=>e!==t))}async getSavedDesigns(){if(this.storageMethod===To.Local){const t=cr.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new Ar("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(),i=A.find((e=>e.transactionId===t));if(!i)throw new Error(`No saved design for transaction ${t}.`);i.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!==To.Local)throw new Ar("Unexpected storage method requested");cr.set(this.localPersistenceKey,JSON.stringify(t))}};function Lo(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 zo{constructor(t,e){if(Lo(this,"client",void 0),Lo(this,"commandContext",void 0),Lo(this,"workflowManager",void 0),Lo(this,"isReadOnly",void 0),Lo(this,"renderableScenes",[]),Lo(this,"renderableSceneCallbacks",[]),Lo(this,"debouncedSavedDesignUpdate",S(I)((async()=>{await Jo.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Lo(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)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const A=e.layouts;this.commandContext=new Ui,this.commandContext.initialize(A,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Eo(e.workflow,e.product.profanities?.map((t=>t.word))||[],A,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer),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 Cr.getShadowGraphqlClient().mutate({mutation:Ys,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(),i=A?.finalizeStepConfig?.lookAtAnimation;if(t){if(!i)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,i))||""}const n=document.createElement("canvas");let r=2048;e&&e<=2048&&(r=e),n.width=r,n.height=r;const a=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,o=A.panels[s],c=a.find((t=>t.layoutState?.layout.panelId===o?.name))||a[0],l=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},g=this.commandContext.getLayoutById(c.layoutState.layout.id),h=n.getContext("2d");if(!h)throw new rr("Failed to obtain 2D context for preview image creation");const d=Ti(g.layoutState.layout,g.layoutState.elements,{renderingConfiguration:{purpose:Ve.Print,region:{left:l.x,top:l.y,width:l.width,height:l.height}}}),u=S(Q).renderToStaticMarkup(d),B=await ke.from(h,u,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await this.getCanvasObjectURLAsync(n);return n.toDataURL(w)}getStepById(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepName===t));if(e&&this.stepHasHandle(e))return Po.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:nA.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Rs(this.getWorkflowManager().getWorkflow())},conditions:[]};return Po.get(this.getWorkflowManager(),e)}}getStepByName(t){const e=this.getWorkflowManager().getWorkflow().steps.find((e=>e.stepTitle===t));if(e&&this.stepHasHandle(e))return Po.get(this.getWorkflowManager(),e)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((e=>e.type===t)).map((t=>Po.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=>Po.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const e=(await Cr.getShadowGraphqlClient().mutate({mutation:yo,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=cr.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,e.customer.id),cr.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 Ar("State undefined!");const e={title:await(async()=>{if(t)return t;const e=this.getWorkflowManager().getTransaction().id,A=(await Jo.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 Jo.addDesign(e),e}async copy(){const t=S(e)(this.getCommandContext().getState());if(!t)throw new Ar("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),i=this.getWorkflowManager().getWorkflow(),n=new uc({}),r=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!r)throw new Ar("Integration product id is undefined!");await n.initFromIntegrationProduct(r);return await n.getWorkflowExperience(i.id,A,void 0)}async onDesignFinished(t){return Go(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=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==nA.SilentIllustration&&t.type!==nA.ProductOverlay}getExportedData(){const t=new Map,e=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(e).forEach((A=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));if(!i)return;t.has(i.stepTitle)||t.set(i.stepTitle,{});const n=e[A];Object.keys(n).forEach((e=>{t.get(i.stepTitle)[e]=n[e]}))})),Object.keys(A)?.forEach((e=>{const i=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));i&&(t.has(i.stepTitle)||t.set(i.stepTitle,{}),t.get(i.stepTitle).selection=A[e].selections[0].name)})),t}}const jo=M.gql`
492
492
  query GetBundle($id: String!) {
493
493
  bundles(ids: [$id]) {
494
494
  id
@@ -1173,5 +1173,5 @@ var t=require("@apollo/client"),e=require("lodash.clonedeep"),A=require("react/j
1173
1173
  }
1174
1174
  }
1175
1175
  }
1176
- `,hc=async t=>{const e=(await Cr.getShadowGraphqlClient().query({query:nc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}})).data.workflow;return e.steps.forEach((t=>{delete t.data.__typename})),e},dc=(t,e)=>{const A=t.workflowState,i=A?JSON.parse(A):void 0;return i?Object.values(i.layouts).map((t=>t.layout)):e.panels.sort(((t,e)=>t.index-e.index)).map((t=>({id:Te(),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 uc{constructor(t){var e;tc(this,"options",void 0),tc(this,"initialized",void 0),tc(this,"experienceOptions",void 0),tc(this,"currencyCode",void 0),tc(this,"customer",void 0),tc(this,"updateTransactionState",(async t=>{try{return Cr.getShadowGraphqlClient().mutate({...t,mutation:Ss})}catch(t){throw console.error(t),new nr("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(e=this.options.applicationKey,mr=e)}getAssetManager(){return Sr}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(t){const e=cr.getMap("bundleOwnerIds");if(e?.has(t)){const A=e.get(t);return wr(A),Promise.resolve({success:!0,stakeholderType:ea.Owner})}const A=cr.getMap("bundleCustomerIds");if(A?.has(t)){const e=A.get(t);if(e){if(await this.authenticateCustomerId(e)){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=Cr.getShadowGraphqlClient(),A=await e.query({query:rc,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 i=A.data.transactions[0],n=i.product?.partner?.id;if(!n)throw new Error(`Unable to read transaction: ${t}`);if(i.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const r=cr.getMap("transactionOwnerIds");if(r?.has(t)){const e=r.get(t);return ur(e),Promise.resolve({success:!0,stakeholderType:ea.Owner})}const a=cr.getMap("transactionCustomerIds");if(a?.has(t)){const e=a.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 s=(await e.query({query:ac,errorPolicy:"all",variables:{id:i.workflowId}})).data.workflow;if(!s)throw new Error(`Unable to read workflow: ${i.workflowId}`);return Promise.resolve({success:!1,theme:s.overrideTheme,customLogoLink:i.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const e=cr.getMap("transactionCustomerIds");e?.has(t)&&(e.delete(t),cr.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=Cr.getShadowGraphqlClient(),A=(await e.query({query:sc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!A.id){const A=(await e.mutate({mutation:oc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!A)throw new Error("Unable to create customer.");return this.customer=A,{customer:A,isAuthenticated:!1}}const i=await this.authenticateCustomerId(A.id);return{customer:this.customer||A,isAuthenticated:i}}async authenticateCustomerId(t){const e=Cr.getShadowGraphqlClient(),A=cr.getMap("customerTokens");if(!A?.has(t))return!1;const i=A.get(t);if(!i)return!1;const n=(await e.mutate({mutation:cc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:i}})).data?.customerAuthenticate;return!!n&&(pr(i),this.customer=n,!0)}async generateVerificationCode(t){await Cr.getShadowGraphqlClient().mutate({mutation:lc,variables:{emailAddress:t}})}async verifyCode(t,e){const A=(await Cr.getShadowGraphqlClient().mutate({mutation:gc,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=cr.getMap("customerTokens")||new Map;return e.set(A.id,A.loginToken),cr.setMap("customerTokens",e),pr(A.loginToken),this.customer={...A,loginToken:void 0},!0}return!1}async getNewBundle(){const t=(await Cr.getShadowGraphqlClient().mutate({mutation:Ko})).data?.bundleCreate;if(!t)throw new Error("Unable to create bundle");wr(t.bundleOwnerId);const e=cr.getMap("bundleOwnerIds")||new Map;return e.set(t.id,t.bundleOwnerId),cr.setMap("bundleOwnerIds",e),new _o(this,t.id)}async getExistingBundle(t){const e=await Cr.getShadowGraphqlClient().query({query:jo,variables:{id:t}});if(!e.data?.bundles||0===e.data?.bundles.length||!e.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const A=e.data?.bundles[0],i=cr.getMap("bundleOwnerIds");return i?.has(A.id)&&wr(i.get(A.id)),new _o(this,A.id)}async getWorkflowExperience(t,e,A,i){if(!i)return await this.getWorkflowExperienceDeprecated(t,e,A);const n=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===ze.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await zn(e.svg))}const i=t.layouts[e].elements.filter((t=>t.type===ze.Textbox));for(let t=0;t<i.length;++t){const e=i[t];e.fontData?.assetUrl&&ii(e.fontData.assetUrl)}}},{transaction:r,workflow:a,readOnly:s}=await(async()=>{const t=Cr.getShadowGraphqlClient();if(await t.resetStore(),"transaction"===i.type){const{transactionId:e,readOnly:A}=i,n=await t.query({query:Fs,variables:{id:e},errorPolicy:"all"});if(!n.data?.transactions||0===n.data.transactions.length)throw new nr("Existing transaction not found.");const r=n.data?.transactions[0];if(!r.workflowId)throw new nr("Existing transaction has no workflow ID.");const a=await hc(r.workflowId);if(!r.product)throw new nr("Failed to load transaction, product not available.");return{transaction:r,workflow:a,readOnly:A}}if("integration"===i.type||"external"===i.type){const e=async()=>{const e="integration"===i.type?{integrationProductId:i.integrationProductId}:{externalIntegrationId:i.externalIntegrationId,externalProductId:i.externalProductId},A=await t.mutate({mutation:Ms,variables:{...e,bulk:i.bulk,workflowId:i.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 nr("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new nr("Failed to create transaction, product not available.");return n},A=hc(i.workflowId),[n,r]=await Promise.all([e(),A]);return{transaction:n,workflow:r}}throw new nr("No workflow ID provided.")})();if(this.currencyCode=r.product.partner?.currencyCode,this.experienceOptions={product:r.product,transaction:r,layouts:[],stateMutationFunc:s?async()=>{throw new Ar("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:s,workflow:a},"transaction"===i.type&&r.workflowState){const t=JSON.parse(r.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await n(t),this.experienceOptions.reloadedState=t}else if(!s&&i.workflowState){const t=JSON.parse(i.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=dc(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=A&&A(a),this.experienceOptions.renderableContextService=new ps(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==i.type){const t=cr.getMap("transactionOwnerIds")||new Map;t.set(r.id,r.transactionOwnerId),ur(r.transactionOwnerId||""),cr.setMap("transactionOwnerIds",t)}else{const t=(cr.getMap("transactionOwnerIds")||new Map).get(r.id);t&&ur(t)}this.initialized=!0;const o=new zo(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),"transaction"!==i.type&&this.customer&&await o.attachCustomerDetails({email:this.customer.emailAddress}),o}async initFromIntegrationProduct(t){if(""===t)throw new nr("No integration product ID provided.");const e=Cr.getShadowGraphqlClient();await e.resetStore();const A=await e.mutate({mutation:Ms,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 nr("Failed to create transaction!");const i=A.data.transactionCreate;if(!i.product)throw new nr("Failed to create transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode;const n=cr.getMap("transactionOwnerIds")||new Map;n.set(i.id,i.transactionOwnerId),ur(i.transactionOwnerId||""),cr.setMap("transactionOwnerIds",n),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,e=!1){if(""===t)throw new nr("No transaction ID provided.");const A=Cr.getShadowGraphqlClient();await A.resetStore();if(e)return await(async()=>{const i=(await A.query({query:Fs,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!i)throw new nr("Failed to read transaction.");if(!i.product)throw new nr("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:async()=>{throw new Ar("State mutation is forbidden in read only mode!")},readOnly:e},this.initialized=!0})();const i=cr.getMap("transactionOwnerIds")||new Map,n=i.get(t);if(n){ur(n);const i=(await A.query({query:Fs,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!i)throw new nr("Failed to read transaction.");if(!i.product)throw new nr("Failed to load transaction, product not available.");return this.currencyCode=i.product.partner?.currencyCode,this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},void(this.initialized=!0)}try{const n=(await A.mutate({mutation:vs,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!n)throw new nr("Failed to read transaction.");if(!n.product)throw new nr("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,n.transactionOwnerId&&(i.set(n.id,n.transactionOwnerId),ur(n.transactionOwnerId),cr.setMap("transactionOwnerIds",i)),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},this.initialized=!0}catch{throw new nr("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,e,A){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot launch experience: Not initialized.");const i=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===ze.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await zn(e.svg))}const i=t.layouts[e].elements.filter((t=>t.type===ze.Textbox));for(let t=0;t<i.length;++t){const e=i[t];e.fontData?.assetUrl&&ii(e.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await hc(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 Vi(t),await i(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=A&&A(t),this.experienceOptions.renderableContextService=new ps(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const e=new zo(this,this.experienceOptions);return await e.getWorkflowManager().getInitializationPromise(),e}if(t){const n=Cr.getShadowGraphqlClient().mutate({mutation:bs,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),r=hc(t);if(await Promise.all([n,r]),this.experienceOptions.workflow=await r,e){const t=JSON.parse(e);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await i(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=dc(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await r),this.experienceOptions.renderableContextService=new ps(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const a=new zo(this,this.experienceOptions);return await a.getWorkflowManager().getInitializationPromise(),a}throw new nr("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function Bc(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 wc{constructor(){Bc(this,"getProduct",void 0),Bc(this,"getCommandContext",void 0),Bc(this,"getAllLayoutData",void 0),Bc(this,"getMetadata",void 0),Bc(this,"getWorkflowMetadata",void 0),Bc(this,"getStepStorage",void 0),Bc(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(){}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){}}function Ec(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 pc;var mc;(mc=pc||(pc={})).SelectFrame="SelectFrame",mc.SelectImage="SelectImage",mc.Position="Position";class Cc extends fo{constructor(t,e){super(t,e),Ec(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const e=this.manager.getRegionElements(this.step.stepName);return _s.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 _s.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,e,A,i){return i&&i.length>1&&void 0===t?pc.SelectFrame:e||A||this.getImageData()?pc.Position:pc.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 fc=t=>{const e=(0,i.useRef)(null),n=(0,i.useRef)(void 0),[r,a]=(0,i.useState)(void 0),{addEvent:s,removeEvent:o,updateEvent:c,eventCache:l}=kr(),[g,h]=(0,i.useState)(!1),[d,u]=(0,i.useState)(!1),{state:B,uiDispatcher:w}=Vr(),E=(0,i.useCallback)((t=>{const e=t;w(new jr({zoom:Math.max(.1,Math.min(e,B.maxZoom))}))}),[w,B.maxZoom]),p=(0,i.useCallback)((t=>{o(t),1===l.length&&(n.current=void 0),2===l.length&&a(void 0);"touch"===t.pointerType&&l.length>1&&l.length-1==1&&(u(!1),h(!1))}),[o,l.length]),m=(0,i.useCallback)((t=>{s(t);"touch"===t.pointerType&&1===l.length&&(w(new jr({selectedElement:void 0})),u(!0),h(!0))}),[s,l.length,w]),C=(0,i.useCallback)((t=>{c(t);const e=1===l.length&&"touch"!==l[0].pointerType,A=2===l.length&&"touch"===l[0].pointerType;if(g&&A){const[t,e]=l,A=Math.abs(t.clientX-e.clientX),i=r;i&&E(B.zoom-.0055*(i-A)),a(A)}if(d&&(e||A)&&t.isPrimary){const e=(n?.current?.x||t.screenX)-t.screenX,A=(n?.current?.y||t.screenY)-t.screenY;w(new jr({selectedElement:void 0,xTranslation:B.xTranslation-e/B.zoom,yTranslation:B.yTranslation-A/B.zoom}))}t.isPrimary&&(n.current={x:t.screenX,y:t.screenY})}),[c,l,g,d,r,E,B.zoom,B.xTranslation,B.yTranslation,w]),f=(0,i.useCallback)((t=>{g&&E(B.zoom-.035*Math.sign(t.deltaY))}),[E,B.zoom,g]);(0,i.useEffect)((()=>{if(!e.current||0===l.length)return;const t=l[0].pointerId,A=e.current.hasPointerCapture(t);d&&!A&&e.current.setPointerCapture(t),!d&&A&&e.current.releasePointerCapture(t)}),[e,d,l]),Ra([" "],(()=>{u(!0),w(new jr({selectedElement:void 0}))}),(()=>u(!1))),Ra(["Control"],(()=>h(!0)),(()=>h(!1)));const Q=(0,i.useMemo)((()=>({cursor:d&&0===l.length?"grab":d&&1===l.length?"grabbing":g?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[d,g,l]);return(0,A.jsx)("div",{ref:e,className:"transform-wrapper",onWheel:f,onPointerDown:m,onPointerUp:p,onPointerCancel:p,onPointerLeave:p,onPointerMove:C,style:Q,children:t.children})};
1176
+ `,hc=async t=>{const e=(await Cr.getShadowGraphqlClient().query({query:nc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}})).data.workflow;return e.steps.forEach((t=>{delete t.data.__typename})),e},dc=(t,e)=>{const A=t.workflowState,i=A?JSON.parse(A):void 0;return i?Object.values(i.layouts).map((t=>t.layout)):e.panels.sort(((t,e)=>t.index-e.index)).map((t=>({id:Te(),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 uc{constructor(t){var e;tc(this,"options",void 0),tc(this,"initialized",void 0),tc(this,"experienceOptions",void 0),tc(this,"currencyCode",void 0),tc(this,"customer",void 0),tc(this,"updateTransactionState",(async t=>{try{return Cr.getShadowGraphqlClient().mutate({...t,mutation:Ss})}catch(t){throw console.error(t),new nr("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(e=this.options.applicationKey,mr=e)}getAssetManager(){return Sr}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(t){const e=cr.getMap("bundleOwnerIds");if(e?.has(t)){const A=e.get(t);return wr(A),Promise.resolve({success:!0,stakeholderType:ea.Owner})}const A=cr.getMap("bundleCustomerIds");if(A?.has(t)){const e=A.get(t);if(e){if(await this.authenticateCustomerId(e)){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=Cr.getShadowGraphqlClient(),A=await e.query({query:rc,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 i=A.data.transactions[0],n=i.product?.partner?.id;if(!n)throw new Error(`Unable to read transaction: ${t}`);if(i.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const r=cr.getMap("transactionOwnerIds");if(r?.has(t)){const e=r.get(t);return ur(e),Promise.resolve({success:!0,stakeholderType:ea.Owner})}const a=cr.getMap("transactionCustomerIds");if(a?.has(t)){const e=a.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 s=(await e.query({query:ac,errorPolicy:"all",variables:{id:i.workflowId}})).data.workflow;if(!s)throw new Error(`Unable to read workflow: ${i.workflowId}`);return Promise.resolve({success:!1,theme:s.overrideTheme,customLogoLink:i.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const e=cr.getMap("transactionCustomerIds");e?.has(t)&&(e.delete(t),cr.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=Cr.getShadowGraphqlClient(),A=(await e.query({query:sc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!A.id){const A=(await e.mutate({mutation:oc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!A)throw new Error("Unable to create customer.");return this.customer=A,{customer:A,isAuthenticated:!1}}const i=await this.authenticateCustomerId(A.id);return{customer:this.customer||A,isAuthenticated:i}}async authenticateCustomerId(t){const e=Cr.getShadowGraphqlClient(),A=cr.getMap("customerTokens");if(!A?.has(t))return!1;const i=A.get(t);if(!i)return!1;const n=(await e.mutate({mutation:cc,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:i}})).data?.customerAuthenticate;return!!n&&(pr(i),this.customer=n,!0)}async generateVerificationCode(t){await Cr.getShadowGraphqlClient().mutate({mutation:lc,variables:{emailAddress:t}})}async verifyCode(t,e){const A=(await Cr.getShadowGraphqlClient().mutate({mutation:gc,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=cr.getMap("customerTokens")||new Map;return e.set(A.id,A.loginToken),cr.setMap("customerTokens",e),pr(A.loginToken),this.customer={...A,loginToken:void 0},!0}return!1}async getNewBundle(){const t=(await Cr.getShadowGraphqlClient().mutate({mutation:Ko})).data?.bundleCreate;if(!t)throw new Error("Unable to create bundle");wr(t.bundleOwnerId);const e=cr.getMap("bundleOwnerIds")||new Map;return e.set(t.id,t.bundleOwnerId),cr.setMap("bundleOwnerIds",e),new _o(this,t.id)}async getExistingBundle(t){const e=await Cr.getShadowGraphqlClient().query({query:jo,variables:{id:t}});if(!e.data?.bundles||0===e.data?.bundles.length||!e.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const A=e.data?.bundles[0],i=cr.getMap("bundleOwnerIds");return i?.has(A.id)&&wr(i.get(A.id)),new _o(this,A.id)}async getWorkflowExperience(t,e,A,i){if(!i)return await this.getWorkflowExperienceDeprecated(t,e,A);const n=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===ze.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await zn(e.svg))}const i=t.layouts[e].elements.filter((t=>t.type===ze.Textbox));for(let t=0;t<i.length;++t){const e=i[t];e.fontData?.assetUrl&&ii(e.fontData.assetUrl)}}},{transaction:r,workflow:a,readOnly:s}=await(async()=>{const t=Cr.getShadowGraphqlClient();if(await t.resetStore(),"transaction"===i.type){const{transactionId:e,readOnly:A}=i,n=await t.query({query:Fs,variables:{id:e},errorPolicy:"all"});if(!n.data?.transactions||0===n.data.transactions.length)throw new nr("Existing transaction not found.");const r=n.data?.transactions[0];if(!r.workflowId)throw new nr("Existing transaction has no workflow ID.");const a=await hc(r.workflowId);if(!r.product)throw new nr("Failed to load transaction, product not available.");return{transaction:r,workflow:a,readOnly:A}}if("integration"===i.type||"external"===i.type){const e=async()=>{const e="integration"===i.type?{integrationProductId:i.integrationProductId}:{externalIntegrationId:i.externalIntegrationId,externalProductId:i.externalProductId},A=await t.mutate({mutation:Ms,variables:{...e,bulk:i.bulk,workflowId:i.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 nr("Failed to create transaction!");const n=A.data.transactionCreate;if(!n.product)throw new nr("Failed to create transaction, product not available.");return n},A=hc(i.workflowId),[n,r]=await Promise.all([e(),A]);return{transaction:n,workflow:r}}throw new nr("No workflow ID provided.")})();if(this.currencyCode=r.product.partner?.currencyCode,this.experienceOptions={product:r.product,transaction:r,layouts:[],stateMutationFunc:s?async()=>{throw new Ar("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:s,workflow:a},"transaction"===i.type&&r.workflowState){const t=JSON.parse(r.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await n(t),this.experienceOptions.reloadedState=t}else if(!s&&i.workflowState){const t=JSON.parse(i.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=dc(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=A&&A(a),this.experienceOptions.renderableContextService=new ps(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]),"transaction"!==i.type){const t=cr.getMap("transactionOwnerIds")||new Map;t.set(r.id,r.transactionOwnerId),ur(r.transactionOwnerId||""),cr.setMap("transactionOwnerIds",t)}else{const t=(cr.getMap("transactionOwnerIds")||new Map).get(r.id);t&&ur(t)}this.initialized=!0;const o=new zo(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),"transaction"!==i.type&&this.customer&&await o.attachCustomerDetails({email:this.customer.emailAddress}),o}async initFromIntegrationProduct(t){if(""===t)throw new nr("No integration product ID provided.");const e=Cr.getShadowGraphqlClient();await e.resetStore();const A=await e.mutate({mutation:Ms,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 nr("Failed to create transaction!");const i=A.data.transactionCreate;if(!i.product)throw new nr("Failed to create transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode;const n=cr.getMap("transactionOwnerIds")||new Map;n.set(i.id,i.transactionOwnerId),ur(i.transactionOwnerId||""),cr.setMap("transactionOwnerIds",n),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,e=!1){if(""===t)throw new nr("No transaction ID provided.");const A=Cr.getShadowGraphqlClient();await A.resetStore();if(e)return await(async()=>{const i=(await A.query({query:Fs,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!i)throw new nr("Failed to read transaction.");if(!i.product)throw new nr("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:async()=>{throw new Ar("State mutation is forbidden in read only mode!")},readOnly:e},this.initialized=!0})();const i=cr.getMap("transactionOwnerIds")||new Map,n=i.get(t);if(n){ur(n);const i=(await A.query({query:Fs,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!i)throw new nr("Failed to read transaction.");if(!i.product)throw new nr("Failed to load transaction, product not available.");return this.currencyCode=i.product.partner?.currencyCode,this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},void(this.initialized=!0)}try{const n=(await A.mutate({mutation:vs,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!n)throw new nr("Failed to read transaction.");if(!n.product)throw new nr("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,n.transactionOwnerId&&(i.set(n.id,n.transactionOwnerId),ur(n.transactionOwnerId),cr.setMap("transactionOwnerIds",i)),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:e},this.initialized=!0}catch{throw new nr("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,e,A){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot launch experience: Not initialized.");const i=async t=>{for(const e in t.layouts){const A=t.layouts[e].elements.filter((t=>t.type===ze.Illustration));for(let t=0;t<A.length;++t){const e=A[t];e.src&&e.svg&&(e.cachedObjectURL=await zn(e.svg))}const i=t.layouts[e].elements.filter((t=>t.type===ze.Textbox));for(let t=0;t<i.length;++t){const e=i[t];e.fontData?.assetUrl&&ii(e.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await hc(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 Vi(t),await i(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=A&&A(t),this.experienceOptions.renderableContextService=new ps(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 zo(this,this.experienceOptions);return await e.getWorkflowManager().getInitializationPromise(),e}if(t){const n=Cr.getShadowGraphqlClient().mutate({mutation:bs,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),r=hc(t);if(await Promise.all([n,r]),this.experienceOptions.workflow=await r,e){const t=JSON.parse(e);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await Vi(t),await i(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=dc(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=A&&A(await r),this.experienceOptions.renderableContextService=new ps(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 a=new zo(this,this.experienceOptions);return await a.getWorkflowManager().getInitializationPromise(),a}throw new nr("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new nr("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function Bc(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 wc{constructor(){Bc(this,"getProduct",void 0),Bc(this,"getCommandContext",void 0),Bc(this,"getAllLayoutData",void 0),Bc(this,"getMetadata",void 0),Bc(this,"getWorkflowMetadata",void 0),Bc(this,"getStepStorage",void 0),Bc(this,"setModelContainer",void 0),Bc(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){}}function Ec(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 i=A.call(t,e||"default");if("object"!=typeof i)return i;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 pc;var mc;(mc=pc||(pc={})).SelectFrame="SelectFrame",mc.SelectImage="SelectImage",mc.Position="Position";class Cc extends fo{constructor(t,e){super(t,e),Ec(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const e=this.manager.getRegionElements(this.step.stepName);return _s.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 _s.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,e,A,i){return i&&i.length>1&&void 0===t?pc.SelectFrame:e||A||this.getImageData()?pc.Position:pc.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 fc=t=>{const e=(0,i.useRef)(null),n=(0,i.useRef)(void 0),[r,a]=(0,i.useState)(void 0),{addEvent:s,removeEvent:o,updateEvent:c,eventCache:l}=kr(),[g,h]=(0,i.useState)(!1),[d,u]=(0,i.useState)(!1),{state:B,uiDispatcher:w}=Vr(),E=(0,i.useCallback)((t=>{const e=t;w(new jr({zoom:Math.max(.1,Math.min(e,B.maxZoom))}))}),[w,B.maxZoom]),p=(0,i.useCallback)((t=>{o(t),1===l.length&&(n.current=void 0),2===l.length&&a(void 0);"touch"===t.pointerType&&l.length>1&&l.length-1==1&&(u(!1),h(!1))}),[o,l.length]),m=(0,i.useCallback)((t=>{s(t);"touch"===t.pointerType&&1===l.length&&(w(new jr({selectedElement:void 0})),u(!0),h(!0))}),[s,l.length,w]),C=(0,i.useCallback)((t=>{c(t);const e=1===l.length&&"touch"!==l[0].pointerType,A=2===l.length&&"touch"===l[0].pointerType;if(g&&A){const[t,e]=l,A=Math.abs(t.clientX-e.clientX),i=r;i&&E(B.zoom-.0055*(i-A)),a(A)}if(d&&(e||A)&&t.isPrimary){const e=(n?.current?.x||t.screenX)-t.screenX,A=(n?.current?.y||t.screenY)-t.screenY;w(new jr({selectedElement:void 0,xTranslation:B.xTranslation-e/B.zoom,yTranslation:B.yTranslation-A/B.zoom}))}t.isPrimary&&(n.current={x:t.screenX,y:t.screenY})}),[c,l,g,d,r,E,B.zoom,B.xTranslation,B.yTranslation,w]),f=(0,i.useCallback)((t=>{g&&E(B.zoom-.035*Math.sign(t.deltaY))}),[E,B.zoom,g]);(0,i.useEffect)((()=>{if(!e.current||0===l.length)return;const t=l[0].pointerId,A=e.current.hasPointerCapture(t);d&&!A&&e.current.setPointerCapture(t),!d&&A&&e.current.releasePointerCapture(t)}),[e,d,l]),Ra([" "],(()=>{u(!0),w(new jr({selectedElement:void 0}))}),(()=>u(!1))),Ra(["Control"],(()=>h(!0)),(()=>h(!1)));const Q=(0,i.useMemo)((()=>({cursor:d&&0===l.length?"grab":d&&1===l.length?"grabbing":g?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[d,g,l]);return(0,A.jsx)("div",{ref:e,className:"transform-wrapper",onWheel:f,onPointerDown:m,onPointerUp:p,onPointerCancel:p,onPointerLeave:p,onPointerMove:C,style:Q,children:t.children})};
1177
1177
  //# sourceMappingURL=main.js.map
package/dist/module.js CHANGED
@@ -439,7 +439,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
439
439
  workflowState
440
440
  }
441
441
  }
442
- `,Jn=A=>{const t=[];for(const e of A.steps)switch(e.type){case D.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Upload});break;case D.Frame:const A=e.data;A.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Upload});break;case D.Illustration:const n=e.data;n.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),n.varyColors&&n.colorPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Colors});break;case D.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selections});break;case D.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Text}),i.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),i.varyColor&&i.colorPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Color})}return t},Ln=[D.SilentIllustration,D.ProductOverlay],On=async(A,t,e)=>{const n=[];A.introduction&&n.push({name:"Introduction",title:A.name,renderableSteps:[{type:D.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const e of A.steps){if(t.bulkScene){let A=!1;switch(e.type){case D.DigitalContent:e.data.varyUpload&&(A=!0);break;case D.Frame:{const t=e.data;!t.varyUpload||!t.varySelection&&e.option||(A=!0)}break;case D.Illustration:{const t=e.data;!t.varySelection&&e.option&&1!==(e.option.variants||[]).length||!t.varyColors&&t.colorPickerEnabled||(A=!0)}break;case D.Material:e.data.varySelection&&(A=!0);break;case D.Model:e.data.varySelection&&(A=!0);break;case D.Picture:e.data.varySelection&&(A=!0);break;case D.Question:e.data.varySelections&&(A=!0);break;case D.Shape:e.data.varySelection&&(A=!0);break;case D.Text:{const t=e.data;!t.varySelection&&e.option&&1!==(e.option.variants||[]).length||!t.varyColor&&t.colorPickerEnabled&&t.colorOption||!t.varyText||(A=!0)}}if(A)continue}const i=Tn(e.stepName,A.stepGroups);if(i){const A=n.find((A=>A.name===i.name));A?Ln.includes(e.type)?A.silentSteps.push(e):A.renderableSteps.push(e):n.push({name:i.name,title:i.name,renderableSteps:Ln.includes(e.type)?[]:[e],silentSteps:Ln.includes(e.type)?[e]:[]})}else n.push({name:e.stepName,title:e.stepTitle,renderableSteps:Ln.includes(e.type)?[]:[e],silentSteps:Ln.includes(e.type)?[e]:[]})}if(t.bulkScene){const i=e?.product?.bulkConfiguration;n.push({name:"Bulk",title:i?.sceneTitle??t.bulkSceneTitle,renderableSteps:[{type:D.Bulk,stepName:"Bulk",stepTitle:i?.stepTitle??t.bulkSceneTitle,helpText:i?.helpText,data:{aspects:Jn(A)},conditions:[]}],silentSteps:[]})}return t.finishScene&&n.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:D.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},Tn=(A,t)=>t.find((t=>t.stepNames.includes(A))),zn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),jn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>zn(A,t))),silentSteps:A.silentSteps.filter((A=>zn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),Kn=async(A,t)=>{const e=jn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===D.Model||t.type===D.Material||t.type===D.Picture||t.type===D.Shape){const A=(t.option?.variants||[]).length;A&&A>1&&n.push(t.stepName)}else n.push(t.stepName);const i=e.filter((A=>A.renderableSteps.filter((A=>n.includes(A.stepName))).length>0));for(const A of i)A.renderableSteps=A.renderableSteps.filter((A=>n.includes(A.stepName)));return i};function Vn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}function Wn(A,t,e,n){const i=e.width*A.zoom,a=e.height*A.zoom;if(n){const n=A,i=Math.max(t.width/e.width,t.height/e.height);n.zoom=Math.max(i,A.zoom);const a=e.width*n.zoom,o=e.height*n.zoom;return n.x=Xn(A.x,t.width-a,0),n.y=Xn(A.y,t.height-o,0),n}const o=A;return o.x=Xn(o.x,-i,t.width),o.y=Xn(o.y,-a,t.height),o}function Xn(A,t,e){return Math.min(Math.max(A,t),e)}class qn{constructor(A){Vn(this,"offsets",void 0),Vn(this,"forceImageCover",void 0),Vn(this,"targetElements",void 0),Vn(this,"imageData",void 0),Vn(this,"frameData",void 0),Vn(this,"_debouncedUpdateFrameOffsets",void 0),Vn(this,"minZoomScale",.03),Vn(this,"maxZoomScale",20),Vn(this,"onFrameDataChangeListeners",void 0),Vn(this,"onZoomChangeListeners",void 0),Vn(this,"workflowManager",void 0),Vn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await N(t.currentFrameSource);OA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=M.get(A);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(A){this.offsets=A}setZoom(A,t,e,n){if(this.imageData&&this.offsets&&this.frameData){const i=(t-this.offsets.x)/this.offsets.zoom,a=(e-this.offsets.y)/this.offsets.zoom,o={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Wn(o,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((t=>t(A)))}}setPatternData(A){(A&&this.frameData||A&&this.frameData&&!this.imageData)&&(this.offsets=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Wn(this.offsets,this.frameData,A,this.forceImageCover))),this.imageData=A,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(A,t){const e=this.imageData;e&&this.frameData&&(this.offsets&&A.x===this.offsets.x&&A.y===this.offsets.y&&A.zoom===this.offsets.zoom?t&&t():(this.offsets=Wn(A,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(A,e,this.frameData,this.targetElements,t)))}onFrameDataChanged(A){A(this.frameData),this.onFrameDataChangeListeners.push(A)}onZoom(A){this.onZoomChangeListeners.push(A)}updateFrameOffsets(A,t,e,n,i){if(!e)throw new ot("Frame data not set. This is a bug");if(!this.workflowManager)throw new ot("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class $n{constructor(A,t,e){Zn(this,"configuration",void 0),Zn(this,"layouts",void 0),Zn(this,"product",void 0),Zn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new tt(A);let e="";if(this.configuration.type===D.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new it(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===E.Image){const e=this.configuration.type===D.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!e)throw new Error("Undefined raster silent step source");const i={stepName:this.configuration.stepName,id:F(),src:e,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,productOverlay:this.configuration.type===D.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new o(i,t)}}{const i=this.configuration.type===D.SilentIllustration?this.configuration.data.asset?.fileLink:e,a=async()=>new Promise(((A,t)=>{i?nA(i).then((t=>{A(t)})).catch((A=>console.error(A))):t("Undefined vector silent step source")})),r=await x(await a()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await dA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===D.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:A},command:new o(s,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new it(this.configuration,"Missing regions.");if(this.configuration.type===D.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===D.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new tt(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===D.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?E.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),E.Illustration)}}const _n=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ct("Failed to shorten URL, see console.")}};function Ai(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class ti{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(A){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(A,t,e,n=3e3,i=10){Ai(this,"pollingId",void 0),Ai(this,"attempts",void 0),Ai(this,"interval",void 0),Ai(this,"maxAttempts",void 0),Ai(this,"predicate",void 0),Ai(this,"onSuccess",void 0),Ai(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=e,this.predicate=A,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=i,this.poll()}}const ei=new class{async init(A,t,e){return e&&await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{const e=n?.storage?.videoShortUrl,i=n?.storage?.videoUrl;t.updateStorage(A.stepName,{videoShortUrl:e,videoUrl:i})}))}async regenerateQRCode(A,t,e,n,i,a,o,r,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await vt([e]))[0],t=A?.versions?.find((A=>"mpeg4"===A.name))?.link;return{asset:A,link:t}},g=await new Promise(((A,e)=>{new ti((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link)throw new nt(e.asset);A({rel:"mpeg4",href:e.link})}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new s(A.id))));const l="http"===a.data.baseUrl.slice(0,4)?"":"https://",B=new URL(l+a.data.baseUrl);B.searchParams.append("video",btoa(JSON.stringify([g]))),B.pathname=B.pathname+("/"===B.pathname.slice(-1)?"":"/");const w=B.toString();if(w.length>=2e3)throw new ct("Cannot create QR code, URL too long.");const d=await _n(w);if(o(d),!a.data||!a.data.regions)throw new it(a,"Missing regions.");const E=await this.regionElements(a),h=await this.command(d,E,i,a.stepName);h&&(h.command&&i.getCommandDispatcher()(h.command),h.followup&&await h.followup()),await i.setSelectionsAndElements(a.stepName,[],E,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:d,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:F(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await KA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new tt(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new o({stepRegion:t,stepName:n,id:A.id,src:a,type:E.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new w(r),followup:async()=>{}}}};function ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const ii=new class{constructor(){ni(this,"frameSourceSvg",(async(A,t)=>{if(!A)return hA(t.data.regions[0]);const e=A.asset;if(!e)throw new et(A);const n=e.fileLink;if(n)return nA(n);throw new nt(e)}))}async init(A,t,e){if(e)return await this.reload(A,t,e),null;if(t.setMandatoryFulfilled(A.stepName,!1),t.markStepsAsInitialised([A.stepName]),A.option&&A.option.variants&&A.option.variants.length>0){const e=A.option,n=kt.getDefaultVariant(e);return n?this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageUrl):null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageUrl)}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));if(!A.option||0===(A.option.variants||[]).length){const e=hA(A.data.regions[0]);t.updateStorage(A.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,i=n.storage?.frameOffsets;if(t.updateMetadata(A.stepName,{frameOffsets:i,framePatternSrc:e}),e){const n=t.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(e,n),t.updateMetadata(A.stepName,{image:e}),t.updateStorage(A.stepName,{framePatternSrc:e})}if(i?.zoom){const e=t.getStepSpecificServices(A.stepName)?.frameService;e.updateOffsets(i)}t.setMandatoryFulfilled(A.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const a=n.selectedVariants[0].id;if(A.option&&a){const n=A.option.variants?.find((A=>A.id===a));n&&await t.setSelectionsAndElements(A.stepName,[n],i,(async()=>{const i=await this.frameSourceSvg(n,A);t.updateStorage(A.stepName,{currentFrameSource:i}),await e()}))}}else await t.setSelectionsAndElements(A.stepName,[],i,e)}}selectImage(A,t,e){e.setEditedStatus(A.stepName,!0);(t.fileLink||"").endsWith("pdf")?e.addPoller(new ti((async()=>{const A=(await Ht.getLocalOrFromServer(t.key||"")).versions?.find((A=>"svg"===A.name));if(!A)return!1;return 200===(await fetch(A.link)).status}),(()=>{Ht.getLocalOrFromServer(t.key||"").then((t=>{this.loadPatternFromAsset(t,A,e)}))}),(()=>{throw new ct("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new o({id:A,type:E.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await QA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await sA(A),n=await S(e),i={src:A,width:n.width,height:n.height,aspect:n.width/n.height};G.set(A,i),t.setPatternData(i)}}async selectVariantCommand(A,t,e,n,i,a){const o=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await N(r),g=o.getImageData(),l=e.map((A=>new s(A.id))),B=g?AA(g,c):void 0,d=g?{id:F(),src:g.src,x:B?.x||0,y:B?.y||0,width:g.width,height:g.height,scaleX:B?.zoom||1,scaleY:B?.zoom||1,rotation:0}:void 0;i&&i(!0);const E=A.data.regions.map((t=>{const e=F(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new tt(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:d,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),h=E.map((A=>A.command));return{command:new w([...h,...l]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...E.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:r}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.versions?.find((A=>"svg"===A.name));if(t)return t.link;const e=A.fileLink;if(e)return e;throw new nt(A)}async loadPatternFromAsset(A,t,e){const n=this.patternSource(A),i=e.markUpdatePending(),a=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(n,a),e.updateMetadata(t.stepName,{image:n}),e.updateStorage(t.stepName,{framePatternSrc:n}),e.markUpdateCompleted(i)}};const ai=new class{async getIllustrationBody(A){return new Promise((t=>{nA(A).then((A=>{t(A)})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new o({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:E.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return y(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=A.option;if(!n)return null;if(e)return this.reload(A,t,e);{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantCommand(A,e,[],(()=>{}),t)}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const o=a.variants?.find((A=>A.id===e));if(o){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[o],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){const e=A.data.colorOption;return e&&e?e.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async changeColorsCommand(A,t,e,n,i){const a={};for(const[A,t]of i.entries())a[A]={browserValue:t,spotColor:a[A]?.spotColor};const o=CA(A,t,e,a),r=await dA(o),s=[];for(const A of n){for(const[t,e]of i.entries())s.push(new uA(A,t,e));s.push(new mA(A,o,r))}return new w(s)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=y(t[0].id,n().map((A=>A.layoutState))),o={...a.colors},r={};Object.entries(o).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[A]=e}));for(const[A,t]of i.entries())o[A]={browserValue:t,spotColor:o[A]?.spotColor},r[A]={browserValue:t};let s=Array.from(Object.values(o)).map((A=>A.browserValue));const c=A.data.colorOption;c&&c.variants?.forEach((A=>{s=s.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:s});const g=new Map;if(Object.entries(o).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(l)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new it(A,"Missing regions.");n(!0);const a=e.map((A=>new s(A.id)));i.setMandatoryFulfilled(A.stepName,!1);const o=t.asset;if(!o)throw new et(t);const r=o.fileLink;if(!r)throw new nt(o);const c=await x(await this.getIllustrationBody(r)),g=await dA(c.svg),l=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new tt(t);const n=F();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r,objectURL:g,svg:c})}})),B=[...l.map((A=>A.command)),...a];let d=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const E=A.data.colorOption;return E&&E.variants?.forEach((A=>{d=d.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:d}),{command:new w(B),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],l.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const oi=new class{async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(e)await this.reload(A,t,e);else{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(!a)throw new At(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants?.find((A=>A.id===e));if(n){const e=n.material,o=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],o,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((A=>n.applyMaterialVariant(A,a.id,e)));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getPreviewService();n(!0);const a=t.material;if(!a)throw n(!1),new et(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{A.option&&i.applyMaterialVariant(t,A.option.id,a)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const ri=new class{async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(e)await this.reload(A,t,e);else{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getPreviewService();if(e&&A.option){const i=n.asset?.fileLink;if(!i)throw new et(n);await e.applyModelVariant(A.option.id,{model:i,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=t.asset?.fileLink;if(!i)throw new et(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&A.option&&t.applyModelVariant(A.option.id,{model:i,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const si=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||F(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new s(a)),c.push(new o({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:E.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},r)),{id:a,region:n,command:new w(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new w(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new w(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=XA(t.toLowerCase());for(const A of i)for(const t in e){if(A===e[t].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const ci=new class{async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,n.defaultVariant,t,(()=>{}));return t.markStepsAsInitialised([A.stepName]),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=t.asset;if(!i)throw new et(t);const a=i?.fileLink;if(!a)return console.error("No URL for picture!"),null;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new s(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new tt(t);const i=F();return{regionElement:{id:i,region:t},command:new o({stepName:A.stepName,stepRegion:t,id:i,src:a,type:E.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new w([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const gi=new class{async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.variants;if(kt.getDefaultVariant(n)){const i=e?.find((A=>A.id===n.defaultVariant?.id));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((A=>A.id===e));n&&await t.setSelectionsAndElements(A.stepName,[n],[])}}}async selectVariant(A,t,e){await e.getInitializationPromise();const n=await this.selectVariantLambda(A,t,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(A,t,e){const n=A.option;if(!n)return null;const i=n.variants;if(!i)return null;const a=i.length>1?i.find((A=>A.id===t)):i[0];if(!a)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[a],[],(async()=>{e.setMandatoryFulfilled(A.stepName,!0)}))}}}};const li=new class{async availableColours(A){const t=A.option;return t&&t.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A})))||[]}async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(!e){const e=kt.getDefaultVariant(n);if(!e)return null;const i={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(A,i,[],t)}return await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.updateStorage(A.stepName,{colour:n.color||""}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=n.getLayouts();if(e.length>0){const a=A=>{const e=A.region;if(!i.find((A=>A.panelId===e?.panelId)))throw new tt(e);const n=t.variant?.color;return n?new uA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},o=e.map(a).filter((A=>!!A));return{command:new w(o),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new tt(e);const a=`\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="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const s=F();return{id:s,region:e,command:new o({stepRegion:e,stepName:A.stepName,colors:r,id:s,svg:a,type:E.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:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),s=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new w(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],s,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Bi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class wi extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=wi.name}}const di=["‘","’","“","”","\n"];class Ei extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Ei.name}}const hi=new class{constructor(){Bi(this,"cachedColors",new Map),Bi(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?DA(t):void 0;if(i){const A=e.split("").filter((A=>!di.includes(A))).join(""),t=A.split("").map((A=>i.getFont().charToGlyph(A)));for(let e=0;e<t.length;e++){".notdef"===t[e].name&&n.push(String.fromCharCode(A.charCodeAt(e)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Bi(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Bi(this,"getErrorsForText",((A,t,e)=>{const n=[];t.data&&t.data.maxLength&&A.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const i=e.getProfanities(),a=XA(A.toLowerCase());for(const A of a)for(const t in i){if(A===i[t].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(A.includes("\n")||A.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else{const e=this.getDefaultImageFillVariant(A.data),i=e?.asset?.fileLink,a=i?await Z(i):void 0,o=a?{src:a.src,height:a.height,width:a.width,scale:A.data.imageFillScale||1}:void 0;t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data))?.color||await this.getDefaultColor(A.data),fillImage:o}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data))?.name||await this.getDefaultColor(A.data),fillImage:e?.name});const r=kt.getDefaultVariant(n);if(r)return this.selectVariantCommand(A,r,{},[],t,(()=>{}),(()=>{}),o)}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>y(t.id,A.getAllLayoutData())))}availableFillColors(A){const t=this.cachedColors.get(A.stepName);if(t)return t;const e=A.data.colorOption;if(e){const t=e.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A})))||[];return this.cachedColors.set(A.stepName,t),t}return[]}async changeFillColor(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=A.data.colorOption,o=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.colorProfile?.key}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,o))}}async availableFillImages(A){const t=A.data.imageFillOption;if(t){const e=t.variants?.map((A=>A.asset?.fileLink))?.filter((A=>!!A))||[];return Promise.all(e.map((async t=>{const e=await Z(t);return{src:t,width:e.width,height:e.height,scale:A.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher(),a=A.option?.variants?.find((A=>A.asset?.fileLink===t.src));n.updateMetadata(A.stepName,{fillImage:a?.name}),n.updateStorage(A.stepName,{fillImage:t});for(const A of e){i(new pA(A.id,t))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return lA(n,{vertical:t.vertical,uppercase:t.uppercase})}updateInputText(A,t,e,n){const i=n.getStepStorage(e.stepName),a=this.getProcessedInput(A,e.data,!!i.customiseAllText),o={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(o.errors.length>0)return o.helperText=o.errors[0].localizationKey,o;const r=(e.data.maxLength-a.length).toString();o.helperText=`${r} characters remaining`;const s=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const A of t){if(!A.fontData)throw new ot("Failed to resolve font data for text.");const[t,n]=P(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),l.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,s))}if(!e.data.curved&&t.length>0){if(!Array.from(l.values()).every((A=>A)))return o.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),o}return n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),o.command=new w(c),o.command.varying=s,o}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e.getStepStorage(A.stepName)||{},e.getRegionElements(A.stepName),e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}createTextFillSpotColor(A,t){const e=A.colorProfile;if(e){const A=(e.name||"").replace(/\s/g,"-"),n=A.lastIndexOf("/"),i=A.slice(n+1).slice(0,-4);if(!t.namedColor)throw new Error("variant named color not set!");return{profileName:i,namedColor:t.namedColor}}}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const o=a.variants?.find((A=>A.id===e));if(o){const e=await this.fontDataFromVariant(o),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,s=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[o],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:s}),t.updateStorage(A.stepName,{text:s,inputText:s});const n=i.map((A=>new B(A.id,e))),a=new w(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=hi.updateInputText(s||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A){const t=A.colorOption;if(t)return kt.getDefaultVariant(t)}async getDefaultColor(A){const t=A.colorOption;if(!t)return;return kt.getDefaultVariant(t)?.color}getDefaultImageFillVariant(A){const t=A.imageFillOption;if(t)return kt.getDefaultVariant(t)}async fontDataFromVariant(A){const t=A.asset;if(!t)throw new et(A);const e=t.fileLink;if(!e)throw new nt(t);return{assetUrl:e,name:(await U(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,o,r){const s=i.markUpdatePending(),c=await this.fontDataFromVariant(t);if(n.length>0){const g=n.map((A=>new B(A.id,c)));if(r){const A=n.map((A=>new pA(A.id,r)));g.push(...A)}const l=await this.changeInputTextWithRegion(A,A.data.size||30,c,e.text||"",e,i,!!e.customiseAllText,a,o);l&&g.push(l);return{command:new w(g),followup:async()=>{i.markUpdateCompleted(s),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,c,e,i),g=await this.changeInputTextWithRegion(A,A.data.size||30,c,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,o),l=n.flatMap((A=>A.commands));if(r){const A=n.map((A=>new pA(A.regionElement.id,r)));l.push(...A)}g&&l.push(g);return{command:new w(l),followup:async()=>{i.markUpdateCompleted(s)}}}}injectReplaceableText(A,t){return t.replaceableText?t.replaceableText.replace("{{}}",A):A}async createTextboxRegions(A,t,e,n,i,a){if(!e||!e.regions)throw new Error("Step data not supplied");const r=a.getTransaction().bulk&&e.varyText||!1,s=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(s,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),l=F();try{if(!g)throw new Ei("Failed to find layout for region: "+t.panelId);const B=e.colorOption;let w;if(B&&B.variants){const t=B.variants.find((A=>A.id===B.defaultVariant?.id))||B.variants[0];w=this.createTextFillSpotColor(B,t),a.updateStorage(A,{colorProfileAssetKey:B.colorProfile?.key})}const d=await this.getDefaultColor(e),h=d||"#000000",Q={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:h,fontSize:e.size||30,fontData:n,id:l,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:s,type:E.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:w},C=[],u=new Map,m=new Map;if(!Q.fontData)throw new ot("Failed to resolve font data for text.");const[D,p]=P(Q.fontSize,Q.fontData,{left:Q.x,top:Q.y,width:Q.width,height:Q.height,rotation:Q.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});u.set(Q.id,D),m.set(Q.id,p);const I=e.curved||e.vertical?c:(p||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(D,e,Q.id,I,r));const f=new o(Q,g);return f.varying=r,{regionElement:{id:l,region:t},commands:[f,...C],newElement:Q,fontData:n}}catch(A){throw console.log(A),new wi("Error adding font to region")}}))).catch((A=>{throw A instanceof wi?(ce.setLatestToast("Failed to load font.",Ci.Error),A):A instanceof Ei?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:s}),a.updateStorage(A,{text:s})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],o=new p(e,n);if(o.varying=i,a.push(o),!t.size){const t=new l(e,A);t.varying=i,a.push(t)}const r=new w(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,o,r,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,A.data,o),B=a.getRegionElements(A.stepName),d=new Map,E=new Map;for(const n of B)if(n.region){const[i,a]=P(t,e,n.region,[l],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});d.set(n.id,i),E.set(n.id,a)}const h=(()=>{if(A.data&&A.data.maxLength&&l.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=a.getProfanities(),e=XA(l.toLowerCase());for(const A of e)for(const e in t){if(A===t[e].toLowerCase().replace(/\s/g,""))return r(!0),{error:"Blocked profanity."}}if(!A.data.vertical&&!A.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(E.values()).every((A=>A)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(A.data.maxLength-l.length).toString()}})();if(h.error)return void s(h.error);if(s(`${h.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const Q=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const C=[];for(const t of B){const e=A.data.curved?l:(E.get(t.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(d.get(t.id)||1,A.data,t.id,e,Q))}const u=new w(C);return u.varying=Q,u}};function Qi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let Ci;var ui;(ui=Ci||(Ci={})).Error="Error",ui.Warning="Warning",ui.Info="Info";class mi extends Oe{constructor(A){super(),Qi(this,"update",void 0),Qi(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Di{constructor(A,t,e,n,i,a,o,r,s,c,g=!1){Qi(this,"reloadedState",void 0),Qi(this,"transaction",void 0),Qi(this,"ownerCustomer",void 0),Qi(this,"updateTransaction",void 0),Qi(this,"confirmedDesign",void 0),Qi(this,"editedSteps",void 0),Qi(this,"informationResults",void 0),Qi(this,"layouts",void 0),Qi(this,"mandatorySteps",void 0),Qi(this,"pendingUpdates",void 0),Qi(this,"selectionCost",void 0),Qi(this,"workflow",void 0),Qi(this,"stepSpecificServices",void 0),Qi(this,"previewService",void 0),Qi(this,"profanityFilter",void 0),Qi(this,"pollers",void 0),Qi(this,"commandContext",void 0),Qi(this,"stepElements",void 0),Qi(this,"stepInitialised",void 0),Qi(this,"stepMetadata",void 0),Qi(this,"stepSelections",void 0),Qi(this,"storage",void 0),Qi(this,"confirmCallbacks",void 0),Qi(this,"editedCallbacks",void 0),Qi(this,"elementsCallbacks",void 0),Qi(this,"informationResultCallbacks",void 0),Qi(this,"initCallbacks",void 0),Qi(this,"makingAdjustmentsCallback",void 0),Qi(this,"mandatoryCallbacks",void 0),Qi(this,"metadataCallbacks",void 0),Qi(this,"selectionCallbacks",void 0),Qi(this,"stepSpecificStorageCallbacks",void 0),Qi(this,"storageCallbacks",void 0),Qi(this,"currentVariationRecordCallbacks",void 0),Qi(this,"variationRecordCallbacks",void 0),Qi(this,"allScenes",void 0),Qi(this,"product",void 0),Qi(this,"invalidModelVariants",void 0),Qi(this,"currentAdjustingStepId",void 0),Qi(this,"renderableContextService",void 0),Qi(this,"workflowStatePromiseQueue",new Te(1)),Qi(this,"variationRecords",[]),Qi(this,"currentVariationRecord",void 0),Qi(this,"initializationPromise",void 0),Qi(this,"initialized",!1),Qi(this,"readOnly",!1),Qi(this,"render3DScene",(()=>{if(!this.previewService)return;const A=this.getCommandContext().getAllLayouts(),t=this.getLayoutPreviewService()?.getAll();if(t)for(const[,e]of t)e.render(this.getWorkflow(),A,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=i,this.commandContext=n,this.reloadedState=c,this.transaction=a,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=o,this.previewService=r,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.initializationPromise=this.initializeDefaultWorkflowState(A,a),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((A=>{throw console.error(A),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(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await On(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},t);const e=jn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new w(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.previewService?.executeModelAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>A.recordNumber=t+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.find((t=>t.recordNumber===A.recordNumber));t&&(t.values=A.values,this.onVariationRecordsChange())}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(A){this.ownerCustomer=A}setTransactionCustomerDetails(A){this.ownerCustomer={...this.ownerCustomer,emailAddress:A.email}}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getWorkflowSelections(){const A={};return this.workflow.steps.forEach((t=>{const e=this.stepSelections[t.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(A[t.stepName]={selections:e.selectedVariants})})),A}markStepsAsInitialised(A){const t={...this.stepInitialised};A.forEach((A=>{t[A]=!0})),this.stepInitialised=t,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(A){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==A))}markUpdatePending(){const A=F();return this.pendingUpdates=[...this.pendingUpdates,A],A}setEditedStatus(A,t){this.editedSteps={...this.editedSteps,[A]:t},this.onEditedChange()}setInformationResults(A){this.informationResults=[...A],this.onInformationResultChange()}setCurrentAdjustingStepId(A){this.currentAdjustingStepId=A,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(A,t){this.mandatorySteps[A]!==t&&(this.mandatorySteps={...this.mandatorySteps,[A]:t},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}async updateStorage(A,t){const e={...this.storage,[A]:{...this.storage[A],...t}};if(!OA(e,this.storage)){this.storage=e;const t=new EA(this.constructSerializableWorkflow());this.commandContext.apply(t,!0),this.onStepSpecificStorageChange(A),this.onStorageChange()}}constructSerializableWorkflow(){const A=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const e={stepName:t.stepName};e.storage=this.storage[t.stepName],e.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((A=>({id:A.id,priceModifier:A.priceModifier}))),A.push(e)}))})),{steps:A}}updateStateWithServer(){if(this.readOnly)return;const A=this.serialize();this.workflowStatePromiseQueue.enqueue(new mi((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new mi((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new ot("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(zn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"===t.type&&t.option?.id&&!zn(t,this.stepSelections)&&A.push(t.option.id),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===D.SilentIllustration){return{step:A,results:await new $n(A,t).trigger()}}if(A.type===D.ProductOverlay){return{step:A,results:await new $n(A,t,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},i=A.filter((A=>!this.stepInitialised[A.stepName])),a={stepElements:{},commands:[]},o=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||o.push(n(A,this.layouts,e));const r=await Promise.all(o);for(const A of r)a.stepElements[A.step.stepName]=A.results.map((A=>A.regionElement)),a.commands=[...a.commands,...A.results.map((A=>A.command))];return a}getStepStorage(A){return this.storage[A]}getMetadata(A){return this.stepMetadata[A]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(A,t){return t.find((t=>t.stepName===A))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((A=>A.layoutState.elements.forEach((A=>{this.getCommandDispatcher()(new s(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier||0)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{zn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,o=jn(a,i),r=jn(a,this.stepSelections),c=o.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{zn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:B,commands:d}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...B,[A]:e},this.removeElements(l);if(this.workflow.steps.find((t=>t.stepName===A))?.type===D.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const E=[...d,...l.map((A=>new s(A.id))),new EA(this.constructSerializableWorkflow())];E.length>0&&this.commandContext.apply(new w(E),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=jn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case D.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case D.DigitalContent:A.push(ei.init(e,this,this.reloadedState));break;case D.Frame:case D.Photo:{const t=new qn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(ii.init(e,this,this.reloadedState))}break;case D.Illustration:A.push(ai.init(e,this,this.reloadedState));break;case D.Material:A.push(oi.init(e,this,this.reloadedState));break;case D.Model:A.push(ri.init(e,this,this.reloadedState));break;case D.Module:this.stepSpecificServices[e.stepName]={module:await gn(e.data.module)},A.push(si.init(e,this,this.reloadedState));break;case D.Picture:A.push(ci.init(e,this,this.reloadedState));break;case D.Question:A.push(gi.init(e,this,this.reloadedState));break;case D.Shape:A.push(li.init(e,this,this.reloadedState));break;case D.Text:A.push(hi.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new w(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)})),this.render3DScene()}traversableScenes(){return Kn(this.allScenes,this.stepSelections)}}function pi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Ii{constructor(A){pi(this,"variantData",void 0),this.variantData=A}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(A,t){return this.variantData.priceModifier.toLocaleString(A||"en-US",{style:"currency",currency:"USD",...t})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.thumbnail?.versions?.find((A=>"cdn"===A.name))?.link}getThumbnail(){const A=this.variantData.thumbnail?.versions?.find((A=>"thumbnail"===A.name));return A?A.link:this.variantData.asset?.versions?.find((A=>"thumbnail"===A.name))?.link}getDisplayImage(){return this.variantData.displayImage?.versions?.find((A=>"medium"===A.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function fi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class yi{constructor(A,t){fi(this,"manager",void 0),fi(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){yi.updateState.set(this.step.stepName,A)}getUpdateState(){return!!yi.updateState.get(this.step.stepName)}getCurrentVariant(){const A=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(A)return new Ii(A)}getAvailableVariants(){return(this.step.option?.variants?.filter((A=>A.enabled))||[]).map((A=>new Ii(A)))}getAllVariants(){return(this.step.option?.variants||[]).map((A=>new Ii(A)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}executeAnimations(){const A=this.manager.getPreviewService(),t=this.step.data.modelAnimation,e=this.step.data.lookAtAnimation;A&&(e&&A.executeCameraAnimation(e),t&&A.executeModelAnimation(t))}}function Mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}fi(yi,"updateState",new Map);const Fi=IA`
442
+ `,Jn=A=>{const t=[];for(const e of A.steps)switch(e.type){case D.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Upload});break;case D.Frame:const A=e.data;A.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Upload});break;case D.Illustration:const n=e.data;n.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),n.varyColors&&n.colorPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Colors});break;case D.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selections});break;case D.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection});break;case D.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Text}),i.varySelection&&e.option&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Selection}),i.varyColor&&i.colorPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:m.Color})}return t},Ln=[D.SilentIllustration,D.ProductOverlay],On=async(A,t,e)=>{const n=[];A.introduction&&n.push({name:"Introduction",title:A.name,renderableSteps:[{type:D.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const e of A.steps){if(t.bulkScene){let A=!1;switch(e.type){case D.DigitalContent:e.data.varyUpload&&(A=!0);break;case D.Frame:{const t=e.data;!t.varyUpload||!t.varySelection&&e.option||(A=!0)}break;case D.Illustration:{const t=e.data;!t.varySelection&&e.option&&1!==(e.option.variants||[]).length||!t.varyColors&&t.colorPickerEnabled||(A=!0)}break;case D.Material:e.data.varySelection&&(A=!0);break;case D.Model:e.data.varySelection&&(A=!0);break;case D.Picture:e.data.varySelection&&(A=!0);break;case D.Question:e.data.varySelections&&(A=!0);break;case D.Shape:e.data.varySelection&&(A=!0);break;case D.Text:{const t=e.data;!t.varySelection&&e.option&&1!==(e.option.variants||[]).length||!t.varyColor&&t.colorPickerEnabled&&t.colorOption||!t.varyText||(A=!0)}}if(A)continue}const i=Tn(e.stepName,A.stepGroups);if(i){const A=n.find((A=>A.name===i.name));A?Ln.includes(e.type)?A.silentSteps.push(e):A.renderableSteps.push(e):n.push({name:i.name,title:i.name,renderableSteps:Ln.includes(e.type)?[]:[e],silentSteps:Ln.includes(e.type)?[e]:[]})}else n.push({name:e.stepName,title:e.stepTitle,renderableSteps:Ln.includes(e.type)?[]:[e],silentSteps:Ln.includes(e.type)?[e]:[]})}if(t.bulkScene){const i=e?.product?.bulkConfiguration;n.push({name:"Bulk",title:i?.sceneTitle??t.bulkSceneTitle,renderableSteps:[{type:D.Bulk,stepName:"Bulk",stepTitle:i?.stepTitle??t.bulkSceneTitle,helpText:i?.helpText,data:{aspects:Jn(A)},conditions:[]}],silentSteps:[]})}return t.finishScene&&n.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:D.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},Tn=(A,t)=>t.find((t=>t.stepNames.includes(A))),zn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),jn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>zn(A,t))),silentSteps:A.silentSteps.filter((A=>zn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),Kn=async(A,t)=>{const e=jn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===D.Model||t.type===D.Material||t.type===D.Picture||t.type===D.Shape){const A=(t.option?.variants||[]).length;A&&A>1&&n.push(t.stepName)}else n.push(t.stepName);const i=e.filter((A=>A.renderableSteps.filter((A=>n.includes(A.stepName))).length>0));for(const A of i)A.renderableSteps=A.renderableSteps.filter((A=>n.includes(A.stepName)));return i};function Vn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}function Wn(A,t,e,n){const i=e.width*A.zoom,a=e.height*A.zoom;if(n){const n=A,i=Math.max(t.width/e.width,t.height/e.height);n.zoom=Math.max(i,A.zoom);const a=e.width*n.zoom,o=e.height*n.zoom;return n.x=Xn(A.x,t.width-a,0),n.y=Xn(A.y,t.height-o,0),n}const o=A;return o.x=Xn(o.x,-i,t.width),o.y=Xn(o.y,-a,t.height),o}function Xn(A,t,e){return Math.min(Math.max(A,t),e)}class qn{constructor(A){Vn(this,"offsets",void 0),Vn(this,"forceImageCover",void 0),Vn(this,"targetElements",void 0),Vn(this,"imageData",void 0),Vn(this,"frameData",void 0),Vn(this,"_debouncedUpdateFrameOffsets",void 0),Vn(this,"minZoomScale",.03),Vn(this,"maxZoomScale",20),Vn(this,"onFrameDataChangeListeners",void 0),Vn(this,"onZoomChangeListeners",void 0),Vn(this,"workflowManager",void 0),Vn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await N(t.currentFrameSource);OA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=M.get(A);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(A){this.offsets=A}setZoom(A,t,e,n){if(this.imageData&&this.offsets&&this.frameData){const i=(t-this.offsets.x)/this.offsets.zoom,a=(e-this.offsets.y)/this.offsets.zoom,o={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Wn(o,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((t=>t(A)))}}setPatternData(A){(A&&this.frameData||A&&this.frameData&&!this.imageData)&&(this.offsets=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Wn(this.offsets,this.frameData,A,this.forceImageCover))),this.imageData=A,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(A,t){const e=this.imageData;e&&this.frameData&&(this.offsets&&A.x===this.offsets.x&&A.y===this.offsets.y&&A.zoom===this.offsets.zoom?t&&t():(this.offsets=Wn(A,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(A,e,this.frameData,this.targetElements,t)))}onFrameDataChanged(A){A(this.frameData),this.onFrameDataChangeListeners.push(A)}onZoom(A){this.onZoomChangeListeners.push(A)}updateFrameOffsets(A,t,e,n,i){if(!e)throw new ot("Frame data not set. This is a bug");if(!this.workflowManager)throw new ot("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class $n{constructor(A,t,e){Zn(this,"configuration",void 0),Zn(this,"layouts",void 0),Zn(this,"product",void 0),Zn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new tt(A);let e="";if(this.configuration.type===D.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new it(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===E.Image){const e=this.configuration.type===D.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!e)throw new Error("Undefined raster silent step source");const i={stepName:this.configuration.stepName,id:F(),src:e,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,productOverlay:this.configuration.type===D.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new o(i,t)}}{const i=this.configuration.type===D.SilentIllustration?this.configuration.data.asset?.fileLink:e,a=async()=>new Promise(((A,t)=>{i?nA(i).then((t=>{A(t)})).catch((A=>console.error(A))):t("Undefined vector silent step source")})),r=await x(await a()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await dA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===D.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:A},command:new o(s,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new it(this.configuration,"Missing regions.");if(this.configuration.type===D.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===D.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new tt(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===D.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?E.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),E.Illustration)}}const _n=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ct("Failed to shorten URL, see console.")}};function Ai(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class ti{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(A){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(A,t,e,n=3e3,i=10){Ai(this,"pollingId",void 0),Ai(this,"attempts",void 0),Ai(this,"interval",void 0),Ai(this,"maxAttempts",void 0),Ai(this,"predicate",void 0),Ai(this,"onSuccess",void 0),Ai(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=e,this.predicate=A,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=i,this.poll()}}const ei=new class{async init(A,t,e){return e&&await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{const e=n?.storage?.videoShortUrl,i=n?.storage?.videoUrl;t.updateStorage(A.stepName,{videoShortUrl:e,videoUrl:i})}))}async regenerateQRCode(A,t,e,n,i,a,o,r,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await vt([e]))[0],t=A?.versions?.find((A=>"mpeg4"===A.name))?.link;return{asset:A,link:t}},g=await new Promise(((A,e)=>{new ti((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link)throw new nt(e.asset);A({rel:"mpeg4",href:e.link})}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new s(A.id))));const l="http"===a.data.baseUrl.slice(0,4)?"":"https://",B=new URL(l+a.data.baseUrl);B.searchParams.append("video",btoa(JSON.stringify([g]))),B.pathname=B.pathname+("/"===B.pathname.slice(-1)?"":"/");const w=B.toString();if(w.length>=2e3)throw new ct("Cannot create QR code, URL too long.");const d=await _n(w);if(o(d),!a.data||!a.data.regions)throw new it(a,"Missing regions.");const E=await this.regionElements(a),h=await this.command(d,E,i,a.stepName);h&&(h.command&&i.getCommandDispatcher()(h.command),h.followup&&await h.followup()),await i.setSelectionsAndElements(a.stepName,[],E,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:d,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:F(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await KA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new tt(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new o({stepRegion:t,stepName:n,id:A.id,src:a,type:E.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new w(r),followup:async()=>{}}}};function ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const ii=new class{constructor(){ni(this,"frameSourceSvg",(async(A,t)=>{if(!A)return hA(t.data.regions[0]);const e=A.asset;if(!e)throw new et(A);const n=e.fileLink;if(n)return nA(n);throw new nt(e)}))}async init(A,t,e){if(e)return await this.reload(A,t,e),null;if(t.setMandatoryFulfilled(A.stepName,!1),t.markStepsAsInitialised([A.stepName]),A.option&&A.option.variants&&A.option.variants.length>0){const e=A.option,n=kt.getDefaultVariant(e);return n?this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageUrl):null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageUrl)}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));if(!A.option||0===(A.option.variants||[]).length){const e=hA(A.data.regions[0]);t.updateStorage(A.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,i=n.storage?.frameOffsets;if(t.updateMetadata(A.stepName,{frameOffsets:i,framePatternSrc:e}),e){const n=t.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(e,n),t.updateMetadata(A.stepName,{image:e}),t.updateStorage(A.stepName,{framePatternSrc:e})}if(i?.zoom){const e=t.getStepSpecificServices(A.stepName)?.frameService;e.updateOffsets(i)}t.setMandatoryFulfilled(A.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const a=n.selectedVariants[0].id;if(A.option&&a){const n=A.option.variants?.find((A=>A.id===a));n&&await t.setSelectionsAndElements(A.stepName,[n],i,(async()=>{const i=await this.frameSourceSvg(n,A);t.updateStorage(A.stepName,{currentFrameSource:i}),await e()}))}}else await t.setSelectionsAndElements(A.stepName,[],i,e)}}selectImage(A,t,e){e.setEditedStatus(A.stepName,!0);(t.fileLink||"").endsWith("pdf")?e.addPoller(new ti((async()=>{const A=(await Ht.getLocalOrFromServer(t.key||"")).versions?.find((A=>"svg"===A.name));if(!A)return!1;return 200===(await fetch(A.link)).status}),(()=>{Ht.getLocalOrFromServer(t.key||"").then((t=>{this.loadPatternFromAsset(t,A,e)}))}),(()=>{throw new ct("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new o({id:A,type:E.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await QA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await sA(A),n=await S(e),i={src:A,width:n.width,height:n.height,aspect:n.width/n.height};G.set(A,i),t.setPatternData(i)}}async selectVariantCommand(A,t,e,n,i,a){const o=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await N(r),g=o.getImageData(),l=e.map((A=>new s(A.id))),B=g?AA(g,c):void 0,d=g?{id:F(),src:g.src,x:B?.x||0,y:B?.y||0,width:g.width,height:g.height,scaleX:B?.zoom||1,scaleY:B?.zoom||1,rotation:0}:void 0;i&&i(!0);const E=A.data.regions.map((t=>{const e=F(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new tt(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:d,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),h=E.map((A=>A.command));return{command:new w([...h,...l]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...E.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:r}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.versions?.find((A=>"svg"===A.name));if(t)return t.link;const e=A.fileLink;if(e)return e;throw new nt(A)}async loadPatternFromAsset(A,t,e){const n=this.patternSource(A),i=e.markUpdatePending(),a=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(n,a),e.updateMetadata(t.stepName,{image:n}),e.updateStorage(t.stepName,{framePatternSrc:n}),e.markUpdateCompleted(i)}};const ai=new class{async getIllustrationBody(A){return new Promise((t=>{nA(A).then((A=>{t(A)})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new o({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:E.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return y(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=A.option;if(!n)return null;if(e)return this.reload(A,t,e);{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantCommand(A,e,[],(()=>{}),t)}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const o=a.variants?.find((A=>A.id===e));if(o){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[o],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){const e=A.data.colorOption;return e&&e?e.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async changeColorsCommand(A,t,e,n,i){const a={};for(const[A,t]of i.entries())a[A]={browserValue:t,spotColor:a[A]?.spotColor};const o=CA(A,t,e,a),r=await dA(o),s=[];for(const A of n){for(const[t,e]of i.entries())s.push(new uA(A,t,e));s.push(new mA(A,o,r))}return new w(s)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=y(t[0].id,n().map((A=>A.layoutState))),o={...a.colors},r={};Object.entries(o).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[A]=e}));for(const[A,t]of i.entries())o[A]={browserValue:t,spotColor:o[A]?.spotColor},r[A]={browserValue:t};let s=Array.from(Object.values(o)).map((A=>A.browserValue));const c=A.data.colorOption;c&&c.variants?.forEach((A=>{s=s.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:s});const g=new Map;if(Object.entries(o).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(l)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new it(A,"Missing regions.");n(!0);const a=e.map((A=>new s(A.id)));i.setMandatoryFulfilled(A.stepName,!1);const o=t.asset;if(!o)throw new et(t);const r=o.fileLink;if(!r)throw new nt(o);const c=await x(await this.getIllustrationBody(r)),g=await dA(c.svg),l=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new tt(t);const n=F();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r,objectURL:g,svg:c})}})),B=[...l.map((A=>A.command)),...a];let d=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const E=A.data.colorOption;return E&&E.variants?.forEach((A=>{d=d.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:d}),{command:new w(B),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],l.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const oi=new class{async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(e)await this.reload(A,t,e);else{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(!a)throw new At(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants?.find((A=>A.id===e));if(n){const e=n.material,o=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],o,(async()=>{const n=t.getModelContainer();if(n){const i=A.data.targetMaterials.map((A=>n.applyMaterialVariant(A,a.id||"",e||{})));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getModelContainer();n(!0);const a=t.material;if(!a)throw n(!1),new et(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{A.option&&i.applyMaterialVariant(t,A.option.id||"",a)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const ri=new class{async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(e)await this.reload(A,t,e);else{const e=kt.getDefaultVariant(n);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getModelContainer();if(e&&A.option){const i=n.asset?.fileLink;if(!i)throw new et(n);await e.applyModelVariant(A.option.id||"",{model:i,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=t.asset?.fileLink;if(!i)throw new et(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getModelContainer();t&&A.option&&t.applyModelVariant(A.option.id||"",{model:i,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const si=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||F(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new s(a)),c.push(new o({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:E.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},r)),{id:a,region:n,command:new w(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new w(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new w(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=XA(t.toLowerCase());for(const A of i)for(const t in e){if(A===e[t].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const ci=new class{async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,n.defaultVariant,t,(()=>{}));return t.markStepsAsInitialised([A.stepName]),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=t.asset;if(!i)throw new et(t);const a=i?.fileLink;if(!a)return console.error("No URL for picture!"),null;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new s(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new tt(t);const i=F();return{regionElement:{id:i,region:t},command:new o({stepName:A.stepName,stepRegion:t,id:i,src:a,type:E.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new w([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const gi=new class{async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.variants;if(kt.getDefaultVariant(n)){const i=e?.find((A=>A.id===n.defaultVariant?.id));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((A=>A.id===e));n&&await t.setSelectionsAndElements(A.stepName,[n],[])}}}async selectVariant(A,t,e){await e.getInitializationPromise();const n=await this.selectVariantLambda(A,t,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(A,t,e){const n=A.option;if(!n)return null;const i=n.variants;if(!i)return null;const a=i.length>1?i.find((A=>A.id===t)):i[0];if(!a)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[a],[],(async()=>{e.setMandatoryFulfilled(A.stepName,!0)}))}}}};const li=new class{async availableColours(A){const t=A.option;return t&&t.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A})))||[]}async init(A,t,e){const n=A.option;if(!n)throw new At(A);if(!e){const e=kt.getDefaultVariant(n);if(!e)return null;const i={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(A,i,[],t)}return await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.updateStorage(A.stepName,{colour:n.color||""}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=n.getLayouts();if(e.length>0){const a=A=>{const e=A.region;if(!i.find((A=>A.panelId===e?.panelId)))throw new tt(e);const n=t.variant?.color;return n?new uA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},o=e.map(a).filter((A=>!!A));return{command:new w(o),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new tt(e);const a=`\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="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const s=F();return{id:s,region:e,command:new o({stepRegion:e,stepName:A.stepName,colors:r,id:s,svg:a,type:E.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:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),s=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new w(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],s,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Bi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class wi extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=wi.name}}const di=["‘","’","“","”","\n"];class Ei extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Ei.name}}const hi=new class{constructor(){Bi(this,"cachedColors",new Map),Bi(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?DA(t):void 0;if(i){const A=e.split("").filter((A=>!di.includes(A))).join(""),t=A.split("").map((A=>i.getFont().charToGlyph(A)));for(let e=0;e<t.length;e++){".notdef"===t[e].name&&n.push(String.fromCharCode(A.charCodeAt(e)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Bi(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Bi(this,"getErrorsForText",((A,t,e)=>{const n=[];t.data&&t.data.maxLength&&A.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const i=e.getProfanities(),a=XA(A.toLowerCase());for(const A of a)for(const t in i){if(A===i[t].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(A.includes("\n")||A.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(A,t,e){const n=A.option;if(!n)return null;if(e)await this.reload(A,t,e);else{const e=this.getDefaultImageFillVariant(A.data),i=e?.asset?.fileLink,a=i?await Z(i):void 0,o=a?{src:a.src,height:a.height,width:a.width,scale:A.data.imageFillScale||1}:void 0;t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data))?.color||await this.getDefaultColor(A.data),fillImage:o}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data))?.name||await this.getDefaultColor(A.data),fillImage:e?.name});const r=kt.getDefaultVariant(n);if(r)return this.selectVariantCommand(A,r,{},[],t,(()=>{}),(()=>{}),o)}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>y(t.id,A.getAllLayoutData())))}availableFillColors(A){const t=this.cachedColors.get(A.stepName);if(t)return t;const e=A.data.colorOption;if(e){const t=e.variants?.map((A=>({fill:A.color,stroke:A.color,variant:A})))||[];return this.cachedColors.set(A.stepName,t),t}return[]}async changeFillColor(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=A.data.colorOption,o=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.colorProfile?.key}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,o))}}async availableFillImages(A){const t=A.data.imageFillOption;if(t){const e=t.variants?.map((A=>A.asset?.fileLink))?.filter((A=>!!A))||[];return Promise.all(e.map((async t=>{const e=await Z(t);return{src:t,width:e.width,height:e.height,scale:A.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher(),a=A.option?.variants?.find((A=>A.asset?.fileLink===t.src));n.updateMetadata(A.stepName,{fillImage:a?.name}),n.updateStorage(A.stepName,{fillImage:t});for(const A of e){i(new pA(A.id,t))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return lA(n,{vertical:t.vertical,uppercase:t.uppercase})}updateInputText(A,t,e,n){const i=n.getStepStorage(e.stepName),a=this.getProcessedInput(A,e.data,!!i.customiseAllText),o={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(o.errors.length>0)return o.helperText=o.errors[0].localizationKey,o;const r=(e.data.maxLength-a.length).toString();o.helperText=`${r} characters remaining`;const s=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const A of t){if(!A.fontData)throw new ot("Failed to resolve font data for text.");const[t,n]=P(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),l.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,s))}if(!e.data.curved&&t.length>0){if(!Array.from(l.values()).every((A=>A)))return o.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),o}return n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),o.command=new w(c),o.command.varying=s,o}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e.getStepStorage(A.stepName)||{},e.getRegionElements(A.stepName),e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}createTextFillSpotColor(A,t){const e=A.colorProfile;if(e){const A=(e.name||"").replace(/\s/g,"-"),n=A.lastIndexOf("/"),i=A.slice(n+1).slice(0,-4);if(!t.namedColor)throw new Error("variant named color not set!");return{profileName:i,namedColor:t.namedColor}}}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=A.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const o=a.variants?.find((A=>A.id===e));if(o){const e=await this.fontDataFromVariant(o),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,s=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[o],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:s}),t.updateStorage(A.stepName,{text:s,inputText:s});const n=i.map((A=>new B(A.id,e))),a=new w(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=hi.updateInputText(s||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A){const t=A.colorOption;if(t)return kt.getDefaultVariant(t)}async getDefaultColor(A){const t=A.colorOption;if(!t)return;return kt.getDefaultVariant(t)?.color}getDefaultImageFillVariant(A){const t=A.imageFillOption;if(t)return kt.getDefaultVariant(t)}async fontDataFromVariant(A){const t=A.asset;if(!t)throw new et(A);const e=t.fileLink;if(!e)throw new nt(t);return{assetUrl:e,name:(await U(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,o,r){const s=i.markUpdatePending(),c=await this.fontDataFromVariant(t);if(n.length>0){const g=n.map((A=>new B(A.id,c)));if(r){const A=n.map((A=>new pA(A.id,r)));g.push(...A)}const l=await this.changeInputTextWithRegion(A,A.data.size||30,c,e.text||"",e,i,!!e.customiseAllText,a,o);l&&g.push(l);return{command:new w(g),followup:async()=>{i.markUpdateCompleted(s),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,c,e,i),g=await this.changeInputTextWithRegion(A,A.data.size||30,c,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,o),l=n.flatMap((A=>A.commands));if(r){const A=n.map((A=>new pA(A.regionElement.id,r)));l.push(...A)}g&&l.push(g);return{command:new w(l),followup:async()=>{i.markUpdateCompleted(s)}}}}injectReplaceableText(A,t){return t.replaceableText?t.replaceableText.replace("{{}}",A):A}async createTextboxRegions(A,t,e,n,i,a){if(!e||!e.regions)throw new Error("Step data not supplied");const r=a.getTransaction().bulk&&e.varyText||!1,s=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(s,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),l=F();try{if(!g)throw new Ei("Failed to find layout for region: "+t.panelId);const B=e.colorOption;let w;if(B&&B.variants){const t=B.variants.find((A=>A.id===B.defaultVariant?.id))||B.variants[0];w=this.createTextFillSpotColor(B,t),a.updateStorage(A,{colorProfileAssetKey:B.colorProfile?.key})}const d=await this.getDefaultColor(e),h=d||"#000000",Q={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:h,fontSize:e.size||30,fontData:n,id:l,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:s,type:E.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:w},C=[],u=new Map,m=new Map;if(!Q.fontData)throw new ot("Failed to resolve font data for text.");const[D,p]=P(Q.fontSize,Q.fontData,{left:Q.x,top:Q.y,width:Q.width,height:Q.height,rotation:Q.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});u.set(Q.id,D),m.set(Q.id,p);const I=e.curved||e.vertical?c:(p||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(D,e,Q.id,I,r));const f=new o(Q,g);return f.varying=r,{regionElement:{id:l,region:t},commands:[f,...C],newElement:Q,fontData:n}}catch(A){throw console.log(A),new wi("Error adding font to region")}}))).catch((A=>{throw A instanceof wi?(ce.setLatestToast("Failed to load font.",Ci.Error),A):A instanceof Ei?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:s}),a.updateStorage(A,{text:s})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],o=new p(e,n);if(o.varying=i,a.push(o),!t.size){const t=new l(e,A);t.varying=i,a.push(t)}const r=new w(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,o,r,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,A.data,o),B=a.getRegionElements(A.stepName),d=new Map,E=new Map;for(const n of B)if(n.region){const[i,a]=P(t,e,n.region,[l],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});d.set(n.id,i),E.set(n.id,a)}const h=(()=>{if(A.data&&A.data.maxLength&&l.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=a.getProfanities(),e=XA(l.toLowerCase());for(const A of e)for(const e in t){if(A===t[e].toLowerCase().replace(/\s/g,""))return r(!0),{error:"Blocked profanity."}}if(!A.data.vertical&&!A.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(E.values()).every((A=>A)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(A.data.maxLength-l.length).toString()}})();if(h.error)return void s(h.error);if(s(`${h.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const Q=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const C=[];for(const t of B){const e=A.data.curved?l:(E.get(t.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(d.get(t.id)||1,A.data,t.id,e,Q))}const u=new w(C);return u.varying=Q,u}};function Qi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let Ci;var ui;(ui=Ci||(Ci={})).Error="Error",ui.Warning="Warning",ui.Info="Info";class mi extends Oe{constructor(A){super(),Qi(this,"update",void 0),Qi(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Di{constructor(A,t,e,n,i,a,o,r,s,c,g=!1,l){Qi(this,"reloadedState",void 0),Qi(this,"transaction",void 0),Qi(this,"ownerCustomer",void 0),Qi(this,"updateTransaction",void 0),Qi(this,"confirmedDesign",void 0),Qi(this,"editedSteps",void 0),Qi(this,"informationResults",void 0),Qi(this,"layouts",void 0),Qi(this,"mandatorySteps",void 0),Qi(this,"pendingUpdates",void 0),Qi(this,"selectionCost",void 0),Qi(this,"workflow",void 0),Qi(this,"stepSpecificServices",void 0),Qi(this,"previewService",void 0),Qi(this,"profanityFilter",void 0),Qi(this,"pollers",void 0),Qi(this,"commandContext",void 0),Qi(this,"stepElements",void 0),Qi(this,"stepInitialised",void 0),Qi(this,"stepMetadata",void 0),Qi(this,"stepSelections",void 0),Qi(this,"storage",void 0),Qi(this,"confirmCallbacks",void 0),Qi(this,"editedCallbacks",void 0),Qi(this,"elementsCallbacks",void 0),Qi(this,"informationResultCallbacks",void 0),Qi(this,"initCallbacks",void 0),Qi(this,"makingAdjustmentsCallback",void 0),Qi(this,"mandatoryCallbacks",void 0),Qi(this,"metadataCallbacks",void 0),Qi(this,"selectionCallbacks",void 0),Qi(this,"stepSpecificStorageCallbacks",void 0),Qi(this,"storageCallbacks",void 0),Qi(this,"currentVariationRecordCallbacks",void 0),Qi(this,"variationRecordCallbacks",void 0),Qi(this,"allScenes",void 0),Qi(this,"product",void 0),Qi(this,"invalidModelVariants",void 0),Qi(this,"currentAdjustingStepId",void 0),Qi(this,"renderableContextService",void 0),Qi(this,"workflowStatePromiseQueue",new Te(1)),Qi(this,"variationRecords",[]),Qi(this,"currentVariationRecord",void 0),Qi(this,"initializationPromise",void 0),Qi(this,"initialized",!1),Qi(this,"readOnly",!1),Qi(this,"modelContainer",void 0),Qi(this,"render3DScene",(()=>{if(!this.previewService)return;const A=this.getCommandContext().getAllLayouts(),t=this.getLayoutPreviewService()?.getAll();if(t)for(const[,e]of t)e.render(this.getWorkflow(),A,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=i,this.commandContext=n,this.reloadedState=c,this.transaction=a,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=o,this.previewService=r,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.initializationPromise=this.initializeDefaultWorkflowState(A,a),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((A=>{throw console.error(A),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(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await On(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},t);const e=jn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new w(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.modelContainer?.executeAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>A.recordNumber=t+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.find((t=>t.recordNumber===A.recordNumber));t&&(t.values=A.values,this.onVariationRecordsChange())}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(A){this.ownerCustomer=A}setTransactionCustomerDetails(A){this.ownerCustomer={...this.ownerCustomer,emailAddress:A.email}}getModelContainer(){return this.modelContainer}setModelContainer(A){(!A||this.previewService&&this.previewService.getAllModels().includes(A))&&(this.modelContainer=A)}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getWorkflowSelections(){const A={};return this.workflow.steps.forEach((t=>{const e=this.stepSelections[t.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(A[t.stepName]={selections:e.selectedVariants})})),A}markStepsAsInitialised(A){const t={...this.stepInitialised};A.forEach((A=>{t[A]=!0})),this.stepInitialised=t,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(A){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==A))}markUpdatePending(){const A=F();return this.pendingUpdates=[...this.pendingUpdates,A],A}setEditedStatus(A,t){this.editedSteps={...this.editedSteps,[A]:t},this.onEditedChange()}setInformationResults(A){this.informationResults=[...A],this.onInformationResultChange()}setCurrentAdjustingStepId(A){this.currentAdjustingStepId=A,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(A,t){this.mandatorySteps[A]!==t&&(this.mandatorySteps={...this.mandatorySteps,[A]:t},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}async updateStorage(A,t){const e={...this.storage,[A]:{...this.storage[A],...t}};if(!OA(e,this.storage)){this.storage=e;const t=new EA(this.constructSerializableWorkflow());this.commandContext.apply(t,!0),this.onStepSpecificStorageChange(A),this.onStorageChange()}}constructSerializableWorkflow(){const A=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const e={stepName:t.stepName};e.storage=this.storage[t.stepName],e.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((A=>({id:A.id,priceModifier:A.priceModifier}))),A.push(e)}))})),{steps:A}}updateStateWithServer(){if(this.readOnly)return;const A=this.serialize();this.workflowStatePromiseQueue.enqueue(new mi((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new mi((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new ot("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(zn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"===t.type&&t.option?.id&&!zn(t,this.stepSelections)&&A.push(t.option.id),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===D.SilentIllustration){return{step:A,results:await new $n(A,t).trigger()}}if(A.type===D.ProductOverlay){return{step:A,results:await new $n(A,t,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},i=A.filter((A=>!this.stepInitialised[A.stepName])),a={stepElements:{},commands:[]},o=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||o.push(n(A,this.layouts,e));const r=await Promise.all(o);for(const A of r)a.stepElements[A.step.stepName]=A.results.map((A=>A.regionElement)),a.commands=[...a.commands,...A.results.map((A=>A.command))];return a}getStepStorage(A){return this.storage[A]}getMetadata(A){return this.stepMetadata[A]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(A,t){return t.find((t=>t.stepName===A))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((A=>A.layoutState.elements.forEach((A=>{this.getCommandDispatcher()(new s(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier||0)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{zn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,o=jn(a,i),r=jn(a,this.stepSelections),c=o.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{zn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:B,commands:d}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...B,[A]:e},this.removeElements(l);if(this.workflow.steps.find((t=>t.stepName===A))?.type===D.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const E=[...d,...l.map((A=>new s(A.id))),new EA(this.constructSerializableWorkflow())];E.length>0&&this.commandContext.apply(new w(E),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=jn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case D.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case D.DigitalContent:A.push(ei.init(e,this,this.reloadedState));break;case D.Frame:case D.Photo:{const t=new qn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(ii.init(e,this,this.reloadedState))}break;case D.Illustration:A.push(ai.init(e,this,this.reloadedState));break;case D.Material:A.push(oi.init(e,this,this.reloadedState));break;case D.Model:A.push(ri.init(e,this,this.reloadedState));break;case D.Module:this.stepSpecificServices[e.stepName]={module:await gn(e.data.module)},A.push(si.init(e,this,this.reloadedState));break;case D.Picture:A.push(ci.init(e,this,this.reloadedState));break;case D.Question:A.push(gi.init(e,this,this.reloadedState));break;case D.Shape:A.push(li.init(e,this,this.reloadedState));break;case D.Text:A.push(hi.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new w(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)})),this.render3DScene()}traversableScenes(){return Kn(this.allScenes,this.stepSelections)}}function pi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Ii{constructor(A){pi(this,"variantData",void 0),this.variantData=A}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(A,t){return this.variantData.priceModifier.toLocaleString(A||"en-US",{style:"currency",currency:"USD",...t})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.thumbnail?.versions?.find((A=>"cdn"===A.name))?.link}getThumbnail(){const A=this.variantData.thumbnail?.versions?.find((A=>"thumbnail"===A.name));return A?A.link:this.variantData.asset?.versions?.find((A=>"thumbnail"===A.name))?.link}getDisplayImage(){return this.variantData.displayImage?.versions?.find((A=>"medium"===A.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function fi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class yi{constructor(A,t){fi(this,"manager",void 0),fi(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){yi.updateState.set(this.step.stepName,A)}getUpdateState(){return!!yi.updateState.get(this.step.stepName)}getCurrentVariant(){const A=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(A)return new Ii(A)}getAvailableVariants(){return(this.step.option?.variants?.filter((A=>A.enabled))||[]).map((A=>new Ii(A)))}getAllVariants(){return(this.step.option?.variants||[]).map((A=>new Ii(A)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}executeAnimations(){const A=this.manager.getPreviewService(),t=this.manager.getModelContainer(),e=this.step.data.modelAnimation,n=this.step.data.lookAtAnimation;A&&n&&A.executeCameraAnimation(n),t&&e&&t.executeAnimation(e)}}function Mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}fi(yi,"updateState",new Map);const Fi=IA`
443
443
  mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
444
444
  transactionAddStakeholder(id: $id, details: $details, type: $type) {
445
445
  id
@@ -488,7 +488,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
488
488
  }
489
489
  }
490
490
  }
491
- `,Ji=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Li=(A,t,e,n,i,a,o,r,s)=>{const c=(wt.getMap("transactionOwnerIds")||new Map).get(A.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,externalCartProductId:A.externalCartProductId,externalCartProductVariantId:A.externalCartProductVariantId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Oi=async(A,t,e,n,i,a,o)=>{const r=A.product?.basePrice||0,s=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=Ji(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Li(A,t,r,s,a,c,o,n,i)},Ti=async(A,t,e,n,i,a,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const w=ft.getShadowGraphqlClient();await w.resetStore();const d=await w.query({query:bn,variables:{id:a.id},errorPolicy:"all"}),E=d.data?.transactions[0].workflowState;!d.errors&&E||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((A=>{d.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const h=A.getPreviewService(),Q=t?.finalizeStepConfig?.lookAtAnimation,C=h&&100===h.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!Q,u=B&&Ji(B,t,!0),m=B&&Ji(B,t,!1),D=async A=>{const e={};let n=0;if(Object.keys(o).length>0)for(const i of Object.keys(o)){const a=o[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await D(!0),I=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await D(!1),y=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),M=await l(C);s("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(g);const F=await(async A=>(await ft.getShadowGraphqlClient().mutate({mutation:bi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}})).data?.designCreate)((()=>{const A={name:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,transactionId:a.id,useThreeDimPreview:C,previewImage:M};if(m){const t=[];for(const[A,e]of Object.entries(m))t.push({key:A,value:e});A.metadata=t}if(I){const t=[];for(const[A,e]of Object.entries(y))t.push({key:A,ids:e});A.selectedVariants=t}return A})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const x=(await ft.getShadowGraphqlClient().query({query:kn,variables:{id:a.id}})).data.transactions[0];return a.bulk?((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Li(A,t,n,i,void 0,a,e)})(x,i,Y):await Oi(x,i,t,p,F?.sku,u,Y)};let zi;var ji;(ji=zi||(zi={})).Local="Local",ji.Remote="Remote";const Ki=new class{constructor(){ki(this,"localPersistenceKey","designTransactions"),ki(this,"storageMethod",zi.Local),ki(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){if(this.storageMethod===zi.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new ot("Unexpected storage method requested")}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.designSavedListeners.forEach((t=>t(A)))}async renameDesign(A,t){const e=await this.getSavedDesigns(),n=e.find((t=>t.transactionId===A));if(!n)throw new Error(`No saved design for transaction ${A}.`);n.title=t,await this.setDesigns(e)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==zi.Local)throw new ot("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}};function Vi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Wi{constructor(t,e){if(Vi(this,"client",void 0),Vi(this,"commandContext",void 0),Vi(this,"workflowManager",void 0),Vi(this,"isReadOnly",void 0),Vi(this,"renderableScenes",[]),Vi(this,"renderableSceneCallbacks",[]),Vi(this,"debouncedSavedDesignUpdate",WA((async()=>{await Ki.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Vi(this,"getCanvasObjectURLAsync",(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const n=e.layouts;this.commandContext=new A,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Di(e.workflow,e.product.profanities?.map((A=>A.word))||[],n,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await ft.getShadowGraphqlClient().mutate({mutation:Gn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(A){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;t&&t<=2048&&(a=t),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((A=>A.layoutState?.layout.panelId===s?.name))||o[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),B=i.getContext("2d");if(!B)throw new ct("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=jA.renderToStaticMarkup(w),E=await zA.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.render();const h=await this.getCanvasObjectURLAsync(i);return i.toDataURL(h)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap((A=>this.getStepsByScene(A)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((A=>({id:A.id,name:A.name,stepIds:A.stepNames})))}getSelectionPriceSubunits(){const A=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(A).forEach((A=>{t+=A.selections.map((A=>A.priceModifier)).reduce(((A,t)=>A+t))})),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:D.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:Jn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Gi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Gi.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.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 A.stepIds.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Gi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){const t=(await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((t=>t.customer?.emailAddress===A.emailAddress));if(t?.customer){this.getWorkflowManager().setTransactionCustomer(t.customer);const A=wt.getMap("transactionCustomerIds")||new Map;A.set(this.getWorkflowManager().getTransaction().id,t.customer.id),wt.setMap("transactionCustomerIds",A)}}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new ot("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Ki.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"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 Ki.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new ot("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Ea({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new ot("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Ti(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,A||(()=>{}),(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(A){return A.type!==D.SilentIllustration&&A.type!==D.ProductOverlay}getExportedData(){const A=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===e));if(!n)return;A.has(n.stepTitle)||A.set(n.stepTitle,{});const i=t[e];Object.keys(i).forEach((t=>{A.get(n.stepTitle)[t]=i[t]}))})),Object.keys(e)?.forEach((t=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===t));n&&(A.has(n.stepTitle)||A.set(n.stepTitle,{}),A.get(n.stepTitle).selection=e[t].selections[0].name)})),A}}const Xi=qA`
491
+ `,Ji=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Li=(A,t,e,n,i,a,o,r,s)=>{const c=(wt.getMap("transactionOwnerIds")||new Map).get(A.id),g={event:"onComplete",lineItemImageUrl:o||"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,externalCartProductId:A.externalCartProductId,externalCartProductVariantId:A.externalCartProductVariantId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||"",transactionOwnerId:c};return i&&(g.metadata=i),r&&(g.selectedVariants=r),s&&(g.sku=s),g},Oi=async(A,t,e,n,i,a,o)=>{const r=A.product?.basePrice||0,s=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=Ji(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Li(A,t,r,s,a,c,o,n,i)},Ti=async(A,t,e,n,i,a,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const w=ft.getShadowGraphqlClient();await w.resetStore();const d=await w.query({query:bn,variables:{id:a.id},errorPolicy:"all"}),E=d.data?.transactions[0].workflowState;!d.errors&&E||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((A=>{d.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const h=A.getPreviewService(),Q=t?.finalizeStepConfig?.lookAtAnimation,C=h&&100===h.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!Q,u=B&&Ji(B,t,!0),m=B&&Ji(B,t,!1),D=async A=>{const e={};let n=0;if(Object.keys(o).length>0)for(const i of Object.keys(o)){const a=o[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await D(!0),I=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await D(!1),y=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),M=await l(C);s("workflow.steps.finish.finalize.creatingDesign"),a.bulk&&await c(g);const F=await(async A=>(await ft.getShadowGraphqlClient().mutate({mutation:bi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}})).data?.designCreate)((()=>{const A={name:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,transactionId:a.id,useThreeDimPreview:!!C,previewImage:M};if(m){const t=[];for(const[A,e]of Object.entries(m))t.push({key:A,value:e});A.metadata=t}if(I){const t=[];for(const[A,e]of Object.entries(y))t.push({key:A,ids:e});A.selectedVariants=t}return A})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const x=(await ft.getShadowGraphqlClient().query({query:kn,variables:{id:a.id}})).data.transactions[0];return a.bulk?((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Li(A,t,n,i,void 0,a,e)})(x,i,Y):await Oi(x,i,t,p,F?.sku,u,Y)};let zi;var ji;(ji=zi||(zi={})).Local="Local",ji.Remote="Remote";const Ki=new class{constructor(){ki(this,"localPersistenceKey","designTransactions"),ki(this,"storageMethod",zi.Local),ki(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){if(this.storageMethod===zi.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new ot("Unexpected storage method requested")}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.designSavedListeners.forEach((t=>t(A)))}async renameDesign(A,t){const e=await this.getSavedDesigns(),n=e.find((t=>t.transactionId===A));if(!n)throw new Error(`No saved design for transaction ${A}.`);n.title=t,await this.setDesigns(e)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==zi.Local)throw new ot("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}};function Vi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Wi{constructor(t,e){if(Vi(this,"client",void 0),Vi(this,"commandContext",void 0),Vi(this,"workflowManager",void 0),Vi(this,"isReadOnly",void 0),Vi(this,"renderableScenes",[]),Vi(this,"renderableSceneCallbacks",[]),Vi(this,"debouncedSavedDesignUpdate",WA((async()=>{await Ki.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Vi(this,"getCanvasObjectURLAsync",(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t;const n=e.layouts;this.commandContext=new A,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Di(e.workflow,e.product.profanities?.map((A=>A.word))||[],n,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await ft.getShadowGraphqlClient().mutate({mutation:Gn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(A){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const i=document.createElement("canvas");let a=2048;t&&t<=2048&&(a=t),i.width=a,i.height=a;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((A=>A.layoutState?.layout.panelId===s?.name))||o[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),B=i.getContext("2d");if(!B)throw new ct("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=jA.renderToStaticMarkup(w),E=await zA.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await E.render();const h=await this.getCanvasObjectURLAsync(i);return i.toDataURL(h)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap((A=>this.getStepsByScene(A)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((A=>({id:A.id,name:A.name,stepIds:A.stepNames})))}getSelectionPriceSubunits(){const A=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(A).forEach((A=>{t+=A.selections.map((A=>A.priceModifier)).reduce(((A,t)=>A+t))})),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:D.Bulk,stepName:"Bulk",stepTitle:A?.stepTitle??"workflow.steps.bulk.title",helpText:A?.helpText,data:{aspects:Jn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Gi.get(this.getWorkflowManager(),t)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Gi.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Gi.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.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 A.stepIds.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Gi.get(this.getWorkflowManager(),A)))}async attachCustomerDetails(A){return this.assignCustomerDetails({emailAddress:A.email})}async assignCustomerDetails(A){const t=(await ft.getShadowGraphqlClient().mutate({mutation:Fi,variables:{id:this.getWorkflowManager().getTransaction().id,details:A,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((t=>t.customer?.emailAddress===A.emailAddress));if(t?.customer){this.getWorkflowManager().setTransactionCustomer(t.customer);const A=wt.getMap("transactionCustomerIds")||new Map;A.set(this.getWorkflowManager().getTransaction().id,t.customer.id),wt.setMap("transactionCustomerIds",A)}}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new ot("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await Ki.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"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 Ki.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new ot("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Ea({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new ot("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0)}async onDesignFinished(A){return Ti(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,A||(()=>{}),(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(A){return A.type!==D.SilentIllustration&&A.type!==D.ProductOverlay}getExportedData(){const A=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===e));if(!n)return;A.has(n.stepTitle)||A.set(n.stepTitle,{});const i=t[e];Object.keys(i).forEach((t=>{A.get(n.stepTitle)[t]=i[t]}))})),Object.keys(e)?.forEach((t=>{const n=this.workflowManager.getWorkflow().steps.find((A=>A.stepName===t));n&&(A.has(n.stepTitle)||A.set(n.stepTitle,{}),A.get(n.stepTitle).selection=e[t].selections[0].name)})),A}}const Xi=qA`
492
492
  query GetBundle($id: String!) {
493
493
  bundles(ids: [$id]) {
494
494
  id
@@ -1173,5 +1173,5 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1173
1173
  }
1174
1174
  }
1175
1175
  }
1176
- `,wa=async A=>{const t=(await ft.getShadowGraphqlClient().query({query:aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},da=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class Ea{constructor(A){var t;ia(this,"options",void 0),ia(this,"initialized",void 0),ia(this,"experienceOptions",void 0),ia(this,"currencyCode",void 0),ia(this,"customer",void 0),ia(this,"updateTransactionState",(async A=>{try{return ft.getShadowGraphqlClient().mutate({...A,mutation:Un})}catch(A){throw console.error(A),new st("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,It=t)}getAssetManager(){return Ht}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(A){const t=wt.getMap("bundleOwnerIds");if(t?.has(A)){const e=t.get(A);return mt(e),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const e=wt.getMap("bundleCustomerIds");if(e?.has(A)){const t=e.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(A){const t=ft.getShadowGraphqlClient(),e=await t.query({query:oa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=wt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Ct(t),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const o=wt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.transactions?.some((t=>t.id===A))))||this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:ra,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=wt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),wt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=ft.getShadowGraphqlClient(),e=(await t.query({query:sa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:ca,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=ft.getShadowGraphqlClient(),e=wt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:ga,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(pt(n),this.customer=i,!0)}async generateVerificationCode(A){await ft.getShadowGraphqlClient().mutate({mutation:la,variables:{emailAddress:A}})}async verifyCode(A,t){const e=(await ft.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}})).data?.customerVerifyCode;if(e?.loginToken){if(!e.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=wt.getMap("customerTokens")||new Map;return t.set(e.id,e.loginToken),wt.setMap("customerTokens",t),pt(e.loginToken),this.customer={...e,loginToken:void 0},!0}return!1}async getNewBundle(){const A=(await ft.getShadowGraphqlClient().mutate({mutation:Zi})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mt(A.bundleOwnerId);const t=wt.getMap("bundleOwnerIds")||new Map;return t.set(A.id,A.bundleOwnerId),wt.setMap("bundleOwnerIds",t),new na(this,A.id)}async getExistingBundle(A){const t=await ft.getShadowGraphqlClient().query({query:Xi,variables:{id:A}});if(!t.data?.bundles||0===t.data?.bundles.length||!t.data?.bundles[0])throw new Error(`Unable to find bundle: ${A}`);const e=t.data?.bundles[0],n=wt.getMap("bundleOwnerIds");return n?.has(e.id)&&mt(n.get(e.id)),new na(this,e.id)}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=ft.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:Hn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new st("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new st("Existing transaction has no workflow ID.");const o=await wa(a.workflowId);if(!a.product)throw new st("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:Nn,variables:{...t,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(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new st("Failed to create transaction, product not available.");return i},e=wa(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new st("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new ot("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==n.type){const A=wt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Ct(a.transactionOwnerId||""),wt.setMap("transactionOwnerIds",A)}else{const A=(wt.getMap("transactionOwnerIds")||new Map).get(a.id);A&&Ct(A)}this.initialized=!0;const s=new Wi(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new st("No integration product ID provided.");const t=ft.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:Nn,variables:{integrationProductId:A,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(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new st("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new st("No transaction ID provided.");const e=ft.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("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 ot("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("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:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Rn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new st("Failed to read transaction.");if(!i.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new st("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new st("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await wa(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new Wi(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=ft.getShadowGraphqlClient().mutate({mutation:Pn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=wa(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new In(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const o=new Wi(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new st("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function ha(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Qa{constructor(){ha(this,"getProduct",void 0),ha(this,"getCommandContext",void 0),ha(this,"getAllLayoutData",void 0),ha(this,"getMetadata",void 0),ha(this,"getWorkflowMetadata",void 0),ha(this,"getStepStorage",void 0),ha(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Ca(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let ua;var ma;(ma=ua||(ua={})).SelectFrame="SelectFrame",ma.SelectImage="SelectImage",ma.Position="Position";class Da extends yi{constructor(A,t){super(A,t),Ca(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ii.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ii.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ua.SelectFrame:t||e||this.getImageData()?ua.Position:ua.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 pa=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Jt(),[c,g]=NA(!1),[l,B]=NA(!1),{state:w,uiDispatcher:d}=qt(),E=RA((A=>{const t=A;d(new Xt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Xt({selectedElement:void 0})),B(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(l&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Xt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,l,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);l&&!e&&t.current.setPointerCapture(A),!l&&e&&t.current.releasePointerCapture(A)}),[t,l,s]),be([" "],(()=>{B(!0),d(new Xt({selectedElement:void 0}))}),(()=>B(!1))),be(["Control"],(()=>g(!0)),(()=>g(!1)));const m=GA((()=>({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 bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:m,children:A.children})};export{Ea as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,Te as PromiseQueue,Oe as QueueablePromise,Qa as MockWorkflowManager,Ci as InformationMessageType,yi as StepHandle,Pi as TextStepHandle,Da as FrameStepHandle,xi as BulkStepHandle,Ui as ShapeStepHandle,Si as IllustrationStepHandle,vi as MaterialStepHandle,Ni as ModelStepHandle,Ri as PictureStepHandle,Hi as QuestionStepHandle,_t as BulkPriceCalculationStrategy,Ii as Variant,At as OptionNotFoundError,tt as LayoutNotFoundError,et as AssetNotFoundError,nt as ResourceNotFoundError,it as MisconfigurationError,rt as ParseError,ot as UnhandledBehaviorError,Ht as assetService,Ki as designService,Ti as createDesign,kt as optionService,wt as persistenceService,ft as graphQlManager,ce as toast,qn as FrameService,Wn as getBoundedOffsets,ii as frameStepService,ri as modelStepService,oi as materialStepService,li as shapeStepService,gi as questionStepService,ei as digitalContentStepService,si as moduleStepService,ci as pictureStepService,hi as textStepService,ai as illustrationStepService,Zt as ProductCameraRig,ua as FrameStep,te as ConversionLocation,ne as ConversionDataType,wa as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ae as StakeholderType,m as StepAspectType,D as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Pe as minZoom,vn as AdvancedEditor,pa as TransformWrapper,Sn as EditorCore,Lt as useLayouts,qt as useEditorState,ke as useEditorInteraction,be as useShortcutCombination,Kt as commandReducer,jt as getDefaultState,bt as CommandContextContext,Wt as AdvancedEditorStateProvider,Vt as AdvancedEditorContext,Xt as UICommand,Tt as EditorSubMenu,ge as ElementEventType,Be as KeyEvent,Jn as gatherVaryingStepAspects};
1176
+ `,wa=async A=>{const t=(await ft.getShadowGraphqlClient().query({query:aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},da=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class Ea{constructor(A){var t;ia(this,"options",void 0),ia(this,"initialized",void 0),ia(this,"experienceOptions",void 0),ia(this,"currencyCode",void 0),ia(this,"customer",void 0),ia(this,"updateTransactionState",(async A=>{try{return ft.getShadowGraphqlClient().mutate({...A,mutation:Un})}catch(A){throw console.error(A),new st("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,It=t)}getAssetManager(){return Ht}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(A){const t=wt.getMap("bundleOwnerIds");if(t?.has(A)){const e=t.get(A);return mt(e),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const e=wt.getMap("bundleCustomerIds");if(e?.has(A)){const t=e.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(A){const t=ft.getShadowGraphqlClient(),e=await t.query({query:oa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=wt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Ct(t),Promise.resolve({success:!0,stakeholderType:ae.Owner})}const o=wt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.bundleStakeholders?.find((t=>t.bundle?.transactions?.some((t=>t.id===A))))||this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:ra,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=wt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),wt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=ft.getShadowGraphqlClient(),e=(await t.query({query:sa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:ca,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=ft.getShadowGraphqlClient(),e=wt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:ga,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(pt(n),this.customer=i,!0)}async generateVerificationCode(A){await ft.getShadowGraphqlClient().mutate({mutation:la,variables:{emailAddress:A}})}async verifyCode(A,t){const e=(await ft.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}})).data?.customerVerifyCode;if(e?.loginToken){if(!e.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=wt.getMap("customerTokens")||new Map;return t.set(e.id,e.loginToken),wt.setMap("customerTokens",t),pt(e.loginToken),this.customer={...e,loginToken:void 0},!0}return!1}async getNewBundle(){const A=(await ft.getShadowGraphqlClient().mutate({mutation:Zi})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mt(A.bundleOwnerId);const t=wt.getMap("bundleOwnerIds")||new Map;return t.set(A.id,A.bundleOwnerId),wt.setMap("bundleOwnerIds",t),new na(this,A.id)}async getExistingBundle(A){const t=await ft.getShadowGraphqlClient().query({query:Xi,variables:{id:A}});if(!t.data?.bundles||0===t.data?.bundles.length||!t.data?.bundles[0])throw new Error(`Unable to find bundle: ${A}`);const e=t.data?.bundles[0],n=wt.getMap("bundleOwnerIds");return n?.has(e.id)&&mt(n.get(e.id)),new na(this,e.id)}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=ft.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:Hn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new st("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new st("Existing transaction has no workflow ID.");const o=await wa(a.workflowId);if(!a.product)throw new st("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:Nn,variables:{...t,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(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new st("Failed to create transaction, product not available.");return i},e=wa(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new st("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new ot("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new In(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]),"transaction"!==n.type){const A=wt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Ct(a.transactionOwnerId||""),wt.setMap("transactionOwnerIds",A)}else{const A=(wt.getMap("transactionOwnerIds")||new Map).get(a.id);A&&Ct(A)}this.initialized=!0;const s=new Wi(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new st("No integration product ID provided.");const t=ft.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:Nn,variables:{integrationProductId:A,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(!e.data||!e.data.transactionCreate)throw new st("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new st("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new st("No transaction ID provided.");const e=ft.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("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 ot("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:Hn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new st("Failed to read transaction.");if(!n.product)throw new st("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:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Rn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new st("Failed to read transaction.");if(!i.product)throw new st("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new st("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new st("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await wa(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new In(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 t=new Wi(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=ft.getShadowGraphqlClient().mutate({mutation:Pn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=wa(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=da(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new In(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 o=new Wi(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new st("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new st("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function ha(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Qa{constructor(){ha(this,"getProduct",void 0),ha(this,"getCommandContext",void 0),ha(this,"getAllLayoutData",void 0),ha(this,"getMetadata",void 0),ha(this,"getWorkflowMetadata",void 0),ha(this,"getStepStorage",void 0),ha(this,"setModelContainer",void 0),ha(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Ca(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let ua;var ma;(ma=ua||(ua={})).SelectFrame="SelectFrame",ma.SelectImage="SelectImage",ma.Position="Position";class Da extends yi{constructor(A,t){super(A,t),Ca(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ii.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ii.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ua.SelectFrame:t||e||this.getImageData()?ua.Position:ua.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 pa=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Jt(),[c,g]=NA(!1),[l,B]=NA(!1),{state:w,uiDispatcher:d}=qt(),E=RA((A=>{const t=A;d(new Xt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Xt({selectedElement:void 0})),B(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(l&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Xt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,l,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);l&&!e&&t.current.setPointerCapture(A),!l&&e&&t.current.releasePointerCapture(A)}),[t,l,s]),be([" "],(()=>{B(!0),d(new Xt({selectedElement:void 0}))}),(()=>B(!1))),be(["Control"],(()=>g(!0)),(()=>g(!1)));const m=GA((()=>({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 bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:m,children:A.children})};export{Ea as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,Te as PromiseQueue,Oe as QueueablePromise,Qa as MockWorkflowManager,Ci as InformationMessageType,yi as StepHandle,Pi as TextStepHandle,Da as FrameStepHandle,xi as BulkStepHandle,Ui as ShapeStepHandle,Si as IllustrationStepHandle,vi as MaterialStepHandle,Ni as ModelStepHandle,Ri as PictureStepHandle,Hi as QuestionStepHandle,_t as BulkPriceCalculationStrategy,Ii as Variant,At as OptionNotFoundError,tt as LayoutNotFoundError,et as AssetNotFoundError,nt as ResourceNotFoundError,it as MisconfigurationError,rt as ParseError,ot as UnhandledBehaviorError,Ht as assetService,Ki as designService,Ti as createDesign,kt as optionService,wt as persistenceService,ft as graphQlManager,ce as toast,qn as FrameService,Wn as getBoundedOffsets,ii as frameStepService,ri as modelStepService,oi as materialStepService,li as shapeStepService,gi as questionStepService,ei as digitalContentStepService,si as moduleStepService,ci as pictureStepService,hi as textStepService,ai as illustrationStepService,Zt as ProductCameraRig,ua as FrameStep,te as ConversionLocation,ne as ConversionDataType,wa as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ae as StakeholderType,m as StepAspectType,D as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Pe as minZoom,vn as AdvancedEditor,pa as TransformWrapper,Sn as EditorCore,Lt as useLayouts,qt as useEditorState,ke as useEditorInteraction,be as useShortcutCombination,Kt as commandReducer,jt as getDefaultState,bt as CommandContextContext,Wt as AdvancedEditorStateProvider,Vt as AdvancedEditorContext,Xt as UICommand,Tt as EditorSubMenu,ge as ElementEventType,Be as KeyEvent,Jn as gatherVaryingStepAspects};
1177
1177
  //# sourceMappingURL=module.js.map
package/dist/types.d.ts CHANGED
@@ -537,6 +537,8 @@ export interface WorkflowManager {
537
537
  */
538
538
  updateStateWithServerImmediate: (getReducerState: () => _CommandState1) => Promise<void>;
539
539
  updateStorage: (stepName: string, update: _StepStorage1) => Promise<void>;
540
+ getModelContainer: () => any | undefined;
541
+ setModelContainer: (container: any) => void;
540
542
  }
541
543
  interface StepService<T extends _AnyStepData1> {
542
544
  /**
@@ -2091,6 +2093,8 @@ export class MockWorkflowManager implements WorkflowManager {
2091
2093
  getAll: () => Map<any, any>;
2092
2094
  };
2093
2095
  getPreviewService(): undefined;
2096
+ setModelContainer: (container: any) => void;
2097
+ getModelContainer(): undefined;
2094
2098
  getProfanities(): never[];
2095
2099
  getRegionElements(_stepName: string): never[];
2096
2100
  getSerializedStep(_stepName: string, _serializedSteps: SerializableStep[]): undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "11.5.0",
3
+ "version": "12.0.0",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",
@@ -45,7 +45,7 @@
45
45
  "@parcel/transformer-typescript-tsc": "^2.8.0",
46
46
  "@parcel/transformer-typescript-types": "2.8.0",
47
47
  "@parcel/validator-typescript": "^2.8.0",
48
- "@spiffcommerce/preview": "^2.1.25",
48
+ "@spiffcommerce/preview": "^3.1.5",
49
49
  "@types/enzyme": "^3.10.12",
50
50
  "@types/jest": "^29.0.3",
51
51
  "@types/lodash.clonedeep": "^4.5.7",