@spiffcommerce/core 12.9.9 → 12.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/module.js CHANGED
@@ -451,7 +451,7 @@ import{CommandContext as t,AssetType as A,BringForwardCommand as e,BringToFrontC
451
451
  workflowState
452
452
  }
453
453
  }
454
- `,Ln=t=>{const A=[];for(const e of t.steps)switch(e.type){case m.DigitalContent:e.data.varyUpload&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Upload});break;case m.Frame:const t=e.data;t.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),t.varyUpload&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Upload});break;case m.Illustration:const n=e.data;n.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),n.varyColors&&n.colorPickerEnabled&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Colors});break;case m.Material:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Model:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Picture:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Question:e.data.varySelections&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selections});break;case m.Shape:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Text:const a=e.data;a.varyText&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Text}),a.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),a.varyColor&&a.colorPickerEnabled&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Color})}return A},Tn=[m.SilentIllustration,m.ProductOverlay],On=async(t,A,e)=>{const n=[];t.introduction&&n.push({name:"Introduction",title:t.name,renderableSteps:[{type:m.Introduction,stepName:"Introduction",stepTitle:t.name,helpText:t.introduction,data:{},conditions:[]}],silentSteps:[]});for(const e of t.steps){if(A.bulkScene){let t=!1;switch(e.type){case m.DigitalContent:e.data.varyUpload&&(t=!0);break;case m.Frame:{const A=e.data;!A.varyUpload||!A.varySelection&&e.option||(t=!0)}break;case m.Illustration:{const A=e.data;!A.varySelection&&e.option&&1!==(e.option.variants||[]).length||!A.varyColors&&A.colorPickerEnabled||(t=!0)}break;case m.Material:e.data.varySelection&&(t=!0);break;case m.Model:e.data.varySelection&&(t=!0);break;case m.Picture:e.data.varySelection&&(t=!0);break;case m.Question:e.data.varySelections&&(t=!0);break;case m.Shape:e.data.varySelection&&(t=!0);break;case m.Text:{const A=e.data;!A.varySelection&&e.option&&1!==(e.option.variants||[]).length||!A.varyColor&&A.colorPickerEnabled&&A.colorOption||!A.varyText||(t=!0)}}if(t)continue}const a=zn(e.stepName,t.stepGroups);if(a){const t=n.find((t=>t.name===a.name));t?Tn.includes(e.type)?t.silentSteps.push(e):t.renderableSteps.push(e):n.push({name:a.name,title:a.name,renderableSteps:Tn.includes(e.type)?[]:[e],silentSteps:Tn.includes(e.type)?[e]:[]})}else n.push({name:e.stepName,title:e.stepTitle,renderableSteps:Tn.includes(e.type)?[]:[e],silentSteps:Tn.includes(e.type)?[e]:[]})}if(A.bulkScene){const a=e?.product?.bulkConfiguration;n.push({name:"Bulk",title:a?.sceneTitle??A.bulkSceneTitle,renderableSteps:[{type:m.Bulk,stepName:"Bulk",stepTitle:a?.stepTitle??A.bulkSceneTitle,helpText:a?.helpText,data:{aspects:Ln(t)},conditions:[]}],silentSteps:[]})}return A.finishScene&&n.push({name:"Finish",title:A.finishSceneTitle,renderableSteps:[{type:m.Finish,stepName:"Finish",stepTitle:A.finishSceneTitle,helpText:"",data:{modelAnimation:t.finalizeStepConfig?t.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:t.finalizeStepConfig?t.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},zn=(t,A)=>A.find((A=>A.stepNames.includes(t))),jn=(t,A)=>(t.conditions||[]).every((t=>{const e=A[t.targetStepName];if(e&&e.selectedVariants){const A=e.selectedVariants;return t.requiredVariantSelections.some((t=>void 0!==A.find((A=>A.id===t))))}return!1})),Kn=(t,A)=>t.map((t=>((t,A)=>{const e={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>jn(t,A))),silentSteps:t.silentSteps.filter((t=>jn(t,A)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(t,A))).filter((t=>null!==t)),Vn=async(t,A)=>{const e=Kn(t,A),n=[];for(const t of e)for(const A of t.renderableSteps)if(A.type===m.Model||A.type===m.Material||A.type===m.Picture||A.type===m.Shape){const t=(A.option?.variants||[]).length;t&&t>1&&n.push(A.stepName)}else n.push(A.stepName);const a=e.filter((t=>t.renderableSteps.filter((t=>n.includes(t.stepName))).length>0));for(const t of a)t.renderableSteps=t.renderableSteps.filter((t=>n.includes(t.stepName)));return a};function Wn(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}function Xn(t,A,e,n){const a=e.width*t.zoom,i=e.height*t.zoom;if(n){const n=t,a=Math.max(A.width/e.width,A.height/e.height);n.zoom=Math.max(a,t.zoom);const i=e.width*n.zoom,o=e.height*n.zoom;return n.x=qn(t.x,A.width-i,0),n.y=qn(t.y,A.height-o,0),n}const o=t;return o.x=qn(o.x,-a,A.width),o.y=qn(o.y,-i,A.height),o}function qn(t,A,e){return Math.min(Math.max(t,A),e)}class Zn{constructor(t){Wn(this,"offsets",void 0),Wn(this,"forceImageCover",void 0),Wn(this,"targetElements",void 0),Wn(this,"imageData",void 0),Wn(this,"frameData",void 0),Wn(this,"_debouncedUpdateFrameOffsets",void 0),Wn(this,"minZoomScale",.03),Wn(this,"maxZoomScale",20),Wn(this,"onFrameDataChangeListeners",void 0),Wn(this,"onZoomChangeListeners",void 0),Wn(this,"workflowManager",void 0),Wn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=Xt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=t}connectWorkflowManager(t,A){A&&t.addStepSpecificStorageCallback((async t=>{if(t){const A=t;if(A.currentFrameSource){const t=await N(A.currentFrameSource);Ot(t,this.frameData)||(this.frameData=t,this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.offsets=tt(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),A),this.workflowManager=t,this.stepName=A}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}async setFrameData(t){const A=M.get(t);this.frameData=A}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,A,e,n){if(this.imageData&&this.offsets&&this.frameData){const a=(A-this.offsets.x)/this.offsets.zoom,i=(e-this.offsets.y)/this.offsets.zoom,o={x:A-a*t,y:e-i*t,zoom:this.imageData.width*t/this.imageData.width};this.updateOffsets(Xn(o,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((A=>A(t)))}}setPatternData(t){(t&&this.frameData||t&&this.frameData&&!this.imageData)&&(this.offsets=tt(t,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements),this.updateOffsets(Xn(this.offsets,this.frameData,t,this.forceImageCover))),this.imageData=t,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,A){const e=this.imageData;e&&this.frameData&&(this.offsets&&t.x===this.offsets.x&&t.y===this.offsets.y&&t.zoom===this.offsets.zoom?A&&A():(this.offsets=Xn(t,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(t,e,this.frameData,this.targetElements,A)))}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,A,e,n,a){if(!e)throw new rA("Frame data not set. This is a bug");if(!this.workflowManager)throw new rA("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();n.forEach((e=>{i(new At(e,A,t))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:t}),a&&a()}recalculateZoomLimits(t,A){const e=Math.max(A.width/t.width,A.height/t.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function $n(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class _n{constructor(t,A,e){$n(this,"configuration",void 0),$n(this,"layouts",void 0),$n(this,"product",void 0),$n(this,"processRegion",(async t=>{const A=this.layouts.find((A=>A.panelId===t.panelId));if(!A)throw new eA(t);let e="";if(this.configuration.type===m.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),e=t,!t)throw new iA(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===h.Image){const e=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!e)throw new Error("Undefined raster silent step source");const a={stepName:this.configuration.stepName,id:F(),src:e,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:a.id,region:t},command:new o(a,A)}}{const a=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:e,i=async()=>new Promise(((t,A)=>{a?nt(a).then((A=>{t(A)})).catch((t=>console.error(t))):A("Undefined vector silent step source")})),r=await S(await i()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await dt(r.svg),src:a,svg:r.svg,colors:r.colors,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new o(s,A)}}})),this.configuration=t,this.layouts=A,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new iA(this.configuration,"Missing regions.");if(this.configuration.type===m.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===m.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((A=>t.panelId===A.panelId)))throw new eA(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===m.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return t?.startsWith("data:image/png")||t?.endsWith(".jpeg")||t?.endsWith(".jpg")||t?.endsWith(".png")?h.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),h.Illustration)}}const ta=async t=>{const A=`${EA.getServicesApiUrl()}/shortener`;try{const e=await fetch(A,{method:"POST",body:JSON.stringify({longUrl:t}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(t){throw console.error(t),new gA("Failed to shorten URL, see console.")}};function Aa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class ea{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(t){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(t,A,e,n=3e3,a=10){Aa(this,"pollingId",void 0),Aa(this,"attempts",void 0),Aa(this,"interval",void 0),Aa(this,"maxAttempts",void 0),Aa(this,"predicate",void 0),Aa(this,"onSuccess",void 0),Aa(this,"onFailure",void 0),this.onSuccess=A,this.onFailure=e,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}const na=new class{async init(t,A,e){return e&&await this.reload(t,A,e),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[],a,(async()=>{const e=n?.storage?.videoShortUrl,a=n?.storage?.videoUrl;A.updateStorage(t.stepName,{videoShortUrl:e,videoUrl:a})}))}async regenerateQRCode(t,A,e,n,a,i,o,r,c){if(A||""===e||""!==n)c(!1);else{const A=async()=>{const t=(await NA([e]))[0],A=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:A}},g=await new Promise(((t,e)=>{new ea((async()=>!!(await A()).link),(async()=>{const e=await A();if(!e.link||!e.link)throw new aA(e.asset);t({rel:"mpeg4",href:e.link})}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>r(new s(t.id))));const l="http"===i.data.baseUrl.slice(0,4)?"":"https://",B=new URL(l+i.data.baseUrl);B.searchParams.append("video",btoa(JSON.stringify([g]))),B.pathname=B.pathname+("/"===B.pathname.slice(-1)?"":"/");const w=B.toString();if(w.length>=2e3)throw new gA("Cannot create QR code, URL too long.");const d=await ta(w);if(o(d),!i.data||!i.data.regions)throw new iA(i,"Missing regions.");const h=await this.regionElements(i),E=await this.command(d,h,a,i.stepName);E&&(E.command&&a.getCommandDispatcher()(E.command),E.followup&&await E.followup()),await a.setSelectionsAndElements(i.stepName,[],h,(async()=>{a.updateStorage(i.stepName,{videoShortUrl:d,videoUrl:n}),c(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:F(),region:t})))}async command(t,A,e,n){const a=e.getLayouts(),i=`data:image/svg+xml;base64,${btoa(await Vt(t,{type:"svg"}))}`,r=A.map((t=>{const A=t.region,e=a.find((t=>t.panelId===A?.panelId));if(!e&&A)throw new eA(A);if(e&&!A)throw new Error("Region not found");if(!e||!A)throw new Error("Neither a region or layout found!");return new o({stepRegion:A,stepName:n,id:t.id,src:i,type:h.Image,y:A.top,x:A.left,width:A.width,height:A.height,rotation:0},e)}));return{command:new w(r),followup:async()=>{}}}};function aa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}const ia=new class{constructor(){aa(this,"frameSourceSvg",(async(t,A)=>{if(!t)return Et(A.data.regions[0]);const e=t.asset;if(!e)throw new nA(t);const n=e.fileLink;if(n)return nt(n);throw new aA(e)}))}async init(t,A,e){if(e)return await this.reload(t,A,e),null;if(A.setMandatoryFulfilled(t.stepName,!1),A.markStepsAsInitialised([t.stepName]),t.option&&t.option.variants&&t.option.variants.length>0){const e=t.option,n=bA.getDefaultVariant(e);return n?this.selectVariantCommand(t,n,[],A,void 0,t.data.placeholderImageUrl):null}return this.selectVariantCommand(t,void 0,[],A,void 0,t.data.placeholderImageUrl)}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));if(!t.option||0===(t.option.variants||[]).length){const e=Et(t.data.regions[0]);A.updateStorage(t.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,a=n.storage?.frameOffsets;if(A.updateMetadata(t.stepName,{frameOffsets:a,framePatternSrc:e}),e){const n=A.getStepSpecificServices(t.stepName)?.frameService;if(!n)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(e,n),A.updateMetadata(t.stepName,{image:e}),A.updateStorage(t.stepName,{framePatternSrc:e})}if(a?.zoom){const e=A.getStepSpecificServices(t.stepName)?.frameService;if(!e)throw new Error("Frame service unavailable, cannot load pattern!");e.updateOffsets(a)}A.setMandatoryFulfilled(t.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const i=n.selectedVariants[0].id;if(t.option&&i){const n=t.option.variants?.find((t=>t.id===i));n&&await A.setSelectionsAndElements(t.stepName,[n],a,(async()=>{const a=await this.frameSourceSvg(n,t);A.updateStorage(t.stepName,{currentFrameSource:a}),await e()}))}}else await A.setSelectionsAndElements(t.stepName,[],a,e)}}selectImage(t,A,e){e.setEditedStatus(t.stepName,!0);(A.fileLink||"").endsWith("pdf")?e.addPoller(new ea((async()=>{const t=(await HA.getLocalOrFromServer(A.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{HA.getLocalOrFromServer(A.key||"").then((A=>{this.loadPatternFromAsset(A,t,e)}))}),(()=>{throw new gA("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(A,t,e)}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(t,A,e,n){return new o({id:t,type:h.Frame,x:A.left,y:A.top,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,scaleX:A.width/n.frameData.width,scaleY:A.height/n.frameData.height,path:n.frameData.path,stepRegion:A,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:A.immutable},e)}async loadPatternFromString(t,A){if(t.endsWith("svg")){const e=await Ct(t),n=e.width,a=e.height,i={src:t,width:n,height:a,aspect:n/a};G.set(t,i),A.setPatternData(i)}else{const e=await st(t),n=await v(e),a={src:t,width:n.width,height:n.height,aspect:n.width/n.height};G.set(t,a),A.setPatternData(a)}}async selectVariantCommand(t,A,e,n,a,i){const o=n.getStepSpecificServices(t.stepName)?.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const r=await this.frameSourceSvg(A,t),c=await N(r),g=o.getImageData(),l=e.map((t=>new s(t.id))),B=g?tt(g,c):void 0,d=g?{id:F(),src:g.src,x:B?.x||0,y:B?.y||0,width:g.width,height:g.height,scaleX:B?.zoom||1,scaleY:B?.zoom||1,rotation:0}:void 0;a&&a(!0);const h=t.data.regions.map((A=>{const e=F(),a=n.getLayouts().find((t=>t.panelId===A.panelId));if(!a)throw new eA(A);return{command:this.getCreateElementCommand(e,A,a,{frameData:c,pattern:d,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:e,region:A}}})),E=h.map((t=>t.command));return{command:new w([...E,...l]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(t.stepName,A?[A]:[],[...h.map((t=>t.regionEl))],(async()=>{if(n.updateStorage(t.stepName,{currentFrameSource:r}),i){const A=n.getStepSpecificServices(t.stepName)?.frameService;if(!A)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,A)}}))}}}patternSource(t){const A=t.versions?.find((t=>"svg"===t.name));if(A)return A.link;const e=t.fileLink;if(e)return e;throw new aA(t)}async loadPatternFromAsset(t,A,e){const n=this.patternSource(t),a=e.markUpdatePending(),i=e.getStepSpecificServices(A.stepName)?.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),e.updateMetadata(A.stepName,{image:n}),e.updateStorage(A.stepName,{framePatternSrc:n}),e.markUpdateCompleted(a)}};const oa=new class{async getIllustrationBody(t){return new Promise((A=>{nt(t).then((t=>{A(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,A,e,n){return new o({stepRegion:A,stepName:n.stepName,colors:n.svg.colors,id:t,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:h.Illustration,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable},e)}getColors(t,A){const e=A.getRegionElements(t.stepName)||[];if(0===e.length)return[];try{return y(e[0].id,A.getAllLayoutData()).colors}catch(t){return[]}}async init(t,A,e){const n=t.option;if(!n)return null;if(e)return this.reload(t,A,e);{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantCommand(t,e,[],(()=>{}),A)}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!i||!e)throw new Error("Required illustration variant no longer available");{const o=i.variants?.find((t=>t.id===e));if(o){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[o],e,(async()=>{A.updateMetadata(t.stepName,{colors:n.storage?.colors}),A.setMandatoryFulfilled(t.stepName,!0)}))}}}return null}async availableColors(t,A){const e=t.data.colorOption;return e&&e?e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t}))):[]}async changeColorsCommand(t,A,e,n,a){const i={};for(const[t,A]of a.entries())i[t]={browserValue:A,spotColor:i[t]?.spotColor};const o=Qt(t,A,e,i),r=await dt(o),s=[];for(const t of n){for(const[A,e]of a.entries())s.push(new ut(t,A,e));s.push(new pt(t,o,r))}return new w(s)}async changeColors(t,A,e,n,a){if(0===A.length)return;const i=y(A[0].id,n().map((t=>t.layoutState))),o={...i.colors},r={};Object.entries(o).forEach((([t,A])=>{const e={browserValue:A.browserValue},n=A.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[t]=e}));for(const[t,A]of a.entries())o[t]={browserValue:A,spotColor:o[t]?.spotColor},r[t]={browserValue:A};let s=Array.from(Object.values(o)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{s=s.map((A=>A.toLowerCase()===t.color?.toLowerCase()?t.name:A))})),e.updateMetadata(t.stepName,{colors:s});const g=new Map;if(Object.entries(o).forEach((([t,A])=>{g.set(t,A.browserValue)})),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(i.svg,i.width,i.height,A.map((t=>t.id)),g);e.updateStorage(t.stepName,{colors:r}),e.getCommandDispatcher()(l)}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(t,A,e,n,a){if(!t.data||!t.data.regions)throw new iA(t,"Missing regions.");n(!0);const i=e.map((t=>new s(t.id)));a.setMandatoryFulfilled(t.stepName,!1);const o=A.asset;if(!o)throw new nA(A);const r=o.fileLink;if(!r)throw new aA(o);const c=await S(await this.getIllustrationBody(r)),g=await dt(c.svg),l=t.data.regions.map((A=>{const e=a.getLayouts().find((t=>t.panelId===A.panelId));if(!e)throw new eA(A);const n=F();return{regionElement:{id:n,region:A},command:this.getCreateElementCommand(n,A,e,{stepName:t.stepName,src:r,objectURL:g,svg:c})}})),B=[...l.map((t=>t.command)),...i];let d=Array.from(Object.values(c.colors)).map((t=>t.browserValue));const h=t.data.colorOption;return h&&h.variants?.forEach((t=>{d=d.map((A=>A.toLowerCase()===t.color?.toLowerCase()?t.name:A))})),a.updateMetadata(t.stepName,{colors:d}),{command:new w(B),followup:async()=>{await a.setSelectionsAndElements(t.stepName,[A],l.map((t=>t.regionElement)),(async()=>{a.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const ra=new class{async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(e)await this.reload(t,A,e);else{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantLambda(t,e,A,(()=>{}))}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(!i)throw new AA(t);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=i.variants?.find((t=>t.id===e));if(n){const e=n.material,o=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],o,(async()=>{const n=A.getModelContainer();if(n){const a=t.data.targetMaterials.map((t=>n.applyMaterialVariant(t,i.id||"",e||{})));Promise.all(a).then((()=>A.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantLambda(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,A,e,n){const a=e.getModelContainer();n(!0);const i=A.material;if(!i)throw n(!1),new nA(A);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],[],(async()=>{try{a&&t.data.targetMaterials.forEach((A=>{t.option&&a.applyMaterialVariant(A,t.option.id||"",i)})),e.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const sa=new class{async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(e)await this.reload(t,A,e);else{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantLambda(t,e,A,(()=>{}))}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{const e=A.getModelContainer();if(e&&t.option){const a=n.asset?.fileLink;if(!a)throw new nA(n);await e.applyModelVariant(t.option.id||"",{model:a,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantLambda(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,A,e,n){n(!0);const a=A.asset?.fileLink;if(!a)throw new nA(A);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],[],(async()=>{try{const A=e.getModelContainer();A&&t.option&&A.applyModelVariant(t.option.id||"",{model:a,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const ca=new class{async init(t,A,e){return e?(await this.reload(t,A,e),null):(A.updateMetadata(t.stepName,{text:""}),this.changeTextCommand(t,"",A,"",(()=>{})))}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[],a,(async()=>{A.updateStorage(t.stepName,{text:n?.storage?.text}),A.setMandatoryFulfilled(t.stepName,""!==n?.storage?.text)}))}async changeText(t,A,e,n,a){const i=await this.changeTextCommand(t,A,e,n,a);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(t,A,e,n,a){const i=e.getRegionElements(t.stepName),r=e.getStepSpecificServices(t.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(t,A,c,a))return e.setMandatoryFulfilled(t.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(t.stepName,""!==A),!t.data||!t.data.regions||t.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(t.stepName,{text:A});const g=(A,n,a)=>{const i=a||F(),r=e.getLayouts().find((t=>t.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return a&&c.push(new s(i)),c.push(new o({stepRegion:n,stepName:t.stepName,colors:{},id:i,svg:A,type:h.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:i,region:n,command:new w(c)}};if(i.length>0){const t=i.map((t=>{if(!t.region)return null;const e=r.svgPrint(A,t.region);return g(e,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new w(t),followup:async()=>{}}}{const n=t.data.regions.map((t=>g(r.svgPrint(A,t),t))),a=n.filter((t=>!!t)).map((t=>t&&t.command));return{command:new w(a),followup:async()=>{const A=n.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await e.setSelectionsAndElements(t.stepName,[],A)}}}}validateInput(t,A,e,n){if(t.data&&t.data.maxLength){const e=t.data.maxLength;if(A.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(A))return n("Unsupported characters."),!1;const a=qt(A.toLowerCase());for(const t of a)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const ga=new class{async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else if(n.defaultVariant)return A.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,n.defaultVariant,A,(()=>{}));return A.markStepsAsInitialised([t.stepName]),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantCommand(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,A,e,n){const a=A.asset;if(!a)throw new nA(A);const i=a?.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),e.setMandatoryFulfilled(t.stepName,!1);const r=e.getRegionElements(t.stepName).map((t=>new s(t.id))),c=t.data.regions.map((A=>{const n=e.getLayouts().find((t=>t.panelId===A.panelId));if(!n)throw new eA(A);const a=F();return{regionElement:{id:a,region:A},command:new o({stepName:t.stepName,stepRegion:A,id:a,src:i,type:h.Image,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,preserveAspectRatio:"none"},n)}}));return{command:new w([...r,...c.map((t=>t.command))]),followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],c.map((t=>t.regionElement)),(async()=>{e.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const la=new class{async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else{const e=n.variants;if(bA.getDefaultVariant(n)){const a=e?.find((t=>t.id===n.defaultVariant?.id));return this.selectVariantLambda(t,a?.id||"",A)}}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((t=>t.id===e));n&&await A.setSelectionsAndElements(t.stepName,[n],[])}}}async selectVariant(t,A,e){await e.getInitializationPromise();const n=await this.selectVariantLambda(t,A,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,A,e){const n=t.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find((t=>t.id===A)):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[i],[],(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}};const Ba=new class{async availableColours(t){const A=t.option;return A&&A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(!e){const e=bA.getDefaultVariant(n);if(!e)return null;const a={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(t,a,[],A)}return await this.reload(t,A,e),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{A.updateStorage(t.stepName,{colour:n.color||""}),A.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantCommand(t,A,e,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,A,e,n){const a=n.getLayouts();if(e.length>0){const i=t=>{const e=t.region;if(!a.find((t=>t.panelId===e?.panelId)))throw new eA(e);const n=A.variant?.color;return n?new ut(t.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},o=e.map(i).filter((t=>!!t));return{command:new w(o),followup:async()=>{await n.setSelectionsAndElements(t.stepName,A.variant?[A.variant]:[],e),n.updateStorage(t.stepName,{colour:A.fill||""})}}}{const e=e=>{const n=a.find((t=>t.panelId===e.panelId));if(!n)throw new eA(e);const i=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${A.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:A.variant.color};const s=F();return{id:s,region:e,command:new o({stepRegion:e,stepName:t.stepName,colors:r,id:s,svg:i,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:t.data.excludeFromPrint},n)}},i=t.data.regions.map(e),r=i.filter((t=>!!t)).map((t=>t?.command)),s=i.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new w(r),followup:async()=>{await n.setSelectionsAndElements(t.stepName,A.variant?[A.variant]:[],s,(async()=>{n.updateStorage(t.stepName,{colour:A.fill||""})}))}}}}};function wa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class da extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=da.name}}const ha=["‘","’","“","”","\n"];class Ea extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=Ea.name}}const Ca=new class{constructor(){wa(this,"cachedColors",new Map),wa(this,"filterUnsupportedCharacters",((t,A)=>{let e=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=A?mt(A):void 0;if(a){const t=e.split("").filter((t=>!ha.includes(t))).join(""),A=t.split("").map((t=>a.getFont().charToGlyph(t)));for(let e=0;e<A.length;e++){".notdef"===A[e].name&&n.push(String.fromCharCode(t.charCodeAt(e)))}}for(let t=0;t<n.length;t++)e=e.replaceAll(n[t],"");return e})),wa(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),wa(this,"getErrorsForText",((t,A,e)=>{const n=[];A.data&&A.data.maxLength&&t.length>A.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=e.getProfanities(),i=qt(t.toLowerCase());for(const t of i)for(const A in a){if(t===a[A].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!A.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else{const e=this.getDefaultImageFillVariant(t.data),a=e?.asset?.fileLink,i=a?await Z(a):void 0,o=i?{src:i.src,height:i.height,width:i.width,scale:t.data.imageFillScale||1}:void 0;A.updateStorage(t.stepName,{inputText:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.color||await this.getDefaultColor(t.data),fillImage:o}),A.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:e?.name});const r=bA.getDefaultVariant(n);if(r)return this.selectVariantCommand(t,r,{},[],A,(()=>{}),(()=>{}),o)}return null}findLayoutElements(t,A){return t.getRegionElements(A.stepName).map((A=>y(A.id,t.getAllLayoutData())))}availableFillColors(t){const A=this.cachedColors.get(t.stepName);if(A)return A;const e=t.data.colorOption;if(e){const A=e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[];return this.cachedColors.set(t.stepName,A),A}return[]}async changeFillColor(t,A,e,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher();A.variant?n.updateMetadata(t.stepName,{color:A.variant.name}):n.updateMetadata(t.stepName,{color:A.fill});const i=t.data.colorOption,o=i?this.createTextFillSpotColor(i,A.variant):void 0;i?n.updateStorage(t.stepName,{color:A.fill,colorProfileAssetKey:i.colorProfile?.key}):n.updateStorage(t.stepName,{color:A.fill});for(const t of e){if(!A.fill)throw new Error("Fill not set on new color selection!");a(new g(t.id,A.fill,o))}}async availableFillImages(t){const A=t.data.imageFillOption;if(A){const e=A.variants?.map((t=>t.asset?.fileLink))?.filter((t=>!!t))||[];return Promise.all(e.map((async A=>{const e=await Z(A);return{src:A,width:e.width,height:e.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,A,e,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher(),i=t.option?.variants?.find((t=>t.asset?.fileLink===A.src));n.updateMetadata(t.stepName,{fillImage:i?.name}),n.updateStorage(t.stepName,{fillImage:A});for(const t of e){a(new Dt(t.id,A))}}getProcessedInput(t,A,e){const n=e?t:this.injectReplaceableText(t,A);return lt(n,{vertical:A.vertical,uppercase:A.uppercase})}updateInputText(t,A,e,n){const a=n.getStepStorage(e.stepName),i=this.getProcessedInput(t,e.data,!!a.customiseAllText),o={command:void 0,helperText:"",errors:this.getErrorsForText(t,e,n)};if(o.errors.length>0)return o.helperText=o.errors[0].localizationKey,o;const r=(e.data.maxLength-i.length).toString();o.helperText=`${r} characters remaining`;const s=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const t of A){if(!t.fontData)throw new rA("Failed to resolve font data for text.");const[A,n]=U(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[i],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(t.id,A),l.set(t.id,n);const a=e.data.curved?i:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(A,e.data,t.id,a,s))}if(!e.data.curved&&A.length>0){if(!Array.from(l.values()).every((t=>t)))return o.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),o}return n.updateStorage(e.stepName,{text:t}),n.updateMetadata(e.stepName,{text:i}),a.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),o.command=new w(c),o.command.varying=s,o}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e.getStepStorage(t.stepName)||{},e.getRegionElements(t.stepName),e,n,a);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}createTextFillSpotColor(t,A){const e=t.colorProfile;if(e){const t=(e.name||"").replace(/\s/g,"-"),n=t.lastIndexOf("/"),a=t.slice(n+1).slice(0,-4);if(!A.namedColor)throw new Error("variant named color not set!");return{profileName:a,namedColor:A.namedColor}}}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const o=i.variants?.find((t=>t.id===e));if(o){const e=await this.fontDataFromVariant(o),i=a.map((t=>({id:t.id,region:t.stepRegion}))),r=n.storage?.color,s=n.storage?.text;await A.setSelectionsAndElements(t.stepName,[o],i,(async()=>{A.updateMetadata(t.stepName,{color:r,text:s}),A.updateStorage(t.stepName,{text:s,inputText:s});const n=a.map((t=>new B(t.id,e))),i=new w(n);A.getCommandDispatcher()(i),A.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=Ca.updateInputText(s||"",a,t,A);c&&A.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const A=t.colorOption;if(A)return bA.getDefaultVariant(A)}async getDefaultColor(t){const A=t.colorOption;if(!A)return;return bA.getDefaultVariant(A)?.color}getDefaultImageFillVariant(t){const A=t.imageFillOption;if(A)return bA.getDefaultVariant(A)}async fontDataFromVariant(t){const A=t.asset;if(!A)throw new nA(t);const e=A.fileLink;if(!e)throw new aA(A);return{assetUrl:e,name:(await H(e)).names.fullName.en}}async selectVariantCommand(t,A,e,n,a,i,o,r){const s=a.markUpdatePending(),c=await this.fontDataFromVariant(A);if(n.length>0){const g=n.map((t=>new B(t.id,c)));if(r){const t=n.map((t=>new Dt(t.id,r)));g.push(...t)}const l=await this.changeInputTextWithRegion(t,t.data.size||30,c,e.text||"",e,a,!!e.customiseAllText,i,o);l&&g.push(l);return{command:new w(g),followup:async()=>{a.markUpdateCompleted(s),await a.setSelectionsAndElements(t.stepName,[A],n)}}}{const n=await this.createTextboxRegions(t.stepName,A,t.data,c,e,a),g=await this.changeInputTextWithRegion(t,t.data.size||30,c,n[0]?.newElement.input||e.text||t.data.defaultText||"",e,a,!!e.customiseAllText,i,o),l=n.flatMap((t=>t.commands));if(r){const t=n.map((t=>new Dt(t.regionElement.id,r)));l.push(...t)}g&&l.push(g);return{command:new w(l),followup:async()=>{a.markUpdateCompleted(s)}}}}injectReplaceableText(t,A){return A.replaceableText?A.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,A,e,n,a,i){if(!e||!e.regions)throw new Error("Step data not supplied");const r=i.getTransaction().bulk&&e.varyText||!1,s=r?"":a.text||e.defaultText||"",c=this.getProcessedInput(s,e,!1),g=await Promise.all(e.regions.map((async A=>{const g=i.getLayouts().find((t=>t.panelId===A.panelId)),l=F();try{if(!g)throw new Ea("Failed to find layout for region: "+A.panelId);const B=e.colorOption;let w;if(B&&B.variants){const A=B.variants.find((t=>t.id===B.defaultVariant?.id))||B.variants[0];w=this.createTextFillSpotColor(B,A),i.updateStorage(t,{colorProfileAssetKey:B.colorProfile?.key})}const d=await this.getDefaultColor(e),E=d||"#000000",C={stepRegion:A,stepName:t,align:this.textAlign(e),fill:a.color?a.color:E,fontSize:e.size||30,fontData:n,id:l,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,text:c,input:s,type:h.Textbox,vertical:e.vertical,x:A.left,y:A.top,height:A.height,width:A.width,immutable:A.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:w},Q=[],u=new Map,p=new Map;if(!C.fontData)throw new rA("Failed to resolve font data for text.");const[m,D]=U(C.fontSize,C.fontData,{left:C.x,top:C.y,width:C.width,height:C.height,rotation:C.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});u.set(C.id,m),p.set(C.id,D);const I=e.curved||e.vertical?c:(D||[]).join("\n");Q.push(this.generateTextChangeCommandsForRegion(m,e,C.id,I,r));const f=new o(C,g);return f.varying=r,{regionElement:{id:l,region:A},commands:[f,...Q],newElement:C,fontData:n}}catch(t){throw console.log(t),new da("Error adding font to region")}}))).catch((t=>{throw t instanceof da?(ge.setLatestToast("Failed to load font.",ua.Error),t):t instanceof Ea?t:new Error(t)}));return await i.setSelectionsAndElements(t,[A],g.map((t=>t.regionElement)),(async()=>{i.updateMetadata(t,{text:s}),i.updateStorage(t,{text:s})})),g}generateTextChangeCommandsForRegion(t,A,e,n,a){const i=[],o=new D(e,n);if(o.varying=a,i.push(o),!A.size){const A=new l(e,t);A.varying=a,i.push(A)}const r=new w(i);return r.varying=a,r}async changeInputTextWithRegion(t,A,e,n,a,i,o,r,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,t.data,o),B=i.getRegionElements(t.stepName),d=new Map,h=new Map;for(const n of B)if(n.region){const[a,i]=U(A,e,n.region,[l],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});d.set(n.id,a),h.set(n.id,i)}const E=(()=>{if(t.data&&t.data.maxLength&&l.length>t.data.maxLength)return c&&c(!0),{info:"0"};const A=i.getProfanities(),e=qt(l.toLowerCase());for(const t of e)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return r(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(h.values()).every((t=>t)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(t.data.maxLength-l.length).toString()}})();if(E.error)return void s(E.error);if(s(`${E.info} characters remaining`||""),c)return;i.updateStorage(t.stepName,{text:g}),i.updateMetadata(t.stepName,{text:this.injectReplaceableText(g,t.data)});const C=i.getTransaction().bulk&&t.data.varyText||!1;a.defaultCleared&&i.setMandatoryFulfilled(t.stepName,!0);const Q=[];for(const A of B){const e=t.data.curved?l:(h.get(A.id)||[]).join("\n");Q.push(this.generateTextChangeCommandsForRegion(d.get(A.id)||1,t.data,A.id,e,C))}const u=new w(Q);return u.varying=C,u}};function Qa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}let ua;var pa;(pa=ua||(ua={})).Error="Error",pa.Warning="Warning",pa.Info="Info";class ma extends Oe{constructor(t){super(),Qa(this,"update",void 0),Qa(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class Da{constructor(t,A,e,n,a,i,o,r,s,c,g=!1,l){Qa(this,"reloadedState",void 0),Qa(this,"transaction",void 0),Qa(this,"ownerCustomer",void 0),Qa(this,"updateTransaction",void 0),Qa(this,"confirmedDesign",void 0),Qa(this,"editedSteps",void 0),Qa(this,"informationResults",void 0),Qa(this,"layouts",void 0),Qa(this,"mandatorySteps",void 0),Qa(this,"pendingUpdates",void 0),Qa(this,"selectionCost",void 0),Qa(this,"workflow",void 0),Qa(this,"stepSpecificServices",void 0),Qa(this,"previewService",void 0),Qa(this,"profanityFilter",void 0),Qa(this,"pollers",void 0),Qa(this,"commandContext",void 0),Qa(this,"stepElements",void 0),Qa(this,"stepInitialised",void 0),Qa(this,"stepMetadata",void 0),Qa(this,"stepSelections",void 0),Qa(this,"storage",void 0),Qa(this,"confirmCallbacks",void 0),Qa(this,"editedCallbacks",void 0),Qa(this,"elementsCallbacks",void 0),Qa(this,"informationResultCallbacks",void 0),Qa(this,"initCallbacks",void 0),Qa(this,"makingAdjustmentsCallback",void 0),Qa(this,"mandatoryCallbacks",void 0),Qa(this,"metadataCallbacks",void 0),Qa(this,"selectionCallbacks",void 0),Qa(this,"stepSpecificStorageCallbacks",void 0),Qa(this,"storageCallbacks",void 0),Qa(this,"currentVariationRecordCallbacks",void 0),Qa(this,"variationRecordCallbacks",void 0),Qa(this,"allScenes",void 0),Qa(this,"product",void 0),Qa(this,"invalidModelVariants",void 0),Qa(this,"currentAdjustingStepId",void 0),Qa(this,"renderableContextService",void 0),Qa(this,"workflowStatePromiseQueue",new ze(1)),Qa(this,"variationRecords",[]),Qa(this,"currentVariationRecord",void 0),Qa(this,"initializationPromise",void 0),Qa(this,"initialized",!1),Qa(this,"readOnly",!1),Qa(this,"modelContainer",void 0),Qa(this,"render3DScene",(()=>{if(!this.previewService)return;const t=this.getCommandContext().getAllLayouts(),A=this.getLayoutPreviewService()?.getAll();if(A)for(const[,e]of A)e.render(this.getWorkflow(),t,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=a,this.commandContext=n,this.reloadedState=c,this.transaction=i,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=t,this.stepSpecificServices={},this.profanityFilter=A,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=o,this.previewService=r,this.modelContainer=l,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.initializationPromise=this.initializeDefaultWorkflowState(t,i),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((t=>{throw console.error(t),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>{this.updateStateWithServer(),this.render3DScene()}))))}async initializeDefaultWorkflowState(t,A){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((t=>{this.storage[t.stepName]=t.storage||{}})),this.allScenes=await On(t,{bulkScene:A.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},A);const e=Kn(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:n,commands:a}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new w(a),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const t=this.workflow.finalizeStepConfig;if(!t)return;const A=t.lookAtAnimation,e=t.modelAnimation;A&&this.previewService?.executeCameraAnimation(A),e&&this.modelContainer?.executeAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(t){const A={...t,recordNumber:this.variationRecords.reduce(((t,A)=>A.recordNumber>t?A.recordNumber:t),0)+1};return this.variationRecords.push(A),this.onVariationRecordsChange(),A}removeVariationRecord(t){if(this.variationRecords=this.variationRecords.filter((A=>A.recordNumber!==t)),this.variationRecords.forEach(((t,A)=>t.recordNumber=A+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===t){const t=this.currentVariationRecord.recordNumber,A=t>1?this.variationRecords[t-2]:this.variationRecords[0];this.setCurrentVariationRecord(A||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(t){this.variationRecords=t,this.onVariationRecordsChange(),0===t.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(t[0])}setCurrentVariationRecord(t){if(this.currentVariationRecord=t,this.onCurrentVariationRecordChange(),t){const A=this.variationRecords.find((A=>A.recordNumber===t.recordNumber));A&&(A.values=t.values,this.onVariationRecordsChange())}}addConfirmCallback(t){t(this.confirmedDesign),this.confirmCallbacks.push(t)}addEditedCallback(t){t(this.editedSteps),this.editedCallbacks.push(t)}addElementsCallback(t){t(this.stepElements),this.elementsCallbacks.push(t)}addInformationResultCallback(t){t(this.informationResults),this.informationResultCallbacks.push(t)}addInitCallback(t){t(this.stepInitialised),this.initCallbacks.push(t)}addMandatoryCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}addMetadataCallback(t){t(this.stepMetadata),this.metadataCallbacks.push(t)}async addSelectionCallback(t){t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(t)}addStepSpecificStorageCallback(t,A){Object.keys(this.storage).includes(A)||(this.storage[A]={}),t(this.storage[A]),Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].push(t)}addStorageCallback(t){t(this.storage),this.storageCallbacks.push(t)}addMakingAdjustmentsCallback(t){t(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(t)}addCurrentVariationCallback(t){t(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(t)}addVariationRecordsCallback(t){t(this.variationRecords),this.variationRecordCallbacks.push(t)}addPoller(t){this.pollers.push(t)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((t=>t.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(t){return this.stepElements[t]||[]}getStepSpecificServices(t){return this.stepSpecificServices[t]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(t){this.ownerCustomer=t}setTransactionCustomerDetails(t){this.ownerCustomer={...this.ownerCustomer,emailAddress:t.email}}getModelContainer(){return this.modelContainer}setModelContainer(t){(!t||this.previewService&&this.previewService.getAllModels().includes(t))&&(this.modelContainer=t)}setTransaction(t){this.transaction=t}getWorkflow(){return this.workflow}getCommandDispatcher(){return t=>this.commandContext.apply(t,!this.initialized)}getWorkflowSelections(){const t={};return this.workflow.steps.forEach((A=>{const e=this.stepSelections[A.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(t[A.stepName]={selections:e.selectedVariants})})),t}markStepsAsInitialised(t){const A={...this.stepInitialised};t.forEach((t=>{A[t]=!0})),this.stepInitialised=A,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(t){this.pendingUpdates=this.pendingUpdates.filter((A=>A!==t))}markUpdatePending(){const t=F();return this.pendingUpdates=[...this.pendingUpdates,t],t}setEditedStatus(t,A){this.editedSteps={...this.editedSteps,[t]:A},this.onEditedChange()}setInformationResults(t){this.informationResults=[...t],this.onInformationResultChange()}setCurrentAdjustingStepId(t){this.currentAdjustingStepId=t,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(t,A){this.mandatorySteps[t]!==A&&(this.mandatorySteps={...this.mandatorySteps,[t]:A},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}async updateStorage(t,A){const e={...this.storage,[t]:{...this.storage[t],...A}};if(!Ot(e,this.storage)){this.storage=e;const A=new ht(this.constructSerializableWorkflow());this.commandContext.apply(A,!0),this.onStepSpecificStorageChange(t),this.onStorageChange()}}constructSerializableWorkflow(){const t=[];return this.allScenes.forEach((A=>{A.renderableSteps.forEach((A=>{const e={stepName:A.stepName};e.storage=this.storage[A.stepName],e.selectedVariants=this.stepSelections[A.stepName]?.selectedVariants?.map((t=>({id:t.id,priceModifier:t.priceModifier}))),t.push(e)}))})),{steps:t}}updateStateWithServer(){if(this.readOnly)return;const t=this.serialize();this.workflowStatePromiseQueue.enqueue(new ma((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new ma((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new rA("Attempted to serialize state before it was initialized.");const A=JSON.stringify(this.dehydrateState(zt(t.transaction))),e=t.variation;if(!e)return{transaction:A};const n={layouts:{},serializableWorkflow:{steps:[]},...zt(e)||{}};return{transaction:A,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(t){for(const A of Object.values(t.layouts).map((t=>t.elements)).flat())"illustration"===A.type&&(delete A.cachedObjectURL,A.src&&delete A.svg);return t}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(t,A){this.stepMetadata={...this.stepMetadata,[t]:{...this.stepMetadata[t],...A}},this.onMetadataChange()}removeElements(t){this.stepElements=((t,A)=>Object.keys(t).reduce(((e,n)=>{const a=[...t[n]||[]];return A.forEach((t=>{const A=a.findIndex((A=>A.id===t.id));A>-1&&a.splice(A,1)})),e[n]=a,e}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,A)=>(jn(A,this.stepSelections)||this.stepElements[A.stepName]&&this.stepElements[A.stepName].forEach((A=>t.push(A))),t)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((t,A)=>("Model"===A.type&&A.option?.id&&!jn(A,this.stepSelections)&&t.push(A.option.id),t)),[])}async stepElementsForIntroducedSilentSteps(t,A){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(t,A,e)=>{if(t.type===m.SilentIllustration){return{step:t,results:await new _n(t,A).trigger()}}if(t.type===m.ProductOverlay){return{step:t,results:await new _n(t,A,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},a=t.filter((t=>!this.stepInitialised[t.stepName])),i={stepElements:{},commands:[]},o=[];for(const t of a)this.markStepsAsInitialised([t.stepName]),A||o.push(n(t,this.layouts,e));const r=await Promise.all(o);for(const t of r)i.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),i.commands=[...i.commands,...t.results.map((t=>t.command))];return i}getStepStorage(t){return this.storage[t]}getMetadata(t){return this.stepMetadata[t]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(t,A){return A.find((A=>A.stepName===t))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((t=>t.layoutState.elements.forEach((t=>{this.getCommandDispatcher()(new s(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,A,e,n){const a=this.stepSelections;this.stepSelections={...this.stepSelections,[t]:{selectedVariants:A}},this.selectionCost=Object.values(this.stepSelections).reduce(((t,A)=>t+A.selectedVariants.map((t=>t.priceModifier||0)).reduce(((t,A)=>t+A),0)),0),this.workflow.steps.forEach((t=>{jn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const i=this.allScenes,o=Kn(i,a),r=Kn(i,this.stepSelections),c=o.map((t=>t.silentSteps)).flat(),g=r.map((t=>t.silentSteps)).flat().filter((t=>!c.some((A=>A.stepName===t.stepName))));c.forEach((t=>{jn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:B,commands:d}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...B,[t]:e},this.removeElements(l);if(this.workflow.steps.find((A=>A.stepName===t))?.type===m.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(e.map((t=>t.id)))}const h=[...d,...l.map((t=>new s(t.id))),new ht(this.constructSerializableWorkflow())];h.length>0&&this.commandContext.apply(new w(h),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const t=[],A=Kn(this.allScenes,this.stepSelections).map((t=>t.renderableSteps)).flat();for(const e of A)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case m.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case m.DigitalContent:t.push(na.init(e,this,this.reloadedState));break;case m.Frame:case m.Photo:{const A=new Zn(e.data.forceImageCover);A.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:A},t.push(ia.init(e,this,this.reloadedState))}break;case m.Illustration:t.push(oa.init(e,this,this.reloadedState));break;case m.Material:t.push(ra.init(e,this,this.reloadedState));break;case m.Model:t.push(sa.init(e,this,this.reloadedState));break;case m.Module:this.stepSpecificServices[e.stepName]={module:await ln(e.data.module)},t.push(ca.init(e,this,this.reloadedState));break;case m.Picture:t.push(ga.init(e,this,this.reloadedState));break;case m.Question:t.push(la.init(e,this,this.reloadedState));break;case m.Shape:t.push(Ba.init(e,this,this.reloadedState));break;case m.Text:t.push(Ca.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(t)).map((t=>{if("rejected"===t.status)throw new Error(`Step initialization failed: ${t.reason}`);return t.value})),n=e.filter((t=>!!t&&!!t.command)).map((t=>t.command)),a=e.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));n&&n.length>0&&this.commandContext.apply(new w(n),!0);for(const t of a)await t();a.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((t=>t(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((t=>t(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((t=>t(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((t=>t(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((t=>t(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((t=>{t(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((t=>t(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((t=>{t(this.stepMetadata)}))}async onSelectionChange(){const t=await this.traversableScenes();for(const A of this.selectionCallbacks)A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:t})}onStepSpecificStorageChange(t){Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].forEach((A=>A(this.storage[t])))}onStorageChange(){this.storageCallbacks.forEach((t=>t(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((t=>{t(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((t=>{t(this.variationRecords)})),this.render3DScene()}traversableScenes(){return Vn(this.allScenes,this.stepSelections)}}function Ia(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class fa{constructor(t){Ia(this,"variantData",void 0),this.variantData=t}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(t,A){return this.variantData.priceModifier.toLocaleString(t||"en-US",{style:"currency",currency:"USD",...A})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.thumbnail?.versions?.find((t=>"cdn"===t.name))?.link}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name));return t?t.link:this.variantData.asset?.versions?.find((t=>"thumbnail"===t.name))?.link}getDisplayImage(){return this.variantData.displayImage?.versions?.find((t=>"medium"===t.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function ya(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class Ma{constructor(t,A){ya(this,"manager",void 0),ya(this,"step",void 0),this.manager=t,this.step=A}setUpdateState(t){Ma.updateState.set(this.step.stepName,t)}getUpdateState(){return!!Ma.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new fa(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new fa(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new fa(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}getRaw(){return this.step}executeAnimations(){const t=this.manager.getPreviewService(),A=this.manager.getModelContainer(),e=this.step.data.modelAnimation,n=this.step.data.lookAtAnimation;t&&n&&t.executeCameraAnimation(n),A&&e&&A.executeAnimation(e)}}function Fa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}ya(Ma,"updateState",new Map);const Ya=ft`
454
+ `,Ln=t=>{const A=[];for(const e of t.steps)switch(e.type){case m.DigitalContent:e.data.varyUpload&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Upload});break;case m.Frame:const t=e.data;t.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),t.varyUpload&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Upload});break;case m.Illustration:const n=e.data;n.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),n.varyColors&&n.colorPickerEnabled&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Colors});break;case m.Material:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Model:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Picture:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Question:e.data.varySelections&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selections});break;case m.Shape:e.data.varySelection&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection});break;case m.Text:const a=e.data;a.varyText&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Text}),a.varySelection&&e.option&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Selection}),a.varyColor&&a.colorPickerEnabled&&A.push({stepName:e.stepName,stepType:e.type,aspectType:p.Color})}return A},Tn=[m.SilentIllustration,m.ProductOverlay],On=async(t,A,e)=>{const n=[];t.introduction&&n.push({name:"Introduction",title:t.name,renderableSteps:[{type:m.Introduction,stepName:"Introduction",stepTitle:t.name,helpText:t.introduction,data:{},conditions:[]}],silentSteps:[]});for(const e of t.steps){if(A.bulkScene){let t=!1;switch(e.type){case m.DigitalContent:e.data.varyUpload&&(t=!0);break;case m.Frame:{const A=e.data;!A.varyUpload||!A.varySelection&&e.option||(t=!0)}break;case m.Illustration:{const A=e.data;!A.varySelection&&e.option&&1!==(e.option.variants||[]).length||!A.varyColors&&A.colorPickerEnabled||(t=!0)}break;case m.Material:e.data.varySelection&&(t=!0);break;case m.Model:e.data.varySelection&&(t=!0);break;case m.Picture:e.data.varySelection&&(t=!0);break;case m.Question:e.data.varySelections&&(t=!0);break;case m.Shape:e.data.varySelection&&(t=!0);break;case m.Text:{const A=e.data;!A.varySelection&&e.option&&1!==(e.option.variants||[]).length||!A.varyColor&&A.colorPickerEnabled&&A.colorOption||!A.varyText||(t=!0)}}if(t)continue}const a=zn(e.stepName,t.stepGroups);if(a){const t=n.find((t=>t.name===a.name));t?Tn.includes(e.type)?t.silentSteps.push(e):t.renderableSteps.push(e):n.push({name:a.name,title:a.name,renderableSteps:Tn.includes(e.type)?[]:[e],silentSteps:Tn.includes(e.type)?[e]:[]})}else n.push({name:e.stepName,title:e.stepTitle,renderableSteps:Tn.includes(e.type)?[]:[e],silentSteps:Tn.includes(e.type)?[e]:[]})}if(A.bulkScene){const a=e?.product?.bulkConfiguration;n.push({name:"Bulk",title:a?.sceneTitle??A.bulkSceneTitle,renderableSteps:[{type:m.Bulk,stepName:"Bulk",stepTitle:a?.stepTitle??A.bulkSceneTitle,helpText:a?.helpText,data:{aspects:Ln(t)},conditions:[]}],silentSteps:[]})}return A.finishScene&&n.push({name:"Finish",title:A.finishSceneTitle,renderableSteps:[{type:m.Finish,stepName:"Finish",stepTitle:A.finishSceneTitle,helpText:"",data:{modelAnimation:t.finalizeStepConfig?t.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:t.finalizeStepConfig?t.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),n},zn=(t,A)=>A.find((A=>A.stepNames.includes(t))),jn=(t,A)=>(t.conditions||[]).every((t=>{const e=A[t.targetStepName];if(e&&e.selectedVariants){const A=e.selectedVariants;return t.requiredVariantSelections.some((t=>void 0!==A.find((A=>A.id===t))))}return!1})),Kn=(t,A)=>t.map((t=>((t,A)=>{const e={name:t.name,title:t.title,renderableSteps:t.renderableSteps.filter((t=>jn(t,A))),silentSteps:t.silentSteps.filter((t=>jn(t,A)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(t,A))).filter((t=>null!==t)),Vn=async(t,A)=>{const e=Kn(t,A),n=[];for(const t of e)for(const A of t.renderableSteps)if(A.type===m.Model||A.type===m.Material||A.type===m.Picture||A.type===m.Shape){const t=(A.option?.variants||[]).length;t&&t>1&&n.push(A.stepName)}else n.push(A.stepName);const a=e.filter((t=>t.renderableSteps.filter((t=>n.includes(t.stepName))).length>0));for(const t of a)t.renderableSteps=t.renderableSteps.filter((t=>n.includes(t.stepName)));return a};function Wn(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}function Xn(t,A,e,n){const a=e.width*t.zoom,i=e.height*t.zoom;if(n){const n=t,a=Math.max(A.width/e.width,A.height/e.height);n.zoom=Math.max(a,t.zoom);const i=e.width*n.zoom,o=e.height*n.zoom;return n.x=qn(t.x,A.width-i,0),n.y=qn(t.y,A.height-o,0),n}const o=t;return o.x=qn(o.x,-a,A.width),o.y=qn(o.y,-i,A.height),o}function qn(t,A,e){return Math.min(Math.max(t,A),e)}class Zn{constructor(t){Wn(this,"offsets",void 0),Wn(this,"forceImageCover",void 0),Wn(this,"targetElements",void 0),Wn(this,"imageData",void 0),Wn(this,"frameData",void 0),Wn(this,"_debouncedUpdateFrameOffsets",void 0),Wn(this,"minZoomScale",.03),Wn(this,"maxZoomScale",20),Wn(this,"onFrameDataChangeListeners",void 0),Wn(this,"onZoomChangeListeners",void 0),Wn(this,"workflowManager",void 0),Wn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=Xt(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=t}connectWorkflowManager(t,A){A&&t.addStepSpecificStorageCallback((async t=>{if(t){const A=t;if(A.currentFrameSource){const t=await N(A.currentFrameSource);Ot(t,this.frameData)||(this.frameData=t,this.onFrameDataChangeListeners.forEach((t=>t(this.frameData))),this.frameData&&this.imageData&&(this.offsets=tt(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),A),this.workflowManager=t,this.stepName=A}setTargetElements(t){this.targetElements=t}getFrameData(){return this.frameData}async setFrameData(t){const A=M.get(t);this.frameData=A}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(t){this.offsets=t}setZoom(t,A,e,n){if(this.imageData&&this.offsets&&this.frameData){const a=(A-this.offsets.x)/this.offsets.zoom,i=(e-this.offsets.y)/this.offsets.zoom,o={x:A-a*t,y:e-i*t,zoom:this.imageData.width*t/this.imageData.width};this.updateOffsets(Xn(o,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((A=>A(t)))}}setPatternData(t){(t&&this.frameData||t&&this.frameData&&!this.imageData)&&(this.offsets=tt(t,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,t,this.frameData,this.targetElements),this.updateOffsets(Xn(this.offsets,this.frameData,t,this.forceImageCover))),this.imageData=t,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(t,A){const e=this.imageData;e&&this.frameData&&(this.offsets&&t.x===this.offsets.x&&t.y===this.offsets.y&&t.zoom===this.offsets.zoom?A&&A():(this.offsets=Xn(t,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(t,e,this.frameData,this.targetElements,A)))}onFrameDataChanged(t){t(this.frameData),this.onFrameDataChangeListeners.push(t)}onZoom(t){this.onZoomChangeListeners.push(t)}updateFrameOffsets(t,A,e,n,a){if(!e)throw new rA("Frame data not set. This is a bug");if(!this.workflowManager)throw new rA("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();n.forEach((e=>{i(new At(e,A,t))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:t}),a&&a()}recalculateZoomLimits(t,A){const e=Math.max(A.width/t.width,A.height/t.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function $n(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class _n{constructor(t,A,e){$n(this,"configuration",void 0),$n(this,"layouts",void 0),$n(this,"product",void 0),$n(this,"processRegion",(async t=>{const A=this.layouts.find((A=>A.panelId===t.panelId));if(!A)throw new eA(t);let e="";if(this.configuration.type===m.ProductOverlay){let t="";if(this.product?.overlayImageUrl&&(t=this.product.overlayImageUrl),e=t,!t)throw new iA(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===h.Image){const e=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:this.product?.overlayImageUrl;if(!e)throw new Error("Undefined raster silent step source");const a={stepName:this.configuration.stepName,id:F(),src:e,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,rotation:t.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:a.id,region:t},command:new o(a,A)}}{const a=this.configuration.type===m.SilentIllustration?this.configuration.data.asset?.fileLink:e,i=async()=>new Promise(((t,A)=>{a?nt(a).then((A=>{t(A)})).catch((t=>console.error(t))):A("Undefined vector silent step source")})),r=await S(await i()),s={stepName:this.configuration.stepName,id:F(),cachedObjectURL:await dt(r.svg),src:a,svg:r.svg,colors:r.colors,type:n,y:t.top,x:t.left,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,immutable:t.immutable,productOverlay:this.configuration.type===m.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:s.id,region:t},command:new o(s,A)}}})),this.configuration=t,this.layouts=A,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new iA(this.configuration,"Missing regions.");if(this.configuration.type===m.SilentIllustration){const t=this.configuration.data.regions.map(this.processRegion);return Promise.all(t)}return this.configuration.type===m.ProductOverlay?Promise.all(this.configuration.data.regions.map((t=>{if(!this.layouts.find((A=>t.panelId===A.panelId)))throw new eA(t);return this.processRegion(t)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const t=this.configuration.type===m.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.asset?.fileLink?.toLowerCase().split("?")[0];return t?.startsWith("data:image/png")||t?.endsWith(".jpeg")||t?.endsWith(".jpg")||t?.endsWith(".png")?h.Image:(t?.endsWith(".svg")||t?.startsWith("image/svg+xml"),h.Illustration)}}const ta=async t=>{const A=`${EA.getServicesApiUrl()}/shortener`;try{const e=await fetch(A,{method:"POST",body:JSON.stringify({longUrl:t}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(t){throw console.error(t),new gA("Failed to shorten URL, see console.")}};function Aa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class ea{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(t){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(t,A,e,n=3e3,a=10){Aa(this,"pollingId",void 0),Aa(this,"attempts",void 0),Aa(this,"interval",void 0),Aa(this,"maxAttempts",void 0),Aa(this,"predicate",void 0),Aa(this,"onSuccess",void 0),Aa(this,"onFailure",void 0),this.onSuccess=A,this.onFailure=e,this.predicate=t,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}const na=new class{async init(t,A,e){return e&&await this.reload(t,A,e),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[],a,(async()=>{const e=n?.storage?.videoShortUrl,a=n?.storage?.videoUrl;A.updateStorage(t.stepName,{videoShortUrl:e,videoUrl:a})}))}async regenerateQRCode(t,A,e,n,a,i,o,r,c){if(A||""===e||""!==n)c(!1);else{const A=async()=>{const t=(await NA([e]))[0],A=t?.versions?.find((t=>"mpeg4"===t.name))?.link;return{asset:t,link:A}},g=await new Promise(((t,e)=>{new ea((async()=>!!(await A()).link),(async()=>{const e=await A();if(!e.link||!e.link)throw new aA(e.asset);t({rel:"mpeg4",href:e.link})}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));t.forEach((t=>r(new s(t.id))));const l="http"===i.data.baseUrl.slice(0,4)?"":"https://",B=new URL(l+i.data.baseUrl);B.searchParams.append("video",btoa(JSON.stringify([g]))),B.pathname=B.pathname+("/"===B.pathname.slice(-1)?"":"/");const w=B.toString();if(w.length>=2e3)throw new gA("Cannot create QR code, URL too long.");const d=await ta(w);if(o(d),!i.data||!i.data.regions)throw new iA(i,"Missing regions.");const h=await this.regionElements(i),E=await this.command(d,h,a,i.stepName);E&&(E.command&&a.getCommandDispatcher()(E.command),E.followup&&await E.followup()),await a.setSelectionsAndElements(i.stepName,[],h,(async()=>{a.updateStorage(i.stepName,{videoShortUrl:d,videoUrl:n}),c(!1)}))}}async regionElements(t){return t.data.regions.map((t=>({id:F(),region:t})))}async command(t,A,e,n){const a=e.getLayouts(),i=`data:image/svg+xml;base64,${btoa(await Vt(t,{type:"svg"}))}`,r=A.map((t=>{const A=t.region,e=a.find((t=>t.panelId===A?.panelId));if(!e&&A)throw new eA(A);if(e&&!A)throw new Error("Region not found");if(!e||!A)throw new Error("Neither a region or layout found!");return new o({stepRegion:A,stepName:n,id:t.id,src:i,type:h.Image,y:A.top,x:A.left,width:A.width,height:A.height,rotation:0},e)}));return{command:new w(r),followup:async()=>{}}}};function aa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}const ia=new class{constructor(){aa(this,"frameSourceSvg",(async(t,A)=>{if(!t)return Et(A.data.regions[0]);const e=t.asset;if(!e)throw new nA(t);const n=e.fileLink;if(n)return nt(n);throw new aA(e)}))}async init(t,A,e){if(e)return await this.reload(t,A,e),null;if(A.setMandatoryFulfilled(t.stepName,!1),A.markStepsAsInitialised([t.stepName]),t.option&&t.option.variants&&t.option.variants.length>0){const e=t.option,n=bA.getDefaultVariant(e);return n?this.selectVariantCommand(t,n,[],A,void 0,t.data.placeholderImageUrl):null}return this.selectVariantCommand(t,void 0,[],A,void 0,t.data.placeholderImageUrl)}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));if(!t.option||0===(t.option.variants||[]).length){const e=Et(t.data.regions[0]);A.updateStorage(t.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,a=n.storage?.frameOffsets;if(A.updateMetadata(t.stepName,{frameOffsets:a,framePatternSrc:e}),e){const n=A.getStepSpecificServices(t.stepName)?.frameService;if(!n)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(e,n),A.updateMetadata(t.stepName,{image:e}),A.updateStorage(t.stepName,{framePatternSrc:e})}if(a?.zoom){const e=A.getStepSpecificServices(t.stepName)?.frameService;if(!e)throw new Error("Frame service unavailable, cannot load pattern!");e.updateOffsets(a)}A.setMandatoryFulfilled(t.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const i=n.selectedVariants[0].id;if(t.option&&i){const n=t.option.variants?.find((t=>t.id===i));n&&await A.setSelectionsAndElements(t.stepName,[n],a,(async()=>{const a=await this.frameSourceSvg(n,t);A.updateStorage(t.stepName,{currentFrameSource:a}),await e()}))}}else await A.setSelectionsAndElements(t.stepName,[],a,e)}}selectImage(t,A,e){e.setEditedStatus(t.stepName,!0);(A.fileLink||"").endsWith("pdf")?e.addPoller(new ea((async()=>{const t=(await HA.getLocalOrFromServer(A.key||"")).versions?.find((t=>"svg"===t.name));if(!t)return!1;return 200===(await fetch(t.link)).status}),(()=>{HA.getLocalOrFromServer(A.key||"").then((A=>{this.loadPatternFromAsset(A,t,e)}))}),(()=>{throw new gA("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(A,t,e)}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(t,A,e,n){return new o({id:t,type:h.Frame,x:A.left,y:A.top,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,scaleX:A.width/n.frameData.width,scaleY:A.height/n.frameData.height,path:n.frameData.path,stepRegion:A,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:A.immutable},e)}async loadPatternFromString(t,A){if(t.endsWith("svg")){const e=await Ct(t),n=e.width,a=e.height,i={src:t,width:n,height:a,aspect:n/a};G.set(t,i),A.setPatternData(i)}else{const e=await st(t),n=await v(e),a={src:t,width:n.width,height:n.height,aspect:n.width/n.height};G.set(t,a),A.setPatternData(a)}}async selectVariantCommand(t,A,e,n,a,i){const o=n.getStepSpecificServices(t.stepName)?.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const r=await this.frameSourceSvg(A,t),c=await N(r),g=o.getImageData(),l=e.map((t=>new s(t.id))),B=g?tt(g,c):void 0,d=g?{id:F(),src:g.src,x:B?.x||0,y:B?.y||0,width:g.width,height:g.height,scaleX:B?.zoom||1,scaleY:B?.zoom||1,rotation:0}:void 0;a&&a(!0);const h=t.data.regions.map((A=>{const e=F(),a=n.getLayouts().find((t=>t.panelId===A.panelId));if(!a)throw new eA(A);return{command:this.getCreateElementCommand(e,A,a,{frameData:c,pattern:d,disablePlaceholder:t.data.disablePlaceholder,focalBlur:t.data.focalBlur,focalBlurStrength:t.data.focalBlurStrength,focalBlurRadius:t.data.focalBlurRadius,stepName:t.stepName}),regionEl:{id:e,region:A}}})),E=h.map((t=>t.command));return{command:new w([...E,...l]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(t.stepName,A?[A]:[],[...h.map((t=>t.regionEl))],(async()=>{if(n.updateStorage(t.stepName,{currentFrameSource:r}),i){const A=n.getStepSpecificServices(t.stepName)?.frameService;if(!A)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,A)}}))}}}patternSource(t){const A=t.versions?.find((t=>"svg"===t.name));if(A)return A.link;const e=t.fileLink;if(e)return e;throw new aA(t)}async loadPatternFromAsset(t,A,e){const n=this.patternSource(t),a=e.markUpdatePending(),i=e.getStepSpecificServices(A.stepName)?.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),e.updateMetadata(A.stepName,{image:n}),e.updateStorage(A.stepName,{framePatternSrc:n}),e.markUpdateCompleted(a)}};const oa=new class{async getIllustrationBody(t){return new Promise((A=>{nt(t).then((t=>{A(t)})).catch((t=>console.error(t)))}))}getCreateElementCommand(t,A,e,n){return new o({stepRegion:A,stepName:n.stepName,colors:n.svg.colors,id:t,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:h.Illustration,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable},e)}getColors(t,A){const e=A.getRegionElements(t.stepName)||[];if(0===e.length)return[];try{return y(e[0].id,A.getAllLayoutData()).colors}catch(t){return[]}}async init(t,A,e){const n=t.option;if(!n)return null;if(e)return this.reload(t,A,e);{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantCommand(t,e,[],(()=>{}),A)}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!i||!e)throw new Error("Required illustration variant no longer available");{const o=i.variants?.find((t=>t.id===e));if(o){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[o],e,(async()=>{A.updateMetadata(t.stepName,{colors:n.storage?.colors}),A.setMandatoryFulfilled(t.stepName,!0)}))}}}return null}async availableColors(t,A){const e=t.data.colorOption;return e&&e?e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t}))):[]}async changeColorsCommand(t,A,e,n,a){const i={};for(const[t,A]of a.entries())i[t]={browserValue:A,spotColor:i[t]?.spotColor};const o=Qt(t,A,e,i),r=await dt(o),s=[];for(const t of n){for(const[A,e]of a.entries())s.push(new ut(t,A,e));s.push(new pt(t,o,r))}return new w(s)}async changeColors(t,A,e,n,a){if(0===A.length)return;const i=y(A[0].id,n().map((t=>t.layoutState))),o={...i.colors},r={};Object.entries(o).forEach((([t,A])=>{const e={browserValue:A.browserValue},n=A.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[t]=e}));for(const[t,A]of a.entries())o[t]={browserValue:A,spotColor:o[t]?.spotColor},r[t]={browserValue:A};let s=Array.from(Object.values(o)).map((t=>t.browserValue));const c=t.data.colorOption;c&&c.variants?.forEach((t=>{s=s.map((A=>A.toLowerCase()===t.color?.toLowerCase()?t.name:A))})),e.updateMetadata(t.stepName,{colors:s});const g=new Map;if(Object.entries(o).forEach((([t,A])=>{g.set(t,A.browserValue)})),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const l=await this.changeColorsCommand(i.svg,i.width,i.height,A.map((t=>t.id)),g);e.updateStorage(t.stepName,{colors:r}),e.getCommandDispatcher()(l)}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(t,A,e,n,a){if(!t.data||!t.data.regions)throw new iA(t,"Missing regions.");n(!0);const i=e.map((t=>new s(t.id)));a.setMandatoryFulfilled(t.stepName,!1);const o=A.asset;if(!o)throw new nA(A);const r=o.fileLink;if(!r)throw new aA(o);const c=await S(await this.getIllustrationBody(r)),g=await dt(c.svg),l=t.data.regions.map((A=>{const e=a.getLayouts().find((t=>t.panelId===A.panelId));if(!e)throw new eA(A);const n=F();return{regionElement:{id:n,region:A},command:this.getCreateElementCommand(n,A,e,{stepName:t.stepName,src:r,objectURL:g,svg:c})}})),B=[...l.map((t=>t.command)),...i];let d=Array.from(Object.values(c.colors)).map((t=>t.browserValue));const h=t.data.colorOption;return h&&h.variants?.forEach((t=>{d=d.map((A=>A.toLowerCase()===t.color?.toLowerCase()?t.name:A))})),a.updateMetadata(t.stepName,{colors:d}),{command:new w(B),followup:async()=>{await a.setSelectionsAndElements(t.stepName,[A],l.map((t=>t.regionElement)),(async()=>{a.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const ra=new class{async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(e)await this.reload(t,A,e);else{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantLambda(t,e,A,(()=>{}))}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(!i)throw new AA(t);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=i.variants?.find((t=>t.id===e));if(n){const e=n.material,o=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],o,(async()=>{const n=A.getModelContainer();if(n){const a=t.data.targetMaterials.map((t=>n.applyMaterialVariant(t,i.id||"",e||{})));Promise.all(a).then((()=>A.setMandatoryFulfilled(t.stepName,!0)))}}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantLambda(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,A,e,n){const a=e.getModelContainer();n(!0);const i=A.material;if(!i)throw n(!1),new nA(A);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],[],(async()=>{try{a&&t.data.targetMaterials.forEach((A=>{t.option&&a.applyMaterialVariant(A,t.option.id||"",i)})),e.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const sa=new class{async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(e)await this.reload(t,A,e);else{const e=bA.getDefaultVariant(n);if(e)return await this.selectVariantLambda(t,e,A,(()=>{}))}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{const e=A.getModelContainer();if(e&&t.option){const a=n.asset?.fileLink;if(!a)throw new nA(n);await e.applyModelVariant(t.option.id||"",{model:a,contextService:A.getLayoutPreviewService()},t.data.replaceProductModel||!1),A.setMandatoryFulfilled(t.stepName,!0)}}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantLambda(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(t,A,e,n){n(!0);const a=A.asset?.fileLink;if(!a)throw new nA(A);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],[],(async()=>{try{const A=e.getModelContainer();A&&t.option&&A.applyModelVariant(t.option.id||"",{model:a,contextService:e.getLayoutPreviewService()},t.data.replaceProductModel||!1),e.setMandatoryFulfilled(t.stepName,!0)}finally{n(!1)}}))}}}};const ca=new class{async init(t,A,e){return e?(await this.reload(t,A,e),null):(A.updateMetadata(t.stepName,{text:""}),this.changeTextCommand(t,"",A,"",(()=>{})))}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)).map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[],a,(async()=>{A.updateStorage(t.stepName,{text:n?.storage?.text}),A.setMandatoryFulfilled(t.stepName,""!==n?.storage?.text)}))}async changeText(t,A,e,n,a){const i=await this.changeTextCommand(t,A,e,n,a);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(t,A,e,n,a){const i=e.getRegionElements(t.stepName),r=e.getStepSpecificServices(t.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(t,A,c,a))return e.setMandatoryFulfilled(t.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(t.stepName,""!==A),!t.data||!t.data.regions||t.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(t.stepName,{text:A});const g=(A,n,a)=>{const i=a||F(),r=e.getLayouts().find((t=>t.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return a&&c.push(new s(i)),c.push(new o({stepRegion:n,stepName:t.stepName,colors:{},id:i,svg:A,type:h.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:i,region:n,command:new w(c)}};if(i.length>0){const t=i.map((t=>{if(!t.region)return null;const e=r.svgPrint(A,t.region);return g(e,t.region,t.id)})).filter((t=>!!t)).filter((t=>!!t)).map((t=>t&&t.command));return{command:new w(t),followup:async()=>{}}}{const n=t.data.regions.map((t=>g(r.svgPrint(A,t),t))),a=n.filter((t=>!!t)).map((t=>t&&t.command));return{command:new w(a),followup:async()=>{const A=n.filter((t=>t)).map((t=>t&&{id:t.id,region:t.region}));await e.setSelectionsAndElements(t.stepName,[],A)}}}}validateInput(t,A,e,n){if(t.data&&t.data.maxLength){const e=t.data.maxLength;if(A.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(A))return n("Unsupported characters."),!1;const a=qt(A.toLowerCase());for(const t of a)for(const A in e){if(t===e[A].toLowerCase().replace(/\s/g,""))return n("Blocked profanity."),!1}return n(""),!0}};const ga=new class{async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else if(n.defaultVariant)return A.markStepsAsInitialised([t.stepName]),this.selectVariantCommand(t,n.defaultVariant,A,(()=>{}));return A.markStepsAsInitialised([t.stepName]),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{A.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantCommand(t,A,e,n);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,A,e,n){const a=A.asset;if(!a)throw new nA(A);const i=a?.fileLink;if(!i)return console.error("No URL for picture!"),null;n(!0),e.setMandatoryFulfilled(t.stepName,!1);const r=e.getRegionElements(t.stepName).map((t=>new s(t.id))),c=t.data.regions.map((A=>{const n=e.getLayouts().find((t=>t.panelId===A.panelId));if(!n)throw new eA(A);const a=F();return{regionElement:{id:a,region:A},command:new o({stepName:t.stepName,stepRegion:A,id:a,src:i,type:h.Image,y:A.top,x:A.left,rotation:A.rotation,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,preserveAspectRatio:"none"},n)}}));return{command:new w([...r,...c.map((t=>t.command))]),followup:async()=>{await e.setSelectionsAndElements(t.stepName,[A],c.map((t=>t.regionElement)),(async()=>{e.setMandatoryFulfilled(t.stepName,!0),n(!1)}))}}}};const la=new class{async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else{const e=n.variants;if(bA.getDefaultVariant(n)){const a=e?.find((t=>t.id===n.defaultVariant?.id));return this.selectVariantLambda(t,a?.id||"",A)}}return null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants?.find((t=>t.id===e));n&&await A.setSelectionsAndElements(t.stepName,[n],[])}}}async selectVariant(t,A,e){await e.getInitializationPromise();const n=await this.selectVariantLambda(t,A,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(t,A,e){const n=t.option;if(!n)return null;const a=n.variants;if(!a)return null;const i=a.length>1?a.find((t=>t.id===A)):a[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(t.stepName,[i],[],(async()=>{e.setMandatoryFulfilled(t.stepName,!0)}))}}}};const Ba=new class{async availableColours(t){const A=t.option;return A&&A.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[]}async init(t,A,e){const n=t.option;if(!n)throw new AA(t);if(!e){const e=bA.getDefaultVariant(n);if(!e)return null;const a={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(t,a,[],A)}return await this.reload(t,A,e),null}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants?.find((t=>t.id===e));if(n){const e=a.map((t=>({id:t.id,region:t.stepRegion})));await A.setSelectionsAndElements(t.stepName,[n],e,(async()=>{A.updateStorage(t.stepName,{colour:n.color||""}),A.setMandatoryFulfilled(t.stepName,!0)}))}}}}async selectVariant(t,A,e,n){const a=await this.selectVariantCommand(t,A,e,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(t,A,e,n){const a=n.getLayouts();if(e.length>0){const i=t=>{const e=t.region;if(!a.find((t=>t.panelId===e?.panelId)))throw new eA(e);const n=A.variant?.color;return n?new ut(t.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},o=e.map(i).filter((t=>!!t));return{command:new w(o),followup:async()=>{await n.setSelectionsAndElements(t.stepName,A.variant?[A.variant]:[],e),n.updateStorage(t.stepName,{colour:A.fill||""})}}}{const e=e=>{const n=a.find((t=>t.panelId===e.panelId));if(!n)throw new eA(e);const i=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${A.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:A.variant.color};const s=F();return{id:s,region:e,command:new o({stepRegion:e,stepName:t.stepName,colors:r,id:s,svg:i,type:h.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:t.data.excludeFromPrint},n)}},i=t.data.regions.map(e),r=i.filter((t=>!!t)).map((t=>t?.command)),s=i.filter((t=>!!t)).map((t=>({id:t.id,region:t.region})));return{command:new w(r),followup:async()=>{await n.setSelectionsAndElements(t.stepName,A.variant?[A.variant]:[],s,(async()=>{n.updateStorage(t.stepName,{colour:A.fill||""})}))}}}}};function wa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class da extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=da.name}}const ha=["‘","’","“","”","\n"];class Ea extends Error{constructor(t){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name=Ea.name}}const Ca=new class{constructor(){wa(this,"cachedColors",new Map),wa(this,"filterUnsupportedCharacters",((t,A)=>{let e=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=A?mt(A):void 0;if(a){const t=e.split("").filter((t=>!ha.includes(t))).join(""),A=t.split("").map((t=>a.getFont().charToGlyph(t)));for(let e=0;e<A.length;e++){".notdef"===A[e].name&&n.push(String.fromCharCode(t.charCodeAt(e)))}}for(let t=0;t<n.length;t++)e=e.replaceAll(n[t],"");return e})),wa(this,"textAlign",(t=>t.vertical?"center":t.textAlign||"center")),wa(this,"getErrorsForText",((t,A,e)=>{const n=[];A.data&&A.data.maxLength&&t.length>A.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=e.getProfanities(),i=qt(t.toLowerCase());for(const t of i)for(const A in a){if(t===a[A].toLowerCase().replace(/\s/g,"")){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!A.data.allowNewlines&&(t.includes("\n")||t.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(t,A,e){const n=t.option;if(!n)return null;if(e)await this.reload(t,A,e);else{const e=this.getDefaultImageFillVariant(t.data),a=e?.asset?.fileLink,i=a?await Z(a):void 0,o=i?{src:i.src,height:i.height,width:i.width,scale:t.data.imageFillScale||1}:void 0;A.updateStorage(t.stepName,{inputText:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.color||await this.getDefaultColor(t.data),fillImage:o}),A.updateMetadata(t.stepName,{text:t.data.defaultText||"",color:(await this.getDefaultColorVariant(t.data))?.name||await this.getDefaultColor(t.data),fillImage:e?.name});const r=bA.getDefaultVariant(n);if(r)return this.selectVariantCommand(t,r,{},[],A,(()=>{}),(()=>{}),o)}return null}findLayoutElements(t,A){return t.getRegionElements(A.stepName).map((A=>y(A.id,t.getAllLayoutData())))}availableFillColors(t){const A=this.cachedColors.get(t.stepName);if(A)return A;const e=t.data.colorOption;if(e){const A=e.variants?.map((t=>({fill:t.color,stroke:t.color,variant:t})))||[];return this.cachedColors.set(t.stepName,A),A}return[]}async changeFillColor(t,A,e,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher();A.variant?n.updateMetadata(t.stepName,{color:A.variant.name}):n.updateMetadata(t.stepName,{color:A.fill});const i=t.data.colorOption,o=i?this.createTextFillSpotColor(i,A.variant):void 0;i?n.updateStorage(t.stepName,{color:A.fill,colorProfileAssetKey:i.colorProfile?.key}):n.updateStorage(t.stepName,{color:A.fill});for(const t of e){if(!A.fill)throw new Error("Fill not set on new color selection!");a(new g(t.id,A.fill,o))}}async availableFillImages(t){const A=t.data.imageFillOption;if(A){const e=A.variants?.map((t=>t.asset?.fileLink))?.filter((t=>!!t))||[];return Promise.all(e.map((async A=>{const e=await Z(A);return{src:A,width:e.width,height:e.height,scale:t.data.imageFillScale||1}})))}return Promise.resolve([])}async changeFillImage(t,A,e,n){if(!t.data||!t.data.regions)return;const a=n.getCommandDispatcher(),i=t.option?.variants?.find((t=>t.asset?.fileLink===A.src));n.updateMetadata(t.stepName,{fillImage:i?.name}),n.updateStorage(t.stepName,{fillImage:A});for(const t of e){a(new Dt(t.id,A))}}getProcessedInput(t,A,e){const n=e?t:this.injectReplaceableText(t,A);return lt(n,{vertical:A.vertical,uppercase:A.uppercase})}updateInputText(t,A,e,n){const a=n.getStepStorage(e.stepName),i=this.getProcessedInput(t,e.data,!!a.customiseAllText),o={command:void 0,helperText:"",errors:this.getErrorsForText(t,e,n)};if(o.errors.length>0)return o.helperText=o.errors[0].localizationKey,o;const r=(e.data.maxLength-i.length).toString();o.helperText=`${r} characters remaining`;const s=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,l=new Map;for(const t of A){if(!t.fontData)throw new rA("Failed to resolve font data for text.");const[A,n]=U(t.fontSize,t.fontData,{left:t.x,top:t.y,width:t.width,height:t.height,rotation:t.rotation,panelId:""},[i],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(t.id,A),l.set(t.id,n);const a=e.data.curved?i:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(A,e.data,t.id,a,s))}if(!e.data.curved&&A.length>0){if(!Array.from(l.values()).every((t=>t)))return o.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),o}return n.updateStorage(e.stepName,{text:t}),n.updateMetadata(e.stepName,{text:i}),a.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),o.command=new w(c),o.command.varying=s,o}async selectVariant(t,A,e,n,a){const i=await this.selectVariantCommand(t,A,e.getStepStorage(t.stepName)||{},e.getRegionElements(t.stepName),e,n,a);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}createTextFillSpotColor(t,A){const e=t.colorProfile;if(e){const t=(e.name||"").replace(/\s/g,"-"),n=t.lastIndexOf("/"),a=t.slice(n+1).slice(0,-4);if(!A.namedColor)throw new Error("variant named color not set!");return{profileName:a,namedColor:A.namedColor}}}async reload(t,A,e){const n=A.getSerializedStep(t.stepName,e.serializableWorkflow.steps),a=Object.values(e.layouts).map((t=>t.elements)).flat().filter((A=>A.stepName===t.stepName)),i=t.option;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const o=i.variants?.find((t=>t.id===e));if(o){const e=await this.fontDataFromVariant(o),i=a.map((t=>({id:t.id,region:t.stepRegion}))),r=n.storage?.color,s=n.storage?.text;await A.setSelectionsAndElements(t.stepName,[o],i,(async()=>{A.updateMetadata(t.stepName,{color:r,text:s}),A.updateStorage(t.stepName,{text:s,inputText:s});const n=a.map((t=>new B(t.id,e))),i=new w(n);A.getCommandDispatcher()(i),A.setMandatoryFulfilled(t.stepName,!0)}));const{command:c}=Ca.updateInputText(s||"",a,t,A);c&&A.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(t){const A=t.colorOption;if(A)return bA.getDefaultVariant(A)}async getDefaultColor(t){const A=t.colorOption;if(!A)return;return bA.getDefaultVariant(A)?.color}getDefaultImageFillVariant(t){const A=t.imageFillOption;if(A)return bA.getDefaultVariant(A)}async fontDataFromVariant(t){const A=t.asset;if(!A)throw new nA(t);const e=A.fileLink;if(!e)throw new aA(A);return{assetUrl:e,name:(await H(e)).names.fullName.en}}async selectVariantCommand(t,A,e,n,a,i,o,r){const s=a.markUpdatePending(),c=await this.fontDataFromVariant(A);if(n.length>0){const g=n.map((t=>new B(t.id,c)));if(r){const t=n.map((t=>new Dt(t.id,r)));g.push(...t)}const l=await this.changeInputTextWithRegion(t,t.data.size||30,c,e.text||"",e,a,!!e.customiseAllText,i,o);l&&g.push(l);return{command:new w(g),followup:async()=>{a.markUpdateCompleted(s),await a.setSelectionsAndElements(t.stepName,[A],n)}}}{const n=await this.createTextboxRegions(t.stepName,A,t.data,c,e,a),g=await this.changeInputTextWithRegion(t,t.data.size||30,c,n[0]?.newElement.input||e.text||t.data.defaultText||"",e,a,!!e.customiseAllText,i,o),l=n.flatMap((t=>t.commands));if(r){const t=n.map((t=>new Dt(t.regionElement.id,r)));l.push(...t)}g&&l.push(g);return{command:new w(l),followup:async()=>{a.markUpdateCompleted(s)}}}}injectReplaceableText(t,A){return A.replaceableText?A.replaceableText.replace("{{}}",t):t}async createTextboxRegions(t,A,e,n,a,i){if(!e||!e.regions)throw new Error("Step data not supplied");const r=i.getTransaction().bulk&&e.varyText||!1,s=r?"":a.text||e.defaultText||"",c=this.getProcessedInput(s,e,!1),g=await Promise.all(e.regions.map((async A=>{const g=i.getLayouts().find((t=>t.panelId===A.panelId)),l=F();try{if(!g)throw new Ea("Failed to find layout for region: "+A.panelId);const B=e.colorOption;let w;if(B&&B.variants){const A=B.variants.find((t=>t.id===B.defaultVariant?.id))||B.variants[0];w=this.createTextFillSpotColor(B,A),i.updateStorage(t,{colorProfileAssetKey:B.colorProfile?.key})}const d=await this.getDefaultColor(e),E=d||"#000000",C={stepRegion:A,stepName:t,align:this.textAlign(e),fill:a.color?a.color:E,fontSize:e.size||30,fontData:n,id:l,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,text:c,input:s,type:h.Textbox,vertical:e.vertical,x:A.left,y:A.top,height:A.height,width:A.width,immutable:A.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:w},Q=[],u=new Map,p=new Map;if(!C.fontData)throw new rA("Failed to resolve font data for text.");const[m,D]=U(C.fontSize,C.fontData,{left:C.x,top:C.y,width:C.width,height:C.height,rotation:C.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});u.set(C.id,m),p.set(C.id,D);const I=e.curved||e.vertical?c:(D||[]).join("\n");Q.push(this.generateTextChangeCommandsForRegion(m,e,C.id,I,r));const f=new o(C,g);return f.varying=r,{regionElement:{id:l,region:A},commands:[f,...Q],newElement:C,fontData:n}}catch(t){throw console.log(t),new da("Error adding font to region")}}))).catch((t=>{throw t instanceof da?(ge.setLatestToast("Failed to load font.",ua.Error),t):t instanceof Ea?t:new Error(t)}));return await i.setSelectionsAndElements(t,[A],g.map((t=>t.regionElement)),(async()=>{i.updateMetadata(t,{text:s}),i.updateStorage(t,{text:s})})),g}generateTextChangeCommandsForRegion(t,A,e,n,a){const i=[],o=new D(e,n);if(o.varying=a,i.push(o),!A.size){const A=new l(e,t);A.varying=a,i.push(A)}const r=new w(i);return r.varying=a,r}async changeInputTextWithRegion(t,A,e,n,a,i,o,r,s,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),l=this.getProcessedInput(g,t.data,o),B=i.getRegionElements(t.stepName),d=new Map,h=new Map;for(const n of B)if(n.region){const[a,i]=U(A,e,n.region,[l],{size:t.data.size,minSize:t.data.minSize,maxSize:t.data.maxSize});d.set(n.id,a),h.set(n.id,i)}const E=(()=>{if(t.data&&t.data.maxLength&&l.length>t.data.maxLength)return c&&c(!0),{info:"0"};const A=i.getProfanities(),e=qt(l.toLowerCase());for(const t of e)for(const e in A){if(t===A[e].toLowerCase().replace(/\s/g,""))return r(!0),{error:"Blocked profanity."}}if(!t.data.vertical&&!t.data.allowNewlines&&(l.includes("\n")||l.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!t.data.curved){if(!Array.from(h.values()).every((t=>t)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(t.data.maxLength-l.length).toString()}})();if(E.error)return void s(E.error);if(s(`${E.info} characters remaining`||""),c)return;i.updateStorage(t.stepName,{text:g}),i.updateMetadata(t.stepName,{text:this.injectReplaceableText(g,t.data)});const C=i.getTransaction().bulk&&t.data.varyText||!1;a.defaultCleared&&i.setMandatoryFulfilled(t.stepName,!0);const Q=[];for(const A of B){const e=t.data.curved?l:(h.get(A.id)||[]).join("\n");Q.push(this.generateTextChangeCommandsForRegion(d.get(A.id)||1,t.data,A.id,e,C))}const u=new w(Q);return u.varying=C,u}};function Qa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}let ua;var pa;(pa=ua||(ua={})).Error="Error",pa.Warning="Warning",pa.Info="Info";class ma extends Oe{constructor(t){super(),Qa(this,"update",void 0),Qa(this,"createdAt",new Date),this.update=t}async execute(){await this.update(),await new Promise((t=>{window.setTimeout((()=>{t()}),1e3)}))}}class Da{constructor(t,A,e,n,a,i,o,r,s,c,g=!1,l,B=!1){Qa(this,"reloadedState",void 0),Qa(this,"transaction",void 0),Qa(this,"ownerCustomer",void 0),Qa(this,"updateTransaction",void 0),Qa(this,"confirmedDesign",void 0),Qa(this,"editedSteps",void 0),Qa(this,"informationResults",void 0),Qa(this,"layouts",void 0),Qa(this,"mandatorySteps",void 0),Qa(this,"pendingUpdates",void 0),Qa(this,"selectionCost",void 0),Qa(this,"workflow",void 0),Qa(this,"stepSpecificServices",void 0),Qa(this,"previewService",void 0),Qa(this,"profanityFilter",void 0),Qa(this,"pollers",void 0),Qa(this,"commandContext",void 0),Qa(this,"stepElements",void 0),Qa(this,"stepInitialised",void 0),Qa(this,"stepMetadata",void 0),Qa(this,"stepSelections",void 0),Qa(this,"storage",void 0),Qa(this,"confirmCallbacks",void 0),Qa(this,"editedCallbacks",void 0),Qa(this,"elementsCallbacks",void 0),Qa(this,"informationResultCallbacks",void 0),Qa(this,"initCallbacks",void 0),Qa(this,"makingAdjustmentsCallback",void 0),Qa(this,"mandatoryCallbacks",void 0),Qa(this,"metadataCallbacks",void 0),Qa(this,"selectionCallbacks",void 0),Qa(this,"stepSpecificStorageCallbacks",void 0),Qa(this,"storageCallbacks",void 0),Qa(this,"currentVariationRecordCallbacks",void 0),Qa(this,"variationRecordCallbacks",void 0),Qa(this,"allScenes",void 0),Qa(this,"product",void 0),Qa(this,"invalidModelVariants",void 0),Qa(this,"currentAdjustingStepId",void 0),Qa(this,"renderableContextService",void 0),Qa(this,"workflowStatePromiseQueue",new ze(1)),Qa(this,"variationRecords",[]),Qa(this,"currentVariationRecord",void 0),Qa(this,"initializationPromise",void 0),Qa(this,"initialized",!1),Qa(this,"readOnly",!1),Qa(this,"modelContainer",void 0),Qa(this,"isReloadedTransaction",!1),Qa(this,"render3DScene",(()=>{if(!this.previewService)return;const t=this.getCommandContext().getAllLayouts(),A=this.getLayoutPreviewService()?.getAll();if(A)for(const[,e]of A)e.render(this.getWorkflow(),t,this.getCurrentVariationRecord(),this.getProduct().overlayImageUrl)})),this.updateTransaction=a,this.commandContext=n,this.reloadedState=c,this.transaction=i,this.readOnly=g,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=t,this.stepSpecificServices={},this.profanityFilter=A,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=o,this.previewService=r,this.modelContainer=l,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.isReloadedTransaction=B,this.initializationPromise=this.initializeDefaultWorkflowState(t,i),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((t=>{throw console.error(t),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>{this.updateStateWithServer(),this.render3DScene()}))))}async initializeDefaultWorkflowState(t,A){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((t=>{this.storage[t.stepName]=t.storage||{}})),this.allScenes=await On(t,{bulkScene:A.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"},A);const e=Kn(this.allScenes,this.stepSelections).map((t=>t.silentSteps)).flat(),{stepElements:n,commands:a}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new w(a),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.isReloadedTransaction&&this.updateStateWithServer(),this.render3DScene(),this.reloadedState&&(()=>{const t=this.workflow.finalizeStepConfig;if(!t)return;const A=t.lookAtAnimation,e=t.modelAnimation;A&&this.previewService?.executeCameraAnimation(A),e&&this.modelContainer?.executeAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(t){const A={...t,recordNumber:this.variationRecords.reduce(((t,A)=>A.recordNumber>t?A.recordNumber:t),0)+1};return this.variationRecords.push(A),this.onVariationRecordsChange(),A}removeVariationRecord(t){if(this.variationRecords=this.variationRecords.filter((A=>A.recordNumber!==t)),this.variationRecords.forEach(((t,A)=>t.recordNumber=A+1)),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===t){const t=this.currentVariationRecord.recordNumber,A=t>1?this.variationRecords[t-2]:this.variationRecords[0];this.setCurrentVariationRecord(A||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(t){this.variationRecords=t,this.onVariationRecordsChange(),0===t.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(t[0])}setCurrentVariationRecord(t){if(this.currentVariationRecord=t,this.onCurrentVariationRecordChange(),t){const A=this.variationRecords.find((A=>A.recordNumber===t.recordNumber));A&&(A.values=t.values,this.onVariationRecordsChange())}}addConfirmCallback(t){t(this.confirmedDesign),this.confirmCallbacks.push(t)}addEditedCallback(t){t(this.editedSteps),this.editedCallbacks.push(t)}addElementsCallback(t){t(this.stepElements),this.elementsCallbacks.push(t)}addInformationResultCallback(t){t(this.informationResults),this.informationResultCallbacks.push(t)}addInitCallback(t){t(this.stepInitialised),this.initCallbacks.push(t)}addMandatoryCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}addMetadataCallback(t){t(this.stepMetadata),this.metadataCallbacks.push(t)}async addSelectionCallback(t){t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(t)}addStepSpecificStorageCallback(t,A){Object.keys(this.storage).includes(A)||(this.storage[A]={}),t(this.storage[A]),Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].push(t)}addStorageCallback(t){t(this.storage),this.storageCallbacks.push(t)}addMakingAdjustmentsCallback(t){t(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(t)}addCurrentVariationCallback(t){t(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(t)}addVariationRecordsCallback(t){t(this.variationRecords),this.variationRecordCallbacks.push(t)}addPoller(t){this.pollers.push(t)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((t=>t.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(t){return this.stepElements[t]||[]}getStepSpecificServices(t){return this.stepSpecificServices[t]}getTransaction(){return this.transaction}getTransactionCustomer(){return this.ownerCustomer}setTransactionCustomer(t){this.ownerCustomer=t}setTransactionCustomerDetails(t){this.ownerCustomer={...this.ownerCustomer,emailAddress:t.email}}getModelContainer(){return this.modelContainer}setModelContainer(t){(!t||this.previewService&&this.previewService.getAllModels().includes(t))&&(this.modelContainer=t)}setTransaction(t){this.transaction=t}getWorkflow(){return this.workflow}getCommandDispatcher(){return t=>this.commandContext.apply(t,!this.initialized)}getWorkflowSelections(){const t={};return this.workflow.steps.forEach((A=>{const e=this.stepSelections[A.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(t[A.stepName]={selections:e.selectedVariants})})),t}markStepsAsInitialised(t){const A={...this.stepInitialised};t.forEach((t=>{A[t]=!0})),this.stepInitialised=A,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(t){this.pendingUpdates=this.pendingUpdates.filter((A=>A!==t))}markUpdatePending(){const t=F();return this.pendingUpdates=[...this.pendingUpdates,t],t}setEditedStatus(t,A){this.editedSteps={...this.editedSteps,[t]:A},this.onEditedChange()}setInformationResults(t){this.informationResults=[...t],this.onInformationResultChange()}setCurrentAdjustingStepId(t){this.currentAdjustingStepId=t,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(t,A){this.mandatorySteps[t]!==A&&(this.mandatorySteps={...this.mandatorySteps,[t]:A},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(t){t(this.mandatorySteps),this.mandatoryCallbacks.push(t)}async injectIntoPreviewService(t){if(this.previewService=t,!this.getProduct().modelUrl)return;const A=t.loadModel({model:this.getProduct().modelUrl,contextService:this.getLayoutPreviewService()});this.setModelContainer(A),await A.getInitializationPromise()}ejectFromPreviewService(){if(this.modelContainer){if(!this.modelContainer.dispose)throw new Error("This feature is not supported in the current preview service.");this.modelContainer.dispose(),this.modelContainer=void 0}}async updateStorage(t,A){const e={...this.storage,[t]:{...this.storage[t],...A}};if(!Ot(e,this.storage)){this.storage=e;const A=new ht(this.constructSerializableWorkflow());this.commandContext.apply(A,!0),this.onStepSpecificStorageChange(t),this.onStorageChange()}}constructSerializableWorkflow(){const t=[];return this.allScenes.forEach((A=>{A.renderableSteps.forEach((A=>{const e={stepName:A.stepName};e.storage=this.storage[A.stepName],e.selectedVariants=this.stepSelections[A.stepName]?.selectedVariants?.map((t=>({id:t.id,priceModifier:t.priceModifier}))),t.push(e)}))})),{steps:t}}updateStateWithServer(){if(this.readOnly)return;const t=this.serialize();this.workflowStatePromiseQueue.enqueue(new ma((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const t=this.serialize();return new ma((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(){const t=this.getCommandContext().getState();if(!t)throw new rA("Attempted to serialize state before it was initialized.");const A=JSON.stringify(this.dehydrateState(zt(t.transaction))),e=t.variation;if(!e)return{transaction:A};const n={layouts:{},serializableWorkflow:{steps:[]},...zt(e)||{}};return{transaction:A,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(t){for(const A of Object.values(t.layouts).map((t=>t.elements)).flat())"illustration"===A.type&&(delete A.cachedObjectURL,A.src&&delete A.svg);return t}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(t,A){this.stepMetadata={...this.stepMetadata,[t]:{...this.stepMetadata[t],...A}},this.onMetadataChange()}removeElements(t){this.stepElements=((t,A)=>Object.keys(t).reduce(((e,n)=>{const a=[...t[n]||[]];return A.forEach((t=>{const A=a.findIndex((A=>A.id===t.id));A>-1&&a.splice(A,1)})),e[n]=a,e}),{}))(this.stepElements,t)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((t,A)=>(jn(A,this.stepSelections)||this.stepElements[A.stepName]&&this.stepElements[A.stepName].forEach((A=>t.push(A))),t)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((t,A)=>("Model"===A.type&&A.option?.id&&!jn(A,this.stepSelections)&&t.push(A.option.id),t)),[])}async stepElementsForIntroducedSilentSteps(t,A){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(t,A,e)=>{if(t.type===m.SilentIllustration){return{step:t,results:await new _n(t,A).trigger()}}if(t.type===m.ProductOverlay){return{step:t,results:await new _n(t,A,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},a=t.filter((t=>!this.stepInitialised[t.stepName])),i={stepElements:{},commands:[]},o=[];for(const t of a)this.markStepsAsInitialised([t.stepName]),A||o.push(n(t,this.layouts,e));const r=await Promise.all(o);for(const t of r)i.stepElements[t.step.stepName]=t.results.map((t=>t.regionElement)),i.commands=[...i.commands,...t.results.map((t=>t.command))];return i}getStepStorage(t){return this.storage[t]}getMetadata(t){return this.stepMetadata[t]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(t,A){return A.find((A=>A.stepName===t))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((t=>t.layoutState.elements.forEach((t=>{this.getCommandDispatcher()(new s(t.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(t,A,e,n){const a=this.stepSelections;this.stepSelections={...this.stepSelections,[t]:{selectedVariants:A}},this.selectionCost=Object.values(this.stepSelections).reduce(((t,A)=>t+A.selectedVariants.map((t=>t.priceModifier||0)).reduce(((t,A)=>t+A),0)),0),this.workflow.steps.forEach((t=>{jn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1,delete this.stepMetadata[t.stepName],delete this.stepSelections[t.stepName],delete this.storage[t.stepName])}));const i=this.allScenes,o=Kn(i,a),r=Kn(i,this.stepSelections),c=o.map((t=>t.silentSteps)).flat(),g=r.map((t=>t.silentSteps)).flat().filter((t=>!c.some((A=>A.stepName===t.stepName))));c.forEach((t=>{jn(t,this.stepSelections)||(this.stepInitialised[t.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const l=this.getInvalidCanvasRegions(),{stepElements:B,commands:d}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...B,[t]:e},this.removeElements(l);if(this.workflow.steps.find((A=>A.stepName===t))?.type===m.Frame){this.getStepSpecificServices(t)?.frameService?.setTargetElements(e.map((t=>t.id)))}const h=[...d,...l.map((t=>new s(t.id))),new ht(this.constructSerializableWorkflow())];h.length>0&&this.commandContext.apply(new w(h),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const t=[],A=Kn(this.allScenes,this.stepSelections).map((t=>t.renderableSteps)).flat();for(const e of A)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case m.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((t=>"Bulk"===t.stepName))?.storage||{});break;case m.DigitalContent:t.push(na.init(e,this,this.reloadedState));break;case m.Frame:case m.Photo:{const A=new Zn(e.data.forceImageCover);A.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:A},t.push(ia.init(e,this,this.reloadedState))}break;case m.Illustration:t.push(oa.init(e,this,this.reloadedState));break;case m.Material:t.push(ra.init(e,this,this.reloadedState));break;case m.Model:t.push(sa.init(e,this,this.reloadedState));break;case m.Module:this.stepSpecificServices[e.stepName]={module:await ln(e.data.module)},t.push(ca.init(e,this,this.reloadedState));break;case m.Picture:t.push(ga.init(e,this,this.reloadedState));break;case m.Question:t.push(la.init(e,this,this.reloadedState));break;case m.Shape:t.push(Ba.init(e,this,this.reloadedState));break;case m.Text:t.push(Ca.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(t)).map((t=>{if("rejected"===t.status)throw new Error(`Step initialization failed: ${t.reason}`);return t.value})),n=e.filter((t=>!!t&&!!t.command)).map((t=>t.command)),a=e.filter((t=>!!t&&!!t.followup)).map((t=>t.followup));n&&n.length>0&&this.commandContext.apply(new w(n),!0);for(const t of a)await t();a.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((t=>t(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((t=>t(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((t=>t(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((t=>t(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((t=>t(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((t=>{t(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((t=>t(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((t=>{t(this.stepMetadata)}))}async onSelectionChange(){const t=await this.traversableScenes();for(const A of this.selectionCallbacks)A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:t})}onStepSpecificStorageChange(t){Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].forEach((A=>A(this.storage[t])))}onStorageChange(){this.storageCallbacks.forEach((t=>t(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((t=>{t(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((t=>{t(this.variationRecords)})),this.render3DScene()}traversableScenes(){return Vn(this.allScenes,this.stepSelections)}}function Ia(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class fa{constructor(t){Ia(this,"variantData",void 0),this.variantData=t}getType(){return this.variantData.asset?.type}getId(){return this.variantData.id}getName(){return this.variantData.name}getPriceFormatted(t,A){return this.variantData.priceModifier.toLocaleString(t||"en-US",{style:"currency",currency:"USD",...A})}getPrice(){return this.variantData.priceModifier}getAsset(){return this.variantData.thumbnail?.versions?.find((t=>"cdn"===t.name))?.link}getThumbnail(){const t=this.variantData.thumbnail?.versions?.find((t=>"thumbnail"===t.name));return t?t.link:this.variantData.asset?.versions?.find((t=>"thumbnail"===t.name))?.link}getDisplayImage(){return this.variantData.displayImage?.versions?.find((t=>"medium"===t.name))?.link}getColor(){return this.variantData.color}isDefault(){return!!this.variantData.default}getResource(){return this.variantData}isEnabled(){return this.variantData.enabled}}function ya(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class Ma{constructor(t,A){ya(this,"manager",void 0),ya(this,"step",void 0),this.manager=t,this.step=A}setUpdateState(t){Ma.updateState.set(this.step.stepName,t)}getUpdateState(){return!!Ma.updateState.get(this.step.stepName)}getCurrentVariant(){const t=this.manager.getWorkflowSelections()[this.step.stepName]?.selections[0];if(t)return new fa(t)}getAvailableVariants(){return(this.step.option?.variants?.filter((t=>t.enabled))||[]).map((t=>new fa(t)))}getAllVariants(){return(this.step.option?.variants||[]).map((t=>new fa(t)))}getId(){return this.step.stepName}getName(){return this.step.stepTitle}getHelpText(){return this.step.helpText}getType(){return this.step.type}getRaw(){return this.step}executeAnimations(){const t=this.manager.getPreviewService(),A=this.manager.getModelContainer(),e=this.step.data.modelAnimation,n=this.step.data.lookAtAnimation;t&&n&&t.executeCameraAnimation(n),A&&e&&A.executeAnimation(e)}}function Fa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}ya(Ma,"updateState",new Map);const Ya=ft`
455
455
  mutation AddTransactionStakeholder($id: String!, $type: String!, $details: CustomerDetailsInput!) {
456
456
  transactionAddStakeholder(id: $id, details: $details, type: $type) {
457
457
  id
@@ -503,7 +503,7 @@ import{CommandContext as t,AssetType as A,BringForwardCommand as e,BringToFrontC
503
503
  }
504
504
  }
505
505
  }
506
- `,La=(t,A,e)=>{const n={};return A.steps.forEach((A=>{Object.assign(n,(A=>{const n={};if("Frame"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideImageInCart&&e)return n;n[`${A.stepTitle} image`]=a.image}if("Illustration"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideColorsInCart&&e||!a.colors)return n;if(a.colors.length>0){const t=a.colors.join(", ").toUpperCase();n[`${A.stepTitle} colors`]=t}}if("Module"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideTextInCart&&e)return n;n[`${A.stepTitle} text`]=a.text}if("Text"===A.type){const a=t[A.stepName];if(!a)return n;const i=A.data;i.hideTextInCart&&e||(n[`${A.stepTitle} text`]=a.text),!a.color||i.hideColorInCart&&e||(n[`${A.stepTitle} color`]=a.color)}return n})(A))})),n},Ta=(t,A,e,n,a,i,o,r,s,c)=>{const g=(dA.getMap("transactionOwnerIds")||new Map).get(t.id),l={baseCost:e,designProductId:t.externalDesignProductId,designProductVariantId:t.externalDesignProductVariantId,event:"onComplete",exportedData:i,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,lineItemImageUrl:o||"",optionsCost:n,processExecutionId:c,transactionId:t.id,transactionOwnerId:g,weight:A.weight,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||""};return a&&(l.metadata=a),r&&(l.selectedVariants=r),s&&(l.sku=s),l},Oa=async(t,A,e,n,a,i,o,r)=>{const s=t.product?.basePrice||0,c=t.priceModifierTotal||0,g=((t,A,e,n)=>{const a={};let i;if(e){i=La(e,A,!1);for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}else if(n){i=n;for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}for(const e of Object.keys(t)){const n=t[e],i=A.steps.find((t=>t.stepTitle===e));if(1===n.length)a[`${i?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)a[`${i?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return a})(n,e,void 0,i);return Ta(t,A,s,c,i,g,o,n,a,r)},za=async(t,A,e,n,a,i,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const w=yA.getShadowGraphqlClient(),d=await w.query({query:Jn,variables:{id:i.id},fetchPolicy:"no-cache",errorPolicy:"all"}),h=d.data?.transactions[0].workflowState;!d.errors&&h||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((t=>{d.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const E=t.getPreviewService(),C=A?.finalizeStepConfig?.lookAtAnimation,Q=E&&100===E.getSceneInitializationProgress()&&A.showModelOnFinishStep&&!!C,u=B&&La(B,A,!0),p=B&&La(B,A,!1),m=async t=>{const e={};let n=0;if(Object.keys(o).length>0)for(const a of Object.keys(o)){const i=o[a],r=A.steps.find((t=>t.stepName===a));for(let A=0;A<i.selections.length;++A){const a=i.selections[A];if(r&&(!t||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const t=r.stepTitle;e[t]?e[t].push({id:a.id||"",name:a.name,priceModifier:a.priceModifier}):e[t]=[{id:a.id||"",name:a.name,priceModifier:a.priceModifier}]}n+=a.priceModifier}}return[e,n]},[D]=await m(!0),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),[f]=await m(!1),y=Object.fromEntries(Object.keys(f).map((t=>[t,f[t].map((t=>t.id))]))),M=await l(Q);s("workflow.steps.finish.finalize.creatingDesign"),i.bulk&&await c(g);const F=await(async t=>(await yA.getShadowGraphqlClient().mutate({mutation:Ja,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)((()=>{const t={name:r,layouts:e.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:A.id,transactionId:i.id,useThreeDimPreview:!!Q,previewImage:M};if(p){const A=[];for(const[t,e]of Object.entries(p))A.push({key:t,value:e});t.metadata=A}if(I){const A=[];for(const[t,e]of Object.entries(y))A.push({key:t,ids:e});t.selectedVariants=A}return t})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const S=(await yA.getShadowGraphqlClient().query({query:bn,variables:{id:i.id}})).data.transactions[0];return i.bulk?((t,A,e,n)=>{const a=(t.product?.basePrice||0)*(t.variationsCount||0),i=t.priceModifierTotal||0,o={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ta(t,A,a,i,void 0,o,e,void 0,void 0,n)})(S,a,Y,F?.processExecution?.id):await Oa(S,a,A,D,F?.sku,u,Y,F?.processExecution?.id)};let ja;var Ka;(Ka=ja||(ja={})).Local="Local",Ka.Remote="Remote";const Va=new class{constructor(){ba(this,"localPersistenceKey","designTransactions"),ba(this,"storageMethod",ja.Local),ba(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((A=>A!==t))}async getSavedDesigns(){if(this.storageMethod===ja.Local){const t=dA.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new rA("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((A=>A.transactionId===t))}async addDesign(t){const A=(await this.getSavedDesigns()).filter((A=>A.transactionId!==t.transactionId));A.unshift(t),await this.setDesigns(A),this.designSavedListeners.forEach((A=>A(t)))}async renameDesign(t,A){const e=await this.getSavedDesigns(),n=e.find((A=>A.transactionId===t));if(!n)throw new Error(`No saved design for transaction ${t}.`);n.title=A,await this.setDesigns(e)}async removeDesign(t){const A=await this.getSavedDesigns();await this.setDesigns(A.filter((A=>A.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==ja.Local)throw new rA("Unexpected storage method requested");dA.set(this.localPersistenceKey,JSON.stringify(t))}};function Wa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class Xa{constructor(A,e){if(Wa(this,"client",void 0),Wa(this,"commandContext",void 0),Wa(this,"workflowManager",void 0),Wa(this,"isReadOnly",void 0),Wa(this,"renderableScenes",[]),Wa(this,"renderableSceneCallbacks",[]),Wa(this,"debouncedSavedDesignUpdate",Xt((async()=>{await Va.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Wa(this,"getCanvasObjectURLAsync",(async t=>new Promise(((A,e)=>{try{t.toBlob((t=>{if(t){const e=URL.createObjectURL(t);A(e)}}))}catch(t){e(t)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=A;const n=e.layouts;this.commandContext=new t,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Da(e.workflow,e.product.profanities?.map((t=>t.word))||[],n,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer),this.workflowManager.addSelectionCallback((t=>{const A=t.traversableScenes.map((t=>{const A=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:A}}));this.renderableScenes=A,this.renderableSceneCallbacks.forEach((t=>t(A)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await yA.getShadowGraphqlClient().mutate({mutation:kn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,A){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const a=document.createElement("canvas");let i=2048;A&&A<=2048&&(i=A),a.width=i,a.height=i;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((t=>t.layoutState?.layout.panelId===s?.name))||o[0],g=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},l=this.commandContext.getLayoutById(c.layoutState.layout.id),B=a.getContext("2d");if(!B)throw new gA("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=Kt.renderToStaticMarkup(w),h=await jt.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await h.render();const E=await this.getCanvasObjectURLAsync(a);return a.toDataURL(E)}getStepById(t){const A=this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepName===t));if(A&&this.stepHasHandle(A))return ka.get(this.getWorkflowManager(),A)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let A=0;return Object.values(t).forEach((t=>{A+=t.selections.map((t=>t.priceModifier)).reduce(((t,A)=>t+A))})),A}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,A={type:m.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Ln(this.getWorkflowManager().getWorkflow())},conditions:[]};return ka.get(this.getWorkflowManager(),A)}}getStepByName(t){const A=this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepTitle===t));if(A&&this.stepHasHandle(A))return ka.get(this.getWorkflowManager(),A)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((A=>A.type===t)).map((t=>ka.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((A=>A.name===t.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>ka.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const A=(await yA.getShadowGraphqlClient().mutate({mutation:Ya,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((A=>A.customer?.emailAddress===t.emailAddress));if(A?.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const t=dA.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,A.customer.id),dA.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((A=>A!==t))}async save(t){if(!this.getCommandContext().getState())throw new rA("State undefined!");const A={title:await(async()=>{if(t)return t;const A=this.getWorkflowManager().getTransaction().id,e=(await Va.getSavedDesigns()).find((t=>t.transactionId===A))?.title;return e||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Va.addDesign(A),A}async copy(){const t=zt(this.getCommandContext().getState());if(!t)throw new rA("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Si({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new rA("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(e.id,A,void 0)}async onDesignFinished(t){return za(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==m.SilentIllustration&&t.type!==m.ProductOverlay}getExportedData(){const t=new Map,A=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(A).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const a=A[e];Object.keys(a).forEach((A=>{t.get(n.stepTitle)[A]=a[A]}))})),Object.keys(e)?.forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=e[A].selections[0].name)})),t}}const qa=Zt`
506
+ `,La=(t,A,e)=>{const n={};return A.steps.forEach((A=>{Object.assign(n,(A=>{const n={};if("Frame"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideImageInCart&&e)return n;n[`${A.stepTitle} image`]=a.image}if("Illustration"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideColorsInCart&&e||!a.colors)return n;if(a.colors.length>0){const t=a.colors.join(", ").toUpperCase();n[`${A.stepTitle} colors`]=t}}if("Module"===A.type){const a=t[A.stepName],i=A.data;if(!a||i.hideTextInCart&&e)return n;n[`${A.stepTitle} text`]=a.text}if("Text"===A.type){const a=t[A.stepName];if(!a)return n;const i=A.data;i.hideTextInCart&&e||(n[`${A.stepTitle} text`]=a.text),!a.color||i.hideColorInCart&&e||(n[`${A.stepTitle} color`]=a.color)}return n})(A))})),n},Ta=(t,A,e,n,a,i,o,r,s,c)=>{const g=(dA.getMap("transactionOwnerIds")||new Map).get(t.id),l={baseCost:e,designProductId:t.externalDesignProductId,designProductVariantId:t.externalDesignProductVariantId,event:"onComplete",exportedData:i,externalCartProductId:t.externalCartProductId,externalCartProductVariantId:t.externalCartProductVariantId,lineItemImageUrl:o||"",optionsCost:n,processExecutionId:c,transactionId:t.id,transactionOwnerId:g,weight:A.weight,workflowViewerLink:t.workflowViewerLink||"",workflowViewerReadOnlyLink:t.workflowViewerReadOnlyLink||""};return a&&(l.metadata=a),r&&(l.selectedVariants=r),s&&(l.sku=s),l},Oa=async(t,A,e,n,a,i,o,r)=>{const s=t.product?.basePrice||0,c=t.priceModifierTotal||0,g=((t,A,e,n)=>{const a={};let i;if(e){i=La(e,A,!1);for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}else if(n){i=n;for(const t of Object.keys(i))a[t]={value:i[t],priceModifier:0}}for(const e of Object.keys(t)){const n=t[e],i=A.steps.find((t=>t.stepTitle===e));if(1===n.length)a[`${i?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let t=0;t<n.length;t++)a[`${i?.stepTitle} selection ${t+1}`]={value:n[t].name,priceModifier:n[t].priceModifier}}return a})(n,e,void 0,i);return Ta(t,A,s,c,i,g,o,n,a,r)},za=async(t,A,e,n,a,i,o,r,s,c,g,l,B)=>{s("workflow.steps.finish.finalize.buildingLayouts"),await t.outstandingRequestsPromise();const w=yA.getShadowGraphqlClient(),d=await w.query({query:Jn,variables:{id:i.id},fetchPolicy:"no-cache",errorPolicy:"all"}),h=d.data?.transactions[0].workflowState;!d.errors&&h||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),d.errors&&d.errors.forEach((t=>{d.errors&&console.log("Server Error:",t.message)})),await t.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const E=t.getPreviewService(),C=A?.finalizeStepConfig?.lookAtAnimation,Q=E&&100===E.getSceneInitializationProgress()&&A.showModelOnFinishStep&&!!C,u=B&&La(B,A,!0),p=B&&La(B,A,!1),m=async t=>{const e={};let n=0;if(Object.keys(o).length>0)for(const a of Object.keys(o)){const i=o[a],r=A.steps.find((t=>t.stepName===a));for(let A=0;A<i.selections.length;++A){const a=i.selections[A];if(r&&(!t||r.option&&(r.option.variants||[]).length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const t=r.stepTitle;e[t]?e[t].push({id:a.id||"",name:a.name,priceModifier:a.priceModifier}):e[t]=[{id:a.id||"",name:a.name,priceModifier:a.priceModifier}]}n+=a.priceModifier}}return[e,n]},[D]=await m(!0),I=Object.fromEntries(Object.keys(D).map((t=>[t,D[t].map((t=>t.id))]))),[f]=await m(!1),y=Object.fromEntries(Object.keys(f).map((t=>[t,f[t].map((t=>t.id))]))),M=await l(Q);s("workflow.steps.finish.finalize.creatingDesign"),i.bulk&&await c(g);const F=await(async t=>(await yA.getShadowGraphqlClient().mutate({mutation:Ja,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:t.name,layouts:t.layouts,workflowId:t.workflowId,transactionId:t.transactionId,previewImage:t.previewImage,useThreeDimPreview:t.useThreeDimPreview,metadata:t.metadata,selectedVariants:t.selectedVariants}})).data?.designCreate)((()=>{const t={name:r,layouts:e.map((t=>({index:t.index,panelId:t.panelId}))),workflowId:A.id,transactionId:i.id,useThreeDimPreview:!!Q,previewImage:M};if(p){const A=[];for(const[t,e]of Object.entries(p))A.push({key:t,value:e});t.metadata=A}if(I){const A=[];for(const[t,e]of Object.entries(y))A.push({key:t,ids:e});t.selectedVariants=A}return t})()),Y=F?.transaction?.previewImageLink;s("workflow.steps.finish.finalize.updatingTransaction");const S=(await yA.getShadowGraphqlClient().query({query:bn,variables:{id:i.id}})).data.transactions[0];return i.bulk?((t,A,e,n)=>{const a=(t.product?.basePrice||0)*(t.variationsCount||0),i=t.priceModifierTotal||0,o={items:{value:t.variationsCount?`${t.variationsCount}`:"0",priceModifier:0}};return Ta(t,A,a,i,void 0,o,e,void 0,void 0,n)})(S,a,Y,F?.processExecution?.id):await Oa(S,a,A,D,F?.sku,u,Y,F?.processExecution?.id)};let ja;var Ka;(Ka=ja||(ja={})).Local="Local",Ka.Remote="Remote";const Va=new class{constructor(){ba(this,"localPersistenceKey","designTransactions"),ba(this,"storageMethod",ja.Local),ba(this,"designSavedListeners",[])}attachSaveListener(t){this.designSavedListeners.push(t)}detachSaveListener(t){this.designSavedListeners=this.designSavedListeners.filter((A=>A!==t))}async getSavedDesigns(){if(this.storageMethod===ja.Local){const t=dA.get(this.localPersistenceKey);return t?JSON.parse(t):[]}throw new rA("Unexpected storage method requested")}async getSavedDesignByTransaction(t){return(await this.getSavedDesigns()).find((A=>A.transactionId===t))}async addDesign(t){const A=(await this.getSavedDesigns()).filter((A=>A.transactionId!==t.transactionId));A.unshift(t),await this.setDesigns(A),this.designSavedListeners.forEach((A=>A(t)))}async renameDesign(t,A){const e=await this.getSavedDesigns(),n=e.find((A=>A.transactionId===t));if(!n)throw new Error(`No saved design for transaction ${t}.`);n.title=A,await this.setDesigns(e)}async removeDesign(t){const A=await this.getSavedDesigns();await this.setDesigns(A.filter((A=>A.transactionId!==t)))}async setDesigns(t){if(this.storageMethod!==ja.Local)throw new rA("Unexpected storage method requested");dA.set(this.localPersistenceKey,JSON.stringify(t))}};function Wa(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class Xa{constructor(A,e){if(Wa(this,"client",void 0),Wa(this,"commandContext",void 0),Wa(this,"workflowManager",void 0),Wa(this,"isReadOnly",void 0),Wa(this,"renderableScenes",[]),Wa(this,"renderableSceneCallbacks",[]),Wa(this,"debouncedSavedDesignUpdate",Xt((async()=>{await Va.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),Wa(this,"getCanvasObjectURLAsync",(async t=>new Promise(((A,e)=>{try{t.toBlob((t=>{if(t){const e=URL.createObjectURL(t);A(e)}}))}catch(t){e(t)}})))),!e.workflow)throw new Error("No Workflow ID provided.");this.client=A;const n=e.layouts;this.commandContext=new t,this.commandContext.initialize(n,e.reloadedState),this.isReadOnly=e.transaction.isOrdered||!!e.readOnly,this.workflowManager=new Da(e.workflow,e.product.profanities?.map((t=>t.word))||[],n,this.commandContext,(t=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(t)}),e.transaction,e.product,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly,e.modelContainer,e.isReloadedTransaction),this.workflowManager.addSelectionCallback((t=>{const A=t.traversableScenes.map((t=>{const A=t.renderableSteps.map((t=>t.stepName));return{id:t.name,title:t.title,renderableSteps:A}}));this.renderableScenes=A,this.renderableSceneCallbacks.forEach((t=>t(A)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(t){await yA.getShadowGraphqlClient().mutate({mutation:kn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:t.map((t=>({recordNumber:t.recordNumber,values:t.values.map((t=>({aspect:t.aspect,stepName:t.stepName,value:t.value})))})))}})}async createPreviewImage(t,A){const e=this.workflowManager.getWorkflow(),n=e?.finalizeStepConfig?.lookAtAnimation;if(t){if(!n)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,n))||""}const a=document.createElement("canvas");let i=2048;A&&A<=2048&&(i=A),a.width=i,a.height=i;const o=this.commandContext.getAllLayouts(),r=e.defaultPreviewPanelIndex||0,s=e.panels[r],c=o.find((t=>t.layoutState?.layout.panelId===s?.name))||o[0],g=c.layoutState.layout.previewRegion?{x:c.layoutState.layout.previewRegion.left,y:c.layoutState.layout.previewRegion.top,width:c.layoutState.layout.previewRegion.width,height:c.layoutState.layout.previewRegion.height}:{x:0,y:0,width:c.layoutState.layout.width,height:c.layoutState.layout.height},l=this.commandContext.getLayoutById(c.layoutState.layout.id),B=a.getContext("2d");if(!B)throw new gA("Failed to obtain 2D context for preview image creation");const w=R(l.layoutState.layout,l.layoutState.elements,{renderingConfiguration:{purpose:W.Print,region:{left:g.x,top:g.y,width:g.width,height:g.height}}}),d=Kt.renderToStaticMarkup(w),h=await jt.from(B,d,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await h.render();const E=await this.getCanvasObjectURLAsync(a);return a.toDataURL(E)}getStepById(t){const A=this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepName===t));if(A&&this.stepHasHandle(A))return ka.get(this.getWorkflowManager(),A)}getSteps(){return this.getScenes().flatMap((t=>this.getStepsByScene(t)))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map((t=>({id:t.id,name:t.name,stepIds:t.stepNames})))}getSelectionPriceSubunits(){const t=this.getWorkflowManager().getWorkflowSelections();let A=0;return Object.values(t).forEach((t=>{A+=t.selections.map((t=>t.priceModifier)).reduce(((t,A)=>t+A))})),A}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const t=this.getWorkflowManager().getProduct().bulkConfiguration,A={type:m.Bulk,stepName:"Bulk",stepTitle:t?.stepTitle??"workflow.steps.bulk.title",helpText:t?.helpText,data:{aspects:Ln(this.getWorkflowManager().getWorkflow())},conditions:[]};return ka.get(this.getWorkflowManager(),A)}}getStepByName(t){const A=this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepTitle===t));if(A&&this.stepHasHandle(A))return ka.get(this.getWorkflowManager(),A)}getStepsByType(t){return this.getWorkflowManager().getWorkflow().steps.filter((A=>A.type===t)).map((t=>ka.get(this.getWorkflowManager(),t)))}getStepsByScene(t){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((A=>A.name===t.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return t.stepIds.map((t=>this.getWorkflowManager().getWorkflow().steps.find((A=>A.stepName===t)))).filter((t=>this.stepHasHandle(t))).map((t=>ka.get(this.getWorkflowManager(),t)))}async attachCustomerDetails(t){return this.assignCustomerDetails({emailAddress:t.email})}async assignCustomerDetails(t){const A=(await yA.getShadowGraphqlClient().mutate({mutation:Ya,variables:{id:this.getWorkflowManager().getTransaction().id,details:t,type:"Owner"}})).data?.transactionAddStakeholder?.stakeholders?.find((A=>A.customer?.emailAddress===t.emailAddress));if(A?.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const t=dA.getMap("transactionCustomerIds")||new Map;t.set(this.getWorkflowManager().getTransaction().id,A.customer.id),dA.setMap("transactionCustomerIds",t)}}attachRenderableSceneListener(t){this.renderableSceneCallbacks.push(t),t(this.renderableScenes)}detachRenderableSceneListener(t){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((A=>A!==t))}async save(t){if(!this.getCommandContext().getState())throw new rA("State undefined!");const A={title:await(async()=>{if(t)return t;const A=this.getWorkflowManager().getTransaction().id,e=(await Va.getSavedDesigns()).find((t=>t.transactionId===A))?.title;return e||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await Va.addDesign(A),A}async copy(){const t=zt(this.getCommandContext().getState());if(!t)throw new rA("Internal state is undefined! Cannot copy experience!");const A=JSON.stringify(t.transaction),e=this.getWorkflowManager().getWorkflow(),n=new Si({}),a=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!a)throw new rA("Integration product id is undefined!");await n.initFromIntegrationProduct(a);return await n.getWorkflowExperience(e.id,A,void 0)}async onDesignFinished(t){return za(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,t||(()=>{}),(t=>this.updateVariationRecords(t)),this.workflowManager.getVariationRecords(),(t=>this.createPreviewImage(t)),this.workflowManager.getWorkflowMetadata())}stepHasHandle(t){return t.type!==m.SilentIllustration&&t.type!==m.ProductOverlay}getExportedData(){const t=new Map,A=this.getWorkflowManager().getWorkflowMetadata(),e=this.getWorkflowManager().getWorkflowSelections();return Object.keys(A).forEach((e=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===e));if(!n)return;t.has(n.stepTitle)||t.set(n.stepTitle,{});const a=A[e];Object.keys(a).forEach((A=>{t.get(n.stepTitle)[A]=a[A]}))})),Object.keys(e)?.forEach((A=>{const n=this.workflowManager.getWorkflow().steps.find((t=>t.stepName===A));n&&(t.has(n.stepTitle)||t.set(n.stepTitle,{}),t.get(n.stepTitle).selection=e[A].selections[0].name)})),t}}const qa=Zt`
507
507
  ${Zt`
508
508
  fragment ProductCollectionProductFields on Product {
509
509
  id
@@ -636,6 +636,7 @@ import{CommandContext as t,AssetType as A,BringForwardCommand as e,BringToFrontC
636
636
  type
637
637
  title
638
638
  description
639
+ entityId
639
640
  }
640
641
  }
641
642
  }
@@ -1297,5 +1298,5 @@ import{CommandContext as t,AssetType as A,BringForwardCommand as e,BringToFrontC
1297
1298
  }
1298
1299
  }
1299
1300
  }
1300
- `,Fi=async t=>{const A=(await yA.getShadowGraphqlClient().query({query:ui,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}})).data.workflow;return A.steps.forEach((t=>{delete t.data.__typename})),A},Yi=(t,A)=>{const e=t.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((t=>t.layout)):A.panels.sort(((t,A)=>t.index-A.index)).map((t=>({id:F(),panelId:t.name,name:t.name,index:t.index,createdAt:new Date,updatedAt:new Date,transparentBackground:t.transparentBackground,height:t.height,width:t.width,previewRegion:t.previewRegion,useEditableArea:t.useEditableArea,editableArea:t.editableArea})))};class Si{constructor(t){var A;Qi(this,"options",void 0),Qi(this,"initialized",void 0),Qi(this,"currencyCode",void 0),Qi(this,"customer",void 0),Qi(this,"experienceOptions",void 0),Qi(this,"updateTransactionState",(async t=>{try{return yA.getShadowGraphqlClient().mutate({...t,mutation:Un})}catch(t){throw console.error(t),new cA("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(A=this.options.applicationKey,fA=A)}getAssetManager(){return HA}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(t){const A=dA.getMap("bundleOwnerIds");if(A?.has(t)){const e=A.get(t);return mA(e),Promise.resolve({success:!0,stakeholderType:oe.Owner})}const e=dA.getMap("bundleCustomerIds");if(e?.has(t)){const A=e.get(t);if(A){if(await this.authenticateCustomerId(A)){const A=this.customer?.bundleStakeholders?.find((A=>A.bundle?.id===t));if(A)return Promise.resolve({success:!0,stakeholderType:A.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(t){const A=yA.getShadowGraphqlClient(),e=await A.query({query:pi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${t}`);const n=e.data.transactions[0],a=n.product?.partner?.id;if(!a)throw new Error(`Unable to read transaction: ${t}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=dA.getMap("transactionOwnerIds");if(i?.has(t)){const A=i.get(t);return uA(A),Promise.resolve({success:!0,stakeholderType:oe.Owner})}const o=dA.getMap("transactionCustomerIds");if(o?.has(t)){const A=o.get(t);if(A){if(await this.authenticateCustomerId(A)){const A=this.customer?.bundleStakeholders?.find((A=>A.bundle?.transactions?.some((A=>A.id===t))))||this.customer?.stakeholders?.find((A=>A.transaction?.id===t));if(A)return Promise.resolve({success:!0,stakeholderType:A.type})}}}const r=(await A.query({query:mi,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const A=dA.getMap("transactionCustomerIds");A?.has(t)&&(A.delete(t),dA.setMap("transactionCustomerIds",A))}getStakeholderTypeForTransaction(t){const A=this.customer?.stakeholders?.find((A=>A.transaction?.id===t));if(A)return A.type}async getOrCreateCustomer(t){this.customer=void 0;const A=yA.getShadowGraphqlClient(),e=(await A.query({query:Di,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!e.id){const e=(await A.mutate({mutation:Ii,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(t){const A=yA.getShadowGraphqlClient(),e=dA.getMap("customerTokens");if(!e?.has(t))return!1;const n=e.get(t);if(!n)return!1;const a=(await A.mutate({mutation:fi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!a&&(IA(n),this.customer=a,!0)}async generateVerificationCode(t){await yA.getShadowGraphqlClient().mutate({mutation:yi,variables:{emailAddress:t}})}async verifyCode(t,A){const e=(await yA.getShadowGraphqlClient().mutate({mutation:Mi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t,verificationCode:A}})).data?.customerVerifyCode;if(e?.loginToken){if(!e.partner?.id)throw new Error(`Unable to find customer: ${t}`);const A=dA.getMap("customerTokens")||new Map;return A.set(e.id,e.loginToken),dA.setMap("customerTokens",A),IA(e.loginToken),this.customer={...e,loginToken:void 0},!0}return!1}async getNewBundle(t){const A=(await yA.getShadowGraphqlClient().mutate({mutation:_a,variables:{collectionId:t}})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mA(A.bundleOwnerId);const e=dA.getMap("bundleOwnerIds")||new Map;return e.set(A.id,A.bundleOwnerId),dA.setMap("bundleOwnerIds",e),new Ci(this,A)}async getExistingBundle(t,A){const e=await yA.getShadowGraphqlClient().query({query:Za,variables:{id:t}});if(!e.data?.bundles||0===e.data?.bundles.length||!e.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const n=e.data?.bundles[0],a=dA.getMap("bundleOwnerIds");a?.has(n.id)&&mA(a.get(n.id));const i=new Ci(this,n);if(n.transactions&&n.transactions.length>0){const t=t=>{const e=A?e=>A(e,t):void 0;return this.getWorkflowExperience(void 0,void 0,e,{type:"transaction",transactionId:t})},e=await Promise.all(n.transactions.map((A=>t(A.id))));i.setWorkflowExperiencesInternal(e)}return i}async getWorkflowExperience(t,A,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(t,A,e);const a=async t=>{for(const A in t.layouts){const e=t.layouts[A].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<e.length;++t){const A=e[t];A.src&&A.svg&&(A.cachedObjectURL=await dt(A.svg))}const n=t.layouts[A].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const A=n[t];A.fontData?.assetUrl&&H(A.fontData.assetUrl)}}},{transaction:i,workflow:o,readOnly:r}=await(async()=>{const t=yA.getShadowGraphqlClient();if("transaction"===n.type){const{transactionId:A,readOnly:e}=n,a=await t.query({query:Hn,variables:{id:A},errorPolicy:"all",fetchPolicy:"no-cache"});if(!a.data?.transactions||0===a.data.transactions.length)throw new cA("Existing transaction not found.");const i=a.data?.transactions[0];if(!i.workflowId)throw new cA("Existing transaction has no workflow ID.");const o=await Fi(i.workflowId);if(!i.product)throw new cA("Failed to load transaction, product not available.");return{transaction:i,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const A=async()=>{const A="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await t.mutate({mutation:Rn,variables:{...A,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new cA("Failed to create transaction!");const a=e.data.transactionCreate;if(!a.product)throw new cA("Failed to create transaction, product not available.");return a},e=Fi(n.workflowId),[a,i]=await Promise.all([A(),e]);return{transaction:a,workflow:i}}throw new cA("No workflow ID provided.")})();this.currencyCode=i.product.partner?.currencyCode;const s={product:i.product,transaction:i,layouts:[],stateMutationFunc:r?async()=>{throw new rA("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o};if("transaction"===n.type&&i.workflowState){const t=JSON.parse(i.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else if(!r&&n.workflowState){const t=JSON.parse(n.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else s.layouts=Yi(s.transaction,s.workflow);if(s.previewService=e&&e(o),s.renderableContextService=new fn(s.layouts),s.product?.modelUrl&&(s.previewService?.initialize({model:s.product.modelUrl,contextService:s.renderableContextService}),s.modelContainer=s.previewService?.getAllModels()[0]),"transaction"!==n.type){const t=dA.getMap("transactionOwnerIds")||new Map;t.set(i.id,i.transactionOwnerId),uA(i.transactionOwnerId||""),dA.setMap("transactionOwnerIds",t)}else{const t=(dA.getMap("transactionOwnerIds")||new Map).get(i.id);t&&uA(t)}this.initialized=!0,this.experienceOptions=s;const c=new Xa(this,s);return await c.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await c.attachCustomerDetails({email:this.customer.emailAddress}),c}async initFromIntegrationProduct(t){if(""===t)throw new cA("No integration product ID provided.");const A=yA.getShadowGraphqlClient(),e=await A.mutate({mutation:Rn,variables:{integrationProductId:t,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new cA("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new cA("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const a=dA.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),uA(n.transactionOwnerId||""),dA.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,A=!1){if(""===t)throw new cA("No transaction ID provided.");const e=yA.getShadowGraphqlClient();if(A)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:t},fetchPolicy:"no-cache",errorPolicy:"all"})).data?.transactions[0];if(!n)throw new cA("Failed to read transaction.");if(!n.product)throw new cA("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new rA("State mutation is forbidden in read only mode!")},readOnly:A},this.initialized=!0})();const n=dA.getMap("transactionOwnerIds")||new Map,a=n.get(t);if(a){uA(a);const n=(await e.query({query:Hn,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new cA("Failed to read transaction.");if(!n.product)throw new cA("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:A},void(this.initialized=!0)}try{const a=(await e.mutate({mutation:Pn,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!a)throw new cA("Failed to read transaction.");if(!a.product)throw new cA("Failed to load transaction, product not available.");this.currencyCode=a.product.partner?.currencyCode,a.transactionOwnerId&&(n.set(a.id,a.transactionOwnerId),uA(a.transactionOwnerId),dA.setMap("transactionOwnerIds",n)),this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:A},this.initialized=!0}catch{throw new cA("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,A,e){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot launch experience: Not initialized.");const n=async t=>{for(const A in t.layouts){const e=t.layouts[A].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<e.length;++t){const A=e[t];A.src&&A.svg&&(A.cachedObjectURL=await dt(A.svg))}const n=t.layouts[A].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const A=n[t];A.fontData?.assetUrl&&H(A.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await Fi(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=t,this.experienceOptions.transaction.workflowState){const t=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=e&&e(t),this.experienceOptions.renderableContextService=new fn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const A=new Xa(this,this.experienceOptions);return await A.getWorkflowManager().getInitializationPromise(),A}if(t){const a=yA.getShadowGraphqlClient().mutate({mutation:Gn,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),i=Fi(t);if(await Promise.all([a,i]),this.experienceOptions.workflow=await i,A){const t=JSON.parse(A);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=Yi(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await i),this.experienceOptions.renderableContextService=new fn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const o=new Xa(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new cA("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function vi(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class xi{constructor(){vi(this,"getProduct",void 0),vi(this,"getCommandContext",void 0),vi(this,"getAllLayoutData",void 0),vi(this,"getMetadata",void 0),vi(this,"getWorkflowMetadata",void 0),vi(this,"getStepStorage",void 0),vi(this,"setModelContainer",void 0),vi(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(t){}addVariationRecord(t){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(t){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(t){}addPoller(t){}addConfirmCallback(t){}addCurrentVariationCallback(t){}addEditedCallback(t){}addElementsCallback(t){}addInformationResultCallback(t){}addInitCallback(t){}addMakingAdjustmentsCallback(t){}addMandatoryCallback(t){}addMetadataCallback(t){}addSelectionCallback(t){}addStepSpecificStorageCallback(t,A){}addStorageCallback(t){}addVariationRecordsCallback(t){}getCommandDispatcher(){return t=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(t){return[]}getSerializedStep(t,A){}getStepSpecificServices(t){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(t){}markUpdateCompleted(t){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(t){}setCurrentVariationRecord(t){}setEditedStatus(t,A){}setInformationResults(t){}setMandatoryFulfilled(t,A){}async setSelectionsAndElements(t,A,e){}setVariationRecords(t){}toggleDesignConfirmed(){}updateMetadata(t,A){}async updateStorage(t,A){}}function Ni(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}let Ri;var Pi;(Pi=Ri||(Ri={})).SelectFrame="SelectFrame",Pi.SelectImage="SelectImage",Pi.Position="Position";class Hi extends Ma{constructor(t,A){super(t,A),Ni(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const A=this.manager.getRegionElements(this.step.stepName);return ia.selectVariant(this.step,t.getResource(),A,this.manager,(t=>this.setUpdateState(t)))}onFrameDataChanged(t){this.frameService&&this.frameService.onFrameDataChanged((A=>{A&&t(A)}))}selectImage(t){return ia.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,A,e,n){return n&&n.length>1&&void 0===t?Ri.SelectFrame:A||e||this.getImageData()?Ri.Position:Ri.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const Ui=t=>{const A=bt(null),e=bt(void 0),[n,a]=Rt(void 0),{addEvent:i,removeEvent:o,updateEvent:r,eventCache:s}=LA(),[c,g]=Rt(!1),[l,B]=Rt(!1),{state:w,uiDispatcher:d}=ZA(),h=Pt((t=>{const A=t;d(new qA({zoom:Math.max(.1,Math.min(A,w.maxZoom))}))}),[d,w.maxZoom]),E=Pt((t=>{o(t),1===s.length&&(e.current=void 0),2===s.length&&a(void 0);"touch"===t.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),C=Pt((t=>{i(t);"touch"===t.pointerType&&1===s.length&&(d(new qA({selectedElement:void 0})),B(!0),g(!0))}),[i,s.length,d]),Q=Pt((t=>{r(t);const A=1===s.length&&"touch"!==s[0].pointerType,i=2===s.length&&"touch"===s[0].pointerType;if(c&&i){const[t,A]=s,e=Math.abs(t.clientX-A.clientX),i=n;i&&h(w.zoom-.0055*(i-e)),a(e)}if(l&&(A||i)&&t.isPrimary){const A=(e?.current?.x||t.screenX)-t.screenX,n=(e?.current?.y||t.screenY)-t.screenY;d(new qA({selectedElement:void 0,xTranslation:w.xTranslation-A/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}t.isPrimary&&(e.current={x:t.screenX,y:t.screenY})}),[r,s,c,l,n,h,w.zoom,w.xTranslation,w.yTranslation,d]),u=Pt((t=>{c&&h(w.zoom-.035*Math.sign(t.deltaY))}),[h,w.zoom,c]);Ut((()=>{if(!A.current||0===s.length)return;const t=s[0].pointerId,e=A.current.hasPointerCapture(t);l&&!e&&A.current.setPointerCapture(t),!l&&e&&A.current.releasePointerCapture(t)}),[A,l,s]),Je([" "],(()=>{B(!0),d(new qA({selectedElement:void 0}))}),(()=>B(!1))),Je(["Control"],(()=>g(!0)),(()=>g(!1)));const p=kt((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return Jt("div",{ref:A,className:"transform-wrapper",onWheel:u,onPointerDown:C,onPointerUp:E,onPointerCancel:E,onPointerLeave:E,onPointerMove:Q,style:p,children:t.children})};export{Si as SpiffCommerceClient,t as CommandContext,EA as spiffCoreConfiguration,ze as PromiseQueue,Oe as QueueablePromise,xi as MockWorkflowManager,ua as InformationMessageType,Ma as StepHandle,Ga as TextStepHandle,Hi as FrameStepHandle,va as BulkStepHandle,Ua as ShapeStepHandle,xa as IllustrationStepHandle,Na as MaterialStepHandle,Ra as ModelStepHandle,Pa as PictureStepHandle,Ha as QuestionStepHandle,te as BulkPriceCalculationStrategy,fa as Variant,AA as OptionNotFoundError,eA as LayoutNotFoundError,nA as AssetNotFoundError,aA as ResourceNotFoundError,iA as MisconfigurationError,sA as ParseError,rA as UnhandledBehaviorError,HA as assetService,Va as designService,za as createDesign,bA as optionService,dA as persistenceService,yA as graphQlManager,ge as toast,Zn as FrameService,Xn as getBoundedOffsets,ia as frameStepService,sa as modelStepService,ra as materialStepService,Ba as shapeStepService,la as questionStepService,na as digitalContentStepService,ca as moduleStepService,ga as pictureStepService,Ca as textStepService,oa as illustrationStepService,$A as ProductCameraRig,Ri as FrameStep,ee as ConversionLocation,ae as ConversionDataType,Fi as getWorkflow,ta as shortenUrl,A as AssetType,e as BringForwardCommand,n as BringToFrontCommand,a as BringToBackCommand,i as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,h as LayoutElementType,E as MoveCommand,C as ResizeCommand,Q as RotateCommand,u as SendBackwardsCommand,oe as StakeholderType,p as StepAspectType,m as StepType,D as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,S as generateSVGWithUnknownColors,v as getAttributesFromArrayBuffer,x as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,P as loadFontFromDataUrl,H as loadFontFromExternalUrl,U as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Ge as minZoom,Nn as AdvancedEditor,Ui as TransformWrapper,xn as EditorCore,TA as useLayouts,ZA as useEditorState,be as useEditorInteraction,Je as useShortcutCombination,VA as commandReducer,KA as getDefaultState,JA as CommandContextContext,XA as AdvancedEditorStateProvider,WA as AdvancedEditorContext,qA as UICommand,zA as EditorSubMenu,le as ElementEventType,we as KeyEvent,Ln as gatherVaryingStepAspects};
1301
+ `,Fi=async t=>{const A=(await yA.getShadowGraphqlClient().query({query:ui,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}})).data.workflow;return A.steps.forEach((t=>{delete t.data.__typename})),A},Yi=(t,A)=>{const e=t.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((t=>t.layout)):A.panels.sort(((t,A)=>t.index-A.index)).map((t=>({id:F(),panelId:t.name,name:t.name,index:t.index,createdAt:new Date,updatedAt:new Date,transparentBackground:t.transparentBackground,height:t.height,width:t.width,previewRegion:t.previewRegion,useEditableArea:t.useEditableArea,editableArea:t.editableArea})))};class Si{constructor(t){var A;Qi(this,"options",void 0),Qi(this,"initialized",void 0),Qi(this,"currencyCode",void 0),Qi(this,"customer",void 0),Qi(this,"experienceOptions",void 0),Qi(this,"updateTransactionState",(async t=>{try{return yA.getShadowGraphqlClient().mutate({...t,mutation:Un})}catch(t){throw console.error(t),new cA("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=t,this.options.applicationKey&&(A=this.options.applicationKey,fA=A)}getAssetManager(){return HA}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateBundleFromLocalStorage(t){const A=dA.getMap("bundleOwnerIds");if(A?.has(t)){const e=A.get(t);return mA(e),Promise.resolve({success:!0,stakeholderType:oe.Owner})}const e=dA.getMap("bundleCustomerIds");if(e?.has(t)){const A=e.get(t);if(A){if(await this.authenticateCustomerId(A)){const A=this.customer?.bundleStakeholders?.find((A=>A.bundle?.id===t));if(A)return Promise.resolve({success:!0,stakeholderType:A.type})}}}return Promise.resolve({success:!1})}async authenticateTransactionFromLocalStorage(t){const A=yA.getShadowGraphqlClient(),e=await A.query({query:pi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:t}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${t}`);const n=e.data.transactions[0],a=n.product?.partner?.id;if(!a)throw new Error(`Unable to read transaction: ${t}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const i=dA.getMap("transactionOwnerIds");if(i?.has(t)){const A=i.get(t);return uA(A),Promise.resolve({success:!0,stakeholderType:oe.Owner})}const o=dA.getMap("transactionCustomerIds");if(o?.has(t)){const A=o.get(t);if(A){if(await this.authenticateCustomerId(A)){const A=this.customer?.bundleStakeholders?.find((A=>A.bundle?.transactions?.some((A=>A.id===t))))||this.customer?.stakeholders?.find((A=>A.transaction?.id===t));if(A)return Promise.resolve({success:!0,stakeholderType:A.type})}}}const r=(await A.query({query:mi,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(t){const A=dA.getMap("transactionCustomerIds");A?.has(t)&&(A.delete(t),dA.setMap("transactionCustomerIds",A))}getStakeholderTypeForTransaction(t){const A=this.customer?.stakeholders?.find((A=>A.transaction?.id===t));if(A)return A.type}async getOrCreateCustomer(t){this.customer=void 0;const A=yA.getShadowGraphqlClient(),e=(await A.query({query:Di,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t}})).data.customer;if(!e.id){const e=(await A.mutate({mutation:Ii,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:t}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(t){const A=yA.getShadowGraphqlClient(),e=dA.getMap("customerTokens");if(!e?.has(t))return!1;const n=e.get(t);if(!n)return!1;const a=(await A.mutate({mutation:fi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!a&&(IA(n),this.customer=a,!0)}async generateVerificationCode(t){await yA.getShadowGraphqlClient().mutate({mutation:yi,variables:{emailAddress:t}})}async verifyCode(t,A){const e=(await yA.getShadowGraphqlClient().mutate({mutation:Mi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:t,verificationCode:A}})).data?.customerVerifyCode;if(e?.loginToken){if(!e.partner?.id)throw new Error(`Unable to find customer: ${t}`);const A=dA.getMap("customerTokens")||new Map;return A.set(e.id,e.loginToken),dA.setMap("customerTokens",A),IA(e.loginToken),this.customer={...e,loginToken:void 0},!0}return!1}async getNewBundle(t){const A=(await yA.getShadowGraphqlClient().mutate({mutation:_a,variables:{collectionId:t}})).data?.bundleCreate;if(!A)throw new Error("Unable to create bundle");mA(A.bundleOwnerId);const e=dA.getMap("bundleOwnerIds")||new Map;return e.set(A.id,A.bundleOwnerId),dA.setMap("bundleOwnerIds",e),new Ci(this,A)}async getExistingBundle(t,A){const e=await yA.getShadowGraphqlClient().query({query:Za,variables:{id:t}});if(!e.data?.bundles||0===e.data?.bundles.length||!e.data?.bundles[0])throw new Error(`Unable to find bundle: ${t}`);const n=e.data?.bundles[0],a=dA.getMap("bundleOwnerIds");a?.has(n.id)&&mA(a.get(n.id));const i=new Ci(this,n);if(n.transactions&&n.transactions.length>0){const t=t=>{const e=A?e=>A(e,t):void 0;return this.getWorkflowExperience(void 0,void 0,e,{type:"transaction",transactionId:t})},e=await Promise.all(n.transactions.map((A=>t(A.id))));i.setWorkflowExperiencesInternal(e)}return i}async getWorkflowExperience(t,A,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(t,A,e);const a=async t=>{for(const A in t.layouts){const e=t.layouts[A].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<e.length;++t){const A=e[t];A.src&&A.svg&&(A.cachedObjectURL=await dt(A.svg))}const n=t.layouts[A].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const A=n[t];A.fontData?.assetUrl&&H(A.fontData.assetUrl)}}},{transaction:i,workflow:o,readOnly:r}=await(async()=>{const t=yA.getShadowGraphqlClient();if("transaction"===n.type){const{transactionId:A,readOnly:e}=n,a=await t.query({query:Hn,variables:{id:A},errorPolicy:"all",fetchPolicy:"no-cache"});if(!a.data?.transactions||0===a.data.transactions.length)throw new cA("Existing transaction not found.");const i=a.data?.transactions[0];if(!i.workflowId)throw new cA("Existing transaction has no workflow ID.");const o=await Fi(i.workflowId);if(!i.product)throw new cA("Failed to load transaction, product not available.");return{transaction:i,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const A=async()=>{const A="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await t.mutate({mutation:Rn,variables:{...A,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new cA("Failed to create transaction!");const a=e.data.transactionCreate;if(!a.product)throw new cA("Failed to create transaction, product not available.");return a},e=Fi(n.workflowId),[a,i]=await Promise.all([A(),e]);return{transaction:a,workflow:i}}throw new cA("No workflow ID provided.")})();this.currencyCode=i.product.partner?.currencyCode;const s={product:i.product,transaction:i,layouts:[],stateMutationFunc:r?async()=>{throw new rA("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o};if("transaction"===n.type&&i.workflowState){const t=JSON.parse(i.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else if(!r&&n.workflowState){const t=JSON.parse(n.workflowState);s.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await a(t),s.reloadedState=t}else s.layouts=Yi(s.transaction,s.workflow);if(s.renderableContextService=new fn(s.layouts),n.previewService?(s.previewService=n.previewService,s.product?.modelUrl&&(s.modelContainer=s.previewService.loadModel({model:s.product.modelUrl,contextService:s.renderableContextService}))):(s.previewService=e&&e(o),s.product?.modelUrl&&(s.previewService?.initialize({model:s.product.modelUrl,contextService:s.renderableContextService}),s.modelContainer=s.previewService?.getAllModels()[0])),"transaction"!==n.type){const t=dA.getMap("transactionOwnerIds")||new Map;t.set(i.id,i.transactionOwnerId),uA(i.transactionOwnerId||""),dA.setMap("transactionOwnerIds",t)}else{const t=(dA.getMap("transactionOwnerIds")||new Map).get(i.id);t&&uA(t),s.isReloadedTransaction=!0}this.initialized=!0,this.experienceOptions=s;const c=new Xa(this,s);return await c.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await c.attachCustomerDetails({email:this.customer.emailAddress}),c}async initFromIntegrationProduct(t){if(""===t)throw new cA("No integration product ID provided.");const A=yA.getShadowGraphqlClient(),e=await A.mutate({mutation:Rn,variables:{integrationProductId:t,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new cA("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new cA("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const a=dA.getMap("transactionOwnerIds")||new Map;a.set(n.id,n.transactionOwnerId),uA(n.transactionOwnerId||""),dA.setMap("transactionOwnerIds",a),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(t,A=!1){if(""===t)throw new cA("No transaction ID provided.");const e=yA.getShadowGraphqlClient();if(A)return await(async()=>{const n=(await e.query({query:Hn,variables:{id:t},fetchPolicy:"no-cache",errorPolicy:"all"})).data?.transactions[0];if(!n)throw new cA("Failed to read transaction.");if(!n.product)throw new cA("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new rA("State mutation is forbidden in read only mode!")},readOnly:A},this.initialized=!0})();const n=dA.getMap("transactionOwnerIds")||new Map,a=n.get(t);if(a){uA(a);const n=(await e.query({query:Hn,variables:{id:t},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new cA("Failed to read transaction.");if(!n.product)throw new cA("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:A},void(this.initialized=!0)}try{const a=(await e.mutate({mutation:Pn,variables:{id:t},errorPolicy:"all"})).data?.transactionClaim;if(!a)throw new cA("Failed to read transaction.");if(!a.product)throw new cA("Failed to load transaction, product not available.");this.currencyCode=a.product.partner?.currencyCode,a.transactionOwnerId&&(n.set(a.id,a.transactionOwnerId),uA(a.transactionOwnerId),dA.setMap("transactionOwnerIds",n)),this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:A},this.initialized=!0}catch{throw new cA("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(t,A,e){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot launch experience: Not initialized.");const n=async t=>{for(const A in t.layouts){const e=t.layouts[A].elements.filter((t=>t.type===h.Illustration));for(let t=0;t<e.length;++t){const A=e[t];A.src&&A.svg&&(A.cachedObjectURL=await dt(A.svg))}const n=t.layouts[A].elements.filter((t=>t.type===h.Textbox));for(let t=0;t<n.length;++t){const A=n[t];A.fontData?.assetUrl&&H(A.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const t=await Fi(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=t,this.experienceOptions.transaction.workflowState){const t=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}this.experienceOptions.previewService=e&&e(t),this.experienceOptions.renderableContextService=new fn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const A=new Xa(this,this.experienceOptions);return await A.getWorkflowManager().getInitializationPromise(),A}if(t){const a=yA.getShadowGraphqlClient().mutate({mutation:Gn,variables:{workflowId:t,id:this.experienceOptions.transaction.id}}),i=Fi(t);if(await Promise.all([a,i]),this.experienceOptions.workflow=await i,A){const t=JSON.parse(A);this.experienceOptions.layouts=Object.values(t.layouts).map((t=>t.layout)),await x(t),await n(t),this.experienceOptions.reloadedState=t}else this.experienceOptions.layouts=Yi(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await i),this.experienceOptions.renderableContextService=new fn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&(this.experienceOptions.previewService?.initialize({model:this.experienceOptions.product.modelUrl,contextService:this.experienceOptions.renderableContextService}),this.experienceOptions.modelContainer=this.experienceOptions.previewService?.getAllModels()[0]);const o=new Xa(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new cA("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new cA("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function vi(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}class xi{constructor(){vi(this,"getProduct",void 0),vi(this,"getCommandContext",void 0),vi(this,"getAllLayoutData",void 0),vi(this,"getMetadata",void 0),vi(this,"getWorkflowMetadata",void 0),vi(this,"getStepStorage",void 0),vi(this,"setModelContainer",void 0),vi(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(t){}addVariationRecord(t){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(t){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(t){}addPoller(t){}addConfirmCallback(t){}addCurrentVariationCallback(t){}addEditedCallback(t){}addElementsCallback(t){}addInformationResultCallback(t){}addInitCallback(t){}addMakingAdjustmentsCallback(t){}addMandatoryCallback(t){}addMetadataCallback(t){}addSelectionCallback(t){}addStepSpecificStorageCallback(t,A){}addStorageCallback(t){}addVariationRecordsCallback(t){}getCommandDispatcher(){return t=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getModelContainer(){}getProfanities(){return[]}getRegionElements(t){return[]}getSerializedStep(t,A){}getStepSpecificServices(t){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(t){}markUpdateCompleted(t){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(t){}setCurrentVariationRecord(t){}setEditedStatus(t,A){}setInformationResults(t){}setMandatoryFulfilled(t,A){}async setSelectionsAndElements(t,A,e){}setVariationRecords(t){}toggleDesignConfirmed(){}updateMetadata(t,A){}async updateStorage(t,A){}injectIntoPreviewService(t){return Promise.resolve()}ejectFromPreviewService(){}}function Ni(t,A,e){return(A=function(t){var A=function(t,A){if("object"!=typeof t||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,A||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(t)}(t,"string");return"symbol"==typeof A?A:String(A)}(A))in t?Object.defineProperty(t,A,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[A]=e,t}let Ri;var Pi;(Pi=Ri||(Ri={})).SelectFrame="SelectFrame",Pi.SelectImage="SelectImage",Pi.Position="Position";class Hi extends Ma{constructor(t,A){super(t,A),Ni(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(t){const A=this.manager.getRegionElements(this.step.stepName);return ia.selectVariant(this.step,t.getResource(),A,this.manager,(t=>this.setUpdateState(t)))}onFrameDataChanged(t){this.frameService&&this.frameService.onFrameDataChanged((A=>{A&&t(A)}))}selectImage(t){return ia.selectImage(this.step,t,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(t,A,e,n){return n&&n.length>1&&void 0===t?Ri.SelectFrame:A||e||this.getImageData()?Ri.Position:Ri.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const Ui=t=>{const A=bt(null),e=bt(void 0),[n,a]=Rt(void 0),{addEvent:i,removeEvent:o,updateEvent:r,eventCache:s}=LA(),[c,g]=Rt(!1),[l,B]=Rt(!1),{state:w,uiDispatcher:d}=ZA(),h=Pt((t=>{const A=t;d(new qA({zoom:Math.max(.1,Math.min(A,w.maxZoom))}))}),[d,w.maxZoom]),E=Pt((t=>{o(t),1===s.length&&(e.current=void 0),2===s.length&&a(void 0);"touch"===t.pointerType&&s.length>1&&s.length-1==1&&(B(!1),g(!1))}),[o,s.length]),C=Pt((t=>{i(t);"touch"===t.pointerType&&1===s.length&&(d(new qA({selectedElement:void 0})),B(!0),g(!0))}),[i,s.length,d]),Q=Pt((t=>{r(t);const A=1===s.length&&"touch"!==s[0].pointerType,i=2===s.length&&"touch"===s[0].pointerType;if(c&&i){const[t,A]=s,e=Math.abs(t.clientX-A.clientX),i=n;i&&h(w.zoom-.0055*(i-e)),a(e)}if(l&&(A||i)&&t.isPrimary){const A=(e?.current?.x||t.screenX)-t.screenX,n=(e?.current?.y||t.screenY)-t.screenY;d(new qA({selectedElement:void 0,xTranslation:w.xTranslation-A/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}t.isPrimary&&(e.current={x:t.screenX,y:t.screenY})}),[r,s,c,l,n,h,w.zoom,w.xTranslation,w.yTranslation,d]),u=Pt((t=>{c&&h(w.zoom-.035*Math.sign(t.deltaY))}),[h,w.zoom,c]);Ut((()=>{if(!A.current||0===s.length)return;const t=s[0].pointerId,e=A.current.hasPointerCapture(t);l&&!e&&A.current.setPointerCapture(t),!l&&e&&A.current.releasePointerCapture(t)}),[A,l,s]),Je([" "],(()=>{B(!0),d(new qA({selectedElement:void 0}))}),(()=>B(!1))),Je(["Control"],(()=>g(!0)),(()=>g(!1)));const p=kt((()=>({cursor:l&&0===s.length?"grab":l&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[l,c,s]);return Jt("div",{ref:A,className:"transform-wrapper",onWheel:u,onPointerDown:C,onPointerUp:E,onPointerCancel:E,onPointerLeave:E,onPointerMove:Q,style:p,children:t.children})};export{Si as SpiffCommerceClient,t as CommandContext,EA as spiffCoreConfiguration,ze as PromiseQueue,Oe as QueueablePromise,xi as MockWorkflowManager,ua as InformationMessageType,Ma as StepHandle,Ga as TextStepHandle,Hi as FrameStepHandle,va as BulkStepHandle,Ua as ShapeStepHandle,xa as IllustrationStepHandle,Na as MaterialStepHandle,Ra as ModelStepHandle,Pa as PictureStepHandle,Ha as QuestionStepHandle,te as BulkPriceCalculationStrategy,fa as Variant,AA as OptionNotFoundError,eA as LayoutNotFoundError,nA as AssetNotFoundError,aA as ResourceNotFoundError,iA as MisconfigurationError,sA as ParseError,rA as UnhandledBehaviorError,HA as assetService,Va as designService,za as createDesign,bA as optionService,dA as persistenceService,yA as graphQlManager,ge as toast,Zn as FrameService,Xn as getBoundedOffsets,ia as frameStepService,sa as modelStepService,ra as materialStepService,Ba as shapeStepService,la as questionStepService,na as digitalContentStepService,ca as moduleStepService,ga as pictureStepService,Ca as textStepService,oa as illustrationStepService,$A as ProductCameraRig,Ri as FrameStep,ee as ConversionLocation,ae as ConversionDataType,Fi as getWorkflow,ta as shortenUrl,A as AssetType,e as BringForwardCommand,n as BringToFrontCommand,a as BringToBackCommand,i as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,l as FontSizeCommand,B as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,h as LayoutElementType,E as MoveCommand,C as ResizeCommand,Q as RotateCommand,u as SendBackwardsCommand,oe as StakeholderType,p as StepAspectType,m as StepType,D as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,S as generateSVGWithUnknownColors,v as getAttributesFromArrayBuffer,x as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,P as loadFontFromDataUrl,H as loadFontFromExternalUrl,U as determineCorrectFontSizeAndLines,G as patternImageDataCache,Dn as generateCommands,k as registerJSDOM,Ge as minZoom,Nn as AdvancedEditor,Ui as TransformWrapper,xn as EditorCore,TA as useLayouts,ZA as useEditorState,be as useEditorInteraction,Je as useShortcutCombination,VA as commandReducer,KA as getDefaultState,JA as CommandContextContext,XA as AdvancedEditorStateProvider,WA as AdvancedEditorContext,qA as UICommand,zA as EditorSubMenu,le as ElementEventType,we as KeyEvent,Ln as gatherVaryingStepAspects};
1301
1302
  //# sourceMappingURL=module.js.map