@spiffcommerce/core 0.10.209 → 0.10.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -201,7 +201,7 @@ var A=require("lodash.clonedeep"),t=require("react/jsx-runtime"),e=require("open
201
201
  workflowState
202
202
  }
203
203
  }
204
- `,ea=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},na=[V.SilentIllustration,V.ProductOverlay],ia=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 ln.getOption(nn,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 ln.getOption(nn,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=aa(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?na.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:na.includes(n.type)?[]:[n],silentSteps:na.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:na.includes(n.type)?[]:[n],silentSteps:na.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:ea(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},aa=(A,t)=>t.find((t=>t.stepNames.includes(A))),sa=(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})),ra=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>sa(A,t))),silentSteps:A.silentSteps.filter((A=>sa(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),oa=async(A,t)=>{const e=ra(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 ln.getOption(nn,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 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}function ga(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=la(A.x,t.width-a,0),n.y=la(A.y,t.height-s,0),n}const s=A;return s.x=la(s.x,-i,t.width),s.y=la(s.y,-a,t.height),s}function la(A,t,e){return Math.min(Math.max(A,t),e)}class Ba{constructor(A){ca(this,"offsets",void 0),ca(this,"forceImageCover",void 0),ca(this,"targetElements",void 0),ca(this,"imageData",void 0),ca(this,"frameData",void 0),ca(this,"_debouncedUpdateFrameOffsets",void 0),ca(this,"minZoomScale",.03),ca(this,"maxZoomScale",20),ca(this,"onFrameDataChangeListeners",void 0),ca(this,"onZoomChangeListeners",void 0),ca(this,"workflowManager",void 0),ca(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 ue(t.currentFrameSource);y(Q)(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=Ie(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=he.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(ga(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=Ie(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(ga(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=ga(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 je("Frame data not set. This is a bug");if(!this.workflowManager)throw new je("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new $t(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 wa(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 da{constructor(A,t,e){wa(this,"configuration",void 0),wa(this,"layouts",void 0),wa(this,"product",void 0),wa(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new Ge(A);let e="";if(this.configuration.type===V.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new Oe(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 Lt(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 yt(await a()),r={stepName:this.configuration.stepName,id:Y(),cachedObjectURL:await Se(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 Lt(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new Oe(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 Ge(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 ha=async A=>{const t=`${$e.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 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}class Ca{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){Ea(this,"pollingId",void 0),Ea(this,"attempts",void 0),Ea(this,"interval",void 0),Ea(this,"maxAttempts",void 0),Ea(this,"predicate",void 0),Ea(this,"onSuccess",void 0),Ea(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 Qa=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 Ca((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new Je(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new Tt(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 ha(B);if(s(w),!a.data||!a.data.regions)throw new Oe(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 Ge(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new Lt({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 Ot(s),followup:async()=>{}}}};function ua(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 Ia=new class{constructor(){ua(this,"frameSourceSvg",(async(A,t)=>{if(!A)return Ce(t.data.regions[0]);if(!A.assetKey)throw new ke(A);const e=await cn.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return PA(n.href);throw new Je(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 ln.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=ln.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 ln.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=Ce(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 Ca((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 Lt({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 De(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};de.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await Be(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};de.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 ue(r),c=s.getImageData(),g=e.map((A=>new Tt(A.id))),l=c?Ie(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 Ge(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 Ot([...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 Je(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 ma=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 Lt({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 Nt(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=ln.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 ln.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 ln.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=ft(A,t,e,a),r=await Se(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new Ae(A,t,e));o.push(new te(A,s,r))}return new Ot(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=Nt(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 ln.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 Oe(A,"Missing regions.");n(!0);const a=e.map((A=>new Tt(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new ke(t);const s=await cn.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new Je(s.data);const o=await yt(await this.getIllustrationBody(r.href)),c=await Se(o.svg),g=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new Ge(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 ln.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 Ot(l),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],g.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Da=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(e)await this.reload(A,t,e);else{const e=ln.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 ln.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new be(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 cn.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 cn.getMaterialFromVariant(t);if(!a)throw n(!1),new ke(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 pa=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(e)await this.reload(A,t,e);else{const e=ln.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 ln.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 cn.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new ke(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 cn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new ke(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 fa=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 Tt(a)),r.push(new Lt({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 Ot(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 Ot(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 Ot(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 ya=new class{async init(A,t,e){const n=(await ln.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 ln.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 ke(t);const i=(await cn.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 Tt(A.id))),r=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new Ge(t);const i=Y();return{regionElement:{id:i,region:t},command:new Lt({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 Ot([...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 Ma=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(ln.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 ln.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 ln.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 Fa=new class{async availableColours(A,t){const e=await ln.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 ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(!e){const e=ln.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 ln.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 Ge(e);const n=t.variant?.color;return n?new Ae(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new Ot(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 Ge(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 Lt({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 Ot(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};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}const Ya=new class{constructor(){xa(this,"latestToast",void 0),xa(this,"toastType",void 0),xa(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 va(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 Sa extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Sa.name}}class Na extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Na.name}}const Pa=new class{constructor(){va(this,"cachedColors",new Map),va(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?XA(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})),va(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),va(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 ln.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=ln.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>Nt(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 ln.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 Vt(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return rt(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`;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 je("Failed to resolve font data for text.");const[t,n]=Me(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 n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),s.command=new Ot(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 ln.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 Zt(A.id,e))),a=new Ot(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Pa.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await ln.getOption(t,A.colourOptionId);if(!e)return;return ln.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await ln.getOption(t,A.colourOptionId);if(!e)return;return ln.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await ln.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new ke(A);const t=await cn.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new Je(t.data);return{assetUrl:e,name:(await KA(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 Zt(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 Ot(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 Ot(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 Na("Failed to find layout for region: "+t.panelId);const l=a.getServer(),B=e.colourOptionId?await ln.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 je("Failed to resolve font data for text.");const[I,m]=Me(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 Lt(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 Sa("Error adding font to region")}}))).catch((A=>{throw A instanceof Sa?(Ya.setLatestToast("Failed to load font.",Ha.Error),A):A instanceof Na?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 _t(e,n);if(s.varying=i,a.push(s),!t.size){const t=new Xt(e,A);t.varying=i,a.push(t)}const r=new Ot(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]=Me(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 Ot(C);return Q.varying=E,Q}};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}let Ha;var Ua;(Ua=Ha||(Ha={})).Error="Error",Ua.Warning="Warning",Ua.Info="Info";class ba extends ai{constructor(A){super(),Ra(this,"update",void 0),Ra(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ga{constructor(A,t,e,n,i,a,s,r,o,c,g,l=!1){Ra(this,"reloadedState",void 0),Ra(this,"transaction",void 0),Ra(this,"updateTransaction",void 0),Ra(this,"confirmedDesign",void 0),Ra(this,"editedSteps",void 0),Ra(this,"informationResults",void 0),Ra(this,"layouts",void 0),Ra(this,"mandatorySteps",void 0),Ra(this,"pendingUpdates",void 0),Ra(this,"selectionCost",void 0),Ra(this,"workflow",void 0),Ra(this,"stepSpecificServices",void 0),Ra(this,"previewService",void 0),Ra(this,"profanityFilter",void 0),Ra(this,"pollers",void 0),Ra(this,"commandContext",void 0),Ra(this,"stepElements",void 0),Ra(this,"stepInitialised",void 0),Ra(this,"stepMetadata",void 0),Ra(this,"stepSelections",void 0),Ra(this,"storage",void 0),Ra(this,"confirmCallbacks",void 0),Ra(this,"editedCallbacks",void 0),Ra(this,"elementsCallbacks",void 0),Ra(this,"informationResultCallbacks",void 0),Ra(this,"initCallbacks",void 0),Ra(this,"makingAdjustmentsCallback",void 0),Ra(this,"mandatoryCallbacks",void 0),Ra(this,"metadataCallbacks",void 0),Ra(this,"selectionCallbacks",void 0),Ra(this,"stepSpecificStorageCallbacks",void 0),Ra(this,"storageCallbacks",void 0),Ra(this,"currentVariationRecordCallbacks",void 0),Ra(this,"variationRecordCallbacks",void 0),Ra(this,"allScenes",void 0),Ra(this,"product",void 0),Ra(this,"invalidModelVariants",void 0),Ra(this,"currentAdjustingStepId",void 0),Ra(this,"renderableContextService",void 0),Ra(this,"workflowStatePromiseQueue",new si(1)),Ra(this,"variationRecords",[]),Ra(this,"currentVariationRecord",void 0),Ra(this,"initializationPromise",void 0),Ra(this,"initialized",!1),Ra(this,"readOnly",!1),Ra(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 ia(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=ra(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new Ot(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}setTransactionCustomerDetails(A){this.transaction.bulkEmailAddress=A.email}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 bt(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 ba((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new ba((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new je("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)=>(sa(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||sa(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 da(A,t).trigger()}}if(A.type===V.ProductOverlay){return{step:A,results:await new da(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 Tt(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=>{sa(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=ra(a,i),r=ra(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=>{sa(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 Tt(A.id))),new bt(this.constructSerializableWorkflow())];w.length>0&&this.commandContext.apply(new Ot(w),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=ra(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(Qa.init(e,this,this.reloadedState));break;case V.Frame:case V.Photo:{const t=new Ba(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Ia.init(e,this,this.reloadedState))}break;case V.Illustration:A.push(ma.init(e,this,this.reloadedState));break;case V.Material:A.push(Da.init(e,this,this.reloadedState));break;case V.Model:A.push(pa.init(e,this,this.reloadedState));break;case V.Module:this.stepSpecificServices[e.stepName]={module:await Mi(e.data.module)},A.push(fa.init(e,this,this.reloadedState));break;case V.Picture:A.push(ya.init(e,this,this.reloadedState));break;case V.Question:A.push(Ma.init(e,this,this.reloadedState));break;case V.Shape:A.push(Fa.init(e,this,this.reloadedState));break;case V.Text:A.push(Pa.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 Ot(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 oa(this.allScenes,this.stepSelections)}}function ka(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 Ja{constructor(A,t){ka(this,"manager",void 0),ka(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){Ja.updateState.set(this.step.stepName,A)}getUpdateState(){return!!Ja.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 ln.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 Oa(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}ka(Ja,"updateState",new Map);const za=w.gql`
204
+ `,ea=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},na=[V.SilentIllustration,V.ProductOverlay],ia=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 ln.getOption(nn,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 ln.getOption(nn,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=aa(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?na.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:na.includes(n.type)?[]:[n],silentSteps:na.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:na.includes(n.type)?[]:[n],silentSteps:na.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:ea(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},aa=(A,t)=>t.find((t=>t.stepNames.includes(A))),sa=(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})),ra=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>sa(A,t))),silentSteps:A.silentSteps.filter((A=>sa(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),oa=async(A,t)=>{const e=ra(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 ln.getOption(nn,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 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}function ga(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=la(A.x,t.width-a,0),n.y=la(A.y,t.height-s,0),n}const s=A;return s.x=la(s.x,-i,t.width),s.y=la(s.y,-a,t.height),s}function la(A,t,e){return Math.min(Math.max(A,t),e)}class Ba{constructor(A){ca(this,"offsets",void 0),ca(this,"forceImageCover",void 0),ca(this,"targetElements",void 0),ca(this,"imageData",void 0),ca(this,"frameData",void 0),ca(this,"_debouncedUpdateFrameOffsets",void 0),ca(this,"minZoomScale",.03),ca(this,"maxZoomScale",20),ca(this,"onFrameDataChangeListeners",void 0),ca(this,"onZoomChangeListeners",void 0),ca(this,"workflowManager",void 0),ca(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 ue(t.currentFrameSource);y(Q)(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=Ie(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=he.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(ga(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=Ie(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(ga(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=ga(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 je("Frame data not set. This is a bug");if(!this.workflowManager)throw new je("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new $t(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 wa(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 da{constructor(A,t,e){wa(this,"configuration",void 0),wa(this,"layouts",void 0),wa(this,"product",void 0),wa(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new Ge(A);let e="";if(this.configuration.type===V.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new Oe(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 Lt(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 yt(await a()),r={stepName:this.configuration.stepName,id:Y(),cachedObjectURL:await Se(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 Lt(r,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new Oe(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 Ge(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 ha=async A=>{const t=`${$e.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 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}class Ca{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){Ea(this,"pollingId",void 0),Ea(this,"attempts",void 0),Ea(this,"interval",void 0),Ea(this,"maxAttempts",void 0),Ea(this,"predicate",void 0),Ea(this,"onSuccess",void 0),Ea(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 Qa=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 Ca((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new Je(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new Tt(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 ha(B);if(s(w),!a.data||!a.data.regions)throw new Oe(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 Ge(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new Lt({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 Ot(s),followup:async()=>{}}}};function ua(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 Ia=new class{constructor(){ua(this,"frameSourceSvg",(async(A,t)=>{if(!A)return Ce(t.data.regions[0]);if(!A.assetKey)throw new ke(A);const e=await cn.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return PA(n.href);throw new Je(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 ln.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=ln.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 ln.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=Ce(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 Ca((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 Lt({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 De(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};de.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await Be(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};de.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 ue(r),c=s.getImageData(),g=e.map((A=>new Tt(A.id))),l=c?Ie(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 Ge(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 Ot([...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 Je(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 ma=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 Lt({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 Nt(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=ln.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 ln.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 ln.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=ft(A,t,e,a),r=await Se(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new Ae(A,t,e));o.push(new te(A,s,r))}return new Ot(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=Nt(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 ln.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 Oe(A,"Missing regions.");n(!0);const a=e.map((A=>new Tt(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new ke(t);const s=await cn.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new Je(s.data);const o=await yt(await this.getIllustrationBody(r.href)),c=await Se(o.svg),g=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new Ge(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 ln.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 Ot(l),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],g.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Da=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(e)await this.reload(A,t,e);else{const e=ln.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 ln.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new be(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 cn.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 cn.getMaterialFromVariant(t);if(!a)throw n(!1),new ke(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 pa=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(e)await this.reload(A,t,e);else{const e=ln.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 ln.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 cn.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new ke(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 cn.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new ke(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 fa=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 Tt(a)),r.push(new Lt({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 Ot(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 Ot(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 Ot(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 ya=new class{async init(A,t,e){const n=(await ln.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 ln.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 ke(t);const i=(await cn.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 Tt(A.id))),r=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new Ge(t);const i=Y();return{regionElement:{id:i,region:t},command:new Lt({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 Ot([...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 Ma=new class{async init(A,t,e){const n=await ln.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(ln.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 ln.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 ln.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 Fa=new class{async availableColours(A,t){const e=await ln.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 ln.getOptionFromStep(A,t.getServer());if(!n)throw new be(A);if(!e){const e=ln.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 ln.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 Ge(e);const n=t.variant?.color;return n?new Ae(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new Ot(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 Ge(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 Lt({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 Ot(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],r,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};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}const Ya=new class{constructor(){xa(this,"latestToast",void 0),xa(this,"toastType",void 0),xa(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 va(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 Sa extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Sa.name}}class Na extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Na.name}}const Pa=new class{constructor(){va(this,"cachedColors",new Map),va(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?XA(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})),va(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),va(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 ln.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=ln.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>Nt(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 ln.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 Vt(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return rt(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`;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 je("Failed to resolve font data for text.");const[t,n]=Me(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 n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),s.command=new Ot(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 ln.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 Zt(A.id,e))),a=new Ot(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Pa.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await ln.getOption(t,A.colourOptionId);if(!e)return;return ln.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await ln.getOption(t,A.colourOptionId);if(!e)return;return ln.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await ln.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new ke(A);const t=await cn.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new Je(t.data);return{assetUrl:e,name:(await KA(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 Zt(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 Ot(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 Ot(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 Na("Failed to find layout for region: "+t.panelId);const l=a.getServer(),B=e.colourOptionId?await ln.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 je("Failed to resolve font data for text.");const[I,m]=Me(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 Lt(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 Sa("Error adding font to region")}}))).catch((A=>{throw A instanceof Sa?(Ya.setLatestToast("Failed to load font.",Ha.Error),A):A instanceof Na?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 _t(e,n);if(s.varying=i,a.push(s),!t.size){const t=new Xt(e,A);t.varying=i,a.push(t)}const r=new Ot(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]=Me(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 Ot(C);return Q.varying=E,Q}};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}let Ha;var Ua;(Ua=Ha||(Ha={})).Error="Error",Ua.Warning="Warning",Ua.Info="Info";class ba extends ai{constructor(A){super(),Ra(this,"update",void 0),Ra(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ga{constructor(A,t,e,n,i,a,s,r,o,c,g,l=!1){Ra(this,"reloadedState",void 0),Ra(this,"transaction",void 0),Ra(this,"updateTransaction",void 0),Ra(this,"confirmedDesign",void 0),Ra(this,"editedSteps",void 0),Ra(this,"informationResults",void 0),Ra(this,"layouts",void 0),Ra(this,"mandatorySteps",void 0),Ra(this,"pendingUpdates",void 0),Ra(this,"selectionCost",void 0),Ra(this,"workflow",void 0),Ra(this,"stepSpecificServices",void 0),Ra(this,"previewService",void 0),Ra(this,"profanityFilter",void 0),Ra(this,"pollers",void 0),Ra(this,"commandContext",void 0),Ra(this,"stepElements",void 0),Ra(this,"stepInitialised",void 0),Ra(this,"stepMetadata",void 0),Ra(this,"stepSelections",void 0),Ra(this,"storage",void 0),Ra(this,"confirmCallbacks",void 0),Ra(this,"editedCallbacks",void 0),Ra(this,"elementsCallbacks",void 0),Ra(this,"informationResultCallbacks",void 0),Ra(this,"initCallbacks",void 0),Ra(this,"makingAdjustmentsCallback",void 0),Ra(this,"mandatoryCallbacks",void 0),Ra(this,"metadataCallbacks",void 0),Ra(this,"selectionCallbacks",void 0),Ra(this,"stepSpecificStorageCallbacks",void 0),Ra(this,"storageCallbacks",void 0),Ra(this,"currentVariationRecordCallbacks",void 0),Ra(this,"variationRecordCallbacks",void 0),Ra(this,"allScenes",void 0),Ra(this,"product",void 0),Ra(this,"invalidModelVariants",void 0),Ra(this,"currentAdjustingStepId",void 0),Ra(this,"renderableContextService",void 0),Ra(this,"workflowStatePromiseQueue",new si(1)),Ra(this,"variationRecords",[]),Ra(this,"currentVariationRecord",void 0),Ra(this,"initializationPromise",void 0),Ra(this,"initialized",!1),Ra(this,"readOnly",!1),Ra(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 ia(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=ra(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new Ot(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.find((t=>t.recordNumber===A.recordNumber));t&&(t.values=A.values,this.onVariationRecordsChange())}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}setTransactionCustomerDetails(A){this.transaction.bulkEmailAddress=A.email}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 bt(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 ba((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new ba((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new je("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)=>(sa(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||sa(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 da(A,t).trigger()}}if(A.type===V.ProductOverlay){return{step:A,results:await new da(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 Tt(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=>{sa(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=ra(a,i),r=ra(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=>{sa(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 Tt(A.id))),new bt(this.constructSerializableWorkflow())];w.length>0&&this.commandContext.apply(new Ot(w),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=ra(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(Qa.init(e,this,this.reloadedState));break;case V.Frame:case V.Photo:{const t=new Ba(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Ia.init(e,this,this.reloadedState))}break;case V.Illustration:A.push(ma.init(e,this,this.reloadedState));break;case V.Material:A.push(Da.init(e,this,this.reloadedState));break;case V.Model:A.push(pa.init(e,this,this.reloadedState));break;case V.Module:this.stepSpecificServices[e.stepName]={module:await Mi(e.data.module)},A.push(fa.init(e,this,this.reloadedState));break;case V.Picture:A.push(ya.init(e,this,this.reloadedState));break;case V.Question:A.push(Ma.init(e,this,this.reloadedState));break;case V.Shape:A.push(Fa.init(e,this,this.reloadedState));break;case V.Text:A.push(Pa.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 Ot(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 oa(this.allScenes,this.stepSelections)}}function ka(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 Ja{constructor(A,t){ka(this,"manager",void 0),ka(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){Ja.updateState.set(this.step.stepName,A)}getUpdateState(){return!!Ja.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 ln.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 Oa(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}ka(Ja,"updateState",new Map);const za=w.gql`
205
205
  mutation UpdateTransactionBulkEmailAddress($id: String!, $bulkEmailAddress: String!) {
206
206
  transactionUpdate(id: $id, bulkEmailAddress: $bulkEmailAddress) {
207
207
  id
package/dist/module.js CHANGED
@@ -201,7 +201,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
201
201
  workflowState
202
202
  }
203
203
  }
204
- `,hn=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},In=[u.SilentIllustration,u.ProductOverlay],Dn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=un(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?In.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:hn(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},un=(A,t)=>t.find((t=>t.stepNames.includes(A))),mn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),pn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>mn(A,t))),silentSteps:A.silentSteps.filter((A=>mn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),fn=async(A,t)=>{const e=pn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Ft.getOption(It,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 Mn(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 Fn(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=yn(A.x,t.width-a,0),n.y=yn(A.y,t.height-s,0),n}const s=A;return s.x=yn(s.x,-i,t.width),s.y=yn(s.y,-a,t.height),s}function yn(A,t,e){return Math.min(Math.max(A,t),e)}class Yn{constructor(A){Mn(this,"offsets",void 0),Mn(this,"forceImageCover",void 0),Mn(this,"targetElements",void 0),Mn(this,"imageData",void 0),Mn(this,"frameData",void 0),Mn(this,"_debouncedUpdateFrameOffsets",void 0),Mn(this,"minZoomScale",.03),Mn(this,"maxZoomScale",20),Mn(this,"onFrameDataChangeListeners",void 0),Mn(this,"onZoomChangeListeners",void 0),Mn(this,"workflowManager",void 0),Mn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await S(t.currentFrameSource);zA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=F.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(Fn(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=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Fn(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=Fn(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 at("Frame data not set. This is a bug");if(!this.workflowManager)throw new at("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Nn(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 xn{constructor(A,t,e){Nn(this,"configuration",void 0),Nn(this,"layouts",void 0),Nn(this,"product",void 0),Nn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new At(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new nt(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id: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===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),r=await N(await a()),o={stepName:this.configuration.stepName,id:y(),cachedObjectURL:await EA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:o.id,region:A},command:new s(o,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new nt(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new At(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const vn=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ot("Failed to shorten URL, see console.")}};function Sn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Pn{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){Sn(this,"pollingId",void 0),Sn(this,"attempts",void 0),Sn(this,"interval",void 0),Sn(this,"maxAttempts",void 0),Sn(this,"predicate",void 0),Sn(this,"onSuccess",void 0),Sn(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 Rn=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,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Pn((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new et(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new o(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new ot("Cannot create QR code, URL too long.");const E=await vn(l);if(s(E),!a.data||!a.data.regions)throw new nt(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await VA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new At(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(r),followup:async()=>{}}}};function Un(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 Hn=new class{constructor(){Un(this,"frameSourceSvg",(async(A,t)=>{if(!A)return QA(t.data.regions[0]);if(!A.assetKey)throw new tt(A);const e=await ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return nA(n.href);throw new et(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 Ft.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Ft.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 Ft.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=QA(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 Pn((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 ot("Failed to resolve transcoded PDF")})))}else this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new s({id:A,type:d.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await CA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await S(r),g=s.getImageData(),B=e.map((A=>new o(A.id))),w=g?AA(g,c):void 0,E=g?{id:y(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new At(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource: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 et(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 Gn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Ft.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 Ft.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 Ft.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=hA(A,t,e,a),r=await EA(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new IA(A,t,e));o.push(new DA(A,s,r))}return new l(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},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 Ft.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 B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(B)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new nt(A,"Missing regions.");n(!0);const a=e.map((A=>new o(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new tt(t);const s=await ft.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new et(s.data);const c=await N(await this.getIllustrationBody(r.href)),g=await EA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new At(t);const n=y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Ft.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const bn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.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 Ft.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new _A(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants.find((A=>A.id===e));if(n){const e=await ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getPreviewService();n(!0);const a=await ft.getMaterialFromVariant(t);if(!a)throw n(!1),new tt(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 Jn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.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 Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getPreviewService();if(e){const i=(await ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(n);await e.applyModelVariant(A.optionId,{model:i.href,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(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 kn=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||y(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new o(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const On=new class{async init(A,t,e){const n=(await Ft.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 Ft.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 tt(t);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new o(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new At(t);const i=y();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new l([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Ln=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Ft.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 Ft.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 Ft.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 zn=new class{async availableColours(A,t){const e=await Ft.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 Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(!e){const e=Ft.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 Ft.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 At(e);const n=t.variant?.color;return n?new IA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new At(e);const a=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const o=y();return{id:o,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:r,id:o,svg:a,type:d.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),o=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],o,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Tn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const jn=new class{constructor(){Tn(this,"latestToast",void 0),Tn(this,"toastType",void 0),Tn(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 Kn(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 Vn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Vn.name}}class Xn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Xn.name}}const Wn=new class{constructor(){Kn(this,"cachedColors",new Map),Kn(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?uA(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})),Kn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Kn(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 Ft.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=Ft.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Ft.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return BA(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`;const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new at("Failed to resolve font data for text.");const[t,n]=H(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,o))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),s.command=new l(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 Ft.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 w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Wn.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Ft.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new tt(A);const t=await ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new et(t.data);return{assetUrl:e,name:(await U(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 w(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 l(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 l(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 r=a.getTransaction().bulk&&e.varyText||!1,o=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(o,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=y();try{if(!g)throw new Xn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Ft.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:o,type:d.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new at("Failed to resolve font data for text.");const[m,p]=H(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,m),u.set(h.id,p);const f=e.curved||e.vertical?c:(p||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(m,e,h.id,f,r));const M=new s(h,g);return M.varying=r,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Vn("Error adding font to region")}}))).catch((A=>{throw A instanceof Vn?(jn.setLatestToast("Failed to load font.",qn.Error),A):A instanceof Xn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:o}),a.updateStorage(A,{text:o})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new m(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const r=new l(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,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=H(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return r(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.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-B.length).toString()}})();if(Q.error)return void o(Q.error);if(o(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let qn;var $n;($n=qn||(qn={})).Error="Error",$n.Warning="Warning",$n.Info="Info";class _n extends De{constructor(A){super(),Zn(this,"update",void 0),Zn(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ai{constructor(A,t,e,n,i,a,s,r,o,c,g,B=!1){Zn(this,"reloadedState",void 0),Zn(this,"transaction",void 0),Zn(this,"updateTransaction",void 0),Zn(this,"confirmedDesign",void 0),Zn(this,"editedSteps",void 0),Zn(this,"informationResults",void 0),Zn(this,"layouts",void 0),Zn(this,"mandatorySteps",void 0),Zn(this,"pendingUpdates",void 0),Zn(this,"selectionCost",void 0),Zn(this,"workflow",void 0),Zn(this,"stepSpecificServices",void 0),Zn(this,"previewService",void 0),Zn(this,"profanityFilter",void 0),Zn(this,"pollers",void 0),Zn(this,"commandContext",void 0),Zn(this,"stepElements",void 0),Zn(this,"stepInitialised",void 0),Zn(this,"stepMetadata",void 0),Zn(this,"stepSelections",void 0),Zn(this,"storage",void 0),Zn(this,"confirmCallbacks",void 0),Zn(this,"editedCallbacks",void 0),Zn(this,"elementsCallbacks",void 0),Zn(this,"informationResultCallbacks",void 0),Zn(this,"initCallbacks",void 0),Zn(this,"makingAdjustmentsCallback",void 0),Zn(this,"mandatoryCallbacks",void 0),Zn(this,"metadataCallbacks",void 0),Zn(this,"selectionCallbacks",void 0),Zn(this,"stepSpecificStorageCallbacks",void 0),Zn(this,"storageCallbacks",void 0),Zn(this,"currentVariationRecordCallbacks",void 0),Zn(this,"variationRecordCallbacks",void 0),Zn(this,"allScenes",void 0),Zn(this,"product",void 0),Zn(this,"invalidModelVariants",void 0),Zn(this,"currentAdjustingStepId",void 0),Zn(this,"renderableContextService",void 0),Zn(this,"workflowStatePromiseQueue",new ue(1)),Zn(this,"variationRecords",[]),Zn(this,"currentVariationRecord",void 0),Zn(this,"initializationPromise",void 0),Zn(this,"initialized",!1),Zn(this,"readOnly",!1),Zn(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=s,this.previewService=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 Dn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=pn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.previewService?.executeModelAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>{A.recordNumber=t+1})),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),this.onVariationRecordsChange()}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}setTransactionCustomerDetails(A){this.transaction.bulkEmailAddress=A.email}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(!zA(e,this.storage)){this.storage=e;const t=new dA(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 _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new at("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(mn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"!==t.type||mn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===u.SilentIllustration){return{step:A,results:await new xn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new xn(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 o(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,s=pn(a,i),r=pn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new o(A.id))),new dA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=pn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Rn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new Yn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Hn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(Gn.init(e,this,this.reloadedState));break;case u.Material:A.push(bn.init(e,this,this.reloadedState));break;case u.Model:A.push(Jn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Oe(e.data.module)},A.push(kn.init(e,this,this.reloadedState));break;case u.Picture:A.push(On.init(e,this,this.reloadedState));break;case u.Question:A.push(Ln.init(e,this,this.reloadedState));break;case u.Shape:A.push(zn.init(e,this,this.reloadedState));break;case u.Text:A.push(Wn.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new l(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)}))}traversableScenes(){return fn(this.allScenes,this.stepSelections)}}function ti(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 ei{constructor(A,t){ti(this,"manager",void 0),ti(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ei.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ei.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Ft.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 ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}ti(ei,"updateState",new Map);const ii=YA`
204
+ `,hn=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},In=[u.SilentIllustration,u.ProductOverlay],Dn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=un(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?In.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:hn(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},un=(A,t)=>t.find((t=>t.stepNames.includes(A))),mn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),pn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>mn(A,t))),silentSteps:A.silentSteps.filter((A=>mn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),fn=async(A,t)=>{const e=pn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Ft.getOption(It,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 Mn(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 Fn(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=yn(A.x,t.width-a,0),n.y=yn(A.y,t.height-s,0),n}const s=A;return s.x=yn(s.x,-i,t.width),s.y=yn(s.y,-a,t.height),s}function yn(A,t,e){return Math.min(Math.max(A,t),e)}class Yn{constructor(A){Mn(this,"offsets",void 0),Mn(this,"forceImageCover",void 0),Mn(this,"targetElements",void 0),Mn(this,"imageData",void 0),Mn(this,"frameData",void 0),Mn(this,"_debouncedUpdateFrameOffsets",void 0),Mn(this,"minZoomScale",.03),Mn(this,"maxZoomScale",20),Mn(this,"onFrameDataChangeListeners",void 0),Mn(this,"onZoomChangeListeners",void 0),Mn(this,"workflowManager",void 0),Mn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await S(t.currentFrameSource);zA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=F.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(Fn(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=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Fn(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=Fn(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 at("Frame data not set. This is a bug");if(!this.workflowManager)throw new at("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Nn(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 xn{constructor(A,t,e){Nn(this,"configuration",void 0),Nn(this,"layouts",void 0),Nn(this,"product",void 0),Nn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new At(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new nt(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id: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===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),r=await N(await a()),o={stepName:this.configuration.stepName,id:y(),cachedObjectURL:await EA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:o.id,region:A},command:new s(o,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new nt(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new At(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const vn=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ot("Failed to shorten URL, see console.")}};function Sn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Pn{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){Sn(this,"pollingId",void 0),Sn(this,"attempts",void 0),Sn(this,"interval",void 0),Sn(this,"maxAttempts",void 0),Sn(this,"predicate",void 0),Sn(this,"onSuccess",void 0),Sn(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 Rn=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,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Pn((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new et(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new o(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new ot("Cannot create QR code, URL too long.");const E=await vn(l);if(s(E),!a.data||!a.data.regions)throw new nt(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await VA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new At(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(r),followup:async()=>{}}}};function Un(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 Hn=new class{constructor(){Un(this,"frameSourceSvg",(async(A,t)=>{if(!A)return QA(t.data.regions[0]);if(!A.assetKey)throw new tt(A);const e=await ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return nA(n.href);throw new et(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 Ft.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Ft.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 Ft.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=QA(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 Pn((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 ot("Failed to resolve transcoded PDF")})))}else this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new s({id:A,type:d.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await CA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await S(r),g=s.getImageData(),B=e.map((A=>new o(A.id))),w=g?AA(g,c):void 0,E=g?{id:y(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new At(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource: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 et(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 Gn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Ft.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 Ft.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 Ft.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=hA(A,t,e,a),r=await EA(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new IA(A,t,e));o.push(new DA(A,s,r))}return new l(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},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 Ft.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 B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(B)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new nt(A,"Missing regions.");n(!0);const a=e.map((A=>new o(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new tt(t);const s=await ft.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new et(s.data);const c=await N(await this.getIllustrationBody(r.href)),g=await EA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new At(t);const n=y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Ft.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const bn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.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 Ft.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new _A(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants.find((A=>A.id===e));if(n){const e=await ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getPreviewService();n(!0);const a=await ft.getMaterialFromVariant(t);if(!a)throw n(!1),new tt(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 Jn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.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 Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getPreviewService();if(e){const i=(await ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(n);await e.applyModelVariant(A.optionId,{model:i.href,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(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 kn=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||y(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new o(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const On=new class{async init(A,t,e){const n=(await Ft.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 Ft.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 tt(t);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new o(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new At(t);const i=y();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new l([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Ln=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Ft.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 Ft.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 Ft.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 zn=new class{async availableColours(A,t){const e=await Ft.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 Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(!e){const e=Ft.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 Ft.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 At(e);const n=t.variant?.color;return n?new IA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new At(e);const a=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const o=y();return{id:o,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:r,id:o,svg:a,type:d.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),o=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],o,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Tn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const jn=new class{constructor(){Tn(this,"latestToast",void 0),Tn(this,"toastType",void 0),Tn(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 Kn(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 Vn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Vn.name}}class Xn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Xn.name}}const Wn=new class{constructor(){Kn(this,"cachedColors",new Map),Kn(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?uA(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})),Kn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Kn(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 Ft.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=Ft.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Ft.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return BA(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`;const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new at("Failed to resolve font data for text.");const[t,n]=H(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,o))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),s.command=new l(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 Ft.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 w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Wn.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Ft.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new tt(A);const t=await ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new et(t.data);return{assetUrl:e,name:(await U(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 w(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 l(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 l(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 r=a.getTransaction().bulk&&e.varyText||!1,o=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(o,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=y();try{if(!g)throw new Xn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Ft.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:o,type:d.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new at("Failed to resolve font data for text.");const[m,p]=H(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,m),u.set(h.id,p);const f=e.curved||e.vertical?c:(p||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(m,e,h.id,f,r));const M=new s(h,g);return M.varying=r,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Vn("Error adding font to region")}}))).catch((A=>{throw A instanceof Vn?(jn.setLatestToast("Failed to load font.",qn.Error),A):A instanceof Xn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:o}),a.updateStorage(A,{text:o})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new m(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const r=new l(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,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=H(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return r(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.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-B.length).toString()}})();if(Q.error)return void o(Q.error);if(o(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let qn;var $n;($n=qn||(qn={})).Error="Error",$n.Warning="Warning",$n.Info="Info";class _n extends De{constructor(A){super(),Zn(this,"update",void 0),Zn(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ai{constructor(A,t,e,n,i,a,s,r,o,c,g,B=!1){Zn(this,"reloadedState",void 0),Zn(this,"transaction",void 0),Zn(this,"updateTransaction",void 0),Zn(this,"confirmedDesign",void 0),Zn(this,"editedSteps",void 0),Zn(this,"informationResults",void 0),Zn(this,"layouts",void 0),Zn(this,"mandatorySteps",void 0),Zn(this,"pendingUpdates",void 0),Zn(this,"selectionCost",void 0),Zn(this,"workflow",void 0),Zn(this,"stepSpecificServices",void 0),Zn(this,"previewService",void 0),Zn(this,"profanityFilter",void 0),Zn(this,"pollers",void 0),Zn(this,"commandContext",void 0),Zn(this,"stepElements",void 0),Zn(this,"stepInitialised",void 0),Zn(this,"stepMetadata",void 0),Zn(this,"stepSelections",void 0),Zn(this,"storage",void 0),Zn(this,"confirmCallbacks",void 0),Zn(this,"editedCallbacks",void 0),Zn(this,"elementsCallbacks",void 0),Zn(this,"informationResultCallbacks",void 0),Zn(this,"initCallbacks",void 0),Zn(this,"makingAdjustmentsCallback",void 0),Zn(this,"mandatoryCallbacks",void 0),Zn(this,"metadataCallbacks",void 0),Zn(this,"selectionCallbacks",void 0),Zn(this,"stepSpecificStorageCallbacks",void 0),Zn(this,"storageCallbacks",void 0),Zn(this,"currentVariationRecordCallbacks",void 0),Zn(this,"variationRecordCallbacks",void 0),Zn(this,"allScenes",void 0),Zn(this,"product",void 0),Zn(this,"invalidModelVariants",void 0),Zn(this,"currentAdjustingStepId",void 0),Zn(this,"renderableContextService",void 0),Zn(this,"workflowStatePromiseQueue",new ue(1)),Zn(this,"variationRecords",[]),Zn(this,"currentVariationRecord",void 0),Zn(this,"initializationPromise",void 0),Zn(this,"initialized",!1),Zn(this,"readOnly",!1),Zn(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=s,this.previewService=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 Dn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=pn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.previewService?.executeModelAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>A.recordNumber=t+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.find((t=>t.recordNumber===A.recordNumber));t&&(t.values=A.values,this.onVariationRecordsChange())}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}setTransactionCustomerDetails(A){this.transaction.bulkEmailAddress=A.email}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(!zA(e,this.storage)){this.storage=e;const t=new dA(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 _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new at("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(mn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"!==t.type||mn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===u.SilentIllustration){return{step:A,results:await new xn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new xn(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 o(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,s=pn(a,i),r=pn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{mn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new o(A.id))),new dA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=pn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Rn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new Yn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Hn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(Gn.init(e,this,this.reloadedState));break;case u.Material:A.push(bn.init(e,this,this.reloadedState));break;case u.Model:A.push(Jn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Oe(e.data.module)},A.push(kn.init(e,this,this.reloadedState));break;case u.Picture:A.push(On.init(e,this,this.reloadedState));break;case u.Question:A.push(Ln.init(e,this,this.reloadedState));break;case u.Shape:A.push(zn.init(e,this,this.reloadedState));break;case u.Text:A.push(Wn.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new l(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)}))}traversableScenes(){return fn(this.allScenes,this.stepSelections)}}function ti(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 ei{constructor(A,t){ti(this,"manager",void 0),ti(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ei.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ei.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Ft.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 ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}ti(ei,"updateState",new Map);const ii=YA`
205
205
  mutation UpdateTransactionBulkEmailAddress($id: String!, $bulkEmailAddress: String!) {
206
206
  transactionUpdate(id: $id, bulkEmailAddress: $bulkEmailAddress) {
207
207
  id
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "0.10.209",
3
+ "version": "0.10.210",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",