@spiffcommerce/core 0.10.202 → 0.10.204
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +2 -2
- package/dist/module.js +2 -2
- package/package.json +1 -1
package/dist/module.js
CHANGED
|
@@ -189,7 +189,7 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
|
|
|
189
189
|
workflowState
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
-
`,hn=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},In=[u.SilentIllustration,u.ProductOverlay],Dn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=un(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?In.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:hn(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},un=(A,t)=>t.find((t=>t.stepNames.includes(A))),pn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),mn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>pn(A,t))),silentSteps:A.silentSteps.filter((A=>pn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),fn=async(A,t)=>{const e=mn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Ft.getOption(It,t.optionId):void 0)?.data.variants.length;A&&A>1&&n.push(t.stepName)}else n.push(t.stepName);const i=e.filter((A=>A.renderableSteps.filter((A=>n.includes(A.stepName))).length>0));for(const A of i)A.renderableSteps=A.renderableSteps.filter((A=>n.includes(A.stepName)));return i};function Mn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}function Fn(A,t,e,n){const i=e.width*A.zoom,a=e.height*A.zoom;if(n){const n=A,i=Math.max(t.width/e.width,t.height/e.height);n.zoom=Math.max(i,A.zoom);const a=e.width*n.zoom,s=e.height*n.zoom;return n.x=yn(A.x,t.width-a,0),n.y=yn(A.y,t.height-s,0),n}const s=A;return s.x=yn(s.x,-i,t.width),s.y=yn(s.y,-a,t.height),s}function yn(A,t,e){return Math.min(Math.max(A,t),e)}class Yn{constructor(A){Mn(this,"offsets",void 0),Mn(this,"forceImageCover",void 0),Mn(this,"targetElements",void 0),Mn(this,"imageData",void 0),Mn(this,"frameData",void 0),Mn(this,"_debouncedUpdateFrameOffsets",void 0),Mn(this,"minZoomScale",.03),Mn(this,"maxZoomScale",20),Mn(this,"onFrameDataChangeListeners",void 0),Mn(this,"onZoomChangeListeners",void 0),Mn(this,"workflowManager",void 0),Mn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await S(t.currentFrameSource);zA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=F.get(A);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(A){this.offsets=A}setZoom(A,t,e,n){if(this.imageData&&this.offsets&&this.frameData){const i=(t-this.offsets.x)/this.offsets.zoom,a=(e-this.offsets.y)/this.offsets.zoom,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Fn(s,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((t=>t(A)))}}setPatternData(A){(A&&this.frameData||A&&this.frameData&&!this.imageData)&&(this.offsets=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Fn(this.offsets,this.frameData,A,this.forceImageCover))),this.imageData=A,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(A,t){const e=this.imageData;e&&this.frameData&&(this.offsets&&A.x===this.offsets.x&&A.y===this.offsets.y&&A.zoom===this.offsets.zoom?t&&t():(this.offsets=Fn(A,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(A,e,this.frameData,this.targetElements,t)))}onFrameDataChanged(A){A(this.frameData),this.onFrameDataChangeListeners.push(A)}onZoom(A){this.onZoomChangeListeners.push(A)}updateFrameOffsets(A,t,e,n,i){if(!e)throw new at("Frame data not set. This is a bug");if(!this.workflowManager)throw new at("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Nn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class xn{constructor(A,t,e){Nn(this,"configuration",void 0),Nn(this,"layouts",void 0),Nn(this,"product",void 0),Nn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new At(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new nt(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id:y(),src:e,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),r=await N(await a()),o={stepName:this.configuration.stepName,id:y(),cachedObjectURL:await EA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:o.id,region:A},command:new s(o,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new nt(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new At(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const vn=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ot("Failed to shorten URL, see console.")}};function Sn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Pn{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(A){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(A,t,e,n=3e3,i=10){Sn(this,"pollingId",void 0),Sn(this,"attempts",void 0),Sn(this,"interval",void 0),Sn(this,"maxAttempts",void 0),Sn(this,"predicate",void 0),Sn(this,"onSuccess",void 0),Sn(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=e,this.predicate=A,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=i,this.poll()}}const Rn=new class{async init(A,t,e){return e&&await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{const e=n?.storage?.videoShortUrl,i=n?.storage?.videoUrl;t.updateStorage(A.stepName,{videoShortUrl:e,videoUrl:i})}))}async regenerateQRCode(A,t,e,n,i,a,s,r,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Pn((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new et(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new o(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new ot("Cannot create QR code, URL too long.");const E=await vn(l);if(s(E),!a.data||!a.data.regions)throw new nt(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await VA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new At(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(r),followup:async()=>{}}}};function Un(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Hn=new class{constructor(){Un(this,"frameSourceSvg",(async(A,t)=>{if(!A)return QA(t.data.regions[0]);if(!A.assetKey)throw new tt(A);const e=await ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return nA(n.href);throw new et(e.data)}))}async init(A,t,e){if(e)return await this.reload(A,t,e),null;if(t.setMandatoryFulfilled(A.stepName,!1),t.markStepsAsInitialised([A.stepName]),A.optionId){const e=await Ft.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Ft.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion}))),a=(await Ft.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=QA(A.data.regions[0]);t.updateStorage(A.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,i=n.storage?.frameOffsets;if(t.updateMetadata(A.stepName,{frameOffsets:i,framePatternSrc:e}),e){const n=t.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(e,n),t.updateMetadata(A.stepName,{image:e}),t.updateStorage(A.stepName,{framePatternSrc:e})}if(i?.zoom){const e=t.getStepSpecificServices(A.stepName)?.frameService;e.updateOffsets(i)}t.setMandatoryFulfilled(A.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));n&&await t.setSelectionsAndElements(A.stepName,[n],i,(async()=>{const i=await this.frameSourceSvg(n,A);t.updateStorage(A.stepName,{currentFrameSource:i}),await e()}))}}else await t.setSelectionsAndElements(A.stepName,[],i,e)}}selectImage(A,t,e){e.setEditedStatus(A.stepName,!0);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new Pn((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new ot("Failed to resolve transcoded PDF")})))}else this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new s({id:A,type:d.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await CA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await S(r),g=s.getImageData(),B=e.map((A=>new o(A.id))),w=g?AA(g,c):void 0,E=g?{id:y(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new At(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:r}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new et(A.data)}async loadPatternFromAsset(A,t,e){const n=this.patternSource(A),i=e.markUpdatePending(),a=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(n,a),e.updateMetadata(t.stepName,{image:n}),e.updateStorage(t.stepName,{framePatternSrc:n}),e.markUpdateCompleted(i)}};const Gn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantCommand(A,e,[],(()=>{}),t)}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await Ft.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}async changeColorsCommand(A,t,e,n,i){const a={};for(const[A,t]of i.entries())a[A]={browserValue:t,spotColor:a[A]?.spotColor};const s=hA(A,t,e,a),r=await EA(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new IA(A,t,e));o.push(new DA(A,s,r))}return new l(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},r={};Object.entries(s).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[A]=e}));for(const[A,t]of i.entries())s[A]={browserValue:t,spotColor:s[A]?.spotColor},r[A]={browserValue:t};let o=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await Ft.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{o=o.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:o});const g=new Map;if(Object.entries(s).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(B)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new nt(A,"Missing regions.");n(!0);const a=e.map((A=>new o(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new tt(t);const s=await ft.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new et(s.data);const c=await N(await this.getIllustrationBody(r.href)),g=await EA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new At(t);const n=y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Ft.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const bn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new _A(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants.find((A=>A.id===e));if(n){const e=await ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getPreviewService();n(!0);const a=await ft.getMaterialFromVariant(t);if(!a)throw n(!1),new tt(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Jn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getPreviewService();if(e){const i=(await ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(n);await e.applyModelVariant(A.optionId,{model:i.href,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const kn=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||y(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new o(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const On=new class{async init(A,t,e){const n=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,t,(()=>{}))}return t.markStepsAsInitialised([A.stepName]),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){if(!t.assetKey)throw new tt(t);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new o(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new At(t);const i=y();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new l([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Ln=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Ft.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants.find((A=>A.id===e));n&&await t.setSelectionsAndElements(A.stepName,[n],[])}}}async selectVariant(A,t,e){const n=await this.selectVariantLambda(A,t,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(A,t,e){const n=await Ft.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,a=i.length>1?i.find((A=>A.id===t)):i[0];if(!a)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[a],[],(async()=>{e.setMandatoryFulfilled(A.stepName,!0)}))}}}};const zn=new class{async availableColours(A,t){const e=await Ft.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(!e){const e=Ft.getDefaultVariant(n.data);if(!e)return null;const i={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(A,i,[],t)}return await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.updateStorage(A.stepName,{colour:n.color||""}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=n.getLayouts();if(e.length>0){const a=A=>{const e=A.region;if(!i.find((A=>A.panelId===e?.panelId)))throw new At(e);const n=t.variant?.color;return n?new IA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new At(e);const a=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const o=y();return{id:o,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:r,id:o,svg:a,type:d.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),o=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],o,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Tn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const jn=new class{constructor(){Tn(this,"latestToast",void 0),Tn(this,"toastType",void 0),Tn(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function Kn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Vn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Vn.name}}class Xn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Xn.name}}const Wn=new class{constructor(){Kn(this,"cachedColors",new Map),Kn(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?uA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Kn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Kn(this,"getErrorsForText",((A,t,e)=>{const n=[];t.data&&t.data.maxLength&&A.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const i=e.getProfanities(),a=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(A.includes("\n")||A.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.color||await this.getDefaultColor(A.data,e)}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=Ft.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Ft.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return BA(n,{vertical:t.vertical,uppercase:t.uppercase})}updateInputText(A,t,e,n){const i=n.getStepStorage(e.stepName),a=this.getProcessedInput(A,e.data,!!i.customiseAllText),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const r=(e.data.maxLength-a.length).toString();s.helperText=`${r} characters remaining`,n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0);const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new at("Failed to resolve font data for text.");const[t,n]=H(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,o))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return s.command=new l(c),s.command.varying=o,s}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e.getStepStorage(A.stepName)||{},e.getRegionElements(A.stepName),e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}createTextFillSpotColor(A,t){const e=A.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.replace(/\s/g,"-"),n=A.lastIndexOf("/"),i=A.slice(n+1).slice(0,-4);if(!t.namedColor)throw new Error("variant named color not set!");return{profileName:i,namedColor:t.namedColor}}}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,o=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:o}),t.updateStorage(A.stepName,{text:o,inputText:o});const n=i.map((A=>new w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Wn.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Ft.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new tt(A);const t=await ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new et(t.data);return{assetUrl:e,name:(await U(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const r=i.markUpdatePending(),o=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new w(A.id,o))),g=await this.changeInputTextWithRegion(A,A.data.size||30,o,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new l(c),followup:async()=>{i.markUpdateCompleted(r),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,o,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,o,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new l(g),followup:async()=>{i.markUpdateCompleted(r)}}}}injectReplaceableText(A,t){return t.replaceableText?t.replaceableText.replace("{{}}",A):A}async createTextboxRegions(A,t,e,n,i,a){if(!e||!e.regions)throw new Error("Step data not supplied");const r=a.getTransaction().bulk&&e.varyText||!1,o=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(o,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=y();try{if(!g)throw new Xn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Ft.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:o,type:d.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new at("Failed to resolve font data for text.");const[p,m]=H(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,p),u.set(h.id,m);const f=e.curved||e.vertical?c:(m||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(p,e,h.id,f,r));const M=new s(h,g);return M.varying=r,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Vn("Error adding font to region")}}))).catch((A=>{throw A instanceof Vn?(jn.setLatestToast("Failed to load font.",qn.Error),A):A instanceof Xn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:o}),a.updateStorage(A,{text:o})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new p(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const r=new l(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,s,r,o,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=H(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return r(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(d.values()).every((A=>A)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(A.data.maxLength-B.length).toString()}})();if(Q.error)return void o(Q.error);if(o(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let qn;var $n;($n=qn||(qn={})).Error="Error",$n.Warning="Warning",$n.Info="Info";class _n extends De{constructor(A){super(),Zn(this,"update",void 0),Zn(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ai{constructor(A,t,e,n,i,a,s,r,o,c,g,B=!1){Zn(this,"reloadedState",void 0),Zn(this,"transaction",void 0),Zn(this,"updateTransaction",void 0),Zn(this,"confirmedDesign",void 0),Zn(this,"editedSteps",void 0),Zn(this,"informationResults",void 0),Zn(this,"layouts",void 0),Zn(this,"mandatorySteps",void 0),Zn(this,"pendingUpdates",void 0),Zn(this,"selectionCost",void 0),Zn(this,"workflow",void 0),Zn(this,"stepSpecificServices",void 0),Zn(this,"previewService",void 0),Zn(this,"profanityFilter",void 0),Zn(this,"pollers",void 0),Zn(this,"commandContext",void 0),Zn(this,"stepElements",void 0),Zn(this,"stepInitialised",void 0),Zn(this,"stepMetadata",void 0),Zn(this,"stepSelections",void 0),Zn(this,"storage",void 0),Zn(this,"confirmCallbacks",void 0),Zn(this,"editedCallbacks",void 0),Zn(this,"elementsCallbacks",void 0),Zn(this,"informationResultCallbacks",void 0),Zn(this,"initCallbacks",void 0),Zn(this,"makingAdjustmentsCallback",void 0),Zn(this,"mandatoryCallbacks",void 0),Zn(this,"metadataCallbacks",void 0),Zn(this,"selectionCallbacks",void 0),Zn(this,"stepSpecificStorageCallbacks",void 0),Zn(this,"storageCallbacks",void 0),Zn(this,"currentVariationRecordCallbacks",void 0),Zn(this,"variationRecordCallbacks",void 0),Zn(this,"allScenes",void 0),Zn(this,"product",void 0),Zn(this,"invalidModelVariants",void 0),Zn(this,"currentAdjustingStepId",void 0),Zn(this,"renderableContextService",void 0),Zn(this,"workflowStatePromiseQueue",new ue(1)),Zn(this,"variationRecords",[]),Zn(this,"currentVariationRecord",void 0),Zn(this,"initializationPromise",void 0),Zn(this,"initialized",!1),Zn(this,"readOnly",!1),Zn(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=s,this.previewService=o,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=c,this.currentVariationRecord=null,this.initializationPromise=this.initializeDefaultWorkflowState(A,a),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((A=>{throw console.error(A),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>this.updateStateWithServer()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await Dn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=mn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.previewService?.executeModelAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>{A.recordNumber=t+1})),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),this.onVariationRecordsChange()}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}getWorkflowSelections(){const A={};return this.workflow.steps.forEach((t=>{const e=this.stepSelections[t.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(A[t.stepName]={selections:e.selectedVariants})})),A}markStepsAsInitialised(A){const t={...this.stepInitialised};A.forEach((A=>{t[A]=!0})),this.stepInitialised=t,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(A){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==A))}markUpdatePending(){const A=y();return this.pendingUpdates=[...this.pendingUpdates,A],A}setEditedStatus(A,t){this.editedSteps={...this.editedSteps,[A]:t},this.onEditedChange()}setInformationResults(A){this.informationResults=[...A],this.onInformationResultChange()}setCurrentAdjustingStepId(A){this.currentAdjustingStepId=A,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(A,t){this.mandatorySteps[A]!==t&&(this.mandatorySteps={...this.mandatorySteps,[A]:t},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}async updateStorage(A,t){const e={...this.storage,[A]:{...this.storage[A],...t}};if(!zA(e,this.storage)){this.storage=e;const t=new dA(this.constructSerializableWorkflow());this.commandContext.apply(t,!0),this.onStepSpecificStorageChange(A),this.onStorageChange()}}constructSerializableWorkflow(){const A=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const e={stepName:t.stepName};e.storage=this.storage[t.stepName],e.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((A=>({id:A.id,priceModifier:A.priceModifier}))),A.push(e)}))})),{steps:A}}updateStateWithServer(){if(this.readOnly)return;const A=this.serialize();this.workflowStatePromiseQueue.enqueue(new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new at("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(pn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"!==t.type||pn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===u.SilentIllustration){return{step:A,results:await new xn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new xn(A,t,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},i=A.filter((A=>!this.stepInitialised[A.stepName])),a={stepElements:{},commands:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const r=await Promise.all(s);for(const A of r)a.stepElements[A.step.stepName]=A.results.map((A=>A.regionElement)),a.commands=[...a.commands,...A.results.map((A=>A.command))];return a}getStepStorage(A){return this.storage[A]}getMetadata(A){return this.stepMetadata[A]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(A,t){return t.find((t=>t.stepName===A))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((A=>A.layoutState.elements.forEach((A=>{this.getCommandDispatcher()(new o(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{pn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,s=mn(a,i),r=mn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{pn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new o(A.id))),new dA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=mn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Rn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new Yn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Hn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(Gn.init(e,this,this.reloadedState));break;case u.Material:A.push(bn.init(e,this,this.reloadedState));break;case u.Model:A.push(Jn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Oe(e.data.module)},A.push(kn.init(e,this,this.reloadedState));break;case u.Picture:A.push(On.init(e,this,this.reloadedState));break;case u.Question:A.push(Ln.init(e,this,this.reloadedState));break;case u.Shape:A.push(zn.init(e,this,this.reloadedState));break;case u.Text:A.push(Wn.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new l(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)}))}traversableScenes(){return fn(this.allScenes,this.stepSelections)}}function ti(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class ei{constructor(A,t){ti(this,"manager",void 0),ti(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ei.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ei.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Ft.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}ti(ei,"updateState",new Map);const ii=YA`
|
|
192
|
+
`,hn=A=>{const t=[];for(const e of A.steps)switch(e.type){case u.DigitalContent:e.data.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Frame:const A=e.data;A.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),A.varyUpload&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Upload});break;case u.Illustration:const n=e.data;n.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),n.varyColors&&n.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Colors});break;case u.Material:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Model:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Picture:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Question:e.data.varySelections&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selections});break;case u.Shape:e.data.varySelection&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection});break;case u.Text:const i=e.data;i.varyText&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Text}),i.varySelection&&e.optionId&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Selection}),i.varyColor&&i.colourPickerEnabled&&t.push({stepName:e.stepName,stepType:e.type,aspectType:D.Color})}return t},In=[u.SilentIllustration,u.ProductOverlay],Dn=async(A,t)=>{const e=[];A.introduction&&e.push({name:"Introduction",title:A.name,renderableSteps:[{type:u.Introduction,stepName:"Introduction",stepTitle:A.name,helpText:A.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of A.steps){if(t.bulkScene){let A=!1;switch(n.type){case u.DigitalContent:n.data.varyUpload&&(A=!0);break;case u.Frame:{const t=n.data;!t.varyUpload||!t.varySelection&&n.optionId||(A=!0)}break;case u.Illustration:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColors&&t.colourPickerEnabled||(A=!0)}break;case u.Material:n.data.varySelection&&(A=!0);break;case u.Model:n.data.varySelection&&(A=!0);break;case u.Picture:n.data.varySelection&&(A=!0);break;case u.Question:n.data.varySelections&&(A=!0);break;case u.Shape:n.data.varySelection&&(A=!0);break;case u.Text:{const t=n.data;!t.varySelection&&n.optionId&&1!==(await Ft.getOption(It,n.optionId)).data.variants.length||!t.varyColor&&t.colourPickerEnabled&&t.colourOptionId||!t.varyText||(A=!0)}}if(A)continue}const i=un(n.stepName,A.stepGroups);if(i){const A=e.find((A=>A.name===i.name));A?In.includes(n.type)?A.silentSteps.push(n):A.renderableSteps.push(n):e.push({name:i.name,title:i.name,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}else e.push({name:n.stepName,title:n.stepTitle,renderableSteps:In.includes(n.type)?[]:[n],silentSteps:In.includes(n.type)?[n]:[]})}return t.bulkScene&&e.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:u.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:hn(A)},conditions:[]}],silentSteps:[]}),t.finishScene&&e.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:u.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:A.finalizeStepConfig?A.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:A.finalizeStepConfig?A.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},un=(A,t)=>t.find((t=>t.stepNames.includes(A))),pn=(A,t)=>(A.conditions||[]).every((A=>{const e=t[A.targetStepName];if(e&&e.selectedVariants){const t=e.selectedVariants;return A.requiredVariantSelections.some((A=>void 0!==t.find((t=>t.id===A))))}return!1})),mn=(A,t)=>A.map((A=>((A,t)=>{const e={name:A.name,title:A.title,renderableSteps:A.renderableSteps.filter((A=>pn(A,t))),silentSteps:A.silentSteps.filter((A=>pn(A,t)))};return 0===e.silentSteps.length&&0===e.renderableSteps.length?null:e})(A,t))).filter((A=>null!==A)),fn=async(A,t)=>{const e=mn(A,t),n=[];for(const A of e)for(const t of A.renderableSteps)if(t.type===u.Model||t.type===u.Material||t.type===u.Picture||t.type===u.Shape){const A=(t.option?t.option:t.optionId?await Ft.getOption(It,t.optionId):void 0)?.data.variants.length;A&&A>1&&n.push(t.stepName)}else n.push(t.stepName);const i=e.filter((A=>A.renderableSteps.filter((A=>n.includes(A.stepName))).length>0));for(const A of i)A.renderableSteps=A.renderableSteps.filter((A=>n.includes(A.stepName)));return i};function Mn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}function Fn(A,t,e,n){const i=e.width*A.zoom,a=e.height*A.zoom;if(n){const n=A,i=Math.max(t.width/e.width,t.height/e.height);n.zoom=Math.max(i,A.zoom);const a=e.width*n.zoom,s=e.height*n.zoom;return n.x=yn(A.x,t.width-a,0),n.y=yn(A.y,t.height-s,0),n}const s=A;return s.x=yn(s.x,-i,t.width),s.y=yn(s.y,-a,t.height),s}function yn(A,t,e){return Math.min(Math.max(A,t),e)}class Yn{constructor(A){Mn(this,"offsets",void 0),Mn(this,"forceImageCover",void 0),Mn(this,"targetElements",void 0),Mn(this,"imageData",void 0),Mn(this,"frameData",void 0),Mn(this,"_debouncedUpdateFrameOffsets",void 0),Mn(this,"minZoomScale",.03),Mn(this,"maxZoomScale",20),Mn(this,"onFrameDataChangeListeners",void 0),Mn(this,"onZoomChangeListeners",void 0),Mn(this,"workflowManager",void 0),Mn(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=WA(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=A}connectWorkflowManager(A,t){t&&A.addStepSpecificStorageCallback((async A=>{if(A){const t=A;if(t.currentFrameSource){const A=await S(t.currentFrameSource);zA(A,this.frameData)||(this.frameData=A,this.onFrameDataChangeListeners.forEach((A=>A(this.frameData))),this.frameData&&this.imageData&&(this.offsets=AA(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=A,this.stepName=t}setTargetElements(A){this.targetElements=A}getFrameData(){return this.frameData}async setFrameData(A){const t=F.get(A);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(A){this.offsets=A}setZoom(A,t,e,n){if(this.imageData&&this.offsets&&this.frameData){const i=(t-this.offsets.x)/this.offsets.zoom,a=(e-this.offsets.y)/this.offsets.zoom,s={x:t-i*A,y:e-a*A,zoom:this.imageData.width*A/this.imageData.width};this.updateOffsets(Fn(s,this.frameData,this.imageData,this.forceImageCover),n),this.onZoomChangeListeners.forEach((t=>t(A)))}}setPatternData(A){(A&&this.frameData||A&&this.frameData&&!this.imageData)&&(this.offsets=AA(A,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,A,this.frameData,this.targetElements),this.updateOffsets(Fn(this.offsets,this.frameData,A,this.forceImageCover))),this.imageData=A,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(A,t){const e=this.imageData;e&&this.frameData&&(this.offsets&&A.x===this.offsets.x&&A.y===this.offsets.y&&A.zoom===this.offsets.zoom?t&&t():(this.offsets=Fn(A,this.frameData,e,this.forceImageCover),this._debouncedUpdateFrameOffsets(A,e,this.frameData,this.targetElements,t)))}onFrameDataChanged(A){A(this.frameData),this.onFrameDataChangeListeners.push(A)}onZoom(A){this.onZoomChangeListeners.push(A)}updateFrameOffsets(A,t,e,n,i){if(!e)throw new at("Frame data not set. This is a bug");if(!this.workflowManager)throw new at("No workflow manager set, cannot update offsets.");const a=this.workflowManager.getCommandDispatcher();n.forEach((e=>{a(new tA(e,t,A))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:A}),i&&i()}recalculateZoomLimits(A,t){const e=Math.max(t.width/A.width,t.height/A.height);this.forceImageCover?(this.minZoomScale=e,this.maxZoomScale=2.5*e):(this.minZoomScale=e/10,this.maxZoomScale=2.5*e)}}function Nn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class xn{constructor(A,t,e){Nn(this,"configuration",void 0),Nn(this,"layouts",void 0),Nn(this,"product",void 0),Nn(this,"processRegion",(async A=>{const t=this.layouts.find((t=>t.panelId===A.panelId));if(!t)throw new At(A);let e="";if(this.configuration.type===u.ProductOverlay){let A="";if(this.product?.overlayImageUrl&&(A=this.product.overlayImageUrl),e=A,!A)throw new nt(this.configuration,"Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if(n===d.Image){const e=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:this.product?.overlayImageUrl,i={stepName:this.configuration.stepName,id:y(),src:e,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,rotation:A.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:i.id,region:A},command:new s(i,t)}}{const i=this.configuration.type===u.SilentIllustration?this.configuration.data.assetKey:e,a=async()=>new Promise((A=>{fetch(i).then((t=>{A(t.text())})).catch((A=>console.error(A)))})),r=await N(await a()),o={stepName:this.configuration.stepName,id:y(),cachedObjectURL:await EA(r.svg),src:i,svg:r.svg,colors:r.colors,type:n,y:A.top,x:A.left,width:A.width,height:A.height,layer:A.layer,layerIndex:A.layerIndex,rotation:A.rotation,immutable:A.immutable,productOverlay:this.configuration.type===u.ProductOverlay||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:o.id,region:A},command:new s(o,t)}}})),this.configuration=A,this.layouts=t,this.product=e||void 0}async trigger(){if(!this.configuration.data.regions)throw new nt(this.configuration,"Missing regions.");if(this.configuration.type===u.SilentIllustration){const A=this.configuration.data.regions.map(this.processRegion);return Promise.all(A)}return this.configuration.type===u.ProductOverlay?Promise.all(this.configuration.data.regions.map((A=>{if(!this.layouts.find((t=>A.panelId===t.panelId)))throw new At(A);return this.processRegion(A)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const A=this.configuration.type===u.ProductOverlay&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return A?.startsWith("data:image/png")||A?.endsWith(".jpeg")||A?.endsWith(".jpg")||A?.endsWith(".png")?d.Image:(A?.endsWith(".svg")||A?.startsWith("image/svg+xml"),d.Illustration)}}const vn=async A=>{const t=`${Et.getServicesApiUrl()}/shortener`;try{const e=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:A}),headers:{"Content-Type":"application/json"}});return(await e.json()).shortUrl}catch(A){throw console.error(A),new ot("Failed to shorten URL, see console.")}};function Sn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Pn{async poll(){try{if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId))}catch(A){}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(A,t,e,n=3e3,i=10){Sn(this,"pollingId",void 0),Sn(this,"attempts",void 0),Sn(this,"interval",void 0),Sn(this,"maxAttempts",void 0),Sn(this,"predicate",void 0),Sn(this,"onSuccess",void 0),Sn(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=e,this.predicate=A,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=i,this.poll()}}const Rn=new class{async init(A,t,e){return e&&await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{const e=n?.storage?.videoShortUrl,i=n?.storage?.videoUrl;t.updateStorage(A.stepName,{videoShortUrl:e,videoUrl:i})}))}async regenerateQRCode(A,t,e,n,i,a,s,r,c){if(t||""===e||""!==n)c(!1);else{const t=async()=>{const A=(await i.getServer().execute("getAssetByKeyV2_private",{assetKey:e.replace(/\//g,"_")})).body,t=A.links.find((A=>"mpeg4"===A.rel));return{asset:A,link:t}},g=await new Promise(((A,e)=>{new Pn((async()=>!!(await t()).link),(async()=>{const e=await t();if(!e.link||!e.link.href)throw new et(e.asset.data);A(e.link)}),(()=>{e("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));A.forEach((A=>r(new o(A.id))));const B="http"===a.data.baseUrl.slice(0,4)?"":"https://",w=new URL(B+a.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([g]))),w.pathname=w.pathname+("/"===w.pathname.slice(-1)?"":"/");const l=w.toString();if(l.length>=2e3)throw new ot("Cannot create QR code, URL too long.");const E=await vn(l);if(s(E),!a.data||!a.data.regions)throw new nt(a,"Missing regions.");const d=await this.regionElements(a),Q=await this.command(E,d,i,a.stepName);Q&&(Q.command&&i.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await i.setSelectionsAndElements(a.stepName,[],d,(async()=>{i.updateStorage(a.stepName,{videoShortUrl:E,videoUrl:n}),c(!1)}))}}async regionElements(A){return A.data.regions.map((A=>({id:y(),region:A})))}async command(A,t,e,n){const i=e.getLayouts(),a=`data:image/svg+xml;base64,${btoa(await VA(A,{type:"svg"}))}`,r=t.map((A=>{const t=A.region,e=i.find((A=>A.panelId===t?.panelId));if(!e&&t)throw new At(t);if(e&&!t)throw new Error("Region not found");if(!e||!t)throw new Error("Neither a region or layout found!");return new s({stepRegion:t,stepName:n,id:A.id,src:a,type:d.Image,y:t.top,x:t.left,width:t.width,height:t.height,rotation:0},e)}));return{command:new l(r),followup:async()=>{}}}};function Un(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Hn=new class{constructor(){Un(this,"frameSourceSvg",(async(A,t)=>{if(!A)return QA(t.data.regions[0]);if(!A.assetKey)throw new tt(A);const e=await ft.getAssetFromVariant(A),n=e.links.find((A=>"cdn"===A.rel));if(n)return nA(n.href);throw new et(e.data)}))}async init(A,t,e){if(e)return await this.reload(A,t,e),null;if(t.setMandatoryFulfilled(A.stepName,!1),t.markStepsAsInitialised([A.stepName]),A.optionId){const e=await Ft.getOption(t.getServer(),A.optionId);if(e&&e.data.variants.length>0){const n=Ft.getDefaultVariant(e.data);if(n)return this.selectVariantCommand(A,n,[],t,void 0,A.data.placeholderImageKey)}return null}return this.selectVariantCommand(A,void 0,[],t,void 0,A.data.placeholderImageKey)}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion}))),a=(await Ft.getOption(t.getServer(),A.optionId))?.data;if(!a||0===a.variants.length){const e=QA(A.data.regions[0]);t.updateStorage(A.stepName,{currentFrameSource:e})}if(n){const e=async()=>{const e=n.storage?.framePatternSrc,i=n.storage?.frameOffsets;if(t.updateMetadata(A.stepName,{frameOffsets:i,framePatternSrc:e}),e){const n=t.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(e,n),t.updateMetadata(A.stepName,{image:e}),t.updateStorage(A.stepName,{framePatternSrc:e})}if(i?.zoom){const e=t.getStepSpecificServices(A.stepName)?.frameService;e.updateOffsets(i)}t.setMandatoryFulfilled(A.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const s=n.selectedVariants[0].id;if(a&&s){const n=a.variants.find((A=>A.id===s));n&&await t.setSelectionsAndElements(A.stepName,[n],i,(async()=>{const i=await this.frameSourceSvg(n,A);t.updateStorage(A.stepName,{currentFrameSource:i}),await e()}))}}else await t.setSelectionsAndElements(A.stepName,[],i,e)}}selectImage(A,t,e){e.setEditedStatus(A.stepName,!0);if(t.links.find((A=>"cdn"===A.rel)).href.endsWith("pdf")){const n=e.getServer();e.addPoller(new Pn((async()=>{const A=(await n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((A=>"svg"===A.rel));if(!A)return!1;return 200===(await fetch(A.href)).status}),(()=>{n.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const n=t.body;this.loadPatternFromAsset(n,A,e)}))}),(()=>{throw new ot("Failed to resolve transcoded PDF")})))}else this.loadPatternFromAsset(t,A,e)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}getCreateElementCommand(A,t,e,n){return new s({id:A,type:d.Frame,x:t.left,y:t.top,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,scaleX:t.width/n.frameData.width,scaleY:t.height/n.frameData.height,path:n.frameData.path,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},e)}async loadPatternFromString(A,t){if(A.endsWith("svg")){const e=await CA(A),n=e.width,i=e.height,a={src:A,width:n,height:i,aspect:n/i};G.set(A,a),t.setPatternData(a)}else{const e=await fetch(A),n=await e.arrayBuffer(),i=await x(n),a={src:A,width:i.width,height:i.height,aspect:i.width/i.height};G.set(A,a),t.setPatternData(a)}}async selectVariantCommand(A,t,e,n,i,a){const s=n.getStepSpecificServices(A.stepName)?.frameService,r=await this.frameSourceSvg(t,A),c=await S(r),g=s.getImageData(),B=e.map((A=>new o(A.id))),w=g?AA(g,c):void 0,E=g?{id:y(),src:g.src,x:w?.x||0,y:w?.y||0,width:g.width,height:g.height,scaleX:w?.zoom||1,scaleY:w?.zoom||1,rotation:0}:void 0;i&&i(!0);const d=A.data.regions.map((t=>{const e=y(),i=n.getLayouts().find((A=>A.panelId===t.panelId));if(!i)throw new At(t);return{command:this.getCreateElementCommand(e,t,i,{frameData:c,pattern:E,disablePlaceholder:A.data.disablePlaceholder,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,stepName:A.stepName}),regionEl:{id:e,region:t}}})),Q=d.map((A=>A.command));return{command:new l([...Q,...B]),followup:async()=>{i&&i(!1),await n.setSelectionsAndElements(A.stepName,t?[t]:[],[...d.map((A=>A.regionEl))],(async()=>{if(n.updateStorage(A.stepName,{currentFrameSource:r}),a){const t=n.getStepSpecificServices(A.stepName)?.frameService;await this.loadPatternFromString(a,t)}}))}}}patternSource(A){const t=A.links.find((A=>"svg"===A.rel));if(t)return t.href;const e=A.links.find((A=>"cdn"===A.rel));if(e)return e.href;throw new et(A.data)}async loadPatternFromAsset(A,t,e){const n=this.patternSource(A),i=e.markUpdatePending(),a=e.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(n,a),e.updateMetadata(t.stepName,{image:n}),e.updateStorage(t.stepName,{framePatternSrc:n}),e.markUpdateCompleted(i)}};const Gn=new class{async getIllustrationBody(A){return new Promise((t=>{fetch(A).then((A=>{t(A.text())})).catch((A=>console.error(A)))}))}getCreateElementCommand(A,t,e,n){return new s({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:A,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:d.Illustration,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable},e)}getColors(A,t){const e=t.getRegionElements(A.stepName)||[];if(0===e.length)return[];try{return M(e[0].id,t.getAllLayoutData()).colors}catch(A){return[]}}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)return this.reload(A,t,e);{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantCommand(A,e,[],(()=>{}),t)}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(!a||!e)throw new Error("Required illustration variant no longer available");{const s=a.variants.find((A=>A.id===e));if(s){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[s],e,(async()=>{t.updateMetadata(A.stepName,{colors:n.storage?.colors}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}return null}async availableColors(A,t){if(A.data.colourOptionId){const e=await Ft.getOption(t.getServer(),A.data.colourOptionId);return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}return[]}async changeColorsCommand(A,t,e,n,i){const a={};for(const[A,t]of i.entries())a[A]={browserValue:t,spotColor:a[A]?.spotColor};const s=hA(A,t,e,a),r=await EA(s),o=[];for(const A of n){for(const[t,e]of i.entries())o.push(new IA(A,t,e));o.push(new DA(A,s,r))}return new l(o)}async changeColors(A,t,e,n,i){if(0===t.length)return;const a=M(t[0].id,n().map((A=>A.layoutState))),s={...a.colors},r={};Object.entries(s).forEach((([A,t])=>{const e={browserValue:t.browserValue},n=t.spotColor;n&&(e.spotColor={profileName:n.profileName,namedColor:n.namedColor}),r[A]=e}));for(const[A,t]of i.entries())s[A]={browserValue:t,spotColor:s[A]?.spotColor},r[A]={browserValue:t};let o=Array.from(Object.values(s)).map((A=>A.browserValue));const c=A.data.colourOptionId?await Ft.getOption(e.getServer(),A.data.colourOptionId):void 0;c&&c.data.variants.forEach((A=>{o=o.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),e.updateMetadata(A.stepName,{colors:o});const g=new Map;if(Object.entries(s).forEach((([A,t])=>{g.set(A,t.browserValue)})),!a.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(a.svg,a.width,a.height,t.map((A=>A.id)),g);e.updateStorage(A.stepName,{colors:r}),e.getCommandDispatcher()(B)}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e,n,i);a&&(a.command&&i.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(A,t,e,n,i){if(!A.data||!A.data.regions)throw new nt(A,"Missing regions.");n(!0);const a=e.map((A=>new o(A.id)));if(i.setMandatoryFulfilled(A.stepName,!1),!t.assetKey)throw new tt(t);const s=await ft.getAssetFromVariant(t),r=s.links.find((A=>"cdn"===A.rel));if(!r)throw new et(s.data);const c=await N(await this.getIllustrationBody(r.href)),g=await EA(c.svg),B=A.data.regions.map((t=>{const e=i.getLayouts().find((A=>A.panelId===t.panelId));if(!e)throw new At(t);const n=y();return{regionElement:{id:n,region:t},command:this.getCreateElementCommand(n,t,e,{stepName:A.stepName,src:r.href,objectURL:g,svg:c})}})),w=[...B.map((A=>A.command)),...a];let E=Array.from(Object.values(c.colors)).map((A=>A.browserValue));const d=A.data.colourOptionId?await Ft.getOption(i.getServer(),A.data.colourOptionId):void 0;return d&&d.data.variants.forEach((A=>{E=E.map((t=>t.toLowerCase()===A.color?.toLowerCase()?A.name:t))})),i.updateMetadata(A.stepName,{colors:E}),{command:new l(w),followup:async()=>{await i.setSelectionsAndElements(A.stepName,[t],B.map((A=>A.regionElement)),(async()=>{i.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const bn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(!a)throw new _A(A);if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(e){const n=a.variants.find((A=>A.id===e));if(n){const e=await ft.getMaterialFromVariant(n),a=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],a,(async()=>{const n=t.getPreviewService();if(n){const i=A.data.targetMaterials.map((t=>n.applyMaterialVariant(t,A.optionId,e.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(A.stepName,!0)))}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){const i=e.getPreviewService();n(!0);const a=await ft.getMaterialFromVariant(t);if(!a)throw n(!1),new tt(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{i&&A.data.targetMaterials.forEach((t=>{i.applyMaterialVariant(t,A.optionId,a.data)})),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const Jn=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(e)await this.reload(A,t,e);else{const e=Ft.getDefaultVariant(n.data);if(e)return await this.selectVariantLambda(A,e,t,(()=>{}))}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{const e=t.getPreviewService();if(e){const i=(await ft.getAssetFromVariant(n)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(n);await e.applyModelVariant(A.optionId,{model:i.href,contextService:t.getLayoutPreviewService()},A.data.replaceProductModel||!1),t.setMandatoryFulfilled(A.stepName,!0)}}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantLambda(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantLambda(A,t,e,n){n(!0);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)throw new tt(t);return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],[],(async()=>{try{const t=e.getPreviewService();t&&t.applyModelVariant(A.optionId,{model:i.href,contextService:e.getLayoutPreviewService()},A.data.replaceProductModel||!1),e.setMandatoryFulfilled(A.stepName,!0)}finally{n(!1)}}))}}}};const kn=new class{async init(A,t,e){return e?(await this.reload(A,t,e),null):(t.updateMetadata(A.stepName,{text:""}),this.changeTextCommand(A,"",t,"",(()=>{})))}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)).map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[],i,(async()=>{t.updateStorage(A.stepName,{text:n?.storage?.text}),t.setMandatoryFulfilled(A.stepName,""!==n?.storage?.text)}))}async changeText(A,t,e,n,i){const a=await this.changeTextCommand(A,t,e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async changeTextCommand(A,t,e,n,i){const a=e.getRegionElements(A.stepName),r=e.getStepSpecificServices(A.stepName)?.module;if(!r)return console.error("Missing module."),null;const c=e.getProfanities();if(!this.validateInput(A,t,c,i))return e.setMandatoryFulfilled(A.stepName,!1),console.error(n),null;if(e.setMandatoryFulfilled(A.stepName,""!==t),!A.data||!A.data.regions||A.data.regions.length<=0)return console.error("Missing configuration."),null;e.updateStorage(A.stepName,{text:t});const g=(t,n,i)=>{const a=i||y(),r=e.getLayouts().find((A=>A.panelId===n.panelId));if(!r)return console.error(`Can not find layout for region: ${n.panelId}`),null;const c=[];return i&&c.push(new o(a)),c.push(new s({stepRegion:n,stepName:A.stepName,colors:{},id:a,svg:t,type:d.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable},r)),{id:a,region:n,command:new l(c)}};if(a.length>0){const A=a.map((A=>{if(!A.region)return null;const e=r.svgPrint(t,A.region);return g(e,A.region,A.id)})).filter((A=>!!A)).filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(A),followup:async()=>{}}}{const n=A.data.regions.map((A=>g(r.svgPrint(t,A),A))),i=n.filter((A=>!!A)).map((A=>A&&A.command));return{command:new l(i),followup:async()=>{const t=n.filter((A=>A)).map((A=>A&&{id:A.id,region:A.region}));await e.setSelectionsAndElements(A.stepName,[],t)}}}}validateInput(A,t,e,n){if(A.data&&A.data.maxLength){const e=A.data.maxLength;if(t.length>e)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const i=t.toLowerCase();for(const A in e)if(i===e[A].toLowerCase().trim()&&""!==i)return n("Blocked profanity."),!1;return n(""),!0}};const On=new class{async init(A,t,e){const n=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(!n)return null;if(e)await this.reload(A,t,e);else if(n.defaultVariant){const e=n.defaultVariant,i=n.variants.find((A=>!!A.assetKey&&A.id===e));if(i)return t.markStepsAsInitialised([A.stepName]),this.selectVariantCommand(A,i,t,(()=>{}))}return t.markStepsAsInitialised([A.stepName]),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&e.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){if(!t.assetKey)throw new tt(t);const i=(await ft.getAssetFromVariant(t)).links.find((A=>"cdn"===A.rel));if(!i)return console.error("No URL for picture!"),null;const a=i.href;n(!0),e.setMandatoryFulfilled(A.stepName,!1);const r=e.getRegionElements(A.stepName).map((A=>new o(A.id))),c=A.data.regions.map((t=>{const n=e.getLayouts().find((A=>A.panelId===t.panelId));if(!n)throw new At(t);const i=y();return{regionElement:{id:i,region:t},command:new s({stepName:A.stepName,stepRegion:t,id:i,src:a,type:d.Image,y:t.top,x:t.left,rotation:t.rotation,width:t.width,height:t.height,layer:t.layer,layerIndex:t.layerIndex,immutable:t.immutable,preserveAspectRatio:"none"},n)}}));return{command:new l([...r,...c.map((A=>A.command))]),followup:async()=>{await e.setSelectionsAndElements(A.stepName,[t],c.map((A=>A.regionElement)),(async()=>{e.setMandatoryFulfilled(A.stepName,!0),n(!1)}))}}}};const Ln=new class{async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=n.data.variants;if(Ft.getDefaultVariant(n.data)){const i=e.find((A=>A.id===n.data.defaultVariant));return this.selectVariantLambda(A,i?.id||"",t)}}return null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(i&&e){const n=i.variants.find((A=>A.id===e));n&&await t.setSelectionsAndElements(A.stepName,[n],[])}}}async selectVariant(A,t,e){const n=await this.selectVariantLambda(A,t,e);n&&(n.command&&e.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(A,t,e){const n=await Ft.getOptionFromStep(A,e.getServer());if(!n)return null;const i=n.data.variants,a=i.length>1?i.find((A=>A.id===t)):i[0];if(!a)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await e.setSelectionsAndElements(A.stepName,[a],[],(async()=>{e.setMandatoryFulfilled(A.stepName,!0)}))}}}};const zn=new class{async availableColours(A,t){const e=await Ft.getOptionFromStep(A,t.getServer());return e?e.data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A}))):[]}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)throw new _A(A);if(!e){const e=Ft.getDefaultVariant(n.data);if(!e)return null;const i={fill:e.color,stroke:e.color,variant:e};return this.selectVariantCommand(A,i,[],t)}return await this.reload(A,t,e),null}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const n=a.variants.find((A=>A.id===e));if(n){const e=i.map((A=>({id:A.id,region:A.stepRegion})));await t.setSelectionsAndElements(A.stepName,[n],e,(async()=>{t.updateStorage(A.stepName,{colour:n.color||""}),t.setMandatoryFulfilled(A.stepName,!0)}))}}}}async selectVariant(A,t,e,n){const i=await this.selectVariantCommand(A,t,e,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(A,t,e,n){const i=n.getLayouts();if(e.length>0){const a=A=>{const e=A.region;if(!i.find((A=>A.panelId===e?.panelId)))throw new At(e);const n=t.variant?.color;return n?new IA(A.id,"spiff-fill-shape",n):(console.error("Failed to change color."),null)},s=e.map(a).filter((A=>!!A));return{command:new l(s),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],e),n.updateStorage(A.stepName,{colour:t.fill||""})}}}{const e=e=>{const n=i.find((A=>A.panelId===e.panelId));if(!n)throw new At(e);const a=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${t.variant?.color}"\n />\n </svg>\n `,r={};r["spiff-fill-shape"]={browserValue:t.variant.color};const o=y();return{id:o,region:e,command:new s({stepRegion:e,stepName:A.stepName,colors:r,id:o,svg:a,type:d.Illustration,y:e.top,x:e.left,rotation:e.rotation,width:e.width,height:e.height,layer:e.layer,layerIndex:e.layerIndex,immutable:e.immutable,excludeFromExport:A.data.excludeFromPrint},n)}},a=A.data.regions.map(e),r=a.filter((A=>!!A)).map((A=>A?.command)),o=a.filter((A=>!!A)).map((A=>({id:A.id,region:A.region})));return{command:new l(r),followup:async()=>{await n.setSelectionsAndElements(A.stepName,t.variant?[t.variant]:[],o,(async()=>{n.updateStorage(A.stepName,{colour:t.fill||""})}))}}}}};function Tn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const jn=new class{constructor(){Tn(this,"latestToast",void 0),Tn(this,"toastType",void 0),Tn(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(A){A({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(A)}setLatestToast(A,t){this.latestToast=A,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((A=>A({toastMessage:this.latestToast,toastType:this.toastType})))}};function Kn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Vn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Vn.name}}class Xn extends Error{constructor(A){super(A),Object.setPrototypeOf(this,new.target.prototype),this.name=Xn.name}}const Wn=new class{constructor(){Kn(this,"cachedColors",new Map),Kn(this,"filterUnsupportedCharacters",((A,t)=>{let e=A.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],i=t?uA(t):void 0;if(i){const A=e.split("").map((A=>i.getFont().charToGlyph(A)));for(let t=0;t<A.length;t++){const i=".notdef"===A[t].name;"\n"===e.charAt(t)||i&&n.push(String.fromCharCode(e.charCodeAt(t)))}}for(let A=0;A<n.length;A++)e=e.replaceAll(n[A],"");return e})),Kn(this,"textAlign",(A=>A.vertical?"center":A.textAlign||"center")),Kn(this,"getErrorsForText",((A,t,e)=>{const n=[];t.data&&t.data.maxLength&&A.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const i=e.getProfanities(),a=A.toLowerCase();if(""!==a)for(const A in i){if(a===i[A].toLowerCase().trim()){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(A.includes("\n")||A.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}))}async init(A,t,e){const n=await Ft.getOptionFromStep(A,t.getServer());if(!n)return null;if(e)await this.reload(A,t,e);else{const e=t.getServer();t.updateStorage(A.stepName,{inputText:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.color||await this.getDefaultColor(A.data,e)}),t.updateMetadata(A.stepName,{text:A.data.defaultText||"",color:(await this.getDefaultColorVariant(A.data,e))?.name||await this.getDefaultColor(A.data,e)});const i=Ft.getDefaultVariant(n.data);if(i)return this.selectVariantCommand(A,i,{},[],t,(()=>{}),(()=>{}))}return null}findLayoutElements(A,t){return A.getRegionElements(t.stepName).map((t=>M(t.id,A.getAllLayoutData())))}async availableColors(A,t){const e=this.cachedColors.get(A.stepName);if(e)return e;if(A.data.colourOptionId){const e=(await Ft.getOption(t.getServer(),A.data.colourOptionId)).data.variants.map((A=>({fill:A.color,stroke:A.color,variant:A})));return this.cachedColors.set(A.stepName,e),e}return[]}async changeFill(A,t,e,n){if(!A.data||!A.data.regions)return;const i=n.getCommandDispatcher();t.variant?n.updateMetadata(A.stepName,{color:t.variant.name}):n.updateMetadata(A.stepName,{color:t.fill});const a=await this.getColorOption(A,n.getServer()),s=a?this.createTextFillSpotColor(a,t.variant):void 0;a?n.updateStorage(A.stepName,{color:t.fill,colorProfileAssetKey:a.data.colorProfileAssetKey}):n.updateStorage(A.stepName,{color:t.fill});for(const A of e){if(!t.fill)throw new Error("Fill not set on new color selection!");i(new g(A.id,t.fill,s))}}getProcessedInput(A,t,e){const n=e?A:this.injectReplaceableText(A,t);return BA(n,{vertical:t.vertical,uppercase:t.uppercase})}updateInputText(A,t,e,n){const i=n.getStepStorage(e.stepName),a=this.getProcessedInput(A,e.data,!!i.customiseAllText),s={command:void 0,helperText:"",errors:this.getErrorsForText(A,e,n)};if(s.errors.length>0)return s.helperText=s.errors[0].localizationKey,s;const r=(e.data.maxLength-a.length).toString();s.helperText=`${r} characters remaining`;const o=n.getTransaction().bulk&&e.data.varyText||!1,c=[],g=new Map,B=new Map;for(const A of t){if(!A.fontData)throw new at("Failed to resolve font data for text.");const[t,n]=H(A.fontSize,A.fontData,{left:A.x,top:A.y,width:A.width,height:A.height,rotation:A.rotation,panelId:""},[a],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});g.set(A.id,t),B.set(A.id,n);const i=e.data.curved?a:(n||[]).join("\n");c.push(this.generateTextChangeCommandsForRegion(t,e.data,A.id,i,o))}if(!e.data.curved&&t.length>0){if(!Array.from(B.values()).every((A=>A)))return s.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),s}return n.updateStorage(e.stepName,{text:A}),n.updateMetadata(e.stepName,{text:a}),i.defaultCleared&&n.setMandatoryFulfilled(e.stepName,!0),s.command=new l(c),s.command.varying=o,s}async selectVariant(A,t,e,n,i){const a=await this.selectVariantCommand(A,t,e.getStepStorage(A.stepName)||{},e.getRegionElements(A.stepName),e,n,i);a&&(a.command&&e.getCommandDispatcher()(a.command),a.followup&&await a.followup())}createTextFillSpotColor(A,t){const e=A.data.colorProfileAssetKey;if(""!==e&&void 0!==e){const A=e.replace(/\s/g,"-"),n=A.lastIndexOf("/"),i=A.slice(n+1).slice(0,-4);if(!t.namedColor)throw new Error("variant named color not set!");return{profileName:i,namedColor:t.namedColor}}}async reload(A,t,e){const n=t.getSerializedStep(A.stepName,e.serializableWorkflow.steps),i=Object.values(e.layouts).map((A=>A.elements)).flat().filter((t=>t.stepName===A.stepName)),a=(await Ft.getOptionFromStep(A,t.getServer()))?.data;if(n?.selectedVariants){const e=n.selectedVariants[0].id;if(a&&e){const s=a.variants.find((A=>A.id===e));if(s){const e=await this.fontDataFromVariant(s),a=i.map((A=>({id:A.id,region:A.stepRegion}))),r=n.storage?.color,o=n.storage?.text;await t.setSelectionsAndElements(A.stepName,[s],a,(async()=>{t.updateMetadata(A.stepName,{color:r,text:o}),t.updateStorage(A.stepName,{text:o,inputText:o});const n=i.map((A=>new w(A.id,e))),a=new l(n);t.getCommandDispatcher()(a),t.setMandatoryFulfilled(A.stepName,!0)}));const{command:c}=Wn.updateInputText(o||"",i,A,t);c&&t.getCommandDispatcher()(c)}}}}async getDefaultColorVariant(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)}}async getDefaultColor(A,t){if(A.colourOptionId){const e=await Ft.getOption(t,A.colourOptionId);if(!e)return;return Ft.getDefaultVariant(e.data)?.color}if(A.colour)return A.colour}async getColorOption(A,t){return A.data.colourOptionId?await Ft.getOption(t,A.data.colourOptionId):void 0}async fontDataFromVariant(A){if(!A.assetKey)throw new tt(A);const t=await ft.getAssetFromVariant(A),e=t.links.find((A=>"cdn"===A.rel))?.href;if(!e)throw new et(t.data);return{assetUrl:e,name:(await U(e)).names.fullName.en}}async selectVariantCommand(A,t,e,n,i,a,s){const r=i.markUpdatePending(),o=await this.fontDataFromVariant(t);if(n.length>0){const c=n.map((A=>new w(A.id,o))),g=await this.changeInputTextWithRegion(A,A.data.size||30,o,e.text||"",e,i,!!e.customiseAllText,a,s);g&&c.push(g);return{command:new l(c),followup:async()=>{i.markUpdateCompleted(r),await i.setSelectionsAndElements(A.stepName,[t],n)}}}{const n=await this.createTextboxRegions(A.stepName,t,A.data,o,e,i),c=await this.changeInputTextWithRegion(A,A.data.size||30,o,n[0]?.newElement.input||e.text||A.data.defaultText||"",e,i,!!e.customiseAllText,a,s),g=n.flatMap((A=>A.commands));c&&g.push(c);return{command:new l(g),followup:async()=>{i.markUpdateCompleted(r)}}}}injectReplaceableText(A,t){return t.replaceableText?t.replaceableText.replace("{{}}",A):A}async createTextboxRegions(A,t,e,n,i,a){if(!e||!e.regions)throw new Error("Step data not supplied");const r=a.getTransaction().bulk&&e.varyText||!1,o=r?"":i.text||e.defaultText||"",c=this.getProcessedInput(o,e,!1),g=await Promise.all(e.regions.map((async t=>{const g=a.getLayouts().find((A=>A.panelId===t.panelId)),B=y();try{if(!g)throw new Xn("Failed to find layout for region: "+t.panelId);const w=a.getServer(),l=e.colourOptionId?await Ft.getOption(w,e.colourOptionId):void 0;let E;if(l){const t=l.data.variants.find((A=>A.id===l.data.defaultVariant))||l.data.variants[0];E=this.createTextFillSpotColor(l,t),a.updateStorage(A,{colorProfileAssetKey:l.data.colorProfileAssetKey})}const Q=await this.getDefaultColor(e,w),C=Q||"#000000",h={stepRegion:t,stepName:A,align:this.textAlign(e),fill:i.color?i.color:C,fontSize:e.size||30,fontData:n,id:B,layer:t.layer,layerIndex:t.layerIndex,rotation:t.rotation,text:c,input:o,type:d.Textbox,vertical:e.vertical,x:t.left,y:t.top,height:t.height,width:t.width,immutable:t.immutable,verticalAlign:e.verticalAlign||"middle",curved:e.curved,paths:e.paths,fillSpotColorDefinition:E},I=[],D=new Map,u=new Map;if(!h.fontData)throw new at("Failed to resolve font data for text.");const[p,m]=H(h.fontSize,h.fontData,{left:h.x,top:h.y,width:h.width,height:h.height,rotation:h.rotation,panelId:""},[c],{size:e.size,minSize:e.minSize,maxSize:e.maxSize});D.set(h.id,p),u.set(h.id,m);const f=e.curved||e.vertical?c:(m||[]).join("\n");I.push(this.generateTextChangeCommandsForRegion(p,e,h.id,f,r));const M=new s(h,g);return M.varying=r,{regionElement:{id:B,region:t},commands:[M,...I],newElement:h,fontData:n}}catch(A){throw console.log(A),new Vn("Error adding font to region")}}))).catch((A=>{throw A instanceof Vn?(jn.setLatestToast("Failed to load font.",qn.Error),A):A instanceof Xn?A:new Error(A)}));return await a.setSelectionsAndElements(A,[t],g.map((A=>A.regionElement)),(async()=>{a.updateMetadata(A,{text:o}),a.updateStorage(A,{text:o})})),g}generateTextChangeCommandsForRegion(A,t,e,n,i){const a=[],s=new p(e,n);if(s.varying=i,a.push(s),!t.size){const t=new B(e,A);t.varying=i,a.push(t)}const r=new l(a);return r.varying=i,r}async changeInputTextWithRegion(A,t,e,n,i,a,s,r,o,c){const g=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),B=this.getProcessedInput(g,A.data,s),w=a.getRegionElements(A.stepName),E=new Map,d=new Map;for(const n of w)if(n.region){const[i,a]=H(t,e,n.region,[B],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});E.set(n.id,i),d.set(n.id,a)}const Q=(()=>{if(A.data&&A.data.maxLength&&B.length>A.data.maxLength)return c&&c(!0),{info:"0"};const t=B.toLowerCase(),e=a.getProfanities();for(const A in e)if(t===e[A].toLowerCase().trim()&&""!==t)return r(!0),{error:"Blocked profanity."};if(!A.data.vertical&&!A.data.allowNewlines&&(B.includes("\n")||B.includes("\r")))return r(!0),{error:"Cannot span multiple lines."};if(!A.data.curved){if(!Array.from(d.values()).every((A=>A)))return r(!0),{error:"Does not fit."}}return r(!1),{info:(A.data.maxLength-B.length).toString()}})();if(Q.error)return void o(Q.error);if(o(`${Q.info} characters remaining`||""),c)return;a.updateStorage(A.stepName,{text:g}),a.updateMetadata(A.stepName,{text:this.injectReplaceableText(g,A.data)});const C=a.getTransaction().bulk&&A.data.varyText||!1;i.defaultCleared&&a.setMandatoryFulfilled(A.stepName,!0);const h=[];for(const t of w){const e=A.data.curved?B:(d.get(t.id)||[]).join("\n");h.push(this.generateTextChangeCommandsForRegion(E.get(t.id)||1,A.data,t.id,e,C))}const I=new l(h);return I.varying=C,I}};function Zn(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let qn;var $n;($n=qn||(qn={})).Error="Error",$n.Warning="Warning",$n.Info="Info";class _n extends De{constructor(A){super(),Zn(this,"update",void 0),Zn(this,"createdAt",new Date),this.update=A}async execute(){await this.update(),await new Promise((A=>{window.setTimeout((()=>{A()}),1e3)}))}}class Ai{constructor(A,t,e,n,i,a,s,r,o,c,g,B=!1){Zn(this,"reloadedState",void 0),Zn(this,"transaction",void 0),Zn(this,"updateTransaction",void 0),Zn(this,"confirmedDesign",void 0),Zn(this,"editedSteps",void 0),Zn(this,"informationResults",void 0),Zn(this,"layouts",void 0),Zn(this,"mandatorySteps",void 0),Zn(this,"pendingUpdates",void 0),Zn(this,"selectionCost",void 0),Zn(this,"workflow",void 0),Zn(this,"stepSpecificServices",void 0),Zn(this,"previewService",void 0),Zn(this,"profanityFilter",void 0),Zn(this,"pollers",void 0),Zn(this,"commandContext",void 0),Zn(this,"stepElements",void 0),Zn(this,"stepInitialised",void 0),Zn(this,"stepMetadata",void 0),Zn(this,"stepSelections",void 0),Zn(this,"storage",void 0),Zn(this,"confirmCallbacks",void 0),Zn(this,"editedCallbacks",void 0),Zn(this,"elementsCallbacks",void 0),Zn(this,"informationResultCallbacks",void 0),Zn(this,"initCallbacks",void 0),Zn(this,"makingAdjustmentsCallback",void 0),Zn(this,"mandatoryCallbacks",void 0),Zn(this,"metadataCallbacks",void 0),Zn(this,"selectionCallbacks",void 0),Zn(this,"stepSpecificStorageCallbacks",void 0),Zn(this,"storageCallbacks",void 0),Zn(this,"currentVariationRecordCallbacks",void 0),Zn(this,"variationRecordCallbacks",void 0),Zn(this,"allScenes",void 0),Zn(this,"product",void 0),Zn(this,"invalidModelVariants",void 0),Zn(this,"currentAdjustingStepId",void 0),Zn(this,"renderableContextService",void 0),Zn(this,"workflowStatePromiseQueue",new ue(1)),Zn(this,"variationRecords",[]),Zn(this,"currentVariationRecord",void 0),Zn(this,"initializationPromise",void 0),Zn(this,"initialized",!1),Zn(this,"readOnly",!1),Zn(this,"server",void 0),this.updateTransaction=i,this.server=r,this.commandContext=n,this.reloadedState=g,this.transaction=a,this.readOnly=B,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=A,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.layouts=e,this.product=s,this.previewService=o,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=c,this.currentVariationRecord=null,this.initializationPromise=this.initializeDefaultWorkflowState(A,a),this.initializationPromise.then((()=>{this.initialized=!0})),this.initializationPromise.catch((A=>{throw console.error(A),this.initialized=!1,new Error("Workflow initialization failed due to an error. See console.")})),this.initializationPromise.finally((()=>this.getCommandContext().registerStateCallback((()=>this.updateStateWithServer()))))}async initializeDefaultWorkflowState(A,t){this.reloadedState&&this.reloadedState.serializableWorkflow.steps.forEach((A=>{this.storage[A.stepName]=A.storage||{}})),this.allScenes=await Dn(A,{bulkScene:t.bulk||!1,bulkSceneTitle:"workflow.steps.bulk.title",finishScene:!0,finishSceneTitle:"workflow.steps.finish.confirmDesign"});const e=mn(this.allScenes,this.stepSelections).map((A=>A.silentSteps)).flat(),{stepElements:n,commands:i}=await this.stepElementsForIntroducedSilentSteps(e,!!this.reloadedState);this.commandContext.apply(new l(i),!0),this.stepElements={...this.stepElements,...n},await this.ensureStepsAreLoaded(),!this.readOnly&&await this.updateStateWithServerImmediate(),this.reloadedState&&(()=>{const A=this.workflow.finalizeStepConfig;if(!A)return;const t=A.lookAtAnimation,e=A.modelAnimation;t&&this.previewService?.executeCameraAnimation(t),e&&this.previewService?.executeModelAnimation(e)})()}getProduct(){return this.product}getInitializationPromise(){return this.initializationPromise}isInitialized(){return this.initialized}addVariationRecord(A){const t={...A,recordNumber:this.variationRecords.reduce(((A,t)=>t.recordNumber>A?t.recordNumber:A),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(A){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==A)),this.variationRecords.forEach(((A,t)=>{A.recordNumber=t+1})),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===A){const A=this.currentVariationRecord.recordNumber,t=A>1?this.variationRecords[A-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(A){this.variationRecords=A,this.onVariationRecordsChange(),0===A.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(A[0])}setCurrentVariationRecord(A){if(this.currentVariationRecord=A,this.onCurrentVariationRecordChange(),A){const t=this.variationRecords.findIndex((t=>t.recordNumber===A.recordNumber));-1!==t&&this.variationRecords.splice(t,1),this.variationRecords=[...this.variationRecords,A],this.variationRecords.sort(((A,t)=>A.recordNumber-t.recordNumber)),this.onVariationRecordsChange()}}addConfirmCallback(A){A(this.confirmedDesign),this.confirmCallbacks.push(A)}addEditedCallback(A){A(this.editedSteps),this.editedCallbacks.push(A)}addElementsCallback(A){A(this.stepElements),this.elementsCallbacks.push(A)}addInformationResultCallback(A){A(this.informationResults),this.informationResultCallbacks.push(A)}addInitCallback(A){A(this.stepInitialised),this.initCallbacks.push(A)}addMandatoryCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}addMetadataCallback(A){A(this.stepMetadata),this.metadataCallbacks.push(A)}async addSelectionCallback(A){A({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:await this.traversableScenes()}),this.selectionCallbacks.push(A)}addStepSpecificStorageCallback(A,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),A(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(A)}addStorageCallback(A){A(this.storage),this.storageCallbacks.push(A)}addMakingAdjustmentsCallback(A){A(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(A)}addCurrentVariationCallback(A){A(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(A)}addVariationRecordsCallback(A){A(this.variationRecords),this.variationRecordCallbacks.push(A)}addPoller(A){this.pollers.push(A)}getLayouts(){return this.layouts}getAllLayoutData(){return this.commandContext.getAllLayouts().map((A=>A.layoutState))}getLayoutPreviewService(){return this.renderableContextService}getInformationResults(){return this.informationResults}getPreviewService(){return this.previewService}getProfanities(){return this.profanityFilter}getCommandContext(){return this.commandContext}getRegionElements(A){return this.stepElements[A]||[]}getStepSpecificServices(A){return this.stepSpecificServices[A]}getTransaction(){return this.transaction}setTransaction(A){this.transaction=A}getWorkflow(){return this.workflow}getCommandDispatcher(){return A=>this.commandContext.apply(A,!this.initialized)}getServer(){return this.server}getWorkflowSelections(){const A={};return this.workflow.steps.forEach((t=>{const e=this.stepSelections[t.stepName];e&&e.selectedVariants&&e.selectedVariants.length>0&&(A[t.stepName]={selections:e.selectedVariants})})),A}markStepsAsInitialised(A){const t={...this.stepInitialised};A.forEach((A=>{t[A]=!0})),this.stepInitialised=t,this.onInitChange()}getUpdatesPending(){return this.pendingUpdates.length>0}markUpdateCompleted(A){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==A))}markUpdatePending(){const A=y();return this.pendingUpdates=[...this.pendingUpdates,A],A}setEditedStatus(A,t){this.editedSteps={...this.editedSteps,[A]:t},this.onEditedChange()}setInformationResults(A){this.informationResults=[...A],this.onInformationResultChange()}setCurrentAdjustingStepId(A){this.currentAdjustingStepId=A,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(A,t){this.mandatorySteps[A]!==t&&(this.mandatorySteps={...this.mandatorySteps,[A]:t},this.onMandatoryChange())}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(A){A(this.mandatorySteps),this.mandatoryCallbacks.push(A)}async updateStorage(A,t){const e={...this.storage,[A]:{...this.storage[A],...t}};if(!zA(e,this.storage)){this.storage=e;const t=new dA(this.constructSerializableWorkflow());this.commandContext.apply(t,!0),this.onStepSpecificStorageChange(A),this.onStorageChange()}}constructSerializableWorkflow(){const A=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const e={stepName:t.stepName};e.storage=this.storage[t.stepName],e.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((A=>({id:A.id,priceModifier:A.priceModifier}))),A.push(e)}))})),{steps:A}}updateStateWithServer(){if(this.readOnly)return;const A=this.serialize();this.workflowStatePromiseQueue.enqueue(new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})))}async updateStateWithServerImmediate(){if(this.readOnly)return;const A=this.serialize();return new _n((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:A.transaction}})})).execute()}serialize(){const A=this.getCommandContext().getState();if(!A)throw new at("Attempted to serialize state before it was initialized.");const t=JSON.stringify(this.dehydrateState(TA(A.transaction))),e=A.variation;if(!e)return{transaction:t};const n={layouts:{},serializableWorkflow:{steps:[]},...TA(e)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(n))}}dehydrateState(A){for(const t of Object.values(A.layouts).map((A=>A.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return A}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(A,t){this.stepMetadata={...this.stepMetadata,[A]:{...this.stepMetadata[A],...t}},this.onMetadataChange()}removeElements(A){this.stepElements=((A,t)=>Object.keys(A).reduce(((e,n)=>{const i=[...A[n]||[]];return t.forEach((A=>{const t=i.findIndex((t=>t.id===A.id));t>-1&&i.splice(t,1)})),e[n]=i,e}),{}))(this.stepElements,A)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((A,t)=>(pn(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>A.push(t))),A)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((A,t)=>("Model"!==t.type||pn(t,this.stepSelections)||t.optionId&&A.push(t.optionId),A)),[])}async stepElementsForIntroducedSilentSteps(A,t){const e=this.product;if(!e)return Promise.resolve({stepElements:{},commands:[]});const n=async(A,t,e)=>{if(A.type===u.SilentIllustration){return{step:A,results:await new xn(A,t).trigger()}}if(A.type===u.ProductOverlay){return{step:A,results:await new xn(A,t,e).trigger()}}return Promise.reject("Unknown silent step. This is a bug")},i=A.filter((A=>!this.stepInitialised[A.stepName])),a={stepElements:{},commands:[]},s=[];for(const A of i)this.markStepsAsInitialised([A.stepName]),t||s.push(n(A,this.layouts,e));const r=await Promise.all(s);for(const A of r)a.stepElements[A.step.stepName]=A.results.map((A=>A.regionElement)),a.commands=[...a.commands,...A.results.map((A=>A.command))];return a}getStepStorage(A){return this.storage[A]}getMetadata(A){return this.stepMetadata[A]}getWorkflowMetadata(){return this.stepMetadata}getSerializedStep(A,t){return t.find((t=>t.stepName===A))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}async reset(){this.commandContext.getAllLayouts().forEach((A=>A.layoutState.elements.forEach((A=>{this.getCommandDispatcher()(new o(A.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async setSelectionsAndElements(A,t,e,n){const i=this.stepSelections;this.stepSelections={...this.stepSelections,[A]:{selectedVariants:t}},this.selectionCost=Object.values(this.stepSelections).reduce(((A,t)=>A+t.selectedVariants.map((A=>A.priceModifier)).reduce(((A,t)=>A+t),0)),0),this.workflow.steps.forEach((A=>{pn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1,delete this.stepMetadata[A.stepName],delete this.stepSelections[A.stepName],delete this.storage[A.stepName])}));const a=this.allScenes,s=mn(a,i),r=mn(a,this.stepSelections),c=s.map((A=>A.silentSteps)).flat(),g=r.map((A=>A.silentSteps)).flat().filter((A=>!c.some((t=>t.stepName===A.stepName))));c.forEach((A=>{pn(A,this.stepSelections)||(this.stepInitialised[A.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const B=this.getInvalidCanvasRegions(),{stepElements:w,commands:E}=await this.stepElementsForIntroducedSilentSteps(g,!1);this.stepElements={...this.stepElements,...w,[A]:e},this.removeElements(B);if(this.workflow.steps.find((t=>t.stepName===A))?.type===u.Frame){this.getStepSpecificServices(A)?.frameService?.setTargetElements(e.map((A=>A.id)))}const d=[...E,...B.map((A=>new o(A.id))),new dA(this.constructSerializableWorkflow())];d.length>0&&this.commandContext.apply(new l(d),!0),await this.ensureStepsAreLoaded(),this.onElementsChange(),await this.onSelectionChange(),n&&await n()}async ensureStepsAreLoaded(){const A=[],t=mn(this.allScenes,this.stepSelections).map((A=>A.renderableSteps)).flat();for(const e of t)if(!this.stepInitialised[e.stepName])switch(this.stepInitialised[e.stepName]=!0,e.type){case u.Bulk:this.updateStorage("Bulk",this.reloadedState?.serializableWorkflow.steps.find((A=>"Bulk"===A.stepName))?.storage||{});break;case u.DigitalContent:A.push(Rn.init(e,this,this.reloadedState));break;case u.Frame:case u.Photo:{const t=new Yn(e.data.forceImageCover);t.connectWorkflowManager(this,e.stepName),this.stepSpecificServices[e.stepName]={frameService:t},A.push(Hn.init(e,this,this.reloadedState))}break;case u.Illustration:A.push(Gn.init(e,this,this.reloadedState));break;case u.Material:A.push(bn.init(e,this,this.reloadedState));break;case u.Model:A.push(Jn.init(e,this,this.reloadedState));break;case u.Module:this.stepSpecificServices[e.stepName]={module:await Oe(e.data.module)},A.push(kn.init(e,this,this.reloadedState));break;case u.Picture:A.push(On.init(e,this,this.reloadedState));break;case u.Question:A.push(Ln.init(e,this,this.reloadedState));break;case u.Shape:A.push(zn.init(e,this,this.reloadedState));break;case u.Text:A.push(Wn.init(e,this,this.reloadedState))}const e=(await Promise.allSettled(A)).map((A=>{if("rejected"===A.status)throw new Error(`Step initialization failed: ${A.reason}`);return A.value})),n=e.filter((A=>!!A&&!!A.command)).map((A=>A.command)),i=e.filter((A=>!!A&&!!A.followup)).map((A=>A.followup));n&&n.length>0&&this.commandContext.apply(new l(n),!0);for(const A of i)await A();i.length>0&&await this.ensureStepsAreLoaded(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((A=>A(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((A=>A(this.editedSteps)))}onElementsChange(){this.elementsCallbacks.forEach((A=>A(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((A=>A(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((A=>A(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((A=>{A(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((A=>A(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((A=>{A(this.stepMetadata)}))}async onSelectionChange(){const A=await this.traversableScenes();for(const t of this.selectionCallbacks)t({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:A})}onStepSpecificStorageChange(A){Object.keys(this.stepSpecificStorageCallbacks).includes(A)||(this.stepSpecificStorageCallbacks[A]=[]),this.stepSpecificStorageCallbacks[A].forEach((t=>t(this.storage[A])))}onStorageChange(){this.storageCallbacks.forEach((A=>A(this.storage)))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((A=>{A(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((A=>{A(this.variationRecords)}))}traversableScenes(){return fn(this.allScenes,this.stepSelections)}}function ti(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class ei{constructor(A,t){ti(this,"manager",void 0),ti(this,"step",void 0),this.manager=A,this.step=t}setUpdateState(A){ei.updateState.set(this.step.stepName,A)}getUpdateState(){return!!ei.updateState.get(this.step.stepName)}async getCurrentVariant(){return(await this.manager.getWorkflowSelections())[this.step.stepName]?.selections[0]}async getAvailableVariants(){if(this.step.type===u.Frame&&!this.step.optionId)return[];const A=await Ft.getOptionFromStep(this.step,this.manager.getServer());return A?A.data.variants:[]}getName(){return this.step.stepTitle}getId(){return this.step.stepName}getType(){return this.step.type}getHelpText(){return this.step.helpText}}function ni(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}ti(ei,"updateState",new Map);const ii=YA`
|
|
193
193
|
mutation UpdateTransactionBulkEmailAddress($id: String!, $bulkEmailAddress: String!) {
|
|
194
194
|
transactionUpdate(id: $id, bulkEmailAddress: $bulkEmailAddress) {
|
|
195
195
|
id
|
|
@@ -223,5 +223,5 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
|
|
|
223
223
|
lastSyncedAt
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
-
`;class si extends ei{constructor(A,t){super(A,t),ni(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(A){await Dt.getShadowGraphqlClient().mutate({mutation:ai,variables:{transactionId:this.manager.getTransaction().id,designName:A}});const t=this.manager.getTransaction();this.manager.setTransaction({...t,designName:A})}addVariationRecord(){const A=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(A),A}updateBulkIsConnected(A){this.manager.updateStorage(this.getId(),{bulkIsConnected:A})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(A){await Dt.getShadowGraphqlClient().mutate({mutation:ii,variables:{id:this.transaction.id,bulkEmailAddress:A}}),this.openBulkSourceUrl()}deleteVariationRecord(A){this.manager.removeVariationRecord(A)}getAspects(){return this.step.data.aspects}}class ri extends ei{constructor(A,t){super(A,t)}selectVariant(A){return Gn.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],(A=>this.setUpdateState(A)),this.manager)}getColors(){const A=this.manager.getRegionElements(this.step.stepName)||[];if(0!==A.length)try{return M(A[0].id,this.manager.getAllLayoutData()).colors}catch(A){}}setColor(A,t){const e=new Map;return e.set(A,t),Gn.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),e)}async getColorOption(){const A=this.step.data.colourOptionId;if(!A)return;const t=await Ft.getOption(It,A);return t||void 0}getAvailableColors(){return this.step.data.colourPickerEnabled?Gn.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colourPickerEnabled}}class oi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return bn.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class ci extends ei{constructor(A,t){super(A,t)}selectVariant(A){return Jn.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class gi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return On.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class Bi extends ei{constructor(A,t){super(A,t)}async selectVariant(A){if(!A.id)throw new Error("Unable to select variant with a null ID");await Ln.selectVariant(this.step,A.id,this.manager)}getDisplayType(){return this.step.option?.data.displayType}}class wi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return Promise.resolve()}setColor(A){return zn.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return zn.availableColours(this.step,this.manager)}}class li extends ei{constructor(A,t){super(A,t)}async selectVariant(A){Wn.selectVariant(this.step,A,this.manager,(A=>{if(A)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:qn.Error,stepID:this.step.stepName}]);else{const A=this.manager.getInformationResults().filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}}),(A=>{}))}getAvailableColors(){return this.step.data.colourPickerEnabled?Wn.availableColors(this.step,this.manager):Promise.resolve([])}async setFill(A){const t=this.manager.getRegionElements(this.step.stepName);await Wn.changeFill(this.step,A,t,this.manager)}getFill(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}setFullTextCustomization(A){const t=this.manager.getStepStorage(this.step.stepName)?.inputText||"",e=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",t):t,n=A?e:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:A,text:n,defaultCleared:!1});return this.setText(n)}setText(A){const t={input:A},e=Wn.findLayoutElements(this.manager,this.step),n=Wn.filterUnsupportedCharacters(A,e[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(t.input=n);const i=e.length<=0,a=i?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,a),this.manager.updateMetadata(this.step.stepName,{text:n}),i)return t;const{command:s,errors:r,helperText:o}=Wn.updateInputText(n,e,this.step,this.manager);s&&this.manager.getCommandDispatcher()(s);const c=this.manager.getInformationResults(),g=r[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:qn.Error,stepID:this.step.stepName}]);else{const A=c.filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}return t.helperText=g||o,t}getText(){const A=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||A||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const A=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),A}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colourPickerEnabled}getRegions(){return this.step.data.regions}}class Ei{static get(A,t){switch(t.type){case u.Question:return new Bi(A,t);case u.Text:return new li(A,t);case u.Illustration:return new ri(A,t);case u.Picture:return new gi(A,t);case u.Shape:return new wi(A,t);case u.Material:return new oi(A,t);case u.Model:return new ci(A,t);case u.Frame:return new Hi(A,t);case u.Bulk:return new si(A,t);default:throw new at(`Step type ${t.type} not yet supported in Core SDK`)}}}function di(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Qi=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Ci=(A,t,e,n,i,a,s,r,o)=>{const c={event:"onComplete",lineItemImageUrl:s?s.href:"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||""};return i&&(c.metadata=i),r&&(c.selectedVariants=r),o&&(c.sku=o),c},hi=async(A,t,e,n,i,a,s)=>{const r=(A.product?.basePrice||0)*(A.variationsCount||0),o=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=Qi(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Ci(A,t,r,o,a,c,s,n,i)},Ii=async(A,t,e,n,i,a,s,r,o,c,g,B,w)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const l=Dt.getShadowGraphqlClient();await l.resetStore();const E=await l.query({query:Cn,variables:{id:a.id},errorPolicy:"all"}),d=E.data?.transactions[0].workflowState;!E.errors&&d||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),E.errors&&E.errors.forEach((A=>{E.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const Q=A.getPreviewService(),C=t?.finalizeStepConfig?.lookAtAnimation,h=Q&&100===Q.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!C,I=w&&Qi(w,t,!0),D=w&&Qi(w,t,!1),u=async A=>{const e={};let n=0;if(Object.keys(s).length>0)for(const i of Object.keys(s)){const a=s[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||await Ft.getOption(It,r.optionId)&&(await Ft.getOption(It,r.optionId)).data.variants.length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await u(!0),m=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await u(!1),M=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),F=await B(h);o("workflow.steps.finish.finalize.creatingDesign");const y=(await It.execute("createDesign",{designDetails:(()=>{const A={designName:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,productId:i.id,transactionId:a.id,threeDimPreview:h,previewImage:F};return w&&(A.metadata=D),m&&(A.selectedVariants=M),A})()})).body,Y=y.links.find((A=>"image"===A.rel));o("workflow.steps.finish.finalize.updatingTransaction");const N=(await Dt.getShadowGraphqlClient().query({query:Qn,variables:{id:a.id}})).data.transactions[0];return a.bulk?(await c(g),((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Ci(A,t,n,i,void 0,a,e)})(N,i,Y)):await hi(N,i,t,p,y.data.sku,I,Y)};let Di;var ui;(ui=Di||(Di={})).Local="Local",ui.Remote="Remote";const pi=new class{constructor(){di(this,"localPersistenceKey","designTransactions"),di(this,"storageMethod",Di.Local),di(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){return await this.getDesigns()}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.notifyDesignSaved(A)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==Di.Local)throw new at("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}async getDesigns(){if(this.storageMethod===Di.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new at("Unexpected storage method requested")}notifyDesignSaved(A){this.designSavedListeners.forEach((t=>t(A)))}};function mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class fi{constructor(t,e,n){if(mi(this,"client",void 0),mi(this,"commandContext",void 0),mi(this,"workflowManager",void 0),mi(this,"isReadOnly",void 0),mi(this,"server",void 0),mi(this,"renderableScenes",[]),mi(this,"renderableSceneCallbacks",[]),mi(this,"debouncedSavedDesignUpdate",WA((async()=>{await pi.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t,this.server=n;const i=e.layouts;this.commandContext=new A,this.commandContext.initialize(i,e.reloadedState),this.isReadOnly=!!e.transaction.lineItem?.id||!wt.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new Ai(e.workflow,e.product.profanities?.map((A=>A.word))||[],i,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,this.server,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await Dt.getShadowGraphqlClient().mutate({mutation:dn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow()?.finalizeStepConfig?.lookAtAnimation;if(A){if(!e)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,e))||""}const n=document.createElement("canvas");let i=2048;t&&t<=2048&&(i=t),n.width=i,n.height=i;const a=this.commandContext.getAllLayouts()[this.workflowManager.getWorkflow().defaultPreviewPanelIndex||0],s=a.layoutState.layout.previewRegion?{x:a.layoutState.layout.previewRegion.left,y:a.layoutState.layout.previewRegion.top,width:a.layoutState.layout.previewRegion.width,height:a.layoutState.layout.previewRegion.height}:{x:0,y:0,width:a.layoutState.layout.width,height:a.layoutState.layout.height},r=this.commandContext.getLayoutById(a.layoutState.layout.id),o=n.getContext("2d");if(!o)throw new ot("Failed to obtain 2D context for preview image creation");const c=P(r.layoutState.layout,r.layoutState.elements,{renderingConfiguration:{purpose:X.Print,region:{left:s.x,top:s.y,width:s.width,height:s.height}}}),g=KA.renderToStaticMarkup(c),B=await jA.from(o,g,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))(n);return n.toDataURL(w)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Ei.get(this.getWorkflowManager(),t)}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A={type:u.Bulk,stepName:"Bulk",stepTitle:"workflow.steps.bulk.title",helpText:"help:/partner/add-ons/bulk-ordering",data:{aspects:hn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Ei.get(this.getWorkflowManager(),A)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Ei.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Ei.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return A.stepNames.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Ei.get(this.getWorkflowManager(),A)))}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new at("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await pi.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await pi.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new at("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new yi({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new at("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0,this.server)}async onDesignFinished(A,t,e,n){return Ii(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),A,this.workflowManager.getTransaction(),e,this.workflowManager.getWorkflow().name,t,(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),n)}stepHasHandle(A){return A.type!==u.SilentIllustration&&A.type!==u.ProductOverlay}}function Mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Fi=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:y(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class yi{constructor(A){Mi(this,"options",void 0),Mi(this,"initialized",void 0),Mi(this,"experienceOptions",void 0),Mi(this,"updateTransactionState",(async A=>{try{return Dt.getShadowGraphqlClient().mutate({...A,mutation:ln})}catch(A){throw console.error(A),new rt("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A}getAssetManager(){return ft}async initFromIntegrationProduct(A){if(""===A)throw new rt("No integration product ID provided.");this.options.useUncachedEndpoints&&It.setUncachedOperations(["getAssetByKeyV2","getWorkflowV2","getMaterialV2","getOptionV2"]);const t=Dt.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:gn,variables:{integrationProductId:A,bulk:this.options.bulk||!1},errorPolicy:"all"});if(!e.data)throw new rt("Failed to create transaction!");const n=(await t.mutate({mutation:Bn,variables:{id:e.data.transactionCreate.id},errorPolicy:"all"})).data?.transactionClaim;if(!n)throw new rt("Failed to create transaction.");if(!e.data.transactionCreate.product)throw new rt("Failed to create transaction, product not available.");const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:e.data.transactionCreate.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new rt("No transaction ID provided.");const e=Dt.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{console.log("Readonly Mode");const n=(await e.query({query:wn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new at("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:wn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");return this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Bn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new rt("Failed to read transaction.");if(!i.product)throw new rt("Failed to load transaction, product not available.");i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new rt("Attempted to access a transaction that isn't available.")}}async getWorkflowExperience(A,t,e,n){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot launch experience: Not initialized.");const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===d.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await EA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===d.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},a=n||It;if(this.experienceOptions.transaction.workflowId){const A=(await a.execute("getWorkflowV2",{workflowSlug:this.experienceOptions.transaction.workflowId})).body.data;if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new An(this.experienceOptions.layouts,a),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new fi(this,this.experienceOptions,a);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const n=(await a.execute("getWorkflowV2",{workflowSlug:A})).body.data;if(this.experienceOptions.workflow=n,await Dt.getShadowGraphqlClient().mutate({mutation:En,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=Fi(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(n),this.experienceOptions.renderableContextService=new An(this.experienceOptions.layouts,a),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const s=new fi(this,this.experienceOptions,a);return await s.getWorkflowManager().getInitializationPromise(),s}throw new rt("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function Yi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Ni={setUncachedOperations:()=>{},execute:async()=>({body:{},headers:{"content-type":""}})};class xi{static getFrameStep(A){return{type:u.Frame,stepTitle:"My frame Step",stepName:"My Step Name",conditions:[],option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-new-variant",priceModifier:1,asset:{data:{key:"1",createdAt:0,licenseId:"",mimeType:"",ownerId:"",price:0,public:!0,type:t.Frame,objectVersions:[],tags:[]},links:[{href:xi.aFrame,rel:"cdn"}]}},{id:"2",name:"my-new-variant-2",priceModifier:1,asset:{data:{key:"2",createdAt:0,licenseId:"",mimeType:"",ownerId:"",price:0,public:!0,type:t.Frame,objectVersions:[],tags:[]},links:[{href:xi.bFrame,rel:"cdn"}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,layer:0,layerIndex:0,rotation:0,panelId:"p-123",immutable:!1,adjustmentBoundary:{x:0,y:0,height:0,width:0}}],...A}}}static getBulkStep(){return{type:u.Bulk,stepTitle:"Bulk",stepName:"bulk-step",data:{aspects:[]}}}static getQuestionStep(A,t){return{type:u.Question,stepTitle:"question-step",stepName:A||"question-step",conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-variant",priceModifier:1},{id:"2",name:"my-variant2",priceModifier:1}]},links:[]},data:{}}}static getMaterialStep(A,t){return{type:u.Material,stepTitle:"My Material Step",stepName:A||"material-step",conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-variant",priceModifier:1,material:{data:{id:"1",name:"mat-1",clearCoat:pA.None,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString(),albedoMapKey:xi.redRaster},links:[]}},{id:"2",name:"my-variant2",priceModifier:1,material:{data:{id:"2",name:"mat-2",clearCoat:pA.None,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString(),albedoMapKey:xi.blueRaster},links:[]}}]},links:[]},data:{targetMaterials:["panel"]}}}static getTextStep(A){return{type:u.Text,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"font/ttf",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Font,tags:[]},links:[{rel:"cdn",href:xi.minimalFont}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],defaultText:"",font:"",maxLength:100,size:16,textAlign:"center",colour:"#000000",verticalAlign:"top",...A}}}static getIllustrationStep(A){return{type:u.Illustration,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"image/svg+xml",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Illustration,tags:[]},links:[{rel:"cdn",href:xi.blueShape.src}]}},{id:"2",name:"",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"image/svg+xml",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Illustration,tags:[]},links:[{rel:"cdn",href:xi.redShape.src}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],colourPickerEnabled:!1,...A}}}static getPictureStep(A,e){return{type:u.Picture,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:e,variants:[{id:"1",name:"a",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"image/png",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Image,tags:[]},links:[{rel:"cdn",href:xi.blueRaster}]}},{id:"2",name:"b",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"image/png",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Image,tags:[]},links:[{rel:"cdn",href:xi.redRaster}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],...A}}}static getModelStep(A,e){return{type:u.Model,stepTitle:"s-1",stepName:"s-1",optionId:"om-1",option:{data:{id:"om-1",name:"test",defaultVariant:e,variants:[{id:"1",name:"a",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"application/octet-stream",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Model,tags:[]},links:[{rel:"cdn",href:xi.glbBox}]}},{id:"2",name:"b",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"application/octet-stream",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Model,tags:[]},links:[{rel:"cdn",href:xi.glbVertexTest}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],...A}}}static getShapeStep(A,t=[]){return{type:u.Shape,stepTitle:"s-1",stepName:A,conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"a",priceModifier:1,color:"#FFFFFF"},{id:"2",name:"b",priceModifier:1,color:"#000000"}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}]}}}static getSilentIllustrationStep(A,t=[]){return{type:u.SilentIllustration,stepTitle:"s-1",stepName:A,conditions:t,data:{assetKey:xi.redRaster,regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}]}}}}Yi(xi,"minimalFont","data:font/truetype;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTZfNAT0AAAcoAAAAHEdERUYAJQAAAAAHEAAAABhPUy8yaO1iTwAAAVgAAABgY21hcAA1CxkAAAHQAAABUmdhc3D//wADAAAHCAAAAAhnbHlmCT9XBwAAAzQAAABoaGVhZB35qu0AAADcAAAANmhoZWEEIACkAAABFAAAACRobXR4BkP/1QAAAbgAAAAYbG9jYQBgAFAAAAMkAAAADm1heHAASgALAAABOAAAACBuYW1llHqhugAAA5wAAAM5cG9zdAAwACUAAAbYAAAALgABAAAAAQAAIJ9E6V8PPPUACwPoAAAAAN68s6YAAAAA3ryzpv+tAAABtQK8AAAACAACAAAAAAAAAAEAAAK8/tQAAAHJ/60AAAG1AAEAAAAAAAAAAAAAAAAAAAAGAAEAAAAGAAgAAgAAAAAAAgAAAAEAAQAAAEAAAAAAAAAAAwE9AfQABQAAAooCuwAAAIwCigK7AAAB3wAxAQIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAWFhYWABAACAAQQK8/tQAAAK8AAAAAAABAAAAAAFeArwAAAAgAAEByQAUAAAAAAFNAAABTQAAAVQAFACM/60AAAADAAAAAwAAABwAAQAAAAAATAADAAEAAAAcAAQAMAAAAAgACAACAAAAAAAgAEH//wAAAAAAIABA//8AAP/j/8QAAQAAAAAAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAWABYAFgAkADQAAAACABQAAAG1AqMAAwAHAAATIREhNyERIRQBof5fMAFA/sACo/1dMAJDAAAAAAEAFAAAAUACvAADAAATIREhFAEs/tQCvP1EAAAC/60AAAB4ArwAAAAEAAADEzMRI1NnZGQBPgF+/UQAAAAAIgGeAAEAAAAAAAAAAQAEAAEAAAAAAAEADAAgAAEAAAAAAAIABwA9AAEAAAAAAAMAFgBzAAEAAAAAAAQAFAC0AAEAAAAAAAUADQDlAAEAAAAAAAYAEgEZAAEAAAAAAAcAAQEwAAEAAAAAAAgAAQE2AAEAAAAAAAkAAQE8AAEAAAAAAAoAAQFCAAEAAAAAAAsAAQFIAAEAAAAAAAwAAQFOAAEAAAAAAA0AAQFUAAEAAAAAAA4AAQFaAAEAAAAAABAADAF2AAEAAAAAABEABwGTAAMAAQQJAAAAAgAAAAMAAQQJAAEAGAAGAAMAAQQJAAIADgAtAAMAAQQJAAMALABFAAMAAQQJAAQAKACKAAMAAQQJAAUAGgDJAAMAAQQJAAYAJADzAAMAAQQJAAcAAgEsAAMAAQQJAAgAAgEyAAMAAQQJAAkAAgE4AAMAAQQJAAoAAgE+AAMAAQQJAAsAAgFEAAMAAQQJAAwAAgFKAAMAAQQJAA0AAgFQAAMAAQQJAA4AAgFWAAMAAQQJABAAGAFcAAMAAQQJABEADgGDACAAACAAAE0AaQBuAGkAbQBhAGwAIABGAG8AbgB0AABNaW5pbWFsIEZvbnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAACAAOgBNAGkAbgBpAG0AYQBsACAARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAACA6TWluaW1hbCBGb250IFJlZ3VsYXIAAE0AaQBuAGkAbQBhAGwAIABGAG8AbgB0ACAAUgBlAGcAdQBsAGEAcgAATWluaW1hbCBGb250IFJlZ3VsYXIAAFYAZQByAHMAaQBvAG4AIAAwAC4AMAAwADEAAFZlcnNpb24gMC4wMDEAAE0AaQBuAGkAbQBhAGwARgBvAG4AdABSAGUAZwB1AGwAYQByAABNaW5pbWFsRm9udFJlZ3VsYXIAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAACAAAE0AaQBuAGkAbQBhAGwAIABGAG8AbgB0AABNaW5pbWFsIEZvbnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAEAAgADACMAJAAAAAAAAf//AAIAAQAAAAwAAAAQAAAAAgAAAAQAAAACAAAAAAABAAAAANpTmfAAAAAA3ryzpgAAAADevLOm"),Yi(xi,"redShape",{src:"https://assets.spiff.com.au/public/assets/56cf72f5-a98d-487f-9e79-8129030ab99e.svg",text:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><script xmlns=""/><defs><style>.cls-1{fill:#f285b1;}</style></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="512" height="512"/></g></g></svg>'}),Yi(xi,"blueShape",{src:"https://assets.spiff.com.au/public/assets/6b9c3b7a-a669-41be-8ba2-538588d449e0.svg",text:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><script xmlns=""/><defs><style>.cls-1{fill:#53c6d6;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="512" height="512"/></g></g></svg>'}),Yi(xi,"aFrame","https://assets.spiff.com.au/public/assets/5bb3c003-3d30-4c98-9f07-2cfe25fbc4f7.svg"),Yi(xi,"bFrame","https://assets.spiff.com.au/public/assets/25e42f93-3f5d-43b6-9075-29164000bdf5.svg"),Yi(xi,"redRaster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="),Yi(xi,"blueRaster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg=="),Yi(xi,"glbBox","data:@file/octet-stream;base64,Z2xURgIAAACABgAA3AMAAEpTT057ImFzc2V0Ijp7ImdlbmVyYXRvciI6IkNPTExBREEyR0xURiIsInZlcnNpb24iOiIyLjAifSwic2NlbmUiOjAsInNjZW5lcyI6W3sibm9kZXMiOlswXX1dLCJub2RlcyI6W3siY2hpbGRyZW4iOlsxXSwibWF0cml4IjpbMS4wLDAuMCwwLjAsMC4wLDAuMCwwLjAsLTEuMCwwLjAsMC4wLDEuMCwwLjAsMC4wLDAuMCwwLjAsMC4wLDEuMF19LHsibWVzaCI6MH1dLCJtZXNoZXMiOlt7InByaW1pdGl2ZXMiOlt7ImF0dHJpYnV0ZXMiOnsiTk9STUFMIjoxLCJQT1NJVElPTiI6Mn0sImluZGljZXMiOjAsIm1vZGUiOjQsIm1hdGVyaWFsIjowfV0sIm5hbWUiOiJNZXNoIn1dLCJhY2Nlc3NvcnMiOlt7ImJ1ZmZlclZpZXciOjAsImJ5dGVPZmZzZXQiOjAsImNvbXBvbmVudFR5cGUiOjUxMjMsImNvdW50IjozNiwibWF4IjpbMjNdLCJtaW4iOlswXSwidHlwZSI6IlNDQUxBUiJ9LHsiYnVmZmVyVmlldyI6MSwiYnl0ZU9mZnNldCI6MCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjI0LCJtYXgiOlsxLjAsMS4wLDEuMF0sIm1pbiI6Wy0xLjAsLTEuMCwtMS4wXSwidHlwZSI6IlZFQzMifSx7ImJ1ZmZlclZpZXciOjEsImJ5dGVPZmZzZXQiOjI4OCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjI0LCJtYXgiOlswLjUsMC41LDAuNV0sIm1pbiI6Wy0wLjUsLTAuNSwtMC41XSwidHlwZSI6IlZFQzMifV0sIm1hdGVyaWFscyI6W3sicGJyTWV0YWxsaWNSb3VnaG5lc3MiOnsiYmFzZUNvbG9yRmFjdG9yIjpbMC44MDAwMDAwMTE5MjA5MjksMC4wLDAuMCwxLjBdLCJtZXRhbGxpY0ZhY3RvciI6MC4wfSwibmFtZSI6IlJlZCJ9XSwiYnVmZmVyVmlld3MiOlt7ImJ1ZmZlciI6MCwiYnl0ZU9mZnNldCI6NTc2LCJieXRlTGVuZ3RoIjo3MiwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZVN0cmlkZSI6MTIsInRhcmdldCI6MzQ5NjJ9XSwiYnVmZmVycyI6W3siYnl0ZUxlbmd0aCI6NjQ4fV19iAIAAEJJTgAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAC/AAAAvwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAEAAgADAAIAAQAEAAUABgAHAAYABQAIAAkACgALAAoACQAMAA0ADgAPAA4ADQAQABEAEgATABIAEQAUABUAFgAXABYAFQA="),Yi(xi,"glbVertexTest","data:@file/octet-stream;base64,Z2xURgIAAABsZgAAxA0AAEpTT057ImFjY2Vzc29ycyI6W3siYnVmZmVyVmlldyI6MCwiY29tcG9uZW50VHlwZSI6NTEyMSwiY291bnQiOjM2LCJtYXgiOlsyM10sIm1pbiI6WzBdLCJ0eXBlIjoiU0NBTEFSIn0seyJidWZmZXJWaWV3IjoxLCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6MjQsIm1heCI6WzAuNzU1NDc4MzgyMTEwNTk1NywtMC44NTEyNDE2NDgxOTcxNzQxLDAuOTc1MDMyODY2MDAxMTI5Ml0sIm1pbiI6Wy0wLjcwNDU2NTgyMzA3ODE1NTUsLTAuODUxMjQxNzA3ODAxODE4OCwtMC45NjExMTU0Nzk0NjkyOTkzXSwidHlwZSI6IlZFQzMifSx7ImJ1ZmZlclZpZXciOjIsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50IjoyNCwibWF4IjpbMCwxLDBdLCJtaW4iOlswLDEsMF0sInR5cGUiOiJWRUMzIn0seyJidWZmZXJWaWV3IjozLCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6MjQsIm1heCI6WzEsNy4xMjE5Mzg5NDk2OTQ1OTVlLTgsMS41MTA1MTkyMTE5MzM1Njk3ZS03LDFdLCJtaW4iOlsxLC0xLjQzNDg4MTM2OTI3NzcxODVlLTcsLTEuMTI1NzY3NjM5MTA5NjUzOGUtNywxXSwidHlwZSI6IlZFQzQifSx7ImJ1ZmZlclZpZXciOjQsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50IjoyNCwibWF4IjpbMC45OTk5OTk4ODA3OTA3MTA0LDAuODAxMDQwOTQ3NDM3Mjg2NF0sIm1pbiI6WzAsMC4wNTUzOTcyNzIxMDk5ODUzNV0sInR5cGUiOiJWRUMyIn0seyJidWZmZXJWaWV3Ijo1LCJjb21wb25lbnRUeXBlIjo1MTIxLCJjb3VudCI6NzIsIm1heCI6WzQ3XSwibWluIjpbMF0sInR5cGUiOiJTQ0FMQVIifSx7ImJ1ZmZlclZpZXciOjYsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50Ijo0OCwibWF4IjpbMS4wMDAwMDA0NzY4MzcxNTgyLDEsMC40ODc0MjI0NjYyNzgwNzYxN10sIm1pbiI6Wy0xLjAwMDAwMDM1NzYyNzg2ODcsLTEsLTAuMTcxODY2NTM2MTQwNDQxOV0sInR5cGUiOiJWRUMzIn0seyJidWZmZXJWaWV3Ijo3LCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6NDgsIm1heCI6WzEsMSwxXSwibWluIjpbLTEsLTEsLTFdLCJ0eXBlIjoiVkVDMyJ9LHsiYnVmZmVyVmlldyI6OCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjQ4LCJtYXgiOlsxLDcuOTQwOTMzODgwNTA5MDY2ZS0yMyw0LjQ3MDM0ODM1ODE1NDI5N2UtOCwxXSwibWluIjpbMSwtNi42MTc0NDQ5MDA0MjQyMjJlLTI0LDAsMV0sInR5cGUiOiJWRUM0In0seyJidWZmZXJWaWV3Ijo5LCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6NDgsIm1heCI6WzAuODM2MTI5NjA1NzcwMTExMSwwLjc2NjYzMTkwMTI2NDE5MDddLCJtaW4iOlswLjIyNjEzMDQ1NTczMjM0NTU4LDAuMjMyMTE3NjUyODkzMDY2NF0sInR5cGUiOiJWRUMyIn0seyJidWZmZXJWaWV3IjoxMCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjQ4LCJtYXgiOlsxLDEsMSwxXSwibWluIjpbMCwwLDAsMV0sInR5cGUiOiJWRUM0In1dLCJhc3NldCI6eyJjb3B5cmlnaHQiOiJDb3B5cmlnaHQgMjAxOCBBbmFseXRpY2FsIEdyYXBoaWNzLCBJbmMuLCBDQy1CWSA0LjAgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8gLSBNZXNoIGFuZCB0ZXh0dXJlcyBieSBFZCBNYWNrZXkuIiwiZ2VuZXJhdG9yIjoiS2hyb25vcyBCbGVuZGVyIGdsVEYgMi4wIGV4cG9ydGVyIiwidmVyc2lvbiI6IjIuMCJ9LCJidWZmZXJWaWV3cyI6W3siYnVmZmVyIjowLCJieXRlTGVuZ3RoIjozNiwiYnl0ZU9mZnNldCI6MCwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjI4OCwiYnl0ZU9mZnNldCI6MzYsInRhcmdldCI6MzQ5NjJ9LHsiYnVmZmVyIjowLCJieXRlTGVuZ3RoIjoyODgsImJ5dGVPZmZzZXQiOjMyNCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjM4NCwiYnl0ZU9mZnNldCI6NjEyLCJ0YXJnZXQiOjM0OTYyfSx7ImJ1ZmZlciI6MCwiYnl0ZUxlbmd0aCI6MTkyLCJieXRlT2Zmc2V0Ijo5OTYsInRhcmdldCI6MzQ5NjJ9LHsiYnVmZmVyIjowLCJieXRlTGVuZ3RoIjo3MiwiYnl0ZU9mZnNldCI6MTE4OCwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZU9mZnNldCI6MTI2MCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZU9mZnNldCI6MTgzNiwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjc2OCwiYnl0ZU9mZnNldCI6MjQxMiwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjM4NCwiYnl0ZU9mZnNldCI6MzE4MCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjc2OCwiYnl0ZU9mZnNldCI6MzU2NCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjQzMzIsImJ5dGVMZW5ndGgiOjk2NzR9LHsiYnVmZmVyIjowLCJieXRlT2Zmc2V0IjoxNDAwOCwiYnl0ZUxlbmd0aCI6ODY1OH1dLCJidWZmZXJzIjpbeyJieXRlTGVuZ3RoIjoyMjY2OH1dLCJpbWFnZXMiOlt7ImJ1ZmZlclZpZXciOjExLCJtaW1lVHlwZSI6ImltYWdlL3BuZyJ9LHsiYnVmZmVyVmlldyI6MTIsIm1pbWVUeXBlIjoiaW1hZ2UvcG5nIn1dLCJtYXRlcmlhbHMiOlt7ImRvdWJsZVNpZGVkIjp0cnVlLCJuYW1lIjoiTGFiZWxfTWF0IiwicGJyTWV0YWxsaWNSb3VnaG5lc3MiOnsiYmFzZUNv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AAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAP7H/fzIRGt01AACAP7H/fzIRGt01AACAP7H/fzIRGt01AACAP7H/fzIRGt01AQAAswIAALMAAIA/AQAAswIAALMAAIA/AQAAswIAALMAAIA/AQAAswIAALMAAIA/AACAvwAAELTXja61AACAvwAAELTXja61AACAvwAAELTXja61AACAvwAAELTXja61AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAwBoBAAAzAACAPwAAgD8AAMAaAQAAMwAAgD8AAIA/AADAGgEAADMAAIA/AACAPwAAwBoBAAAzAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAmQAAQDMAAIA/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");function vi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Si{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,"getUpdatesPending",void 0)}getServer(){return Ni}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Pi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let Ri;var Ui;(Ui=Ri||(Ri={})).SelectFrame="SelectFrame",Ui.SelectImage="SelectImage",Ui.Position="Position";class Hi extends ei{constructor(A,t){super(A,t),Pi(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return Hn.selectVariant(this.step,A,t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return Hn.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?Ri.SelectFrame:t||e||this.getImageData()?Ri.Position:Ri.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const Gi=A=>{const t=JA(null),[e,n]=PA(void 0),[i,a]=PA(void 0),{addEvent:s,removeEvent:r,updateEvent:o,eventCache:c}=Yt(),[g,B]=PA(!1),[w,l]=PA(!1),{state:E,uiDispatcher:d}=bt(),Q=RA((A=>{const t=A;d(new Gt({zoom:Math.max(.1,Math.min(t,E.maxZoom))}))}),[d,E.maxZoom]),C=RA((A=>{r(A),1===c.length&&n(void 0),2===c.length&&a(void 0);"touch"===A.pointerType&&c.length>1&&c.length-1==1&&(l(!1),B(!1))}),[t,c]),h=RA((A=>{s(A);"touch"===A.pointerType&&1===c.length&&(d(new Gt({selectedElement:void 0})),l(!0),B(!0))}),[t,w,c]),I=RA((A=>{o(A),A.isPrimary&&n({x:A.screenX,y:A.screenY});const t=1===c.length&&"touch"!==c[0].pointerType,s=2===c.length&&"touch"===c[0].pointerType;if(g&&s){const[A,t]=c,e=Math.abs(A.clientX-t.clientX),n=i;n&&Q(E.zoom-.0055*(n-e)),a(e)}if(w&&(t||s)&&A.isPrimary){const t=(e?.x||A.screenX)-A.screenX,n=(e?.y||A.screenY)-A.screenY;d(new Gt({selectedElement:void 0,xTranslation:E.xTranslation-t/E.zoom,yTranslation:E.yTranslation-n/E.zoom}))}}),[E.xTranslation,E.yTranslation,E.zoom,w,g,Q,c,e,i]),D=RA((A=>{g&&Q(E.zoom-.035*Math.sign(A.deltaY))}),[E,g]);HA((()=>{if(!t.current||0===c.length)return;const A=c[0].pointerId,e=t.current.hasPointerCapture(A);w&&!e&&t.current.setPointerCapture(A),!w&&e&&t.current.releasePointerCapture(A)}),[t,w,c]),Ce([" "],(()=>{l(!0),d(new Gt({selectedElement:void 0}))}),(()=>l(!1))),Ce(["Control"],(()=>B(!0)),(()=>B(!1)));const u=bA((()=>({cursor:w&&0===c.length?"grab":w&&1===c.length?"grabbing":g?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[w,g,c]);return kA("div",{ref:t,className:"transform-wrapper",onWheel:D,onPointerDown:h,onPointerUp:C,onPointerCancel:C,onPointerLeave:C,onPointerMove:I,style:u,children:A.children})};export{yi as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,ue as PromiseQueue,De as QueueablePromise,Si as MockWorkflowManager,qn as InformationMessageType,ei as StepHandle,li as TextStepHandle,Hi as FrameStepHandle,si as BulkStepHandle,wi as ShapeStepHandle,ri as IllustrationStepHandle,oi as MaterialStepHandle,ci as ModelStepHandle,gi as PictureStepHandle,Bi as QuestionStepHandle,_A as OptionNotFoundError,At as LayoutNotFoundError,tt as AssetNotFoundError,et as ResourceNotFoundError,nt as MisconfigurationError,st as ParseError,at as UnhandledBehaviorError,ft as assetService,pi as designService,Ii as createDesign,Ft as optionService,It as server,wt as persistenceService,Dt as graphQlManager,jn as toast,Yn as FrameService,Hn as frameStepService,Jn as modelStepService,bn as materialStepService,zn as shapeStepService,Ln as questionStepService,Rn as digitalContentStepService,kn as moduleStepService,On as pictureStepService,Wn as textStepService,Gn as illustrationStepService,Jt as ProductCameraRig,Ri as FrameStep,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,s as CreateElementCommand,r as CreateLayoutCommand,o as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,B as FontSizeCommand,w as FontSourceCommand,l as GroupCommand,E as LayoutElementFactory,d as LayoutElementType,Q as MoveCommand,C as ResizeCommand,h as RotateCommand,I as SendBackwardsCommand,D as StepAspectType,u as StepType,p as TextChangeCommand,m as UnitOfMeasurement,f as dataUrlFromExternalUrl,M as findElement,F as frameDataCache,y as generate,Y as getAxisAlignedBoundingBox,N as generateSVGWithUnknownColors,x as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,S as getFrameData,P as getSvgElement,R as loadFontFromDataUrl,U as loadFontFromExternalUrl,H as determineCorrectFontSizeAndLines,G as patternImageDataCache,$e as generateCommands,b as registerJSDOM,Ee as minZoom,cn as AdvancedEditor,Gi as TransformWrapper,on as EditorCore,Nt as useLayouts,bt as useEditorState,Qe as useEditorInteraction,Ce as useShortcutCombination,Rt as commandReducer,Pt as getDefaultState,yt as CommandContextContext,Ht as AdvancedEditorStateProvider,Ut as AdvancedEditorContext,Gt as UICommand,vt as EditorSubMenu,zt as ElementEventType,jt as KeyEvent,hn as gatherVaryingStepAspects};
|
|
226
|
+
`;class si extends ei{constructor(A,t){super(A,t),ni(this,"transaction",this.manager.getTransaction())}selectVariant(){throw new Error("Bulk step does not support variants.")}async setDesignName(A){await Dt.getShadowGraphqlClient().mutate({mutation:ai,variables:{transactionId:this.manager.getTransaction().id,designName:A}});const t=this.manager.getTransaction();this.manager.setTransaction({...t,designName:A})}addVariationRecord(){const A=this.manager.addVariationRecord({transactionId:this.transaction.id,values:[]});return this.manager.setCurrentVariationRecord(A),A}updateBulkIsConnected(A){this.manager.updateStorage(this.getId(),{bulkIsConnected:A})}openBulkSourceUrl(){window.open(this.transaction.bulkSourceUrl,"_blank")}async sendGoogleSheetLinkToEmail(A){await Dt.getShadowGraphqlClient().mutate({mutation:ii,variables:{id:this.transaction.id,bulkEmailAddress:A}}),this.openBulkSourceUrl()}deleteVariationRecord(A){this.manager.removeVariationRecord(A)}getAspects(){return this.step.data.aspects}}class ri extends ei{constructor(A,t){super(A,t)}async selectVariant(A){if(await this.getCurrentVariant()!==A)return Gn.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],(A=>this.setUpdateState(A)),this.manager)}getColors(){const A=this.manager.getRegionElements(this.step.stepName)||[];if(0!==A.length)try{return M(A[0].id,this.manager.getAllLayoutData()).colors}catch(A){}}setColor(A,t){const e=new Map;return e.set(A,t),Gn.changeColors(this.step,this.manager.getRegionElements(this.step.stepName),this.manager,(()=>this.manager.getCommandContext().getAllLayouts()),e)}async getColorOption(){const A=this.step.data.colourOptionId;if(!A)return;const t=await Ft.getOption(It,A);return t||void 0}getAvailableColors(){return this.step.data.colourPickerEnabled?Gn.availableColors(this.step,this.manager):Promise.resolve([])}hasVaryingSelection(){return this.step.data.varySelection}hasVaryingColors(){return this.step.data.varyColors}isColorPickerEnabled(){return this.step.data.colourPickerEnabled}}class oi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return bn.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class ci extends ei{constructor(A,t){super(A,t)}selectVariant(A){return Jn.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class gi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return On.selectVariant(this.step,A,this.manager,(A=>this.setUpdateState(A)))}}class Bi extends ei{constructor(A,t){super(A,t)}async selectVariant(A){if(!A.id)throw new Error("Unable to select variant with a null ID");await Ln.selectVariant(this.step,A.id,this.manager)}getDisplayType(){return this.step.option?.data.displayType}}class wi extends ei{constructor(A,t){super(A,t)}selectVariant(A){return Promise.resolve()}setColor(A){return zn.selectVariant(this.step,A,this.manager.getRegionElements(this.step.stepName)||[],this.manager)}getColors(){return zn.availableColours(this.step,this.manager)}}class li extends ei{constructor(A,t){super(A,t)}async selectVariant(A){Wn.selectVariant(this.step,A,this.manager,(A=>{if(A)this.manager.setInformationResults([...this.manager.getInformationResults(),{message:"An issue has occured with test",messageType:qn.Error,stepID:this.step.stepName}]);else{const A=this.manager.getInformationResults().filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}}),(A=>{}))}getAvailableColors(){return this.step.data.colourPickerEnabled?Wn.availableColors(this.step,this.manager):Promise.resolve([])}async setFill(A){const t=this.manager.getRegionElements(this.step.stepName);await Wn.changeFill(this.step,A,t,this.manager)}getFill(){return this.manager.getStepStorage(this.step.stepName)?.color||"#000000"}setFullTextCustomization(A){const t=this.manager.getStepStorage(this.step.stepName)?.inputText||"",e=void 0!==this.step.data.replaceableText?this.step.data.replaceableText.replace("{{}}",t):t,n=A?e:this.step.data.defaultText;this.manager.updateStorage(this.step.stepName,{customiseAllText:A,text:n,defaultCleared:!1});return this.setText(n)}setText(A){const t={input:A},e=Wn.findLayoutElements(this.manager,this.step),n=Wn.filterUnsupportedCharacters(A,e[0]?.fontData);!!this.step.data&&!!this.step.data.maxLength&&n.length>this.step.data.maxLength||(t.input=n);const i=e.length<=0,a=i?{inputText:n,text:n}:{inputText:n};if(this.manager.updateStorage(this.step.stepName,a),this.manager.updateMetadata(this.step.stepName,{text:n}),i)return t;const{command:s,errors:r,helperText:o}=Wn.updateInputText(n,e,this.step,this.manager);s&&this.manager.getCommandDispatcher()(s);const c=this.manager.getInformationResults(),g=r[0]?.localizationKey;if(g)this.manager.setInformationResults([...c,{message:`${g} - ${this.step.stepTitle}`,messageType:qn.Error,stepID:this.step.stepName}]);else{const A=c.filter((A=>A.stepID!==this.step.stepName));this.manager.setInformationResults(A)}return t.helperText=g||o,t.errorText=g,t}getText(){const A=this.step.data.defaultText;return this.manager.getStepStorage(this.step.stepName)?.text||A||""}isReplaceable(){return this.step.data.userCanReplaceText}clearDefaultTextIfNecessary(){if(!this.manager.getStepStorage(this.step.stepName)?.defaultCleared&&this.step.data.deleteDefaultOnFocus){const A=this.setText("");return this.manager.updateStorage(this.step.stepName,{defaultCleared:!0,inputText:""}),A}}hasVaryingText(){return this.step.data.varyText}hasVaryingColor(){return this.step.data.varyColor}hasVaryingSelection(){return this.step.data.varySelection}hasColorPicker(){return this.step.data.colourPickerEnabled}getRegions(){return this.step.data.regions}}class Ei{static get(A,t){switch(t.type){case u.Question:return new Bi(A,t);case u.Text:return new li(A,t);case u.Illustration:return new ri(A,t);case u.Picture:return new gi(A,t);case u.Shape:return new wi(A,t);case u.Material:return new oi(A,t);case u.Model:return new ci(A,t);case u.Frame:return new Hi(A,t);case u.Bulk:return new si(A,t);default:throw new at(`Step type ${t.type} not yet supported in Core SDK`)}}}function di(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Qi=(A,t,e)=>{const n={};return t.steps.forEach((t=>{Object.assign(n,(t=>{const n={};if("Frame"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideImageInCart&&e)return n;n[`${t.stepTitle} image`]=i.image}if("Illustration"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideColorsInCart&&e||!i.colors)return n;if(i.colors.length>0){const A=i.colors.join(", ").toUpperCase();n[`${t.stepTitle} colors`]=A}}if("Module"===t.type){const i=A[t.stepName],a=t.data;if(!i||a.hideTextInCart&&e)return n;n[`${t.stepTitle} text`]=i.text}if("Text"===t.type){const i=A[t.stepName];if(!i)return n;const a=t.data;a.hideTextInCart&&e||(n[`${t.stepTitle} text`]=i.text),!i.color||a.hideColorInCart&&e||(n[`${t.stepTitle} color`]=i.color)}return n})(t))})),n},Ci=(A,t,e,n,i,a,s,r,o)=>{const c={event:"onComplete",lineItemImageUrl:s?s.href:"",transactionId:A.id,designProductVariantId:A.externalDesignProductVariantId,designProductId:A.externalDesignProductId,baseCost:e,weight:t.weight,optionsCost:n,exportedData:a,workflowViewerLink:A.workflowViewerLink||"",workflowViewerReadOnlyLink:A.workflowViewerReadOnlyLink||""};return i&&(c.metadata=i),r&&(c.selectedVariants=r),o&&(c.sku=o),c},hi=async(A,t,e,n,i,a,s)=>{const r=(A.product?.basePrice||0)*(A.variationsCount||0),o=A.priceModifierTotal||0,c=((A,t,e,n)=>{const i={};let a;if(e){a=Qi(e,t,!1);for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}else if(n){a=n;for(const A of Object.keys(a))i[A]={value:a[A],priceModifier:0}}for(const e of Object.keys(A)){const n=A[e],a=t.steps.find((A=>A.stepTitle===e));if(1===n.length)i[`${a?.stepTitle} selection`]={value:n[0].name,priceModifier:n[0].priceModifier};else if(n.length>1)for(let A=0;A<n.length;A++)i[`${a?.stepTitle} selection ${A+1}`]={value:n[A].name,priceModifier:n[A].priceModifier}}return i})(n,e,void 0,a);return Ci(A,t,r,o,a,c,s,n,i)},Ii=async(A,t,e,n,i,a,s,r,o,c,g,B,w)=>{o("workflow.steps.finish.finalize.buildingLayouts"),await A.outstandingRequestsPromise();const l=Dt.getShadowGraphqlClient();await l.resetStore();const E=await l.query({query:Cn,variables:{id:a.id},errorPolicy:"all"}),d=E.data?.transactions[0].workflowState;!E.errors&&d||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(n())),E.errors&&E.errors.forEach((A=>{E.errors&&console.log("Server Error:",A.message)})),await A.updateStateWithServerImmediate(n),console.log("Server state is undefined @ Workflow completion"));const Q=A.getPreviewService(),C=t?.finalizeStepConfig?.lookAtAnimation,h=Q&&100===Q.getSceneInitializationProgress()&&t.showModelOnFinishStep&&!!C,I=w&&Qi(w,t,!0),D=w&&Qi(w,t,!1),u=async A=>{const e={};let n=0;if(Object.keys(s).length>0)for(const i of Object.keys(s)){const a=s[i],r=t.steps.find((A=>A.stepName===i));for(let t=0;t<a.selections.length;++t){const i=a.selections[t];if(r&&(!A||await Ft.getOption(It,r.optionId)&&(await Ft.getOption(It,r.optionId)).data.variants.length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const A=r.stepTitle;e[A]?e[A].push({id:i.id||"",name:i.name,priceModifier:i.priceModifier}):e[A]=[{id:i.id||"",name:i.name,priceModifier:i.priceModifier}]}n+=i.priceModifier}}return[e,n]},[p]=await u(!0),m=Object.fromEntries(Object.keys(p).map((A=>[A,p[A].map((A=>A.id))]))),[f]=await u(!1),M=Object.fromEntries(Object.keys(f).map((A=>[A,f[A].map((A=>A.id))]))),F=await B(h);o("workflow.steps.finish.finalize.creatingDesign");const y=(await It.execute("createDesign",{designDetails:(()=>{const A={designName:r,layouts:e.map((A=>({index:A.index,panelId:A.panelId}))),workflowId:t.id,productId:i.id,transactionId:a.id,threeDimPreview:h,previewImage:F};return w&&(A.metadata=D),m&&(A.selectedVariants=M),A})()})).body,Y=y.links.find((A=>"image"===A.rel));o("workflow.steps.finish.finalize.updatingTransaction");const N=(await Dt.getShadowGraphqlClient().query({query:Qn,variables:{id:a.id}})).data.transactions[0];return a.bulk?(await c(g),((A,t,e)=>{const n=(A.product?.basePrice||0)*(A.variationsCount||0),i=A.priceModifierTotal||0,a={items:{value:A.variationsCount?`${A.variationsCount}`:"0",priceModifier:0}};return Ci(A,t,n,i,void 0,a,e)})(N,i,Y)):await hi(N,i,t,p,y.data.sku,I,Y)};let Di;var ui;(ui=Di||(Di={})).Local="Local",ui.Remote="Remote";const pi=new class{constructor(){di(this,"localPersistenceKey","designTransactions"),di(this,"storageMethod",Di.Local),di(this,"designSavedListeners",[])}attachSaveListener(A){this.designSavedListeners.push(A)}detachSaveListener(A){this.designSavedListeners=this.designSavedListeners.filter((t=>t!==A))}async getSavedDesigns(){return await this.getDesigns()}async getSavedDesignByTransaction(A){return(await this.getSavedDesigns()).find((t=>t.transactionId===A))}async addDesign(A){const t=(await this.getSavedDesigns()).filter((t=>t.transactionId!==A.transactionId));t.unshift(A),await this.setDesigns(t),this.notifyDesignSaved(A)}async removeDesign(A){const t=await this.getSavedDesigns();await this.setDesigns(t.filter((t=>t.transactionId!==A)))}async setDesigns(A){if(this.storageMethod!==Di.Local)throw new at("Unexpected storage method requested");wt.set(this.localPersistenceKey,JSON.stringify(A))}async getDesigns(){if(this.storageMethod===Di.Local){const A=wt.get(this.localPersistenceKey);return A?JSON.parse(A):[]}throw new at("Unexpected storage method requested")}notifyDesignSaved(A){this.designSavedListeners.forEach((t=>t(A)))}};function mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class fi{constructor(t,e,n){if(mi(this,"client",void 0),mi(this,"commandContext",void 0),mi(this,"workflowManager",void 0),mi(this,"isReadOnly",void 0),mi(this,"server",void 0),mi(this,"renderableScenes",[]),mi(this,"renderableSceneCallbacks",[]),mi(this,"debouncedSavedDesignUpdate",WA((async()=>{await pi.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()}),2500)),!e.workflow)throw new Error("No Workflow ID provided.");this.client=t,this.server=n;const i=e.layouts;this.commandContext=new A,this.commandContext.initialize(i,e.reloadedState),this.isReadOnly=!!e.transaction.lineItem?.id||!wt.getMap("transactionOwnerIds")?.get(e.transaction.id)||!!e.readOnly,this.workflowManager=new Ai(e.workflow,e.product.profanities?.map((A=>A.word))||[],i,this.commandContext,(A=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return e.stateMutationFunc(A)}),e.transaction,e.product,this.server,e.previewService,e.renderableContextService,e.reloadedState,e.readOnly),this.workflowManager.addSelectionCallback((A=>{const t=A.traversableScenes.map((A=>{const t=A.renderableSteps.map((A=>A.stepName));return{id:A.name,title:A.title,renderableSteps:t}}));this.renderableScenes=t,this.renderableSceneCallbacks.forEach((A=>A(t)))}))}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(A){await Dt.getShadowGraphqlClient().mutate({mutation:dn,variables:{transactionId:this.workflowManager.getTransaction().id,updates:A.map((A=>({recordNumber:A.recordNumber,values:A.values.map((A=>({aspect:A.aspect,stepName:A.stepName,value:A.value})))})))}})}async createPreviewImage(A,t){const e=this.workflowManager.getWorkflow()?.finalizeStepConfig?.lookAtAnimation;if(A){if(!e)throw new Error("Failed to generate cart preview image!");return await(this.workflowManager.getPreviewService()?.renderSceneScreenshot(512,e))||""}const n=document.createElement("canvas");let i=2048;t&&t<=2048&&(i=t),n.width=i,n.height=i;const a=this.commandContext.getAllLayouts()[this.workflowManager.getWorkflow().defaultPreviewPanelIndex||0],s=a.layoutState.layout.previewRegion?{x:a.layoutState.layout.previewRegion.left,y:a.layoutState.layout.previewRegion.top,width:a.layoutState.layout.previewRegion.width,height:a.layoutState.layout.previewRegion.height}:{x:0,y:0,width:a.layoutState.layout.width,height:a.layoutState.layout.height},r=this.commandContext.getLayoutById(a.layoutState.layout.id),o=n.getContext("2d");if(!o)throw new ot("Failed to obtain 2D context for preview image creation");const c=P(r.layoutState.layout,r.layoutState.elements,{renderingConfiguration:{purpose:X.Print,region:{left:s.x,top:s.y,width:s.width,height:s.height}}}),g=KA.renderToStaticMarkup(c),B=await jA.from(o,g,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await B.render();const w=await(async A=>new Promise(((t,e)=>{try{A.toBlob((A=>{if(A){const e=URL.createObjectURL(A);t(e)}}))}catch(A){e(A)}})))(n);return n.toDataURL(w)}getStepById(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A));if(t&&this.stepHasHandle(t))return Ei.get(this.getWorkflowManager(),t)}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const A={type:u.Bulk,stepName:"Bulk",stepTitle:"workflow.steps.bulk.title",helpText:"help:/partner/add-ons/bulk-ordering",data:{aspects:hn(this.getWorkflowManager().getWorkflow())},conditions:[]};return Ei.get(this.getWorkflowManager(),A)}}getStepByName(A){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===A));if(t&&this.stepHasHandle(t))return Ei.get(this.getWorkflowManager(),t)}getStepsByType(A){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===A)).map((A=>Ei.get(this.getWorkflowManager(),A)))}getStepsByScene(A){if(!this.getWorkflowManager().getWorkflow().stepGroups.find((t=>t.name===A.name)))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return A.stepNames.map((A=>this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===A)))).filter((A=>this.stepHasHandle(A))).map((A=>Ei.get(this.getWorkflowManager(),A)))}attachRenderableSceneListener(A){this.renderableSceneCallbacks.push(A),A(this.renderableScenes)}detachRenderableSceneListener(A){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter((t=>t!==A))}async save(A){if(!this.getCommandContext().getState())throw new at("State undefined!");const t={title:await(async()=>{if(A)return A;const t=this.getWorkflowManager().getTransaction().id,e=(await pi.getSavedDesigns()).find((A=>A.transactionId===t))?.title;return e||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await pi.addDesign(t),t}async copy(){const A=TA(this.getCommandContext().getState());if(!A)throw new at("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(A.transaction),e=this.getWorkflowManager().getWorkflow(),n=new yi({}),i=this.getWorkflowManager().getTransaction().integrationProduct?.id;if(!i)throw new at("Integration product id is undefined!");await n.initFromIntegrationProduct(i);return await n.getWorkflowExperience(e.id,t,void 0,this.server)}async onDesignFinished(A,t,e,n){return Ii(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),A,this.workflowManager.getTransaction(),e,this.workflowManager.getWorkflow().name,t,(A=>this.updateVariationRecords(A)),this.workflowManager.getVariationRecords(),(A=>this.createPreviewImage(A)),n)}stepHasHandle(A){return A.type!==u.SilentIllustration&&A.type!==u.ProductOverlay}}function Mi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Fi=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:y(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class yi{constructor(A){Mi(this,"options",void 0),Mi(this,"initialized",void 0),Mi(this,"experienceOptions",void 0),Mi(this,"updateTransactionState",(async A=>{try{return Dt.getShadowGraphqlClient().mutate({...A,mutation:ln})}catch(A){throw console.error(A),new rt("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A}getAssetManager(){return ft}async initFromIntegrationProduct(A){if(""===A)throw new rt("No integration product ID provided.");this.options.useUncachedEndpoints&&It.setUncachedOperations(["getAssetByKeyV2","getWorkflowV2","getMaterialV2","getOptionV2"]);const t=Dt.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:gn,variables:{integrationProductId:A,bulk:this.options.bulk||!1},errorPolicy:"all"});if(!e.data)throw new rt("Failed to create transaction!");const n=(await t.mutate({mutation:Bn,variables:{id:e.data.transactionCreate.id},errorPolicy:"all"})).data?.transactionClaim;if(!n)throw new rt("Failed to create transaction.");if(!e.data.transactionCreate.product)throw new rt("Failed to create transaction, product not available.");const i=wt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Ct(n.transactionOwnerId||""),wt.setMap("transactionOwnerIds",i),this.experienceOptions={product:e.data.transactionCreate.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new rt("No transaction ID provided.");const e=Dt.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{console.log("Readonly Mode");const n=(await e.query({query:wn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new at("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=wt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Ct(i);const n=(await e.query({query:wn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");return this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Bn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new rt("Failed to read transaction.");if(!i.product)throw new rt("Failed to load transaction, product not available.");i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Ct(i.transactionOwnerId),wt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new rt("Attempted to access a transaction that isn't available.")}}async getWorkflowExperience(A,t,e,n){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot launch experience: Not initialized.");const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===d.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await EA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===d.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},a=n||It;if(this.experienceOptions.transaction.workflowId){const A=(await a.execute("getWorkflowV2",{workflowSlug:this.experienceOptions.transaction.workflowId})).body.data;if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new An(this.experienceOptions.layouts,a),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new fi(this,this.experienceOptions,a);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const n=(await a.execute("getWorkflowV2",{workflowSlug:A})).body.data;if(this.experienceOptions.workflow=n,await Dt.getShadowGraphqlClient().mutate({mutation:En,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=Fi(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(n),this.experienceOptions.renderableContextService=new An(this.experienceOptions.layouts,a),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const s=new fi(this,this.experienceOptions,a);return await s.getWorkflowManager().getInitializationPromise(),s}throw new rt("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function Yi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}const Ni={setUncachedOperations:()=>{},execute:async()=>({body:{},headers:{"content-type":""}})};class xi{static getFrameStep(A){return{type:u.Frame,stepTitle:"My frame Step",stepName:"My Step Name",conditions:[],option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-new-variant",priceModifier:1,asset:{data:{key:"1",createdAt:0,licenseId:"",mimeType:"",ownerId:"",price:0,public:!0,type:t.Frame,objectVersions:[],tags:[]},links:[{href:xi.aFrame,rel:"cdn"}]}},{id:"2",name:"my-new-variant-2",priceModifier:1,asset:{data:{key:"2",createdAt:0,licenseId:"",mimeType:"",ownerId:"",price:0,public:!0,type:t.Frame,objectVersions:[],tags:[]},links:[{href:xi.bFrame,rel:"cdn"}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,layer:0,layerIndex:0,rotation:0,panelId:"p-123",immutable:!1,adjustmentBoundary:{x:0,y:0,height:0,width:0}}],...A}}}static getBulkStep(){return{type:u.Bulk,stepTitle:"Bulk",stepName:"bulk-step",data:{aspects:[]}}}static getQuestionStep(A,t){return{type:u.Question,stepTitle:"question-step",stepName:A||"question-step",conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-variant",priceModifier:1},{id:"2",name:"my-variant2",priceModifier:1}]},links:[]},data:{}}}static getMaterialStep(A,t){return{type:u.Material,stepTitle:"My Material Step",stepName:A||"material-step",conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"my-variant",priceModifier:1,material:{data:{id:"1",name:"mat-1",clearCoat:pA.None,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString(),albedoMapKey:xi.redRaster},links:[]}},{id:"2",name:"my-variant2",priceModifier:1,material:{data:{id:"2",name:"mat-2",clearCoat:pA.None,createdAt:(new Date).toISOString(),updatedAt:(new Date).toISOString(),albedoMapKey:xi.blueRaster},links:[]}}]},links:[]},data:{targetMaterials:["panel"]}}}static getTextStep(A){return{type:u.Text,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"font/ttf",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Font,tags:[]},links:[{rel:"cdn",href:xi.minimalFont}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],defaultText:"",font:"",maxLength:100,size:16,textAlign:"center",colour:"#000000",verticalAlign:"top",...A}}}static getIllustrationStep(A){return{type:u.Illustration,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"image/svg+xml",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Illustration,tags:[]},links:[{rel:"cdn",href:xi.blueShape.src}]}},{id:"2",name:"",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"image/svg+xml",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Illustration,tags:[]},links:[{rel:"cdn",href:xi.redShape.src}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],colourPickerEnabled:!1,...A}}}static getPictureStep(A,e){return{type:u.Picture,stepTitle:"s-1",stepName:"s-1",option:{data:{name:"test",defaultVariant:e,variants:[{id:"1",name:"a",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"image/png",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Image,tags:[]},links:[{rel:"cdn",href:xi.blueRaster}]}},{id:"2",name:"b",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"image/png",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Image,tags:[]},links:[{rel:"cdn",href:xi.redRaster}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],...A}}}static getModelStep(A,e){return{type:u.Model,stepTitle:"s-1",stepName:"s-1",optionId:"om-1",option:{data:{id:"om-1",name:"test",defaultVariant:e,variants:[{id:"1",name:"a",priceModifier:1,assetKey:"123",asset:{data:{key:"123",createdAt:0,mimeType:"application/octet-stream",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Model,tags:[]},links:[{rel:"cdn",href:xi.glbBox}]}},{id:"2",name:"b",priceModifier:1,assetKey:"456",asset:{data:{key:"456",createdAt:0,mimeType:"application/octet-stream",ownerId:"",price:0,licenseId:"",public:!1,objectVersions:[],type:t.Model,tags:[]},links:[{rel:"cdn",href:xi.glbVertexTest}]}}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}],...A}}}static getShapeStep(A,t=[]){return{type:u.Shape,stepTitle:"s-1",stepName:A,conditions:t,option:{data:{name:"test",defaultVariant:"1",variants:[{id:"1",name:"a",priceModifier:1,color:"#FFFFFF"},{id:"2",name:"b",priceModifier:1,color:"#000000"}]},links:[]},data:{regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}]}}}static getSilentIllustrationStep(A,t=[]){return{type:u.SilentIllustration,stepTitle:"s-1",stepName:A,conditions:t,data:{assetKey:xi.redRaster,regions:[{top:0,left:0,width:100,height:100,rotation:0,panelId:"p-123"}]}}}}Yi(xi,"minimalFont","data:font/truetype;charset=utf-8;base64,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"),Yi(xi,"redShape",{src:"https://assets.spiff.com.au/public/assets/56cf72f5-a98d-487f-9e79-8129030ab99e.svg",text:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><script xmlns=""/><defs><style>.cls-1{fill:#f285b1;}</style></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="512" height="512"/></g></g></svg>'}),Yi(xi,"blueShape",{src:"https://assets.spiff.com.au/public/assets/6b9c3b7a-a669-41be-8ba2-538588d449e0.svg",text:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><script xmlns=""/><defs><style>.cls-1{fill:#53c6d6;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="512" height="512"/></g></g></svg>'}),Yi(xi,"aFrame","https://assets.spiff.com.au/public/assets/5bb3c003-3d30-4c98-9f07-2cfe25fbc4f7.svg"),Yi(xi,"bFrame","https://assets.spiff.com.au/public/assets/25e42f93-3f5d-43b6-9075-29164000bdf5.svg"),Yi(xi,"redRaster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="),Yi(xi,"blueRaster","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg=="),Yi(xi,"glbBox","data:@file/octet-stream;base64,Z2xURgIAAACABgAA3AMAAEpTT057ImFzc2V0Ijp7ImdlbmVyYXRvciI6IkNPTExBREEyR0xURiIsInZlcnNpb24iOiIyLjAifSwic2NlbmUiOjAsInNjZW5lcyI6W3sibm9kZXMiOlswXX1dLCJub2RlcyI6W3siY2hpbGRyZW4iOlsxXSwibWF0cml4IjpbMS4wLDAuMCwwLjAsMC4wLDAuMCwwLjAsLTEuMCwwLjAsMC4wLDEuMCwwLjAsMC4wLDAuMCwwLjAsMC4wLDEuMF19LHsibWVzaCI6MH1dLCJtZXNoZXMiOlt7InByaW1pdGl2ZXMiOlt7ImF0dHJpYnV0ZXMiOnsiTk9STUFMIjoxLCJQT1NJVElPTiI6Mn0sImluZGljZXMiOjAsIm1vZGUiOjQsIm1hdGVyaWFsIjowfV0sIm5hbWUiOiJNZXNoIn1dLCJhY2Nlc3NvcnMiOlt7ImJ1ZmZlclZpZXciOjAsImJ5dGVPZmZzZXQiOjAsImNvbXBvbmVudFR5cGUiOjUxMjMsImNvdW50IjozNiwibWF4IjpbMjNdLCJtaW4iOlswXSwidHlwZSI6IlNDQUxBUiJ9LHsiYnVmZmVyVmlldyI6MSwiYnl0ZU9mZnNldCI6MCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjI0LCJtYXgiOlsxLjAsMS4wLDEuMF0sIm1pbiI6Wy0xLjAsLTEuMCwtMS4wXSwidHlwZSI6IlZFQzMifSx7ImJ1ZmZlclZpZXciOjEsImJ5dGVPZmZzZXQiOjI4OCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjI0LCJtYXgiOlswLjUsMC41LDAuNV0sIm1pbiI6Wy0wLjUsLTAuNSwtMC41XSwidHlwZSI6IlZFQzMifV0sIm1hdGVyaWFscyI6W3sicGJyTWV0YWxsaWNSb3VnaG5lc3MiOnsiYmFzZUNvbG9yRmFjdG9yIjpbMC44MDAwMDAwMTE5MjA5MjksMC4wLDAuMCwxLjBdLCJtZXRhbGxpY0ZhY3RvciI6MC4wfSwibmFtZSI6IlJlZCJ9XSwiYnVmZmVyVmlld3MiOlt7ImJ1ZmZlciI6MCwiYnl0ZU9mZnNldCI6NTc2LCJieXRlTGVuZ3RoIjo3MiwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZVN0cmlkZSI6MTIsInRhcmdldCI6MzQ5NjJ9XSwiYnVmZmVycyI6W3siYnl0ZUxlbmd0aCI6NjQ4fV19iAIAAEJJTgAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAC/AAAAvwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAEAAgADAAIAAQAEAAUABgAHAAYABQAIAAkACgALAAoACQAMAA0ADgAPAA4ADQAQABEAEgATABIAEQAUABUAFgAXABYAFQA="),Yi(xi,"glbVertexTest","data:@file/octet-stream;base64,Z2xURgIAAABsZgAAxA0AAEpTT057ImFjY2Vzc29ycyI6W3siYnVmZmVyVmlldyI6MCwiY29tcG9uZW50VHlwZSI6NTEyMSwiY291bnQiOjM2LCJtYXgiOlsyM10sIm1pbiI6WzBdLCJ0eXBlIjoiU0NBTEFSIn0seyJidWZmZXJWaWV3IjoxLCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6MjQsIm1heCI6WzAuNzU1NDc4MzgyMTEwNTk1NywtMC44NTEyNDE2NDgxOTcxNzQxLDAuOTc1MDMyODY2MDAxMTI5Ml0sIm1pbiI6Wy0wLjcwNDU2NTgyMzA3ODE1NTUsLTAuODUxMjQxNzA3ODAxODE4OCwtMC45NjExMTU0Nzk0NjkyOTkzXSwidHlwZSI6IlZFQzMifSx7ImJ1ZmZlclZpZXciOjIsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50IjoyNCwibWF4IjpbMCwxLDBdLCJtaW4iOlswLDEsMF0sInR5cGUiOiJWRUMzIn0seyJidWZmZXJWaWV3IjozLCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6MjQsIm1heCI6WzEsNy4xMjE5Mzg5NDk2OTQ1OTVlLTgsMS41MTA1MTkyMTE5MzM1Njk3ZS03LDFdLCJtaW4iOlsxLC0xLjQzNDg4MTM2OTI3NzcxODVlLTcsLTEuMTI1NzY3NjM5MTA5NjUzOGUtNywxXSwidHlwZSI6IlZFQzQifSx7ImJ1ZmZlclZpZXciOjQsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50IjoyNCwibWF4IjpbMC45OTk5OTk4ODA3OTA3MTA0LDAuODAxMDQwOTQ3NDM3Mjg2NF0sIm1pbiI6WzAsMC4wNTUzOTcyNzIxMDk5ODUzNV0sInR5cGUiOiJWRUMyIn0seyJidWZmZXJWaWV3Ijo1LCJjb21wb25lbnRUeXBlIjo1MTIxLCJjb3VudCI6NzIsIm1heCI6WzQ3XSwibWluIjpbMF0sInR5cGUiOiJTQ0FMQVIifSx7ImJ1ZmZlclZpZXciOjYsImNvbXBvbmVudFR5cGUiOjUxMjYsImNvdW50Ijo0OCwibWF4IjpbMS4wMDAwMDA0NzY4MzcxNTgyLDEsMC40ODc0MjI0NjYyNzgwNzYxN10sIm1pbiI6Wy0xLjAwMDAwMDM1NzYyNzg2ODcsLTEsLTAuMTcxODY2NTM2MTQwNDQxOV0sInR5cGUiOiJWRUMzIn0seyJidWZmZXJWaWV3Ijo3LCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6NDgsIm1heCI6WzEsMSwxXSwibWluIjpbLTEsLTEsLTFdLCJ0eXBlIjoiVkVDMyJ9LHsiYnVmZmVyVmlldyI6OCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjQ4LCJtYXgiOlsxLDcuOTQwOTMzODgwNTA5MDY2ZS0yMyw0LjQ3MDM0ODM1ODE1NDI5N2UtOCwxXSwibWluIjpbMSwtNi42MTc0NDQ5MDA0MjQyMjJlLTI0LDAsMV0sInR5cGUiOiJWRUM0In0seyJidWZmZXJWaWV3Ijo5LCJjb21wb25lbnRUeXBlIjo1MTI2LCJjb3VudCI6NDgsIm1heCI6WzAuODM2MTI5NjA1NzcwMTExMSwwLjc2NjYzMTkwMTI2NDE5MDddLCJtaW4iOlswLjIyNjEzMDQ1NTczMjM0NTU4LDAuMjMyMTE3NjUyODkzMDY2NF0sInR5cGUiOiJWRUMyIn0seyJidWZmZXJWaWV3IjoxMCwiY29tcG9uZW50VHlwZSI6NTEyNiwiY291bnQiOjQ4LCJtYXgiOlsxLDEsMSwxXSwibWluIjpbMCwwLDAsMV0sInR5cGUiOiJWRUM0In1dLCJhc3NldCI6eyJjb3B5cmlnaHQiOiJDb3B5cmlnaHQgMjAxOCBBbmFseXRpY2FsIEdyYXBoaWNzLCBJbmMuLCBDQy1CWSA0LjAgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8gLSBNZXNoIGFuZCB0ZXh0dXJlcyBieSBFZCBNYWNrZXkuIiwiZ2VuZXJhdG9yIjoiS2hyb25vcyBCbGVuZGVyIGdsVEYgMi4wIGV4cG9ydGVyIiwidmVyc2lvbiI6IjIuMCJ9LCJidWZmZXJWaWV3cyI6W3siYnVmZmVyIjowLCJieXRlTGVuZ3RoIjozNiwiYnl0ZU9mZnNldCI6MCwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjI4OCwiYnl0ZU9mZnNldCI6MzYsInRhcmdldCI6MzQ5NjJ9LHsiYnVmZmVyIjowLCJieXRlTGVuZ3RoIjoyODgsImJ5dGVPZmZzZXQiOjMyNCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjM4NCwiYnl0ZU9mZnNldCI6NjEyLCJ0YXJnZXQiOjM0OTYyfSx7ImJ1ZmZlciI6MCwiYnl0ZUxlbmd0aCI6MTkyLCJieXRlT2Zmc2V0Ijo5OTYsInRhcmdldCI6MzQ5NjJ9LHsiYnVmZmVyIjowLCJieXRlTGVuZ3RoIjo3MiwiYnl0ZU9mZnNldCI6MTE4OCwidGFyZ2V0IjozNDk2M30seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZU9mZnNldCI6MTI2MCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjU3NiwiYnl0ZU9mZnNldCI6MTgzNiwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjc2OCwiYnl0ZU9mZnNldCI6MjQxMiwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjM4NCwiYnl0ZU9mZnNldCI6MzE4MCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVMZW5ndGgiOjc2OCwiYnl0ZU9mZnNldCI6MzU2NCwidGFyZ2V0IjozNDk2Mn0seyJidWZmZXIiOjAsImJ5dGVPZmZzZXQiOjQzMzIsImJ5dGVMZW5ndGgiOjk2NzR9LHsiYnVmZmVyIjowLCJieXRlT2Zmc2V0IjoxNDAwOCwiYnl0ZUxlbmd0aCI6ODY1OH1dLCJidWZmZXJzIjpbeyJieXRlTGVuZ3RoIjoyMjY2OH1dLCJpbWFnZXMiOlt7ImJ1ZmZlclZpZXciOjExLCJtaW1lVHlwZSI6ImltYWdlL3BuZyJ9LHsiYnVmZmVyVmlldyI6MTIsIm1pbWVUeXBlIjoiaW1hZ2UvcG5nIn1dLCJtYXRlcmlhbHMiOlt7ImRvdWJsZVNpZGVkIjp0cnVlLCJuYW1lIjoiTGFiZWxfTWF0IiwicGJyTWV0YWxsaWNSb3VnaG5lc3MiOnsiYmFzZUNv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AAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgL8AAACAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAP7H/fzIRGt01AACAP7H/fzIRGt01AACAP7H/fzIRGt01AACAP7H/fzIRGt01AQAAswIAALMAAIA/AQAAswIAALMAAIA/AQAAswIAALMAAIA/AQAAswIAALMAAIA/AACAvwAAELTXja61AACAvwAAELTXja61AACAvwAAELTXja61AACAvwAAELTXja61AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AABAM/7/fzIAAIC/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrb//38/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AAAAADFlCrYAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAwBoBAAAzAACAPwAAgD8AAMAaAQAAMwAAgD8AAIA/AADAGgEAADMAAIA/AACAPwAAwBoBAAAzAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAAAAAAIAAAIA/AACAPwAAAAAAAACAAACAPwAAgD8AAAAAAAAAgAAAgD8AAIA/AAAAmQAAQDMAAIA/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");function vi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class Si{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,"getUpdatesPending",void 0)}getServer(){return Ni}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function Pi(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let Ri;var Ui;(Ui=Ri||(Ri={})).SelectFrame="SelectFrame",Ui.SelectImage="SelectImage",Ui.Position="Position";class Hi extends ei{constructor(A,t){super(A,t),Pi(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return Hn.selectVariant(this.step,A,t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return Hn.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?Ri.SelectFrame:t||e||this.getImageData()?Ri.Position:Ri.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const Gi=A=>{const t=JA(null),[e,n]=PA(void 0),[i,a]=PA(void 0),{addEvent:s,removeEvent:r,updateEvent:o,eventCache:c}=Yt(),[g,B]=PA(!1),[w,l]=PA(!1),{state:E,uiDispatcher:d}=bt(),Q=RA((A=>{const t=A;d(new Gt({zoom:Math.max(.1,Math.min(t,E.maxZoom))}))}),[d,E.maxZoom]),C=RA((A=>{r(A),1===c.length&&n(void 0),2===c.length&&a(void 0);"touch"===A.pointerType&&c.length>1&&c.length-1==1&&(l(!1),B(!1))}),[t,c]),h=RA((A=>{s(A);"touch"===A.pointerType&&1===c.length&&(d(new Gt({selectedElement:void 0})),l(!0),B(!0))}),[t,w,c]),I=RA((A=>{o(A),A.isPrimary&&n({x:A.screenX,y:A.screenY});const t=1===c.length&&"touch"!==c[0].pointerType,s=2===c.length&&"touch"===c[0].pointerType;if(g&&s){const[A,t]=c,e=Math.abs(A.clientX-t.clientX),n=i;n&&Q(E.zoom-.0055*(n-e)),a(e)}if(w&&(t||s)&&A.isPrimary){const t=(e?.x||A.screenX)-A.screenX,n=(e?.y||A.screenY)-A.screenY;d(new Gt({selectedElement:void 0,xTranslation:E.xTranslation-t/E.zoom,yTranslation:E.yTranslation-n/E.zoom}))}}),[E.xTranslation,E.yTranslation,E.zoom,w,g,Q,c,e,i]),D=RA((A=>{g&&Q(E.zoom-.035*Math.sign(A.deltaY))}),[E,g]);HA((()=>{if(!t.current||0===c.length)return;const A=c[0].pointerId,e=t.current.hasPointerCapture(A);w&&!e&&t.current.setPointerCapture(A),!w&&e&&t.current.releasePointerCapture(A)}),[t,w,c]),Ce([" "],(()=>{l(!0),d(new Gt({selectedElement:void 0}))}),(()=>l(!1))),Ce(["Control"],(()=>B(!0)),(()=>B(!1)));const u=bA((()=>({cursor:w&&0===c.length?"grab":w&&1===c.length?"grabbing":g?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[w,g,c]);return kA("div",{ref:t,className:"transform-wrapper",onWheel:D,onPointerDown:h,onPointerUp:C,onPointerCancel:C,onPointerLeave:C,onPointerMove:I,style:u,children:A.children})};export{yi as SpiffCommerceClient,A as CommandContext,Et as spiffCoreConfiguration,ue as PromiseQueue,De as QueueablePromise,Si as MockWorkflowManager,qn as InformationMessageType,ei as StepHandle,li as TextStepHandle,Hi as FrameStepHandle,si as BulkStepHandle,wi as ShapeStepHandle,ri as IllustrationStepHandle,oi as MaterialStepHandle,ci as ModelStepHandle,gi as PictureStepHandle,Bi as QuestionStepHandle,_A as OptionNotFoundError,At as LayoutNotFoundError,tt as AssetNotFoundError,et as ResourceNotFoundError,nt as MisconfigurationError,st as ParseError,at as UnhandledBehaviorError,ft as assetService,pi as designService,Ii as createDesign,Ft as optionService,It as server,wt as persistenceService,Dt as graphQlManager,jn as toast,Yn as FrameService,Hn as frameStepService,Jn as modelStepService,bn as materialStepService,zn as shapeStepService,Ln as questionStepService,Rn as digitalContentStepService,kn as moduleStepService,On as pictureStepService,Wn as textStepService,Gn as illustrationStepService,Jt as ProductCameraRig,Ri as FrameStep,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,s as CreateElementCommand,r as CreateLayoutCommand,o as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,B as FontSizeCommand,w as FontSourceCommand,l as GroupCommand,E as LayoutElementFactory,d as LayoutElementType,Q as MoveCommand,C as ResizeCommand,h as RotateCommand,I as SendBackwardsCommand,D as StepAspectType,u as StepType,p as TextChangeCommand,m as UnitOfMeasurement,f as dataUrlFromExternalUrl,M as findElement,F as frameDataCache,y as generate,Y as getAxisAlignedBoundingBox,N as generateSVGWithUnknownColors,x as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,S as getFrameData,P as getSvgElement,R as loadFontFromDataUrl,U as loadFontFromExternalUrl,H as determineCorrectFontSizeAndLines,G as patternImageDataCache,$e as generateCommands,b as registerJSDOM,Ee as minZoom,cn as AdvancedEditor,Gi as TransformWrapper,on as EditorCore,Nt as useLayouts,bt as useEditorState,Qe as useEditorInteraction,Ce as useShortcutCombination,Rt as commandReducer,Pt as getDefaultState,yt as CommandContextContext,Ht as AdvancedEditorStateProvider,Ut as AdvancedEditorContext,Gt as UICommand,vt as EditorSubMenu,zt as ElementEventType,jt as KeyEvent,hn as gatherVaryingStepAspects};
|
|
227
227
|
//# sourceMappingURL=module.js.map
|