@spiffcommerce/core 21.11.2-3 → 21.11.2-4
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/index.js +3 -2
- package/dist/index.umd.cjs +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1404,7 +1404,7 @@ class AA {
|
|
|
1404
1404
|
* @param promise A new promise to add to the queue.
|
|
1405
1405
|
*/
|
|
1406
1406
|
enqueue(e) {
|
|
1407
|
-
if (this.queue.push(e), this.queueMaxSize !== void 0 && this.queue.length > this.queueMaxSize) {
|
|
1407
|
+
if (console.log("enqueueing"), console.trace(), this.queue.push(e), this.queueMaxSize !== void 0 && this.queue.length > this.queueMaxSize) {
|
|
1408
1408
|
const t = this.queue.length - 1;
|
|
1409
1409
|
for (let A = 0; A < t; ++A)
|
|
1410
1410
|
this.queue.shift();
|
|
@@ -1445,6 +1445,7 @@ class AA {
|
|
|
1445
1445
|
* queue until no more are available.
|
|
1446
1446
|
*/
|
|
1447
1447
|
async dequeue() {
|
|
1448
|
+
console.log("dequeueing"), console.trace();
|
|
1448
1449
|
const e = this.queue.shift();
|
|
1449
1450
|
if (!e) {
|
|
1450
1451
|
this.activePromise = void 0;
|
|
@@ -7674,7 +7675,7 @@ class Gn {
|
|
|
7674
7675
|
* Actions to perform when a static render event is fired for this canvas.
|
|
7675
7676
|
*/
|
|
7676
7677
|
async render(e, t, A) {
|
|
7677
|
-
console.trace();
|
|
7678
|
+
console.log("rendering"), console.trace();
|
|
7678
7679
|
const a = we(t);
|
|
7679
7680
|
this.lastRequestedRenderArguments = {
|
|
7680
7681
|
workflow: e,
|
package/dist/index.umd.cjs
CHANGED
|
@@ -649,7 +649,7 @@
|
|
|
649
649
|
...IntegrationProductFields
|
|
650
650
|
}
|
|
651
651
|
}
|
|
652
|
-
`,we=[l.StepType.SilentIllustration,l.StepType.ProductOverlay],KA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:l.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=VA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:we.includes(A.type)?[]:[A],silentSteps:we.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?we.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:we.includes(A.type)?[]:[A],silentSteps:we.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:l.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},VA=(c,e)=>e.find(t=>t.stepNames.includes(c)),Ae=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),WA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>Ae(A,e)),silentSteps:c.silentSteps.filter(A=>Ae(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ne=(c,e)=>c.map(t=>WA(t,e)).filter(t=>t!==null),XA=async(c,e,t=!1)=>{var i;const A=ne(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===l.StepType.Model||s.type===l.StepType.Material||s.type===l.StepType.Picture||s.type===l.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Ge{constructor(){this.timestamp=Date.now()}}class ke{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Ft(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=Fe(c.x,e.width-r,0),o.y=Fe(c.y,e.height-g,0),o}const i=c;return i.x=Fe(i.x,-n,e.width),i.y=Fe(i.y,-a,e.height),i}function Fe(c,e,t){return Math.min(Math.max(c,e),t)}class Mt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=ot(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await l.getFrameData(o);st(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=l.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,g=t[o]-s*e[o],B=A[o]-r*e[o];return{x:g,y:B,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new k("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Ft(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new k("Frame data not set. This is a bug");if(!this.workflowManager)throw new k("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new l.GroupCommand([new l.UpdateFramePattern(s,t,e[r]),new l.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=l.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class yt{constructor(e,t,A){this.processRegion=async n=>{var s,r,g,B;const a=this.layouts.find(d=>d.panelId===n.panelId);if(!a)throw new J(n);let i="";if(this.configuration.type===l.StepType.ProductOverlay){let d="";if((s=this.product)!=null&&s.overlayImageUrl&&(d=this.product.overlayImageUrl),i=d,!d)throw new ge(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===l.LayoutElementType.Image){const d=this.configuration.type===l.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!d)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:l.generate(),src:d,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===l.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new l.CreateElementCommand(w,a)}}else{const d=this.configuration.type===l.StepType.SilentIllustration?(B=this.configuration.data.asset)==null?void 0:B.fileLink:i,w=async()=>new Promise((E,Q)=>{if(!d){Q("Undefined vector silent step source");return}l.fetchAsString(d,!0).then(m=>{E(m)}).catch(m=>console.error(m))}),h=await l.generateSVGWithUnknownColors(await w()),u={stepName:this.configuration.stepName,id:l.generate(),cachedObjectURL:await l.svgObjectURL(h.svg),src:d,svg:h.svg,colors:h.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===l.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:u.id,region:n},command:new l.CreateElementCommand(u,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ge(this.configuration,"Missing regions.");if(this.configuration.type===l.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===l.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new J(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===l.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?l.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),l.LayoutElementType.Illustration)}}const St=async c=>{const e=`${X.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ie("Failed to shorten URL, see console.")}};class Yt{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class qA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var B,d;const r=(B=n==null?void 0:n.storage)==null?void 0:B.videoShortUrl,g=(d=n==null?void 0:n.storage)==null?void 0:d.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const g=async()=>{var I,f;const m=(await wt([A]))[0],D=(f=(I=m==null?void 0:m.versions)==null?void 0:I.find(p=>p.name==="mpeg4"))==null?void 0:f.link;return{asset:m,link:D}},B=await new Promise((m,D)=>{new Yt(async()=>!!(await g()).link,async()=>{const I=await g();if(!I.link||!I.link)throw new Z(I.asset);m({rel:"mpeg4",href:I.link})},()=>{D("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(m=>s(new l.DeleteElementCommand(m.id)));const d=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(d+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([B]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const h=w.toString();if(h.length>=2e3)throw new Ie("Cannot create QR code, URL too long.");const u=await St(h);if(o(u),!i.data||!i.data.regions)throw new ge(i,"Missing regions.");const E=await this.regionElements(i),Q=await this.command(u,E,a,i.stepName);Q&&(Q.command&&a.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await a.setSelectionsAndElements(i.stepName,[],E,async()=>{a.updateStorage(i.stepName,{videoShortUrl:u,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:l.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await rt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,B=a.find(d=>d.panelId===(g==null?void 0:g.panelId));if(!B&&g)throw new J(g);if(B&&!g)throw new Error("Region not found");if(!B||!g)throw new Error("Neither a region or layout found!");return new l.CreateElementCommand({stepRegion:g,stepName:n,id:r.id,src:o,type:l.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},B)});return{command:new l.GroupCommand(s),followup:async()=>{}}}}const Pt=new qA;class ZA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return l.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new W(e);const n=A.fileLink;if(n)return l.fetchAsString(n,!0);throw new Z(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(e.mandatory&&t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName).map(g=>({id:g.id,region:g.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const g=e.data.regions.map(B=>l.generateDefaultRectangleFrameSvg(B));t.updateStorage(e.stepName,{currentFrameSources:g})}if(n){const g=async()=>{var w,h,u,E;const B=(w=n.storage)==null?void 0:w.framePatternSrc,d=(h=n.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:d,framePatternSrc:B}),B){const Q=(u=t.getStepSpecificServices(e.stepName))==null?void 0:u.frameService;if(!Q)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(B,Q),t.updateMetadata(e.stepName,{image:B}),t.updateStorage(e.stepName,{framePatternSrc:B})}if(d!=null&&d.some(Q=>Q.zoom)){const Q=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!Q)throw new Error("Frame service unavailable, cannot load pattern!");Q.updateOffsets(d)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const B=n.selectedVariants[0].id;if(e.option&&B){const d=(r=e.option.variants)==null?void 0:r.find(w=>w.id===B);d&&await t.setSelectionsAndElements(e.stepName,[d],s,async()=>{const w=await Promise.all(e.data.regions.map(h=>this.frameSourceSvg(d,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){return A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?new Promise(a=>{A.addPoller(new Yt(async()=>{var r;const o=(r=(await G.getLocalOrFromServer(t.key||"")).versions)==null?void 0:r.find(g=>g.name==="svg");return o?(await fetch(o.link)).status===200:!1},()=>{G.getLocalOrFromServer(t.key||"").then(i=>{this.loadPatternFromAsset(i,e,A).then(a)})},()=>{throw new Ie("Failed to resolve transcoded PDF")}))}):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new l.CreateElementCommand({id:e,type:l.LayoutElementType.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,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await l.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};l.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await l.fetchAsArrayBuffer(e,!0),n=await l.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};l.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var d;const o=(d=n.getStepSpecificServices(e.stepName))==null?void 0:d.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const u=await l.getFrameData(s[h]),E=o.getImageData(),Q=A.map(F=>new l.DeleteElementCommand(F.id)),m=E?l.calculateOffsets(E,u):void 0,D=E?{id:l.generate(),src:E.src,x:(m==null?void 0:m.x)||0,y:(m==null?void 0:m.y)||0,width:E.width,height:E.height,scaleX:(m==null?void 0:m.zoom)||1,scaleY:(m==null?void 0:m.zoom)||1,rotation:0}:void 0,I=l.generate(),p=n.getLayouts().find(F=>F.panelId===w.panelId);if(!p)throw new J(w);return{command:this.getCreateElementCommand(I,w,p,{frameData:u,pattern:D,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:Q}})),g=r.map(w=>w.command),B=r.map(w=>w.removeExistingCommands).flat();return{command:new l.GroupCommand([...g,...B]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!h)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,h)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new Z(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const he=new ZA;class $A{async getIllustrationBody(e){return new Promise(t=>{l.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new l.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:l.LayoutElementType.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},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return l.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t,!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var g;const i={};for(const[B,d]of a.entries())i[B]={browserValue:d,spotColor:(g=i[B])==null?void 0:g.spotColor};const o=l.modifySVGWithElementProperties(e,t,A,i),s=await l.svgObjectURL(o),r=[];for(const B of n){for(const[d,w]of a.entries())r.push(new l.IllustrationColorCommand(B,d,w));r.push(new l.IllustrationCacheCommand(B,o,s))}return new l.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,h;if(t.length===0)return;const i=l.findElement(t[0].id,n().map(u=>u.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([u,E])=>{const Q={browserValue:E.browserValue},m=E.spotColor;m&&(Q.spotColor={profileName:m.profileName,namedColor:m.namedColor}),s[u]=Q});for(const[u,E]of a.entries())o[u]={browserValue:E,spotColor:(w=o[u])==null?void 0:w.spotColor},s[u]={browserValue:E};let r=Array.from(Object.values(o)).map(u=>u.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(u=>{r=r.map(E=>{var Q;return E.toLowerCase()===((Q=u.color)==null?void 0:Q.toLowerCase())?u.name:E})})),A.updateMetadata(e.stepName,{colors:r});const B=new Map;if(Object.entries(o).forEach(([u,E])=>{B.set(u,E.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const d=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(u=>u.id),B);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(d)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a,i){var m;if(!e.data||!e.data.regions)throw new ge(e,"Missing regions.");n(!0);const o=A.map(D=>new l.DeleteElementCommand(D.id));e.mandatory&&a.setMandatoryFulfilled(e.stepName,!1);const s=t.asset;if(!s)throw new W(t);const r=s.fileLink;if(!r)throw new Z(s);const g=await l.generateSVGWithUnknownColors(await this.getIllustrationBody(r)),B=await l.svgObjectURL(g.svg),d=D=>{const I=a.getLayouts().find(p=>p.panelId===D.panelId);if(!I)throw new J(D);const f=l.generate();return{regionElement:{id:f,region:D},command:this.getCreateElementCommand(f,D,I,{stepName:e.stepName,src:r,objectURL:B,svg:g})}},w=e.data.regions.map(d),u=[...w.map(D=>D.command),...o];let E=Array.from(Object.values(g.colors)).map(D=>D.browserValue);const Q=e.data.colorOption;return Q&&((m=Q.variants)==null||m.forEach(D=>{E=E.map(I=>{var f;return I.toLowerCase()===((f=D.color)==null?void 0:f.toLowerCase())?D.name:I})})),a.updateMetadata(e.stepName,{colors:E}),{command:new l.GroupCommand(u),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],w.map(f=>f.regionElement),async()=>{i||a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const D=await this.availableColors(e,a)||[],I=Object.keys(g.colors);if(e.data.colorPickerEnabled&&D.length===1&&I.length===1){const f=D[0],p=I[0];await this.changeColors(e,w.map(F=>F.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[p,f.variant.color]]))}}}}}const Ee=new $A;class _A{async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{},!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(!s)throw new ce(e);if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=B.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],w,async()=>{const h=t.getModelContainer();if(h){const u=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",d||{}));Promise.all(u).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n,a){const i=A.getModelContainer();n(!0);const o=t.material;if(!o)throw n(!1),new W(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{i&&e.data.targetMaterials.forEach(s=>{e.option&&i.applyMaterialVariant(s,e.option.id||"",o)}),a||A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const be=new _A;class en{async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{},!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const u=(h=B.asset)==null?void 0:h.fileLink;if(!u)throw new W(B);await w.applyModelVariant(e.stepName||"",{model:u,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n,a){var o;n(!0);const i=(o=t.asset)==null?void 0:o.fileLink;if(!i)throw new W(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const s=A.getModelContainer();s&&await s.applyModelVariant(e.stepName,{model:i,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),a||A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Je=new en;class tn{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,g;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=n==null?void 0:n.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var g;const i=A.getRegionElements(e.stepName),o=(g=A.getStepSpecificServices(e.stepName))==null?void 0:g.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(B,d,w)=>{const h=w||l.generate(),E=A.getLayouts().find(m=>m.panelId===d.panelId);if(!E)return console.error(`Can not find layout for region: ${d.panelId}`),null;const Q=[];return w&&Q.push(new l.DeleteElementCommand(h)),Q.push(new l.CreateElementCommand({stepRegion:d,stepName:e.stepName,colors:{},id:h,svg:B,type:l.LayoutElementType.Illustration,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable},E)),{id:h,region:d,command:new l.GroupCommand(Q)}};if(i.length>0){const d=i.map(w=>{if(!w.region)return null;const h=o.svgPrint(t,w.region);return r(h,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new l.GroupCommand(d),followup:async()=>{}}}else{const B=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),d=B.filter(w=>!!w).map(w=>w&&w.command);return{command:new l.GroupCommand(d),followup:async()=>{const w=B.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=He.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const xt=new tn;class An{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{},!0);return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){console.log(`setting picture step ${e.stepName} to variant ${t.id} (${t.name})`);const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n,a){const i=t.asset;if(!i)throw new W(t);const o=i==null?void 0:i.fileLink;if(!o)return console.error("No URL for picture!"),null;n(!0),e.mandatory&&A.setMandatoryFulfilled(e.stepName,!1);const r=A.getRegionElements(e.stepName).map(d=>new l.DeleteElementCommand(d.id)),g=d=>{const h=A.getLayouts().find(E=>E.panelId===d.panelId);if(!h)throw new J(d);const u=l.generate();return{regionElement:{id:u,region:d},command:new l.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:u,src:o,type:l.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},h)}},B=e.data.regions.map(g);return{command:new l.GroupCommand([...r,...B.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],B.map(d=>d.regionElement),async()=>{a||A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const Te=new An;class nn{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t,!0)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,n){const a=e.option;if(!a)return null;const i=a.variants;if(!i)return null;const o=i.length>1?i.find(s=>s.id===t):i[0];if(!o)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[o],[],async()=>{n||A.setMandatoryFulfilled(e.stepName,!0)})}}}}const Oe=new nn;class an{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new J(s);return new l.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new l.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,g;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((g=t.variant)!=null&&g.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=B=>{const d=B.region;if(!a.find(u=>u.panelId===(d==null?void 0:d.panelId)))throw new J(d);const h=o();return new l.IllustrationColorCommand(B.id,this.shapeFillId,h)},g=A.map(r).filter(B=>!!B);return{command:new l.GroupCommand(g),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=a.find(D=>D.panelId===w.panelId);if(!h)throw new J(w);const u=o(),E=`
|
|
652
|
+
`,we=[l.StepType.SilentIllustration,l.StepType.ProductOverlay],KA=async c=>{const e=[];c.introduction&&e.push({name:"Introduction",title:c.name,renderableSteps:[{type:l.StepType.Introduction,stepName:"Introduction",stepTitle:c.name,helpText:c.introduction,data:{},conditions:[]}],silentSteps:[]});for(const A of c.steps){const n=VA(A.stepName,c.stepGroups);if(!n)e.push({name:A.stepName,title:A.stepTitle,renderableSteps:we.includes(A.type)?[]:[A],silentSteps:we.includes(A.type)?[A]:[]});else{const a=e.find(i=>i.name===n.name);a?we.includes(A.type)?a.silentSteps.push(A):a.renderableSteps.push(A):e.push({name:n.name,title:n.name,renderableSteps:we.includes(A.type)?[]:[A],silentSteps:we.includes(A.type)?[A]:[]})}}const t="workflow.steps.finish.confirmDesign";return e.push({name:"Finish",title:t,renderableSteps:[{type:l.StepType.Finish,stepName:"Finish",stepTitle:t,helpText:"",data:{modelAnimation:c.finalizeStepConfig?c.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:c.finalizeStepConfig?c.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),e},VA=(c,e)=>e.find(t=>t.stepNames.includes(c)),Ae=(c,e)=>(c.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}),WA=(c,e)=>{const t={name:c.name,title:c.title,renderableSteps:c.renderableSteps.filter(A=>Ae(A,e)),silentSteps:c.silentSteps.filter(A=>Ae(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},ne=(c,e)=>c.map(t=>WA(t,e)).filter(t=>t!==null),XA=async(c,e,t=!1)=>{var i;const A=ne(c,e),n=[];for(const o of A)for(const s of o.renderableSteps){const r=(((i=s.option)==null?void 0:i.variants)||[]).length;s.silent||(s.type===l.StepType.Model||s.type===l.StepType.Material||s.type===l.StepType.Picture||s.type===l.StepType.Shape?(r>1||t)&&n.push(s.stepName):n.push(s.stepName))}const a=A.filter(o=>o.renderableSteps.filter(r=>n.includes(r.stepName)).length>0);for(const o of a)o.renderableSteps=o.renderableSteps.filter(s=>n.includes(s.stepName));return a};class Ge{constructor(){this.timestamp=Date.now()}}class ke{constructor(e,t=!0){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e,this.isEnabled=t}enqueue(e){if(console.log("enqueueing"),console.trace(),this.queue.push(e),this.queueMaxSize!==void 0&&this.queue.length>this.queueMaxSize){const t=this.queue.length-1;for(let A=0;A<t;++A)this.queue.shift()}this.isEnabled&&(this.activePromise||(this.activePromise=this.dequeue()))}get enabled(){return this.isEnabled}set enabled(e){!this.isEnabled&&e&&!this.activePromise&&(this.activePromise=this.dequeue()),this.isEnabled=e}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async dequeue(){console.log("dequeueing"),console.trace();const e=this.queue.shift();if(!e){this.activePromise=void 0;return}try{await e.execute()}catch(t){console.log(t)}finally{await this.dequeue()}}}function Ft(c,e,t,A){const n=t.width*c.zoom,a=t.height*c.zoom;if(A){const o=c,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,c.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=Fe(c.x,e.width-r,0),o.y=Fe(c.y,e.height-g,0),o}const i=c;return i.x=Fe(i.x,-n,e.width),i.y=Fe(i.y,-a,e.height),i}function Fe(c,e,t){return Math.min(Math.max(c,e),t)}class Mt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=ot(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e,this.thresholdSettings={useThreshold:!1,invertThreshold:!1,threshold:128,thresholdSaturation:.5}}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const n=A;if(n.currentFrameSources){let a=!1;for(let i=0;i<n.currentFrameSources.length;i++){const o=n.currentFrameSources[i],s=await l.getFrameData(o);st(s,this.frameData)||(this.frameData||(this.frameData=new Array(n.currentFrameSources.length)),this.frameData[i]=s,a=!0)}a&&(this.onFrameDataChangeListeners.forEach(i=>i(this.frameData)),this.frameData&&this.imageData&&(this.recalculateOffsets(this.imageData),this.updateOffsets(this.offsets),this.recalculateZoomLimits(this.imageData,this.frameData)))}}},t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}setFrameData(e){if(!e){this.frameData=void 0;return}e.forEach((t,A)=>{const n=l.frameDataCache.get(t);n&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=n)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,n){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const a=this.frameData.map((i,o)=>{const s=(t[o]-this.offsets[o].x)/this.offsets[o].zoom,r=(A[o]-this.offsets[o].y)/this.offsets[o].zoom,g=t[o]-s*e[o],B=A[o]-r*e[o];return{x:g,y:B,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(a,n),this.onZoomChangeListeners.forEach(i=>i(e))}}setPatternData(e){this.imageData=e,e&&this.frameData&&(this.recalculateOffsets(e),this.updateOffsets(this.offsets,void 0,!0)),this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t,A){const n=this.imageData;if(!n||!this.frameData)return;if(this.frameData.length!==e.length)throw new k("Frame data and offsets are not the same length. This is a bug. Please report it.");if(!this.offsets.some((i,o)=>!(e[o].x===i.x&&e[o].y===i.y&&e[o].zoom===i.zoom))&&!A){t&&t();return}(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((i,o)=>{this.offsets[o]=Ft(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,n,this.frameData,this.thresholdSettings,this.targetElements,t)}getThresholdSettings(){return this.thresholdSettings}setThresholdSettings(e){this.thresholdSettings=e,this.imageData&&this.frameData&&this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,e,this.targetElements)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,n,a,i){if(!A||A.length===0||A.some(s=>!s))throw new k("Frame data not set. This is a bug");if(!this.workflowManager)throw new k("No workflow manager set, cannot update offsets.");const o=this.workflowManager.getCommandDispatcher();a.forEach((s,r)=>{o(new l.GroupCommand([new l.UpdateFramePattern(s,t,e[r]),new l.UpdateFrameThresholdSettingsCommand(s,n.useThreshold,n.invertThreshold,n.threshold,n.thresholdSaturation)]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),i&&i()}recalculateZoomLimits(e,t){(this.minZoomScale.length!==t.length||this.maxZoomScale.length!==t.length)&&(this.minZoomScale=new Array(t.length),this.maxZoomScale=new Array(t.length)),t.forEach((A,n)=>{const a=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[n]=a,this.maxZoomScale[n]=a*2.5):(this.minZoomScale[n]=a/10,this.maxZoomScale[n]=a*2.5)})}recalculateOffsets(e){this.frameData&&((!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length)),this.frameData.forEach((t,A)=>{this.offsets[A]=l.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.thresholdSettings,this.targetElements))}}class yt{constructor(e,t,A){this.processRegion=async n=>{var s,r,g,B;const a=this.layouts.find(d=>d.panelId===n.panelId);if(!a)throw new J(n);let i="";if(this.configuration.type===l.StepType.ProductOverlay){let d="";if((s=this.product)!=null&&s.overlayImageUrl&&(d=this.product.overlayImageUrl),i=d,!d)throw new ge(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===l.LayoutElementType.Image){const d=this.configuration.type===l.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!d)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:l.generate(),src:d,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,immutable:n.immutable,productOverlay:this.configuration.type===l.StepType.ProductOverlay?!0:void 0,rotation:n.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:n},command:new l.CreateElementCommand(w,a)}}else{const d=this.configuration.type===l.StepType.SilentIllustration?(B=this.configuration.data.asset)==null?void 0:B.fileLink:i,w=async()=>new Promise((E,Q)=>{if(!d){Q("Undefined vector silent step source");return}l.fetchAsString(d,!0).then(m=>{E(m)}).catch(m=>console.error(m))}),h=await l.generateSVGWithUnknownColors(await w()),u={stepName:this.configuration.stepName,id:l.generate(),cachedObjectURL:await l.svgObjectURL(h.svg),src:d,svg:h.svg,colors:h.colors,type:o,y:n.top,x:n.left,width:n.width,height:n.height,layer:n.layer,layerIndex:n.layerIndex,rotation:n.rotation,immutable:n.immutable,productOverlay:this.configuration.type===l.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:u.id,region:n},command:new l.CreateElementCommand(u,a)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ge(this.configuration,"Missing regions.");if(this.configuration.type===l.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===l.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new J(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,n;const e=this.configuration.type===l.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(n=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:n.toLowerCase().split("?")[0];return e!=null&&e.startsWith("data:image/png")||e!=null&&e.endsWith(".jpeg")||e!=null&&e.endsWith(".jpg")||e!=null&&e.endsWith(".png")?l.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),l.LayoutElementType.Illustration)}}const St=async c=>{const e=`${X.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:c}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ie("Failed to shorten URL, see console.")}};class Yt{async poll(){try{if(await this.predicate()){this.onSuccess(),this.pollingId>-1&&window.clearInterval(this.pollingId);return}}catch{}this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,A,n=3e3,a=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=n,this.maxAttempts=a,this.poll()}}class qA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var B,d;const r=(B=n==null?void 0:n.storage)==null?void 0:B.videoShortUrl,g=(d=n==null?void 0:n.storage)==null?void 0:d.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,n,a,i,o,s,r){if(!t&&A!==""&&n===""){const g=async()=>{var I,f;const m=(await wt([A]))[0],D=(f=(I=m==null?void 0:m.versions)==null?void 0:I.find(p=>p.name==="mpeg4"))==null?void 0:f.link;return{asset:m,link:D}},B=await new Promise((m,D)=>{new Yt(async()=>!!(await g()).link,async()=>{const I=await g();if(!I.link||!I.link)throw new Z(I.asset);m({rel:"mpeg4",href:I.link})},()=>{D("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(m=>s(new l.DeleteElementCommand(m.id)));const d=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(d+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([B]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const h=w.toString();if(h.length>=2e3)throw new Ie("Cannot create QR code, URL too long.");const u=await St(h);if(o(u),!i.data||!i.data.regions)throw new ge(i,"Missing regions.");const E=await this.regionElements(i),Q=await this.command(u,E,a,i.stepName);Q&&(Q.command&&a.getCommandDispatcher()(Q.command),Q.followup&&await Q.followup()),await a.setSelectionsAndElements(i.stepName,[],E,async()=>{a.updateStorage(i.stepName,{videoShortUrl:u,videoUrl:n}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:l.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,n){const a=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await rt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,B=a.find(d=>d.panelId===(g==null?void 0:g.panelId));if(!B&&g)throw new J(g);if(B&&!g)throw new Error("Region not found");if(!B||!g)throw new Error("Neither a region or layout found!");return new l.CreateElementCommand({stepRegion:g,stepName:n,id:r.id,src:o,type:l.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},B)});return{command:new l.GroupCommand(s),followup:async()=>{}}}}const Pt=new qA;class ZA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return l.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new W(e);const n=A.fileLink;if(n)return l.fetchAsString(n,!0);throw new Z(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(e.mandatory&&t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const n=e.option,a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageUrl):null}return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageUrl)}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName).map(g=>({id:g.id,region:g.stepRegion}));if(!e.option||(e.option.variants||[]).length===0){const g=e.data.regions.map(B=>l.generateDefaultRectangleFrameSvg(B));t.updateStorage(e.stepName,{currentFrameSources:g})}if(n){const g=async()=>{var w,h,u,E;const B=(w=n.storage)==null?void 0:w.framePatternSrc,d=(h=n.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:d,framePatternSrc:B}),B){const Q=(u=t.getStepSpecificServices(e.stepName))==null?void 0:u.frameService;if(!Q)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(B,Q),t.updateMetadata(e.stepName,{image:B}),t.updateStorage(e.stepName,{framePatternSrc:B})}if(d!=null&&d.some(Q=>Q.zoom)){const Q=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!Q)throw new Error("Frame service unavailable, cannot load pattern!");Q.updateOffsets(d)}t.setMandatoryFulfilled(e.stepName,!0)};if(n.selectedVariants&&n.selectedVariants.length>0){const B=n.selectedVariants[0].id;if(e.option&&B){const d=(r=e.option.variants)==null?void 0:r.find(w=>w.id===B);d&&await t.setSelectionsAndElements(e.stepName,[d],s,async()=>{const w=await Promise.all(e.data.regions.map(h=>this.frameSourceSvg(d,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){return A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?new Promise(a=>{A.addPoller(new Yt(async()=>{var r;const o=(r=(await G.getLocalOrFromServer(t.key||"")).versions)==null?void 0:r.find(g=>g.name==="svg");return o?(await fetch(o.link)).status===200:!1},()=>{G.getLocalOrFromServer(t.key||"").then(i=>{this.loadPatternFromAsset(i,e,A).then(a)})},()=>{throw new Ie("Failed to resolve transcoded PDF")}))}):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,n){return new l.CreateElementCommand({id:e,type:l.LayoutElementType.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,dataWidth:n.frameData.width,dataHeight:n.frameData.height,stepRegion:t,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await l.GetSVGDimensions(e),n=A.width,a=A.height,i={src:e,width:n,height:a,aspect:n/a};l.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await l.fetchAsArrayBuffer(e,!0),n=await l.getAttributesFromArrayBuffer(A),a={src:e,width:n.width,height:n.height,aspect:n.width/n.height};l.patternImageDataCache.set(e,a),t.setPatternData(a)}}async selectVariantCommand(e,t,A,n,a,i){var d;const o=(d=n.getStepSpecificServices(e.stepName))==null?void 0:d.frameService;if(!o)throw new Error("Frame service unavailable, cannot load pattern!");const s=await Promise.all(e.data.regions.map(w=>this.frameSourceSvg(t,w)));a&&a(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const u=await l.getFrameData(s[h]),E=o.getImageData(),Q=A.map(F=>new l.DeleteElementCommand(F.id)),m=E?l.calculateOffsets(E,u):void 0,D=E?{id:l.generate(),src:E.src,x:(m==null?void 0:m.x)||0,y:(m==null?void 0:m.y)||0,width:E.width,height:E.height,scaleX:(m==null?void 0:m.zoom)||1,scaleY:(m==null?void 0:m.zoom)||1,rotation:0}:void 0,I=l.generate(),p=n.getLayouts().find(F=>F.panelId===w.panelId);if(!p)throw new J(w);return{command:this.getCreateElementCommand(I,w,p,{frameData:u,pattern:D,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:I,region:w},removeExistingCommands:Q}})),g=r.map(w=>w.command),B=r.map(w=>w.removeExistingCommands).flat();return{command:new l.GroupCommand([...g,...B]),followup:async()=>{a&&a(!1),await n.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(n.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=n.getStepSpecificServices(e.stepName))==null?void 0:w.frameService;if(!h)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(i,h)}})}}}patternSource(e){var n;const t=(n=e.versions)==null?void 0:n.find(a=>a.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new Z(e)}async loadPatternFromAsset(e,t,A){var o;const n=this.patternSource(e),a=A.markUpdatePending(),i=(o=A.getStepSpecificServices(t.stepName))==null?void 0:o.frameService;if(!i)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(n,i),A.updateMetadata(t.stepName,{image:n}),A.updateStorage(t.stepName,{framePatternSrc:n}),A.markUpdateCompleted(a)}}const he=new ZA;class $A{async getIllustrationBody(e){return new Promise(t=>{l.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,n){return new l.CreateElementCommand({stepRegion:t,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:l.LayoutElementType.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},A)}getColors(e,t){const A=t.getRegionElements(e.stepName)||[];if(A.length===0)return[];try{return l.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const n=e.option;if(!n)return null;if(A)return this.reload(e,t,A);{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantCommand(e,a,[],()=>{},t,!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=n.storage)==null?void 0:w.colors}),t.setMandatoryFulfilled(e.stepName,!0)})}}else throw new Error("Required illustration variant no longer available")}return null}async availableColors(e,t){var n;const A=e.data.colorOption;return A?A?(n=A.variants)==null?void 0:n.map(a=>({fill:a.color,stroke:a.color,variant:a})):[]:[]}async changeColorsCommand(e,t,A,n,a){var g;const i={};for(const[B,d]of a.entries())i[B]={browserValue:d,spotColor:(g=i[B])==null?void 0:g.spotColor};const o=l.modifySVGWithElementProperties(e,t,A,i),s=await l.svgObjectURL(o),r=[];for(const B of n){for(const[d,w]of a.entries())r.push(new l.IllustrationColorCommand(B,d,w));r.push(new l.IllustrationCacheCommand(B,o,s))}return new l.GroupCommand(r)}async changeColors(e,t,A,n,a){var w,h;if(t.length===0)return;const i=l.findElement(t[0].id,n().map(u=>u.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([u,E])=>{const Q={browserValue:E.browserValue},m=E.spotColor;m&&(Q.spotColor={profileName:m.profileName,namedColor:m.namedColor}),s[u]=Q});for(const[u,E]of a.entries())o[u]={browserValue:E,spotColor:(w=o[u])==null?void 0:w.spotColor},s[u]={browserValue:E};let r=Array.from(Object.values(o)).map(u=>u.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(u=>{r=r.map(E=>{var Q;return E.toLowerCase()===((Q=u.color)==null?void 0:Q.toLowerCase())?u.name:E})})),A.updateMetadata(e.stepName,{colors:r});const B=new Map;if(Object.entries(o).forEach(([u,E])=>{B.set(u,E.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const d=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(u=>u.id),B);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(d)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A,n,a);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,n,a,i){var m;if(!e.data||!e.data.regions)throw new ge(e,"Missing regions.");n(!0);const o=A.map(D=>new l.DeleteElementCommand(D.id));e.mandatory&&a.setMandatoryFulfilled(e.stepName,!1);const s=t.asset;if(!s)throw new W(t);const r=s.fileLink;if(!r)throw new Z(s);const g=await l.generateSVGWithUnknownColors(await this.getIllustrationBody(r)),B=await l.svgObjectURL(g.svg),d=D=>{const I=a.getLayouts().find(p=>p.panelId===D.panelId);if(!I)throw new J(D);const f=l.generate();return{regionElement:{id:f,region:D},command:this.getCreateElementCommand(f,D,I,{stepName:e.stepName,src:r,objectURL:B,svg:g})}},w=e.data.regions.map(d),u=[...w.map(D=>D.command),...o];let E=Array.from(Object.values(g.colors)).map(D=>D.browserValue);const Q=e.data.colorOption;return Q&&((m=Q.variants)==null||m.forEach(D=>{E=E.map(I=>{var f;return I.toLowerCase()===((f=D.color)==null?void 0:f.toLowerCase())?D.name:I})})),a.updateMetadata(e.stepName,{colors:E}),{command:new l.GroupCommand(u),followup:async()=>{await a.setSelectionsAndElements(e.stepName,[t],w.map(f=>f.regionElement),async()=>{i||a.setMandatoryFulfilled(e.stepName,!0),n(!1)});const D=await this.availableColors(e,a)||[],I=Object.keys(g.colors);if(e.data.colorPickerEnabled&&D.length===1&&I.length===1){const f=D[0],p=I[0];await this.changeColors(e,w.map(F=>F.regionElement),a,()=>a.getCommandContext().getAllLayouts(),new Map([[p,f.variant.color]]))}}}}}const Ee=new $A;class _A{async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{},!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(!s)throw new ce(e);if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=B.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],w,async()=>{const h=t.getModelContainer();if(h){const u=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",d||{}));Promise.all(u).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n,a){const i=A.getModelContainer();n(!0);const o=t.material;if(!o)throw n(!1),new W(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{i&&e.data.targetMaterials.forEach(s=>{e.option&&i.applyMaterialVariant(s,e.option.id||"",o)}),a||A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const be=new _A;class en{async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);if(a)return await this.selectVariantLambda(e,a,t,()=>{},!0)}return null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const u=(h=B.asset)==null?void 0:h.fileLink;if(!u)throw new W(B);await w.applyModelVariant(e.stepName||"",{model:u,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,n){const a=await this.selectVariantLambda(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A,n,a){var o;n(!0);const i=(o=t.asset)==null?void 0:o.fileLink;if(!i)throw new W(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const s=A.getModelContainer();s&&await s.applyModelVariant(e.stepName,{model:i,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),a||A.setMandatoryFulfilled(e.stepName,!0)}finally{n(!1)}})}}}}const Je=new en;class tn{async init(e,t,A){if(A)await this.reload(e,t,A);else return t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",()=>{});return null}async reload(e,t,A){const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),s=Object.values(A.layouts).map(r=>r.elements).flat().filter(r=>r.stepName===e.stepName).map(r=>({id:r.id,region:r.stepRegion}));await t.setSelectionsAndElements(e.stepName,[],s,async()=>{var r,g;t.updateStorage(e.stepName,{text:(r=n==null?void 0:n.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=n==null?void 0:n.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,n,a){const i=await this.changeTextCommand(e,t,A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,n,a){var g;const i=A.getRegionElements(e.stepName),o=(g=A.getStepSpecificServices(e.stepName))==null?void 0:g.module;if(!o)return console.error("Missing module."),null;const s=A.getProfanities();if(!this.validateInput(e,t,s,a))return A.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(A.setMandatoryFulfilled(e.stepName,t!==""),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;A.updateStorage(e.stepName,{text:t});const r=(B,d,w)=>{const h=w||l.generate(),E=A.getLayouts().find(m=>m.panelId===d.panelId);if(!E)return console.error(`Can not find layout for region: ${d.panelId}`),null;const Q=[];return w&&Q.push(new l.DeleteElementCommand(h)),Q.push(new l.CreateElementCommand({stepRegion:d,stepName:e.stepName,colors:{},id:h,svg:B,type:l.LayoutElementType.Illustration,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable},E)),{id:h,region:d,command:new l.GroupCommand(Q)}};if(i.length>0){const d=i.map(w=>{if(!w.region)return null;const h=o.svgPrint(t,w.region);return r(h,w.region,w.id)}).filter(w=>!!w).filter(w=>!!w).map(w=>w&&w.command);return{command:new l.GroupCommand(d),followup:async()=>{}}}else{const B=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),d=B.filter(w=>!!w).map(w=>w&&w.command);return{command:new l.GroupCommand(d),followup:async()=>{const w=B.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,n){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return n("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return n("Unsupported characters."),!1;const a=He.split(t.toLowerCase());for(const i of a)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return n("Blocked profanity."),!1}return n(""),!0}}const xt=new tn;class An{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else if(n.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n.defaultVariant,t,()=>{},!0);return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,n){console.log(`setting picture step ${e.stepName} to variant ${t.id} (${t.name})`);const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantCommand(e,t,A,n,a){const i=t.asset;if(!i)throw new W(t);const o=i==null?void 0:i.fileLink;if(!o)return console.error("No URL for picture!"),null;n(!0),e.mandatory&&A.setMandatoryFulfilled(e.stepName,!1);const r=A.getRegionElements(e.stepName).map(d=>new l.DeleteElementCommand(d.id)),g=d=>{const h=A.getLayouts().find(E=>E.panelId===d.panelId);if(!h)throw new J(d);const u=l.generate();return{regionElement:{id:u,region:d},command:new l.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:u,src:o,type:l.LayoutElementType.Image,y:d.top,x:d.left,rotation:d.rotation,width:d.width,height:d.height,layer:d.layer,layerIndex:d.layerIndex,immutable:d.immutable,preserveAspectRatio:"none"},h)}},B=e.data.regions.map(g);return{command:new l.GroupCommand([...r,...B.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],B.map(d=>d.regionElement),async()=>{a||A.setMandatoryFulfilled(e.stepName,!0),n(!1)})}}}}const Te=new An;class nn{async init(e,t,A){const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const a=n.variants;if(L.getDefaultVariant(n)){const o=a==null?void 0:a.find(s=>{var r;return s.id===((r=n.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t,!0)}}return null}async reload(e,t,A){var i;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),a=e.option;if(n!=null&&n.selectedVariants){const o=n.selectedVariants[0].id;if(a&&o){const s=(i=a.variants)==null?void 0:i.find(r=>r.id===o);s&&await t.setSelectionsAndElements(e.stepName,[s],[])}}}async selectVariant(e,t,A){await A.getInitializationPromise();const n=await this.selectVariantLambda(e,t,A);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,n){const a=e.option;if(!a)return null;const i=a.variants;if(!i)return null;const o=i.length>1?i.find(s=>s.id===t):i[0];if(!o)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[o],[],async()=>{n||A.setMandatoryFulfilled(e.stepName,!0)})}}}}const Oe=new nn;class an{constructor(){this.shapeFillId="spiff-fill-shape"}async availableColours(e){var A;const t=e.option;return t?((A=t.variants)==null?void 0:A.map(n=>({fill:n.color,stroke:n.color,variant:n})))||[]:[]}setCustomColor(e,t,A){const n=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!n.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new J(s);return new l.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new l.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const n=e.option;if(!n)throw new ce(e);if(A)await this.reload(e,t,A);else{const a=L.getDefaultVariant(n);return a?this.selectVariantCommand(e,{fill:a.color,stroke:a.color,variant:a},[],t):null}return null}async selectVariant(e,t,A,n){const a=await this.selectVariantCommand(e,t,A,n);a&&(a.command&&n.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async reload(e,t,A){var r;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(g=>g.elements).flat().filter(g=>g.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const g=n.selectedVariants[0].id;if(s&&g){const B=(r=s.variants)==null?void 0:r.find(d=>d.id===g);if(B){const d=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[B],d,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=n==null?void 0:n.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,n){var s;const a=n.getLayouts(),i=(s=n.getStepStorage(e.stepName))==null?void 0:s.colour,o=()=>{var r,g;if(((r=t.variant)==null?void 0:r.color)==="#custom")return i||"#FFFFFF";if((g=t.variant)!=null&&g.color)return t.variant.color;throw new Error("Failed to resolve color for shape step.")};if(A.length>0){const r=B=>{const d=B.region;if(!a.find(u=>u.panelId===(d==null?void 0:d.panelId)))throw new J(d);const h=o();return new l.IllustrationColorCommand(B.id,this.shapeFillId,h)},g=A.map(r).filter(B=>!!B);return{command:new l.GroupCommand(g),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),n.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=a.find(D=>D.panelId===w.panelId);if(!h)throw new J(w);const u=o(),E=`
|
|
653
653
|
<svg
|
|
654
654
|
xmlns="http://www.w3.org/2000/svg"
|
|
655
655
|
xmlnsXlink="http://www.w3.org/1999/xlink"
|
|
@@ -2037,7 +2037,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
|
|
|
2037
2037
|
/>
|
|
2038
2038
|
</svg>
|
|
2039
2039
|
`,h={"spiff-fill-shape":{browserValue:i.color||"#000000"}},u=l.generate();return new l.CreateElementCommand({colors:h,id:u,svg:d,type:l.LayoutElementType.Illustration,y:g.top,x:g.left,rotation:g.rotation,width:g.width,height:g.height,layer:g.layer,layerIndex:g.layerIndex,immutable:g.immutable},B)},s=A.data.regions;try{return s.map(o)}catch(g){return console.error(g),[]}},Gn=async(c,e,t)=>{const A=[],a=(()=>{var r,g;return e.type===l.StepType.ProductOverlay?t||((r=e.data.asset)==null?void 0:r.fileLink)||"":((g=e.data.asset)==null?void 0:g.fileLink)||""})(),o=(()=>a.endsWith(".jpeg")||a.endsWith(".jpg")||a.endsWith(".png")?l.LayoutElementType.Image:(a.endsWith(".svg"),l.LayoutElementType.Illustration))(),s=e.data.regions;if(o==="image")try{s.forEach(r=>{const g=c.find(d=>d.panelId===r.panelId);if(!g)throw new J(r);const B={id:l.generate(),src:a,type:o,y:r.top,x:r.left,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,productOverlay:e.type===l.StepType.ProductOverlay?!0:void 0,scaleX:1,scaleY:1,rotation:r.rotation,excludeFromExport:e.data.excludeFromPrint,preserveAspectRatio:"none"};A.push(new l.CreateElementCommand(B,g))})}catch(r){console.error(r)}else{const r=await l.fetchAsString(a,!0),g=B=>{const d=/<svg.*?<\/svg>/s,w=B.match(d)||[],h=(w==null?void 0:w.length)>0?w[0]:"",Q=l.domParser().parseFromString(h,"image/svg+xml").firstElementChild;if(!Q)throw new $("Failed to read SVG.");return l.sanitizeSvgTree(Q),l.xmlSerializer().serializeToString(Q)};s.forEach(B=>{const d=c.find(h=>h.panelId===B.panelId);if(!d)throw new J(B);const w={id:l.generate(),src:a,asset_key:a,svg:g(r),colors:{},type:o,y:B.top,x:B.left,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,scaleX:1,scaleY:1,rotation:B.rotation,productOverlay:e.type===l.StepType.ProductOverlay?!0:void 0,excludeFromExport:e.data.excludeFromPrint};A.push(new l.CreateElementCommand(w,d))})}return A},kn=async(c,e,t,A)=>{const n=[],a=t.data,i=30,o=E=>E.vertical?"center":E.textAlign||"center",s=()=>{var D;const E=A.option;if(!E)return;const Q=((D=E.variants)==null?void 0:D.find(I=>I.id===a.fontVariantId))||l.getDefaultVariant(E);if(!Q||!Q.asset)return;e[A.stepName]={selectedVariants:[Q]};const m=Q.asset.fileLink;if(m)return m},g=await(async()=>{const E=s();if(!E)return;const Q=await l.loadFont(E);return{assetUrl:E,name:Q.names.fullName.en}})(),B=(A.data.replaceableText?A.data.replaceableText.replace("{{}}",a.text):a.text)||"",d=l.applyTextTransformations(B,{vertical:A.data.vertical,uppercase:A.data.uppercase}),w=async E=>{const Q=E.colorOption;if(!Q)return;const m=L.getDefaultVariant(Q);return m==null?void 0:m.color},h=a.color||await w(A.data),u=A.data.regions;for(const E of u){const Q=c.find(D=>D.panelId===E.panelId);if(!Q)continue;const m={stepName:t.name,id:l.generate(),align:o(A.data),curved:A.data.curved,fill:a.color||h||"#000000",fontData:g,fontSize:A.data.size||i,height:E.height,layer:E.layer,layerIndex:E.layerIndex,paths:A.data.paths,rotation:E.rotation,text:d,type:l.LayoutElementType.Textbox,vertical:A.data.vertical,verticalAlign:A.data.verticalAlign||"middle",width:E.width,x:E.left,y:E.top};if(g){const[D,I]=l.determineCorrectFontSizeAndLines(A.data.size||i,g,E,[l.applyTextTransformations(d,{vertical:A.data.vertical,uppercase:A.data.uppercase})],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});n.push(new l.CreateElementCommand({...m,fontSize:D,text:m.curved?m.text:(I||[]).join(`
|
|
2040
|
-
`)},Q))}else n.push(new l.CreateElementCommand(m,Q))}return n},bn=(c,e)=>c.conditions?c.conditions.every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}):!0,eA=async(c,e,t,A)=>{const n=[],a={};for(const i of c){const o=e.steps.find(s=>s.stepName===i.name);if(o)switch(o.type){case l.StepType.DigitalContent:n.push(...await xn(t,i,o));break;case l.StepType.Frame:case l.StepType.Photo:n.push(...await Nn(t,a,i,o));break;case l.StepType.Illustration:n.push(...await Hn(t,a,i,o));break;case l.StepType.Module:n.push(...await Rn(t,i,o));break;case l.StepType.Picture:n.push(...await Un(t,a,i,o));break;case l.StepType.Shape:n.push(...await vn(t,a,i,o));break;case l.StepType.Text:n.push(...await kn(t,a,i,o));break}}for(const i of e.steps)i.type!==l.StepType.SilentIllustration&&i.type!==l.StepType.ProductOverlay||bn(i,a)&&n.push(...await Gn(t,i,A));return n};class Pe{constructor(e){this.handleCompleteRender=null;const t=new Map;e.forEach(A=>t.set(A.id,new Tn(A.id,A.name,this))),this.layouts=t}setCompleteRenderCallback(e){this.handleCompleteRender=e,e(Array.from(this.layouts.values()))}onCompleteRender(){this.handleCompleteRender&&this.handleCompleteRender(Array.from(this.layouts.values()))}getAll(){return this.layouts}}const Jn=(()=>new Promise((c,e)=>{const A=l.createCanvas().getContext("webgl2");c(!!A)}))();class Tn{constructor(e,t,A){this.hasSetStaticContext=!1,this.interactiveDirty=!1,this.staticCtxDirty=!1,this.lastRequestedRenderArguments=void 0,this.lastCompletedStaticRender=void 0,this.lastModificationID=void 0,this.renderQueue=new ke(2),this.id=e,this.name=t,this.service=A}getID(){return this.id}getName(){return this.name}getStaticContext(){return this.textureCtx}setStaticContext(e){if(this.textureCtx=e,this.lastRequestedRenderArguments){const{workflow:t,layouts:A,productOverlayImageUrl:n}=this.lastRequestedRenderArguments;this.render(t,A,n)}}getStaticContextDirty(){return this.staticCtxDirty}setStaticContextDirty(e){this.staticCtxDirty=e}getInteractiveCanvasDirty(){return this.interactiveDirty}setInteractiveCanvasDirty(e){this.interactiveDirty=e}markLastCompletedStaticRender(){this.lastCompletedStaticRender=Date.now(),this.service.onCompleteRender()}getLastCompletedStaticRender(){return this.lastCompletedStaticRender}getLastModificationID(){return this.lastModificationID}async render(e,t,A){console.trace();const n=se(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,productOverlayImageUrl:A};const a=this.getStaticContext();if(!a){this.markLastCompletedStaticRender(),this.setStaticContextDirty(!1);return}this.renderQueue.enqueue(new On(this.getID(),a,await Jn,()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)},e,n,A))}}class On extends Ge{constructor(e,t,A,n,a,i,o){super(),this.layoutId=e,this.ctx=t,this.nonPOTSupport=A,this.onRender=n,this.workflow=a,this.layouts=i,this.productOverlayImageUrl=o}getDynamicTextureResolution(){return this.getIsMobile()||!this.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}getIsMobile(){return window.innerWidth<=480}offscreenRenderingSupported(){return navigator.userAgent.includes("SamsungBrowser")?!1:!!window.Worker&&!!window.OffscreenCanvas}resizeFit(e,t=4096){const A=t/e.width,n=t/e.height,a=Math.min(A,n);return a>1?e:{width:e.width*a,height:e.height*a}}async execute(){performance.mark("spiff-core-rqp-execute-start");const e=this.layouts.find(d=>d.layoutState.layout.id===this.layoutId);if(!e)return;const t=e.layoutState.elements||[],A=e.layoutState.layout.width,n=e.layoutState.layout.height,a=this.getDynamicTextureResolution().width,i=this.getDynamicTextureResolution().height;let o,s;if(this.nonPOTSupport){const d=a/i;A/n<d?(o=a,s=n*(a/A)):(o=A*(i/n),s=i);const h=this.resizeFit({width:o,height:s});o=h.width,s=h.height}else o=this.getDynamicTextureResolution().width,s=this.getDynamicTextureResolution().height;const r=l.getSvgElement(e.layoutState.layout,t,{renderingConfiguration:{purpose:l.LayoutRenderingPurpose.ThreeD}}),g=l.renderPapyrusComponentAsString(r),B=await it.Pith.from(this.ctx,g,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1,createCanvas:l.createCanvas,createImage:l.loadImage,DOMParser:l.getDomParser(),fetch:l.fetch});B.resize(o,s),await B.render(),this.onRender(),performance.mark("spiff-core-rqp-execute-end"),performance.measure("spiff-core-rqp-execute","spiff-core-rqp-execute-start","spiff-core-rqp-execute-end")}}const Ln=(c,e)=>{const t=[];return c.forEach(A=>{const n=e.steps.find(a=>a.stepName===A.stepName);(n==null?void 0:n.type)===l.StepType.Text&&A.stepAspectType==="Text"&&t.push({name:n.stepName,data:{text:A.value}})}),t},zn=async(c,e,t,A)=>{let n={serializableWorkflow:{steps:[]},layouts:{}};n=new l.GroupCommand(t.map(s=>new l.CreateLayoutCommand(s))).apply(n);const i=await eA(c,e,t,A);return new l.GroupCommand(i).apply(n)},jn=M.gql`
|
|
2040
|
+
`)},Q))}else n.push(new l.CreateElementCommand(m,Q))}return n},bn=(c,e)=>c.conditions?c.conditions.every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const n=A.selectedVariants;return t.requiredVariantSelections.some(a=>n.find(i=>i.id===a)!==void 0)}return!1}):!0,eA=async(c,e,t,A)=>{const n=[],a={};for(const i of c){const o=e.steps.find(s=>s.stepName===i.name);if(o)switch(o.type){case l.StepType.DigitalContent:n.push(...await xn(t,i,o));break;case l.StepType.Frame:case l.StepType.Photo:n.push(...await Nn(t,a,i,o));break;case l.StepType.Illustration:n.push(...await Hn(t,a,i,o));break;case l.StepType.Module:n.push(...await Rn(t,i,o));break;case l.StepType.Picture:n.push(...await Un(t,a,i,o));break;case l.StepType.Shape:n.push(...await vn(t,a,i,o));break;case l.StepType.Text:n.push(...await kn(t,a,i,o));break}}for(const i of e.steps)i.type!==l.StepType.SilentIllustration&&i.type!==l.StepType.ProductOverlay||bn(i,a)&&n.push(...await Gn(t,i,A));return n};class Pe{constructor(e){this.handleCompleteRender=null;const t=new Map;e.forEach(A=>t.set(A.id,new Tn(A.id,A.name,this))),this.layouts=t}setCompleteRenderCallback(e){this.handleCompleteRender=e,e(Array.from(this.layouts.values()))}onCompleteRender(){this.handleCompleteRender&&this.handleCompleteRender(Array.from(this.layouts.values()))}getAll(){return this.layouts}}const Jn=(()=>new Promise((c,e)=>{const A=l.createCanvas().getContext("webgl2");c(!!A)}))();class Tn{constructor(e,t,A){this.hasSetStaticContext=!1,this.interactiveDirty=!1,this.staticCtxDirty=!1,this.lastRequestedRenderArguments=void 0,this.lastCompletedStaticRender=void 0,this.lastModificationID=void 0,this.renderQueue=new ke(2),this.id=e,this.name=t,this.service=A}getID(){return this.id}getName(){return this.name}getStaticContext(){return this.textureCtx}setStaticContext(e){if(this.textureCtx=e,this.lastRequestedRenderArguments){const{workflow:t,layouts:A,productOverlayImageUrl:n}=this.lastRequestedRenderArguments;this.render(t,A,n)}}getStaticContextDirty(){return this.staticCtxDirty}setStaticContextDirty(e){this.staticCtxDirty=e}getInteractiveCanvasDirty(){return this.interactiveDirty}setInteractiveCanvasDirty(e){this.interactiveDirty=e}markLastCompletedStaticRender(){this.lastCompletedStaticRender=Date.now(),this.service.onCompleteRender()}getLastCompletedStaticRender(){return this.lastCompletedStaticRender}getLastModificationID(){return this.lastModificationID}async render(e,t,A){console.log("rendering"),console.trace();const n=se(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,productOverlayImageUrl:A};const a=this.getStaticContext();if(!a){this.markLastCompletedStaticRender(),this.setStaticContextDirty(!1);return}this.renderQueue.enqueue(new On(this.getID(),a,await Jn,()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)},e,n,A))}}class On extends Ge{constructor(e,t,A,n,a,i,o){super(),this.layoutId=e,this.ctx=t,this.nonPOTSupport=A,this.onRender=n,this.workflow=a,this.layouts=i,this.productOverlayImageUrl=o}getDynamicTextureResolution(){return this.getIsMobile()||!this.offscreenRenderingSupported()?{width:1024,height:1024}:{width:2048,height:2048}}getIsMobile(){return window.innerWidth<=480}offscreenRenderingSupported(){return navigator.userAgent.includes("SamsungBrowser")?!1:!!window.Worker&&!!window.OffscreenCanvas}resizeFit(e,t=4096){const A=t/e.width,n=t/e.height,a=Math.min(A,n);return a>1?e:{width:e.width*a,height:e.height*a}}async execute(){performance.mark("spiff-core-rqp-execute-start");const e=this.layouts.find(d=>d.layoutState.layout.id===this.layoutId);if(!e)return;const t=e.layoutState.elements||[],A=e.layoutState.layout.width,n=e.layoutState.layout.height,a=this.getDynamicTextureResolution().width,i=this.getDynamicTextureResolution().height;let o,s;if(this.nonPOTSupport){const d=a/i;A/n<d?(o=a,s=n*(a/A)):(o=A*(i/n),s=i);const h=this.resizeFit({width:o,height:s});o=h.width,s=h.height}else o=this.getDynamicTextureResolution().width,s=this.getDynamicTextureResolution().height;const r=l.getSvgElement(e.layoutState.layout,t,{renderingConfiguration:{purpose:l.LayoutRenderingPurpose.ThreeD}}),g=l.renderPapyrusComponentAsString(r),B=await it.Pith.from(this.ctx,g,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1,createCanvas:l.createCanvas,createImage:l.loadImage,DOMParser:l.getDomParser(),fetch:l.fetch});B.resize(o,s),await B.render(),this.onRender(),performance.mark("spiff-core-rqp-execute-end"),performance.measure("spiff-core-rqp-execute","spiff-core-rqp-execute-start","spiff-core-rqp-execute-end")}}const Ln=(c,e)=>{const t=[];return c.forEach(A=>{const n=e.steps.find(a=>a.stepName===A.stepName);(n==null?void 0:n.type)===l.StepType.Text&&A.stepAspectType==="Text"&&t.push({name:n.stepName,data:{text:A.value}})}),t},zn=async(c,e,t,A)=>{let n={serializableWorkflow:{steps:[]},layouts:{}};n=new l.GroupCommand(t.map(s=>new l.CreateLayoutCommand(s))).apply(n);const i=await eA(c,e,t,A);return new l.GroupCommand(i).apply(n)},jn=M.gql`
|
|
2041
2041
|
${te}
|
|
2042
2042
|
fragment ProductFields on Product {
|
|
2043
2043
|
id
|