@spiffcommerce/core 0.10.188 → 0.10.189
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 +1 -1
- package/dist/module.js +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -189,7 +189,7 @@ var A=require("lodash.clonedeep"),t=require("react/jsx-runtime"),e=require("open
|
|
|
189
189
|
workflowState
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
-
`,Wi=A=>{const t=[];for(const e of A.steps)switch(e.type){case V.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Upload});break;case V.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Upload});break;case V.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Colors});break;case V.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selections});break;case V.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Color})}return t},Zi=[V.SilentIllustration,V.ProductOverlay],qi=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:V.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case V.DigitalContent:n.data.varyUpload&&(A=!0);break;case V.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case V.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await nn.getOption(Ze,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case V.Material:n.data.varySelection&&(A=!0);break;case V.Model:n.data.varySelection&&(A=!0);break;case V.Picture:n.data.varySelection&&(A=!0);break;case V.Question:n.data.varySelections&&(A=!0);break;case V.Shape:n.data.varySelection&&(A=!0);break;case V.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await nn.getOption(Ze,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=$i(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?Zi.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:Zi.includes(n.type)?[]:[n],silentSteps:Zi.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:Zi.includes(n.type)?[]:[n],silentSteps:Zi.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:V.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:Wi(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:V.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:[]}),e},$i=(A,t)=>t.find((t=>t.stepNames.includes(A))),_i=(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})),Aa=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>_i(A,t))),silentSteps:A.silentSteps.filter((A=>_i(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),ta=async(A,t)=>{const e=Aa(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===V.Model||t.type===V.Material||t.type===V.Picture||t.type===V.Shape){const A=(t.option?t.option:t.optionId?await nn.getOption(Ze,t.optionId):void 0)?.data.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 ea(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 na(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,s=e.height*n.zoom;return n.x=ia(A.x,t.width-a,0),n.y=ia(A.y,t.height-s,0),n}const s=A;return s.x=ia(s.x,-i,t.width),s.y=ia(s.y,-a,t.height),s}function ia(A,t,e){return Math.min(Math.max(A,t),e)}class aa{constructor(A){ea(this,"offsets",void 0),ea(this,"forceImageCover",void 0),ea(this,"targetElements",void 0),ea(this,"imageData",void 0),ea(this,"frameData",void 0),ea(this,"_debouncedUpdateFrameOffsets",void 0),ea(this,"minZoomScale",.03),ea(this,"maxZoomScale",20),ea(this,"onFrameDataChangeListeners",void 0),ea(this,"onZoomChangeListeners",void 0),ea(this,"workflowManager",void 0),ea(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=y(D)(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 Be(t.currentFrameSource);y(Q)(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=we(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=oe.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,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(na(s,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=we(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(na(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=na(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 Ue("Frame data not set. This is a bug");if(!this.workflowManager)throw new Ue("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new Tt(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 sa(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 ra{constructor(A,t,e){sa(this,"configuration",void 0),sa(this,"layouts",void 0),sa(this,"product",void 0),sa(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new Se(A);let e="";if(this.configuration.type===V.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new Re(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===P.Image){const e=this.configuration.type===V.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id:Y(),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===V.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new bt(i,t)}}{const i=this.configuration.type===V.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),s=await Qt(await a()),r={stepName:this.configuration.stepName,id:Y(),cachedObjectURL:await fe(s.svg),src:i,svg:s.svg,colors:s.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===V.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:r.id,region:A},command:new bt(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new Re(this.configuration,"Missing regions.");if(this.configuration.type===V.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===V.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new Se(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===V.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?P.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),P.Illustration)}}const oa=async A=>{const t=`${Te.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 ke("Failed to shorten URL, see console.")}};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}class ga{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){ca(this,"pollingId",void 0),ca(this,"attempts",void 0),ca(this,"interval",void 0),ca(this,"maxAttempts",void 0),ca(this,"predicate",void 0),ca(this,"onSuccess",void 0),ca(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 la=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,s,r,o){if(t||""===e||""!==n)o(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},c=await new Promise(((A,e)=>{new ga((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new Pe(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new Gt(A.id))));const g="http"===a.data.baseUrl.slice(0,4)?"":"https://",l=new URL(g+a.data.baseUrl);l.searchParams.append("video",btoa(JSON.stringify([c]))),l.pathname=l.pathname+("/"===l.pathname.slice(-1)?"":"/");const B=l.toString();if(B.length>=2e3)throw new ke("Cannot create QR code, URL too long.");const w=await oa(B);if(s(w),!a.data||!a.data.regions)throw new Re(a,"Missing regions.");const d=await this.regionElements(a),h=await this.command(w,d,i,a.stepName);h&&(h.command&&i.getCommandDispatcher()(h.command),h.followup&&await h.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:w,videoUrl:n}),o(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:Y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await(0,I.toString)(A,{type:"svg"}))}`,s=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new Se(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new bt({stepRegion:t,stepName:n,id:A.id,src:a,type:P.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new Rt(s),followup:async()=>{}}}};function Ba(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 wa=new class{constructor(){Ba(this,"frameSourceSvg",(async(A,t)=>{if(!A)return ge(t.data.regions[0]);if(!A.assetKey)throw new Ne(A);const e=await tn.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return NA(n.href);throw new Pe(e.data)}))}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.optionId){const e=await nn.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=nn.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}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}))),a=(await nn.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=ge(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 s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));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);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new ga((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new ke("Failed to resolve transcoded PDF")})))}else 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 bt({id:A,type:P.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 he(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};re.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await ae(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};re.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),o=await Be(r),c=s.getImageData(),g=e.map((A=>new Gt(A.id))),l=c?we(c,o):void 0,B=c?{id:Y(),src:c.src,x:l?.x||0,y:l?.y||0,width:c.width,height:c.height,scaleX:l?.zoom||1,scaleY:l?.zoom||1,rotation:0}:void 0;i&&i(!0);const w=A.data.regions.map((t=>{const e=Y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new Se(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:o,pattern:B,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),d=w.map((A=>A.command));return{command:new Rt([...d,...g]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...w.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.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new Pe(A.data)}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 da=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new bt({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:P.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 yt(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await nn.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}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 s=Ct(A,t,e,a),r=await fe(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new Vt(A,t,e));o.push(new Xt(A,s,r))}return new Rt(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=yt(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},r={};Object.entries(s).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())s[A]={browserValue:t,spotColor:s[A]?.spotColor},r[A]={browserValue:t};let o=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await nn.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{o=o.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:o});const g=new Map;if(Object.entries(s).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 Re(A,"Missing regions.");n(!0);const a=e.map((A=>new Gt(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new Ne(t);const s=await tn.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new Pe(s.data);const o=await Qt(await this.getIllustrationBody(r.href)),c=await fe(o.svg),g=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new Se(t);const n=Y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:c,svg:o})}})),l=[...g.map((A=>A.command)),...a];let B=Array.from(Object.values(o.colors)).map((A=>A.browserValue));const w=A.data.colourOptionId?await nn.getOption(i.getServer(),A.data.colourOptionId):void 0;return w&&w.data.variants.forEach((A=>{B=B.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:B}),{command:new Rt(l),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],g.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const ha=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(e)await this.reload(A,t,e);else{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new ve(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=await tn.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));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=await tn.getMaterialFromVariant(t);if(!a)throw n(!1),new Ne(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ea=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(e)await this.reload(A,t,e);else{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){const i=(await tn.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new Ne(n);await e.applyModelVariant(A.optionId,{model:i.href,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=(await tn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new Ne(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ca=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),s=e.getStepSpecificServices(A.stepName)?.module;if(!s)return console.error("Missing module."),null;const r=e.getProfanities();if(!this.validateInput(A,t,r,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 o=(t,n,i)=>{const a=i||Y(),s=e.getLayouts().find((A=>A.panelId===n.panelId));if(!s)return console.error(`Can not find layout for region: ${n.panelId}`),null;const r=[];return i&&r.push(new Gt(a)),r.push(new bt({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:P.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},s)),{id:a,region:n,command:new Rt(r)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=s.svgPrint(t,A.region);return o(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new Rt(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>o(s.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new Rt(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=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const Qa=new class{async init(A,t,e){const n=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){if(!t.assetKey)throw new Ne(t);const i=(await tn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const s=e.getRegionElements(A.stepName).map((A=>new Gt(A.id))),r=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new Se(t);const i=Y();return{regionElement:{id:i,region:t},command:new bt({stepName:A.stepName,stepRegion:t,id:i,src:a,type:P.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 Rt([...s,...r.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],r.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const ua=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(nn.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){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=await nn.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,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 Ia=new class{async availableColours(A,t){const e=await nn.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(!e){const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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 Se(e);const n=t.variant?.color;return n?new Vt(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new Rt(s),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 Se(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 `,s={};s["spiff-fill-shape"]={browserValue:t.variant.color};const r=Y();return{id:r,region:e,command:new bt({stepRegion:e,stepName:A.stepName,colors:s,id:r,svg:a,type:P.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),s=a.filter((A=>!!A)).map((A=>A?.command)),r=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new Rt(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function ma(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 Da=new class{constructor(){ma(this,"latestToast",void 0),ma(this,"toastType",void 0),ma(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function pa(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 fa extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=fa.name}}class ya extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=ya.name}}const Ma=new class{constructor(){pa(this,"cachedColors",new Map),pa(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?VA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),pa(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),pa(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=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){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=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||""}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=nn.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>yt(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await nn.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(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=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):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 Jt(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return At(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),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const r=(e.data.maxLength-a.length).toString();s.helperText=`${r} characters remaining`,n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0);const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const A of t){if(!A.fontData)throw new Ue("Failed to resolve font data for text.");const[t,n]=ue(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,o))}if(!e.data.curved&&t.length>0){if(!Array.from(l.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return s.command=new Rt(c),s.command.varying=o,s}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.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,o=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:o}),t.updateStorage(A.stepName,{text:o,inputText:o});const n=i.map((A=>new jt(A.id,e))),a=new Rt(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Ma.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await nn.getOption(t,A.colourOptionId);if(!e)return;return nn.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await nn.getOption(t,A.colourOptionId);if(!e)return;return nn.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await nn.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new Ne(A);const t=await tn.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new Pe(t.data);return{assetUrl:e,name:(await TA(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const r=i.markUpdatePending(),o=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new jt(A.id,o))),g=await this.changeInputTextWithRegion(A,A.data.size||30,o,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new Rt(c),followup:async()=>{i.markUpdateCompleted(r),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,o,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,o,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new Rt(g),followup:async()=>{i.markUpdateCompleted(r)}}}}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 s=a.getTransaction().bulk&&e.varyText||!1,r=s?"":i.text||e.defaultText||"",o=this.getProcessedInput(r,e,!1),c=await Promise.all(e.regions.map((async t=>{const c=a.getLayouts().find((A=>A.panelId===t.panelId)),g=Y();try{if(!c)throw new ya("Failed to find layout for region: "+t.panelId);const l=a.getServer(),B=e.colourOptionId?await nn.getOption(l,e.colourOptionId):void 0;let w;if(B){const t=B.data.variants.find((A=>A.id===B.data.defaultVariant))||B.data.variants[0];w=this.createTextFillSpotColor(B,t),a.updateStorage(A,{colorProfileAssetKey:B.data.colorProfileAssetKey})}const d=await this.getDefaultColor(e,l),h=d||"#000000",E={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:h,fontSize:e.size||30,fontData:n,id:g,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:o,input:r,type:P.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=[],Q=new Map,u=new Map;if(!E.fontData)throw new Ue("Failed to resolve font data for text.");const[I,m]=ue(E.fontSize,E.fontData,{left:E.x,top:E.y,width:E.width,height:E.height,rotation:E.rotation,panelId:""},[o],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});Q.set(E.id,I),u.set(E.id,m);const D=e.curved||e.vertical?o:(m||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(I,e,E.id,D,s));const p=new bt(E,c);return p.varying=s,{regionElement:{id:g,region:t},commands:[p,...C],newElement:E,fontData:n}}catch(A){throw console.log(A),new fa("Error adding font to region")}}))).catch((A=>{throw A instanceof fa?(Da.setLatestToast("Failed to load font.",Fa.Error),A):A instanceof ya?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],c.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:r}),a.updateStorage(A,{text:r})})),c}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new Kt(e,n);if(s.varying=i,a.push(s),!t.size){const t=new Ot(e,A);t.varying=i,a.push(t)}const r=new Rt(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,s,r,o,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,A.data,s),B=a.getRegionElements(A.stepName),w=new Map,d=new Map;for(const n of B)if(n.region){const[i,a]=ue(t,e,n.region,[l],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});w.set(n.id,i),d.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=l.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)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(d.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 o(h.error);if(o(`${h.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const E=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:(d.get(t.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(w.get(t.id)||1,A.data,t.id,e,E))}const Q=new Rt(C);return Q.varying=E,Q}};function xa(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 Fa;var Ya;(Ya=Fa||(Fa={})).Error="Error",Ya.Warning="Warning",Ya.Info="Info";class va extends $n{constructor(A){super(),xa(this,"update",void 0),xa(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Sa{constructor(A,t,e,n,i,a,s,r,o,c,g,l=!1){xa(this,"reloadedState",void 0),xa(this,"transaction",void 0),xa(this,"updateTransaction",void 0),xa(this,"confirmedDesign",void 0),xa(this,"editedSteps",void 0),xa(this,"informationResults",void 0),xa(this,"layouts",void 0),xa(this,"mandatorySteps",void 0),xa(this,"pendingUpdates",void 0),xa(this,"selectionCost",void 0),xa(this,"workflow",void 0),xa(this,"stepSpecificServices",void 0),xa(this,"previewService",void 0),xa(this,"profanityFilter",void 0),xa(this,"pollers",void 0),xa(this,"commandContext",void 0),xa(this,"stepElements",void 0),xa(this,"stepInitialised",void 0),xa(this,"stepMetadata",void 0),xa(this,"stepSelections",void 0),xa(this,"storage",void 0),xa(this,"confirmCallbacks",void 0),xa(this,"editedCallbacks",void 0),xa(this,"elementsCallbacks",void 0),xa(this,"informationResultCallbacks",void 0),xa(this,"initCallbacks",void 0),xa(this,"makingAdjustmentsCallback",void 0),xa(this,"mandatoryCallbacks",void 0),xa(this,"metadataCallbacks",void 0),xa(this,"selectionCallbacks",void 0),xa(this,"stepSpecificStorageCallbacks",void 0),xa(this,"storageCallbacks",void 0),xa(this,"currentVariationRecordCallbacks",void 0),xa(this,"variationRecordCallbacks",void 0),xa(this,"allScenes",void 0),xa(this,"product",void 0),xa(this,"invalidModelVariants",void 0),xa(this,"currentAdjustingStepId",void 0),xa(this,"renderableContextService",void 0),xa(this,"workflowStatePromiseQueue",new _n(1)),xa(this,"variationRecords",[]),xa(this,"currentVariationRecord",void 0),xa(this,"initializationPromise",void 0),xa(this,"initialized",!1),xa(this,"readOnly",!1),xa(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=l,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=s,this.previewService=o,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=c,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()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await qi(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=Aa(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new Rt(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),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.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),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}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}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=Y();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(!y(Q)(e,this.storage)){this.storage=e;const t=new vt(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 va((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new va((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new Ue("Attempted to serialize state before it was initialized.");const e=JSON.stringify(this.dehydrateState(y(A)(t.transaction))),n=t.variation;if(!n)return{transaction:e};const i={layouts:{},serializableWorkflow:{steps:[]},...y(A)(n)||{}};return{transaction:e,variation:JSON.stringify(this.dehydrateState(i))}}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)=>(_i(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||_i(t,this.stepSelections)||t.optionId&&A.push(t.optionId),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===V.SilentIllustration){return{step:A,results:await new ra(A,t).trigger()}}if(A.type===V.ProductOverlay){return{step:A,results:await new ra(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:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const r=await Promise.all(s);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 Gt(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)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{_i(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,s=Aa(a,i),r=Aa(a,this.stepSelections),o=s.map((A=>A.silentSteps)).flat(),c=r.map((A=>A.silentSteps)).flat().filter((A=>!o.some((t=>t.stepName===A.stepName))));o.forEach((A=>{_i(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const g=this.getInvalidCanvasRegions(),{stepElements:l,commands:B}=await this.stepElementsForIntroducedSilentSteps(c,!1);this.stepElements={...this.stepElements,...l,[A]:e},this.removeElements(g);if(this.workflow.steps.find((t=>t.stepName===A))?.type===V.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const w=[...B,...g.map((A=>new Gt(A.id))),new vt(this.constructSerializableWorkflow())];w.length>0&&this.commandContext.apply(new Rt(w),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=Aa(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 V.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case V.DigitalContent:A.push(la.init(e,this,this.reloadedState));break;case V.Frame:case V.Photo:{const t=new aa(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(wa.init(e,this,this.reloadedState))}break;case V.Illustration:A.push(da.init(e,this,this.reloadedState));break;case V.Material:A.push(ha.init(e,this,this.reloadedState));break;case V.Model:A.push(Ea.init(e,this,this.reloadedState));break;case V.Module:this.stepSpecificServices[e.stepName]={module:await ui(e.data.module)},A.push(Ca.init(e,this,this.reloadedState));break;case V.Picture:A.push(Qa.init(e,this,this.reloadedState));break;case V.Question:A.push(ua.init(e,this,this.reloadedState));break;case V.Shape:A.push(Ia.init(e,this,this.reloadedState));break;case V.Text:A.push(Ma.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 Rt(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)}))}traversableScenes(){return ta(this.allScenes,this.stepSelections)}}function Na(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 Pa{constructor(A,t){Na(this,"manager",void 0),Na(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){Pa.updateState.set(this.step.stepName,A)}getUpdateState(){return!!Pa.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===V.Frame&&!this.step.optionId)return[];const A=await nn.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function Ra(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}Na(Pa,"updateState",new Map);const Ha=w.gql`
|
|
192
|
+
`,Wi=A=>{const t=[];for(const e of A.steps)switch(e.type){case V.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Upload});break;case V.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Upload});break;case V.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Colors});break;case V.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selections});break;case V.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection});break;case V.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:W.Color})}return t},Zi=[V.SilentIllustration,V.ProductOverlay],qi=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:V.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case V.DigitalContent:n.data.varyUpload&&(A=!0);break;case V.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case V.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await nn.getOption(Ze,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case V.Material:n.data.varySelection&&(A=!0);break;case V.Model:n.data.varySelection&&(A=!0);break;case V.Picture:n.data.varySelection&&(A=!0);break;case V.Question:n.data.varySelections&&(A=!0);break;case V.Shape:n.data.varySelection&&(A=!0);break;case V.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await nn.getOption(Ze,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=$i(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?Zi.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:Zi.includes(n.type)?[]:[n],silentSteps:Zi.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:Zi.includes(n.type)?[]:[n],silentSteps:Zi.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:V.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:Wi(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:V.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:[]}),e},$i=(A,t)=>t.find((t=>t.stepNames.includes(A))),_i=(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})),Aa=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>_i(A,t))),silentSteps:A.silentSteps.filter((A=>_i(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),ta=async(A,t)=>{const e=Aa(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===V.Model||t.type===V.Material||t.type===V.Picture||t.type===V.Shape){const A=(t.option?t.option:t.optionId?await nn.getOption(Ze,t.optionId):void 0)?.data.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 ea(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 na(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,s=e.height*n.zoom;return n.x=ia(A.x,t.width-a,0),n.y=ia(A.y,t.height-s,0),n}const s=A;return s.x=ia(s.x,-i,t.width),s.y=ia(s.y,-a,t.height),s}function ia(A,t,e){return Math.min(Math.max(A,t),e)}class aa{constructor(A){ea(this,"offsets",void 0),ea(this,"forceImageCover",void 0),ea(this,"targetElements",void 0),ea(this,"imageData",void 0),ea(this,"frameData",void 0),ea(this,"_debouncedUpdateFrameOffsets",void 0),ea(this,"minZoomScale",.03),ea(this,"maxZoomScale",20),ea(this,"onFrameDataChangeListeners",void 0),ea(this,"onZoomChangeListeners",void 0),ea(this,"workflowManager",void 0),ea(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=y(D)(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 Be(t.currentFrameSource);y(Q)(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=we(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=oe.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,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(na(s,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=we(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(na(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=na(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 Ue("Frame data not set. This is a bug");if(!this.workflowManager)throw new Ue("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new Tt(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 sa(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 ra{constructor(A,t,e){sa(this,"configuration",void 0),sa(this,"layouts",void 0),sa(this,"product",void 0),sa(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new Se(A);let e="";if(this.configuration.type===V.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new Re(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===P.Image){const e=this.configuration.type===V.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id:Y(),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===V.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new bt(i,t)}}{const i=this.configuration.type===V.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),s=await Qt(await a()),r={stepName:this.configuration.stepName,id:Y(),cachedObjectURL:await fe(s.svg),src:i,svg:s.svg,colors:s.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===V.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:r.id,region:A},command:new bt(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new Re(this.configuration,"Missing regions.");if(this.configuration.type===V.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===V.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new Se(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===V.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?P.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),P.Illustration)}}const oa=async A=>{const t=`${Te.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 ke("Failed to shorten URL, see console.")}};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}class ga{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){ca(this,"pollingId",void 0),ca(this,"attempts",void 0),ca(this,"interval",void 0),ca(this,"maxAttempts",void 0),ca(this,"predicate",void 0),ca(this,"onSuccess",void 0),ca(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 la=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,s,r,o){if(t||""===e||""!==n)o(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},c=await new Promise(((A,e)=>{new ga((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new Pe(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new Gt(A.id))));const g="http"===a.data.baseUrl.slice(0,4)?"":"https://",l=new URL(g+a.data.baseUrl);l.searchParams.append("video",btoa(JSON.stringify([c]))),l.pathname=l.pathname+("/"===l.pathname.slice(-1)?"":"/");const B=l.toString();if(B.length>=2e3)throw new ke("Cannot create QR code, URL too long.");const w=await oa(B);if(s(w),!a.data||!a.data.regions)throw new Re(a,"Missing regions.");const d=await this.regionElements(a),h=await this.command(w,d,i,a.stepName);h&&(h.command&&i.getCommandDispatcher()(h.command),h.followup&&await h.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:w,videoUrl:n}),o(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:Y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await(0,I.toString)(A,{type:"svg"}))}`,s=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new Se(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new bt({stepRegion:t,stepName:n,id:A.id,src:a,type:P.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new Rt(s),followup:async()=>{}}}};function Ba(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 wa=new class{constructor(){Ba(this,"frameSourceSvg",(async(A,t)=>{if(!A)return ge(t.data.regions[0]);if(!A.assetKey)throw new Ne(A);const e=await tn.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return NA(n.href);throw new Pe(e.data)}))}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.optionId){const e=await nn.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=nn.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}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}))),a=(await nn.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=ge(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 s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));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);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new ga((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new ke("Failed to resolve transcoded PDF")})))}else 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 bt({id:A,type:P.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 he(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};re.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await ae(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};re.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),o=await Be(r),c=s.getImageData(),g=e.map((A=>new Gt(A.id))),l=c?we(c,o):void 0,B=c?{id:Y(),src:c.src,x:l?.x||0,y:l?.y||0,width:c.width,height:c.height,scaleX:l?.zoom||1,scaleY:l?.zoom||1,rotation:0}:void 0;i&&i(!0);const w=A.data.regions.map((t=>{const e=Y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new Se(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:o,pattern:B,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),d=w.map((A=>A.command));return{command:new Rt([...d,...g]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...w.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.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new Pe(A.data)}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 da=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new bt({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:P.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 yt(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await nn.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}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 s=Ct(A,t,e,a),r=await fe(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new Vt(A,t,e));o.push(new Xt(A,s,r))}return new Rt(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=yt(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},r={};Object.entries(s).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())s[A]={browserValue:t,spotColor:s[A]?.spotColor},r[A]={browserValue:t};let o=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await nn.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{o=o.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:o});const g=new Map;if(Object.entries(s).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 Re(A,"Missing regions.");n(!0);const a=e.map((A=>new Gt(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new Ne(t);const s=await tn.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new Pe(s.data);const o=await Qt(await this.getIllustrationBody(r.href)),c=await fe(o.svg),g=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new Se(t);const n=Y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:c,svg:o})}})),l=[...g.map((A=>A.command)),...a];let B=Array.from(Object.values(o.colors)).map((A=>A.browserValue));const w=A.data.colourOptionId?await nn.getOption(i.getServer(),A.data.colourOptionId):void 0;return w&&w.data.variants.forEach((A=>{B=B.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:B}),{command:new Rt(l),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],g.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const ha=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(e)await this.reload(A,t,e);else{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new ve(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=await tn.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));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=await tn.getMaterialFromVariant(t);if(!a)throw n(!1),new Ne(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ea=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(e)await this.reload(A,t,e);else{const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){const i=(await tn.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new Ne(n);await e.applyModelVariant(A.optionId,{model:i.href,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=(await tn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new Ne(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ca=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),s=e.getStepSpecificServices(A.stepName)?.module;if(!s)return console.error("Missing module."),null;const r=e.getProfanities();if(!this.validateInput(A,t,r,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 o=(t,n,i)=>{const a=i||Y(),s=e.getLayouts().find((A=>A.panelId===n.panelId));if(!s)return console.error(`Can not find layout for region: ${n.panelId}`),null;const r=[];return i&&r.push(new Gt(a)),r.push(new bt({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:P.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},s)),{id:a,region:n,command:new Rt(r)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=s.svgPrint(t,A.region);return o(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new Rt(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>o(s.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new Rt(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=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const Qa=new class{async init(A,t,e){const n=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){if(!t.assetKey)throw new Ne(t);const i=(await tn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const s=e.getRegionElements(A.stepName).map((A=>new Gt(A.id))),r=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new Se(t);const i=Y();return{regionElement:{id:i,region:t},command:new bt({stepName:A.stepName,stepRegion:t,id:i,src:a,type:P.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 Rt([...s,...r.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],r.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const ua=new class{async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(nn.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await nn.getOptionFromStep(A,t.getServer()))?.data;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){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=await nn.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,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 Ia=new class{async availableColours(A,t){const e=await nn.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await nn.getOptionFromStep(A,t.getServer());if(!n)throw new ve(A);if(!e){const e=nn.getDefaultVariant(n.data);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=(await nn.getOptionFromStep(A,t.getServer()))?.data;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 Se(e);const n=t.variant?.color;return n?new Vt(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new Rt(s),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 Se(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 `,s={};s["spiff-fill-shape"]={browserValue:t.variant.color};const r=Y();return{id:r,region:e,command:new bt({stepRegion:e,stepName:A.stepName,colors:s,id:r,svg:a,type:P.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),s=a.filter((A=>!!A)).map((A=>A?.command)),r=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new Rt(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function ma(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 Da=new class{constructor(){ma(this,"latestToast",void 0),ma(this,"toastType",void 0),ma(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function pa(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 fa extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=fa.name}}class ya extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=ya.name}}const Ma=new class{constructor(){pa(this,"cachedColors",new Map),pa(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?VA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),pa(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),pa(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=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){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=await nn.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.color||await this.getDefaultColor(A.data,e)}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=nn.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>yt(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await nn.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(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=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):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 Jt(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return At(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),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const r=(e.data.maxLength-a.length).toString();s.helperText=`${r} characters remaining`,n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0);const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const A of t){if(!A.fontData)throw new Ue("Failed to resolve font data for text.");const[t,n]=ue(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,o))}if(!e.data.curved&&t.length>0){if(!Array.from(l.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return s.command=new Rt(c),s.command.varying=o,s}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.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.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=(await nn.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,o=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:o}),t.updateStorage(A.stepName,{text:o,inputText:o});const n=i.map((A=>new jt(A.id,e))),a=new Rt(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Ma.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await nn.getOption(t,A.colourOptionId);if(!e)return;return nn.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await nn.getOption(t,A.colourOptionId);if(!e)return;return nn.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await nn.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new Ne(A);const t=await tn.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new Pe(t.data);return{assetUrl:e,name:(await TA(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const r=i.markUpdatePending(),o=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new jt(A.id,o))),g=await this.changeInputTextWithRegion(A,A.data.size||30,o,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new Rt(c),followup:async()=>{i.markUpdateCompleted(r),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,o,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,o,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new Rt(g),followup:async()=>{i.markUpdateCompleted(r)}}}}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 s=a.getTransaction().bulk&&e.varyText||!1,r=s?"":i.text||e.defaultText||"",o=this.getProcessedInput(r,e,!1),c=await Promise.all(e.regions.map((async t=>{const c=a.getLayouts().find((A=>A.panelId===t.panelId)),g=Y();try{if(!c)throw new ya("Failed to find layout for region: "+t.panelId);const l=a.getServer(),B=e.colourOptionId?await nn.getOption(l,e.colourOptionId):void 0;let w;if(B){const t=B.data.variants.find((A=>A.id===B.data.defaultVariant))||B.data.variants[0];w=this.createTextFillSpotColor(B,t),a.updateStorage(A,{colorProfileAssetKey:B.data.colorProfileAssetKey})}const d=await this.getDefaultColor(e,l),h=d||"#000000",E={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:h,fontSize:e.size||30,fontData:n,id:g,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:o,input:r,type:P.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=[],Q=new Map,u=new Map;if(!E.fontData)throw new Ue("Failed to resolve font data for text.");const[I,m]=ue(E.fontSize,E.fontData,{left:E.x,top:E.y,width:E.width,height:E.height,rotation:E.rotation,panelId:""},[o],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});Q.set(E.id,I),u.set(E.id,m);const D=e.curved||e.vertical?o:(m||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(I,e,E.id,D,s));const p=new bt(E,c);return p.varying=s,{regionElement:{id:g,region:t},commands:[p,...C],newElement:E,fontData:n}}catch(A){throw console.log(A),new fa("Error adding font to region")}}))).catch((A=>{throw A instanceof fa?(Da.setLatestToast("Failed to load font.",Fa.Error),A):A instanceof ya?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],c.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:r}),a.updateStorage(A,{text:r})})),c}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new Kt(e,n);if(s.varying=i,a.push(s),!t.size){const t=new Ot(e,A);t.varying=i,a.push(t)}const r=new Rt(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,s,r,o,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,A.data,s),B=a.getRegionElements(A.stepName),w=new Map,d=new Map;for(const n of B)if(n.region){const[i,a]=ue(t,e,n.region,[l],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});w.set(n.id,i),d.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=l.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)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(d.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 o(h.error);if(o(`${h.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const E=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:(d.get(t.id)||[]).join("\n");C.push(this.generateTextChangeCommandsForRegion(w.get(t.id)||1,A.data,t.id,e,E))}const Q=new Rt(C);return Q.varying=E,Q}};function xa(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 Fa;var Ya;(Ya=Fa||(Fa={})).Error="Error",Ya.Warning="Warning",Ya.Info="Info";class va extends $n{constructor(A){super(),xa(this,"update",void 0),xa(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Sa{constructor(A,t,e,n,i,a,s,r,o,c,g,l=!1){xa(this,"reloadedState",void 0),xa(this,"transaction",void 0),xa(this,"updateTransaction",void 0),xa(this,"confirmedDesign",void 0),xa(this,"editedSteps",void 0),xa(this,"informationResults",void 0),xa(this,"layouts",void 0),xa(this,"mandatorySteps",void 0),xa(this,"pendingUpdates",void 0),xa(this,"selectionCost",void 0),xa(this,"workflow",void 0),xa(this,"stepSpecificServices",void 0),xa(this,"previewService",void 0),xa(this,"profanityFilter",void 0),xa(this,"pollers",void 0),xa(this,"commandContext",void 0),xa(this,"stepElements",void 0),xa(this,"stepInitialised",void 0),xa(this,"stepMetadata",void 0),xa(this,"stepSelections",void 0),xa(this,"storage",void 0),xa(this,"confirmCallbacks",void 0),xa(this,"editedCallbacks",void 0),xa(this,"elementsCallbacks",void 0),xa(this,"informationResultCallbacks",void 0),xa(this,"initCallbacks",void 0),xa(this,"makingAdjustmentsCallback",void 0),xa(this,"mandatoryCallbacks",void 0),xa(this,"metadataCallbacks",void 0),xa(this,"selectionCallbacks",void 0),xa(this,"stepSpecificStorageCallbacks",void 0),xa(this,"storageCallbacks",void 0),xa(this,"currentVariationRecordCallbacks",void 0),xa(this,"variationRecordCallbacks",void 0),xa(this,"allScenes",void 0),xa(this,"product",void 0),xa(this,"invalidModelVariants",void 0),xa(this,"currentAdjustingStepId",void 0),xa(this,"renderableContextService",void 0),xa(this,"workflowStatePromiseQueue",new _n(1)),xa(this,"variationRecords",[]),xa(this,"currentVariationRecord",void 0),xa(this,"initializationPromise",void 0),xa(this,"initialized",!1),xa(this,"readOnly",!1),xa(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=l,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=s,this.previewService=o,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=c,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()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await qi(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=Aa(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new Rt(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),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.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),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}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}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=Y();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(!y(Q)(e,this.storage)){this.storage=e;const t=new vt(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 va((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new va((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new Ue("Attempted to serialize state before it was initialized.");const e=JSON.stringify(this.dehydrateState(y(A)(t.transaction))),n=t.variation;if(!n)return{transaction:e};const i={layouts:{},serializableWorkflow:{steps:[]},...y(A)(n)||{}};return{transaction:e,variation:JSON.stringify(this.dehydrateState(i))}}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)=>(_i(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||_i(t,this.stepSelections)||t.optionId&&A.push(t.optionId),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===V.SilentIllustration){return{step:A,results:await new ra(A,t).trigger()}}if(A.type===V.ProductOverlay){return{step:A,results:await new ra(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:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const r=await Promise.all(s);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 Gt(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)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{_i(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,s=Aa(a,i),r=Aa(a,this.stepSelections),o=s.map((A=>A.silentSteps)).flat(),c=r.map((A=>A.silentSteps)).flat().filter((A=>!o.some((t=>t.stepName===A.stepName))));o.forEach((A=>{_i(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const g=this.getInvalidCanvasRegions(),{stepElements:l,commands:B}=await this.stepElementsForIntroducedSilentSteps(c,!1);this.stepElements={...this.stepElements,...l,[A]:e},this.removeElements(g);if(this.workflow.steps.find((t=>t.stepName===A))?.type===V.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const w=[...B,...g.map((A=>new Gt(A.id))),new vt(this.constructSerializableWorkflow())];w.length>0&&this.commandContext.apply(new Rt(w),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=Aa(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 V.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case V.DigitalContent:A.push(la.init(e,this,this.reloadedState));break;case V.Frame:case V.Photo:{const t=new aa(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(wa.init(e,this,this.reloadedState))}break;case V.Illustration:A.push(da.init(e,this,this.reloadedState));break;case V.Material:A.push(ha.init(e,this,this.reloadedState));break;case V.Model:A.push(Ea.init(e,this,this.reloadedState));break;case V.Module:this.stepSpecificServices[e.stepName]={module:await ui(e.data.module)},A.push(Ca.init(e,this,this.reloadedState));break;case V.Picture:A.push(Qa.init(e,this,this.reloadedState));break;case V.Question:A.push(ua.init(e,this,this.reloadedState));break;case V.Shape:A.push(Ia.init(e,this,this.reloadedState));break;case V.Text:A.push(Ma.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 Rt(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)}))}traversableScenes(){return ta(this.allScenes,this.stepSelections)}}function Na(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 Pa{constructor(A,t){Na(this,"manager",void 0),Na(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){Pa.updateState.set(this.step.stepName,A)}getUpdateState(){return!!Pa.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===V.Frame&&!this.step.optionId)return[];const A=await nn.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function Ra(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}Na(Pa,"updateState",new Map);const Ha=w.gql`
|
|
193
193
|
mutation UpdateTransactionBulkEmailAddress($id: String!, $bulkEmailAddress: String!) {
|
|
194
194
|
transactionUpdate(id: $id, bulkEmailAddress: $bulkEmailAddress) {
|
|
195
195
|
id
|
package/dist/module.js
CHANGED
|
@@ -189,7 +189,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
|
|
|
189
189
|
workflowState
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
-
`,un=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},pn=[u.SilentIllustration,u.ProductOverlay],mn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Nt.getOption(pt,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Nt.getOption(pt,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=fn(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?pn.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:pn.includes(n.type)?[]:[n],silentSteps:pn.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:pn.includes(n.type)?[]:[n],silentSteps:pn.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:un(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.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:[]}),e},fn=(A,t)=>t.find((t=>t.stepNames.includes(A))),Mn=(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})),yn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>Mn(A,t))),silentSteps:A.silentSteps.filter((A=>Mn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),Fn=async(A,t)=>{const e=yn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Nt.getOption(pt,t.optionId):void 0)?.data.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 Yn(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 Nn(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,s=e.height*n.zoom;return n.x=xn(A.x,t.width-a,0),n.y=xn(A.y,t.height-s,0),n}const s=A;return s.x=xn(s.x,-i,t.width),s.y=xn(s.y,-a,t.height),s}function xn(A,t,e){return Math.min(Math.max(A,t),e)}class vn{constructor(A){Yn(this,"offsets",void 0),Yn(this,"forceImageCover",void 0),Yn(this,"targetElements",void 0),Yn(this,"imageData",void 0),Yn(this,"frameData",void 0),Yn(this,"_debouncedUpdateFrameOffsets",void 0),Yn(this,"minZoomScale",.03),Yn(this,"maxZoomScale",20),Yn(this,"onFrameDataChangeListeners",void 0),Yn(this,"onZoomChangeListeners",void 0),Yn(this,"workflowManager",void 0),Yn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=$A(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 S(t.currentFrameSource);KA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=nA(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=y.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,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Nn(s,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=nA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Nn(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=Nn(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 rt("Frame data not set. This is a bug");if(!this.workflowManager)throw new rt("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new iA(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 Sn(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 Pn{constructor(A,t,e){Sn(this,"configuration",void 0),Sn(this,"layouts",void 0),Sn(this,"product",void 0),Sn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new nt(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new st(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,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===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),o=await N(await a()),r={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await CA(o.svg),src:i,svg:o.svg,colors:o.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===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:r.id,region:A},command:new s(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new st(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new nt(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const Hn=async A=>{const t=`${Ct.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 Bt("Failed to shorten URL, see console.")}};function Rn(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 Un{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){Rn(this,"pollingId",void 0),Rn(this,"attempts",void 0),Rn(this,"interval",void 0),Rn(this,"maxAttempts",void 0),Rn(this,"predicate",void 0),Rn(this,"onSuccess",void 0),Rn(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 Gn=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,s,o,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Un((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new at(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>o(new r(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new Bt("Cannot create QR code, URL too long.");const E=await Hn(l);if(s(E),!a.data||!a.data.regions)throw new st(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,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 ZA(A,{type:"svg"}))}`,o=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new nt(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(o),followup:async()=>{}}}};function bn(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 Jn=new class{constructor(){bn(this,"frameSourceSvg",(async(A,t)=>{if(!A)return IA(t.data.regions[0]);if(!A.assetKey)throw new it(A);const e=await Ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return sA(n.href);throw new at(e.data)}))}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.optionId){const e=await Nt.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Nt.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}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}))),a=(await Nt.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=IA(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 s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));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);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new Un((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new Bt("Failed to resolve transcoded PDF")})))}else 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 s({id:A,type:d.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 DA(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 fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,o=await this.frameSourceSvg(t,A),c=await S(o),g=s.getImageData(),B=e.map((A=>new r(A.id))),w=g?nA(g,c):void 0,E=g?{id:F(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=F(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new nt(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:o}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new at(A.data)}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 kn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.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 M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await Nt.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}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 s=uA(A,t,e,a),o=await CA(s),r=[];for(const A of n){for(const[t,e]of i.entries())r.push(new pA(A,t,e));r.push(new mA(A,s,o))}return new l(r)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},o={};Object.entries(s).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),o[A]=e}));for(const[A,t]of i.entries())s[A]={browserValue:t,spotColor:s[A]?.spotColor},o[A]={browserValue:t};let r=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await Nt.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{r=r.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:r});const g=new Map;if(Object.entries(s).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:o}),e.getCommandDispatcher()(B)}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 st(A,"Missing regions.");n(!0);const a=e.map((A=>new r(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new it(t);const s=await Ft.getAssetFromVariant(t),o=s.links.find((A=>"cdn"===A.rel));if(!o)throw new at(s.data);const c=await N(await this.getIllustrationBody(o.href)),g=await CA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new nt(t);const n=F();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:o.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Nt.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const On=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(e)await this.reload(A,t,e);else{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new et(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=await Ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));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=await Ft.getMaterialFromVariant(t);if(!a)throw n(!1),new it(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const zn=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(e)await this.reload(A,t,e);else{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){const i=(await Ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new it(n);await e.applyModelVariant(A.optionId,{model:i.href,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=(await Ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new it(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ln=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),o=e.getStepSpecificServices(A.stepName)?.module;if(!o)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(),o=e.getLayouts().find((A=>A.panelId===n.panelId));if(!o)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new r(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},o)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=o.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 l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(o.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(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=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const Tn=new class{async init(A,t,e){const n=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){if(!t.assetKey)throw new it(t);const i=(await Ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const o=e.getRegionElements(A.stepName).map((A=>new r(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new nt(t);const i=F();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.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 l([...o,...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 jn=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Nt.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){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=await Nt.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,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 Kn=new class{async availableColours(A,t){const e=await Nt.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(!e){const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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 nt(e);const n=t.variant?.color;return n?new pA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),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 nt(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 `,o={};o["spiff-fill-shape"]={browserValue:t.variant.color};const r=F();return{id:r,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:o,id:r,svg:a,type:d.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),o=a.filter((A=>!!A)).map((A=>A?.command)),r=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(o),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};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}const Xn=new class{constructor(){Vn(this,"latestToast",void 0),Vn(this,"toastType",void 0),Vn(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function Wn(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 Zn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Zn.name}}class qn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=qn.name}}const $n=new class{constructor(){Wn(this,"cachedColors",new Map),Wn(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?fA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Wn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Wn(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=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){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=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||""}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=Nt.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Nt.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(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=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):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,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return EA(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),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const o=(e.data.maxLength-a.length).toString();s.helperText=`${o} characters remaining`,n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0);const r=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new rt("Failed to resolve font data for text.");const[t,n]=U(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),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,r))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return s.command=new l(c),s.command.varying=r,s}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.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),o=n.storage?.color,r=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:o,text:r}),t.updateStorage(A.stepName,{text:r,inputText:r});const n=i.map((A=>new w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=$n.updateInputText(r||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Nt.getOption(t,A.colourOptionId);if(!e)return;return Nt.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Nt.getOption(t,A.colourOptionId);if(!e)return;return Nt.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Nt.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new it(A);const t=await Ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new at(t.data);return{assetUrl:e,name:(await R(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const o=i.markUpdatePending(),r=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new w(A.id,r))),g=await this.changeInputTextWithRegion(A,A.data.size||30,r,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new l(c),followup:async()=>{i.markUpdateCompleted(o),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,r,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,r,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new l(g),followup:async()=>{i.markUpdateCompleted(o)}}}}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 o=a.getTransaction().bulk&&e.varyText||!1,r=o?"":i.text||e.defaultText||"",c=this.getProcessedInput(r,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=F();try{if(!g)throw new qn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Nt.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:r,type:d.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:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new rt("Failed to resolve font data for text.");const[p,m]=U(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,p),u.set(h.id,m);const f=e.curved||e.vertical?c:(m||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(p,e,h.id,f,o));const M=new s(h,g);return M.varying=o,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Zn("Error adding font to region")}}))).catch((A=>{throw A instanceof Zn?(Xn.setLatestToast("Failed to load font.",Ai.Error),A):A instanceof qn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:r}),a.updateStorage(A,{text:r})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new p(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const o=new l(a);return o.varying=i,o}async changeInputTextWithRegion(A,t,e,n,i,a,s,o,r,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=U(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return o(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.includes("\r")))return o(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(d.values()).every((A=>A)))return o(!0),{error:"Does not fit."}}return o(!1),{info:(A.data.maxLength-B.length).toString()}})();if(Q.error)return void r(Q.error);if(r(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function _n(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 Ai;var ti;(ti=Ai||(Ai={})).Error="Error",ti.Warning="Warning",ti.Info="Info";class ei extends me{constructor(A){super(),_n(this,"update",void 0),_n(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class ni{constructor(A,t,e,n,i,a,s,o,r,c,g,B=!1){_n(this,"reloadedState",void 0),_n(this,"transaction",void 0),_n(this,"updateTransaction",void 0),_n(this,"confirmedDesign",void 0),_n(this,"editedSteps",void 0),_n(this,"informationResults",void 0),_n(this,"layouts",void 0),_n(this,"mandatorySteps",void 0),_n(this,"pendingUpdates",void 0),_n(this,"selectionCost",void 0),_n(this,"workflow",void 0),_n(this,"stepSpecificServices",void 0),_n(this,"previewService",void 0),_n(this,"profanityFilter",void 0),_n(this,"pollers",void 0),_n(this,"commandContext",void 0),_n(this,"stepElements",void 0),_n(this,"stepInitialised",void 0),_n(this,"stepMetadata",void 0),_n(this,"stepSelections",void 0),_n(this,"storage",void 0),_n(this,"confirmCallbacks",void 0),_n(this,"editedCallbacks",void 0),_n(this,"elementsCallbacks",void 0),_n(this,"informationResultCallbacks",void 0),_n(this,"initCallbacks",void 0),_n(this,"makingAdjustmentsCallback",void 0),_n(this,"mandatoryCallbacks",void 0),_n(this,"metadataCallbacks",void 0),_n(this,"selectionCallbacks",void 0),_n(this,"stepSpecificStorageCallbacks",void 0),_n(this,"storageCallbacks",void 0),_n(this,"currentVariationRecordCallbacks",void 0),_n(this,"variationRecordCallbacks",void 0),_n(this,"allScenes",void 0),_n(this,"product",void 0),_n(this,"invalidModelVariants",void 0),_n(this,"currentAdjustingStepId",void 0),_n(this,"renderableContextService",void 0),_n(this,"workflowStatePromiseQueue",new fe(1)),_n(this,"variationRecords",[]),_n(this,"currentVariationRecord",void 0),_n(this,"initializationPromise",void 0),_n(this,"initialized",!1),_n(this,"readOnly",!1),_n(this,"server",void 0),this.updateTransaction=i,this.server=o,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,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=s,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=c,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()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await mn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=yn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),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.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),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}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}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(!KA(e,this.storage)){this.storage=e;const t=new hA(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 ei((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new ei((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new rt("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(VA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...VA(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)=>(Mn(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||Mn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),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===u.SilentIllustration){return{step:A,results:await new Pn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new Pn(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:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const o=await Promise.all(s);for(const A of o)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 r(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)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{Mn(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,s=yn(a,i),o=yn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=o.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{Mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new r(A.id))),new hA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=yn(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 u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Gn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new vn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Jn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(kn.init(e,this,this.reloadedState));break;case u.Material:A.push(On.init(e,this,this.reloadedState));break;case u.Model:A.push(zn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Te(e.data.module)},A.push(Ln.init(e,this,this.reloadedState));break;case u.Picture:A.push(Tn.init(e,this,this.reloadedState));break;case u.Question:A.push(jn.init(e,this,this.reloadedState));break;case u.Shape:A.push(Kn.init(e,this,this.reloadedState));break;case u.Text:A.push($n.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 l(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)}))}traversableScenes(){return Fn(this.allScenes,this.stepSelections)}}function ii(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 ai{constructor(A,t){ii(this,"manager",void 0),ii(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ai.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ai.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Nt.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function si(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}ii(ai,"updateState",new Map);const oi=vA`
|
|
192
|
+
`,un=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},pn=[u.SilentIllustration,u.ProductOverlay],mn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Nt.getOption(pt,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Nt.getOption(pt,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=fn(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?pn.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:pn.includes(n.type)?[]:[n],silentSteps:pn.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:pn.includes(n.type)?[]:[n],silentSteps:pn.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:un(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.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:[]}),e},fn=(A,t)=>t.find((t=>t.stepNames.includes(A))),Mn=(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})),yn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>Mn(A,t))),silentSteps:A.silentSteps.filter((A=>Mn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),Fn=async(A,t)=>{const e=yn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Nt.getOption(pt,t.optionId):void 0)?.data.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 Yn(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 Nn(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,s=e.height*n.zoom;return n.x=xn(A.x,t.width-a,0),n.y=xn(A.y,t.height-s,0),n}const s=A;return s.x=xn(s.x,-i,t.width),s.y=xn(s.y,-a,t.height),s}function xn(A,t,e){return Math.min(Math.max(A,t),e)}class vn{constructor(A){Yn(this,"offsets",void 0),Yn(this,"forceImageCover",void 0),Yn(this,"targetElements",void 0),Yn(this,"imageData",void 0),Yn(this,"frameData",void 0),Yn(this,"_debouncedUpdateFrameOffsets",void 0),Yn(this,"minZoomScale",.03),Yn(this,"maxZoomScale",20),Yn(this,"onFrameDataChangeListeners",void 0),Yn(this,"onZoomChangeListeners",void 0),Yn(this,"workflowManager",void 0),Yn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=$A(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 S(t.currentFrameSource);KA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=nA(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=y.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,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Nn(s,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=nA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Nn(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=Nn(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 rt("Frame data not set. This is a bug");if(!this.workflowManager)throw new rt("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new iA(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 Sn(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 Pn{constructor(A,t,e){Sn(this,"configuration",void 0),Sn(this,"layouts",void 0),Sn(this,"product",void 0),Sn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new nt(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new st(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,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===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),o=await N(await a()),r={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await CA(o.svg),src:i,svg:o.svg,colors:o.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===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:r.id,region:A},command:new s(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new st(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new nt(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const Hn=async A=>{const t=`${Ct.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 Bt("Failed to shorten URL, see console.")}};function Rn(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 Un{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){Rn(this,"pollingId",void 0),Rn(this,"attempts",void 0),Rn(this,"interval",void 0),Rn(this,"maxAttempts",void 0),Rn(this,"predicate",void 0),Rn(this,"onSuccess",void 0),Rn(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 Gn=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,s,o,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Un((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new at(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>o(new r(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new Bt("Cannot create QR code, URL too long.");const E=await Hn(l);if(s(E),!a.data||!a.data.regions)throw new st(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,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 ZA(A,{type:"svg"}))}`,o=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new nt(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(o),followup:async()=>{}}}};function bn(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 Jn=new class{constructor(){bn(this,"frameSourceSvg",(async(A,t)=>{if(!A)return IA(t.data.regions[0]);if(!A.assetKey)throw new it(A);const e=await Ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return sA(n.href);throw new at(e.data)}))}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.optionId){const e=await Nt.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Nt.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}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}))),a=(await Nt.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=IA(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 s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));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);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new Un((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new Bt("Failed to resolve transcoded PDF")})))}else 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 s({id:A,type:d.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 DA(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 fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,o=await this.frameSourceSvg(t,A),c=await S(o),g=s.getImageData(),B=e.map((A=>new r(A.id))),w=g?nA(g,c):void 0,E=g?{id:F(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=F(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new nt(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:o}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new at(A.data)}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 kn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.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 M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await Nt.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}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 s=uA(A,t,e,a),o=await CA(s),r=[];for(const A of n){for(const[t,e]of i.entries())r.push(new pA(A,t,e));r.push(new mA(A,s,o))}return new l(r)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},o={};Object.entries(s).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),o[A]=e}));for(const[A,t]of i.entries())s[A]={browserValue:t,spotColor:s[A]?.spotColor},o[A]={browserValue:t};let r=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await Nt.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{r=r.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:r});const g=new Map;if(Object.entries(s).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:o}),e.getCommandDispatcher()(B)}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 st(A,"Missing regions.");n(!0);const a=e.map((A=>new r(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new it(t);const s=await Ft.getAssetFromVariant(t),o=s.links.find((A=>"cdn"===A.rel));if(!o)throw new at(s.data);const c=await N(await this.getIllustrationBody(o.href)),g=await CA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new nt(t);const n=F();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:o.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Nt.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const On=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(e)await this.reload(A,t,e);else{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new et(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=await Ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));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=await Ft.getMaterialFromVariant(t);if(!a)throw n(!1),new it(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const zn=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(e)await this.reload(A,t,e);else{const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){const i=(await Ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new it(n);await e.applyModelVariant(A.optionId,{model:i.href,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=(await Ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new it(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Ln=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),o=e.getStepSpecificServices(A.stepName)?.module;if(!o)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(),o=e.getLayouts().find((A=>A.panelId===n.panelId));if(!o)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new r(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},o)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=o.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 l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(o.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(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=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const Tn=new class{async init(A,t,e){const n=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){if(!t.assetKey)throw new it(t);const i=(await Ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const o=e.getRegionElements(A.stepName).map((A=>new r(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new nt(t);const i=F();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.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 l([...o,...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 jn=new class{async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Nt.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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){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=await Nt.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,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 Kn=new class{async availableColours(A,t){const e=await Nt.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await Nt.getOptionFromStep(A,t.getServer());if(!n)throw new et(A);if(!e){const e=Nt.getDefaultVariant(n.data);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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;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 nt(e);const n=t.variant?.color;return n?new pA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),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 nt(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 `,o={};o["spiff-fill-shape"]={browserValue:t.variant.color};const r=F();return{id:r,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:o,id:r,svg:a,type:d.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),o=a.filter((A=>!!A)).map((A=>A?.command)),r=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(o),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};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}const Xn=new class{constructor(){Vn(this,"latestToast",void 0),Vn(this,"toastType",void 0),Vn(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function Wn(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 Zn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Zn.name}}class qn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=qn.name}}const $n=new class{constructor(){Wn(this,"cachedColors",new Map),Wn(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?fA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Wn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Wn(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=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){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=await Nt.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.color||await this.getDefaultColor(A.data,e)}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=Nt.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Nt.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(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=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):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,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return EA(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),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const o=(e.data.maxLength-a.length).toString();s.helperText=`${o} characters remaining`,n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0);const r=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new rt("Failed to resolve font data for text.");const[t,n]=U(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),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,r))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return s.command=new l(c),s.command.varying=r,s}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.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.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=(await Nt.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),o=n.storage?.color,r=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:o,text:r}),t.updateStorage(A.stepName,{text:r,inputText:r});const n=i.map((A=>new w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=$n.updateInputText(r||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Nt.getOption(t,A.colourOptionId);if(!e)return;return Nt.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Nt.getOption(t,A.colourOptionId);if(!e)return;return Nt.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Nt.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new it(A);const t=await Ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new at(t.data);return{assetUrl:e,name:(await R(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const o=i.markUpdatePending(),r=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new w(A.id,r))),g=await this.changeInputTextWithRegion(A,A.data.size||30,r,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new l(c),followup:async()=>{i.markUpdateCompleted(o),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,r,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,r,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new l(g),followup:async()=>{i.markUpdateCompleted(o)}}}}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 o=a.getTransaction().bulk&&e.varyText||!1,r=o?"":i.text||e.defaultText||"",c=this.getProcessedInput(r,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=F();try{if(!g)throw new qn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Nt.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:r,type:d.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:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new rt("Failed to resolve font data for text.");const[p,m]=U(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,p),u.set(h.id,m);const f=e.curved||e.vertical?c:(m||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(p,e,h.id,f,o));const M=new s(h,g);return M.varying=o,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Zn("Error adding font to region")}}))).catch((A=>{throw A instanceof Zn?(Xn.setLatestToast("Failed to load font.",Ai.Error),A):A instanceof qn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:r}),a.updateStorage(A,{text:r})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new p(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const o=new l(a);return o.varying=i,o}async changeInputTextWithRegion(A,t,e,n,i,a,s,o,r,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=U(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return o(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.includes("\r")))return o(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(d.values()).every((A=>A)))return o(!0),{error:"Does not fit."}}return o(!1),{info:(A.data.maxLength-B.length).toString()}})();if(Q.error)return void r(Q.error);if(r(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function _n(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 Ai;var ti;(ti=Ai||(Ai={})).Error="Error",ti.Warning="Warning",ti.Info="Info";class ei extends me{constructor(A){super(),_n(this,"update",void 0),_n(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class ni{constructor(A,t,e,n,i,a,s,o,r,c,g,B=!1){_n(this,"reloadedState",void 0),_n(this,"transaction",void 0),_n(this,"updateTransaction",void 0),_n(this,"confirmedDesign",void 0),_n(this,"editedSteps",void 0),_n(this,"informationResults",void 0),_n(this,"layouts",void 0),_n(this,"mandatorySteps",void 0),_n(this,"pendingUpdates",void 0),_n(this,"selectionCost",void 0),_n(this,"workflow",void 0),_n(this,"stepSpecificServices",void 0),_n(this,"previewService",void 0),_n(this,"profanityFilter",void 0),_n(this,"pollers",void 0),_n(this,"commandContext",void 0),_n(this,"stepElements",void 0),_n(this,"stepInitialised",void 0),_n(this,"stepMetadata",void 0),_n(this,"stepSelections",void 0),_n(this,"storage",void 0),_n(this,"confirmCallbacks",void 0),_n(this,"editedCallbacks",void 0),_n(this,"elementsCallbacks",void 0),_n(this,"informationResultCallbacks",void 0),_n(this,"initCallbacks",void 0),_n(this,"makingAdjustmentsCallback",void 0),_n(this,"mandatoryCallbacks",void 0),_n(this,"metadataCallbacks",void 0),_n(this,"selectionCallbacks",void 0),_n(this,"stepSpecificStorageCallbacks",void 0),_n(this,"storageCallbacks",void 0),_n(this,"currentVariationRecordCallbacks",void 0),_n(this,"variationRecordCallbacks",void 0),_n(this,"allScenes",void 0),_n(this,"product",void 0),_n(this,"invalidModelVariants",void 0),_n(this,"currentAdjustingStepId",void 0),_n(this,"renderableContextService",void 0),_n(this,"workflowStatePromiseQueue",new fe(1)),_n(this,"variationRecords",[]),_n(this,"currentVariationRecord",void 0),_n(this,"initializationPromise",void 0),_n(this,"initialized",!1),_n(this,"readOnly",!1),_n(this,"server",void 0),this.updateTransaction=i,this.server=o,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,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=s,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=c,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()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await mn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=yn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),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.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),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}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}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(!KA(e,this.storage)){this.storage=e;const t=new hA(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 ei((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new ei((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new rt("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(VA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...VA(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)=>(Mn(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||Mn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),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===u.SilentIllustration){return{step:A,results:await new Pn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new Pn(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:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const o=await Promise.all(s);for(const A of o)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 r(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)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{Mn(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,s=yn(a,i),o=yn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=o.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{Mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new r(A.id))),new hA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=yn(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 u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Gn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new vn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Jn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(kn.init(e,this,this.reloadedState));break;case u.Material:A.push(On.init(e,this,this.reloadedState));break;case u.Model:A.push(zn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Te(e.data.module)},A.push(Ln.init(e,this,this.reloadedState));break;case u.Picture:A.push(Tn.init(e,this,this.reloadedState));break;case u.Question:A.push(jn.init(e,this,this.reloadedState));break;case u.Shape:A.push(Kn.init(e,this,this.reloadedState));break;case u.Text:A.push($n.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 l(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)}))}traversableScenes(){return Fn(this.allScenes,this.stepSelections)}}function ii(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 ai{constructor(A,t){ii(this,"manager",void 0),ii(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ai.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ai.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Nt.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function si(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}ii(ai,"updateState",new Map);const oi=vA`
|
|
193
193
|
mutation UpdateTransactionBulkEmailAddress($id: String!, $bulkEmailAddress: String!) {
|
|
194
194
|
transactionUpdate(id: $id, bulkEmailAddress: $bulkEmailAddress) {
|
|
195
195
|
id
|