@spiffcommerce/core 0.10.191 → 0.10.192
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 +3 -3
- package/dist/types.d.ts +3 -0
- 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||"",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(A?.recordNumber!==this.currentVariationRecord?.recordNumber&&(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
|