@spiffcommerce/core 16.5.1-1 → 16.5.1-2
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 +1 -1
- package/dist/index.umd.cjs +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1323,7 +1323,7 @@ const Ve = y`
|
|
|
1323
1323
|
for (const i of t)
|
|
1324
1324
|
for (const o of i.renderableSteps) {
|
|
1325
1325
|
const r = (((s = o.option) == null ? void 0 : s.variants) || []).length;
|
|
1326
|
-
o.silent
|
|
1326
|
+
o.silent || (o.type === I.Model || o.type === I.Material || o.type === I.Picture || o.type === I.Shape ? (r > 1 || e) && a.push(o.stepName) : a.push(o.stepName));
|
|
1327
1327
|
}
|
|
1328
1328
|
const n = t.filter((i) => i.renderableSteps.filter(
|
|
1329
1329
|
(r) => a.includes(r.stepName)
|
package/dist/index.umd.cjs
CHANGED
|
@@ -556,7 +556,7 @@
|
|
|
556
556
|
workflowState
|
|
557
557
|
}
|
|
558
558
|
}
|
|
559
|
-
`,xe=l=>{const e=[];for(const t of l.steps)switch(t.type){case c.StepType.DigitalContent:t.data.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Frame:const a=t.data;a.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),a.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Illustration:const n=t.data;n.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Colors});break;case c.StepType.Material:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Model:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Picture:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Question:t.data.varySelections&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selections});break;case c.StepType.Shape:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Text:const d=t.data;d.varyText&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Text}),d.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),d.varyColor&&d.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Color});break}return e},ce=[c.StepType.SilentIllustration,c.StepType.ProductOverlay],GA=async(l,e,t)=>{var a;const A=[];l.introduction&&A.push({name:"Introduction",title:l.name,renderableSteps:[{type:c.StepType.Introduction,stepName:"Introduction",stepTitle:l.name,helpText:l.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of l.steps){if(e.bulkScene){let o=!1;switch(n.type){case c.StepType.DigitalContent:n.data.varyUpload&&(o=!0);break;case c.StepType.Frame:{const s=n.data;s.varyUpload&&(s.varySelection||!n.option)&&(o=!0)}break;case c.StepType.Illustration:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColors||!s.colorPickerEnabled)&&(o=!0)}break;case c.StepType.Material:n.data.varySelection&&(o=!0);break;case c.StepType.Model:n.data.varySelection&&(o=!0);break;case c.StepType.Picture:n.data.varySelection&&(o=!0);break;case c.StepType.Question:n.data.varySelections&&(o=!0);break;case c.StepType.Shape:n.data.varySelection&&(o=!0);break;case c.StepType.Text:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColor||!s.colorPickerEnabled||!s.colorOption)&&s.varyText&&(o=!0)}break}if(o)continue}const i=vA(n.stepName,l.stepGroups);if(!i)A.push({name:n.stepName,title:n.stepTitle,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]});else{const o=A.find(s=>s.name===i.name);o?ce.includes(n.type)?o.silentSteps.push(n):o.renderableSteps.push(n):A.push({name:i.name,title:i.name,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]})}}if(e.bulkScene){const n=(a=t==null?void 0:t.product)==null?void 0:a.bulkConfiguration;A.push({name:"Bulk",title:(n==null?void 0:n.sceneTitle)??e.bulkSceneTitle,renderableSteps:[{type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(n==null?void 0:n.stepTitle)??e.bulkSceneTitle,helpText:n==null?void 0:n.helpText,data:{aspects:xe(l)},conditions:[]}],silentSteps:[]})}return e.finishScene&&A.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:c.StepType.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:l.finalizeStepConfig?l.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:l.finalizeStepConfig?l.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),A},vA=(l,e)=>e.find(t=>t.stepNames.includes(l)),Z=(l,e)=>(l.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const a=A.selectedVariants;return t.requiredVariantSelections.some(n=>a.find(i=>i.id===n)!==void 0)}return!1}),kA=(l,e)=>{const t={name:l.name,title:l.title,renderableSteps:l.renderableSteps.filter(A=>Z(A,e)),silentSteps:l.silentSteps.filter(A=>Z(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},$=(l,e)=>l.map(t=>kA(t,e)).filter(t=>t!==null),bA=async(l,e,t=!1)=>{var i;const A=$(l,e),a=[];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===c.StepType.Model||s.type===c.StepType.Material||s.type===c.StepType.Picture||s.type===c.StepType.Shape?(r>1||t)&&a.push(s.stepName):a.push(s.stepName))}const n=A.filter(o=>o.renderableSteps.filter(r=>a.includes(r.stepName)).length>0);for(const o of n)o.renderableSteps=o.renderableSteps.filter(s=>a.includes(s.stepName));return n};class He{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e}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.activePromise||(this.activePromise=this.dequeue())}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 Ct(l,e,t,A){const a=t.width*l.zoom,n=t.height*l.zoom;if(A){const o=l,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,l.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=me(l.x,e.width-r,0),o.y=me(l.y,e.height-g,0),o}const i=l;return i.x=me(i.x,-a,e.width),i.y=me(i.y,-n,e.height),i}function me(l,e,t){return Math.min(Math.max(l,e),t)}class Qt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=_e(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const a=A;if(a.currentFrameSources){let n=!1;for(let i=0;i<a.currentFrameSources.length;i++){const o=a.currentFrameSources[i],s=await c.getFrameData(o);et(s,this.frameData)||(this.frameData||(this.frameData=new Array(a.currentFrameSources.length)),this.frameData[i]=s,n=!0)}n&&(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 a=c.frameDataCache.get(t);a&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=a)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,a){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const n=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],d=A[o]-r*e[o];return{x:g,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(n,a),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 a=this.imageData;if(!a||!this.frameData)return;if(this.frameData.length!==e.length)throw new U("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]=Ct(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,a,this.frameData,this.targetElements,t)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,a,n){if(!A||A.length===0||A.some(o=>!o))throw new U("Frame data not set. This is a bug");if(!this.workflowManager)throw new U("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();a.forEach((o,s)=>{i(new c.UpdateFramePattern(o,t,e[s]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),n&&n()}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,a)=>{const n=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[a]=n,this.maxZoomScale[a]=n*2.5):(this.minZoomScale[a]=n/10,this.maxZoomScale[a]=n*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]=c.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements))}}class ut{constructor(e,t,A){this.processRegion=async a=>{var s,r,g,d;const n=this.layouts.find(B=>B.panelId===a.panelId);if(!n)throw new k(a);let i="";if(this.configuration.type===c.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ne(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===c.LayoutElementType.Image){const B=this.configuration.type===c.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:c.generate(),src:B,type:o,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===c.StepType.ProductOverlay?!0:void 0,rotation:a.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:a},command:new c.CreateElementCommand(w,n)}}else{const B=this.configuration.type===c.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((E,m)=>{if(!B){m("Undefined vector silent step source");return}c.fetchAsString(B,!0).then(C=>{E(C)}).catch(C=>console.error(C))}),h=await c.generateSVGWithUnknownColors(await w()),Q={stepName:this.configuration.stepName,id:c.generate(),cachedObjectURL:await c.svgObjectURL(h.svg),src:B,svg:h.svg,colors:h.colors,type:o,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===c.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:Q.id,region:a},command:new c.CreateElementCommand(Q,n)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ne(this.configuration,"Missing regions.");if(this.configuration.type===c.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===c.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new k(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,a;const e=this.configuration.type===c.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(a=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:a.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")?c.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),c.LayoutElementType.Illustration)}}const mt=async l=>{const e=`${ie.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:l}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class It{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,a=3e3,n=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=a,this.maxAttempts=n,this.poll()}}class TA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const a=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 d,B;const r=(d=a==null?void 0:a.storage)==null?void 0:d.videoShortUrl,g=(B=a==null?void 0:a.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,a,n,i,o,s,r){if(!t&&A!==""&&a===""){const g=async()=>{var F,D;const C=(await ct([A]))[0],I=(D=(F=C==null?void 0:C.versions)==null?void 0:F.find(p=>p.name==="mpeg4"))==null?void 0:D.link;return{asset:C,link:I}},d=await new Promise((C,I)=>{new It(async()=>!!(await g()).link,async()=>{const F=await g();if(!F.link||!F.link)throw new W(F.asset);C({rel:"mpeg4",href:F.link})},()=>{I("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(C=>s(new c.DeleteElementCommand(C.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const h=w.toString();if(h.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const Q=await mt(h);if(o(Q),!i.data||!i.data.regions)throw new ne(i,"Missing regions.");const E=await this.regionElements(i),m=await this.command(Q,E,n,i.stepName);m&&(m.command&&n.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await n.setSelectionsAndElements(i.stepName,[],E,async()=>{n.updateStorage(i.stepName,{videoShortUrl:Q,videoUrl:a}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:c.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,a){const n=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await tt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,d=n.find(B=>B.panelId===(g==null?void 0:g.panelId));if(!d&&g)throw new k(g);if(d&&!g)throw new Error("Region not found");if(!d||!g)throw new Error("Neither a region or layout found!");return new c.CreateElementCommand({stepRegion:g,stepName:a,id:r.id,src:o,type:c.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},d)});return{command:new c.GroupCommand(s),followup:async()=>{}}}}const ft=new TA;class JA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return c.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new z(e);const a=A.fileLink;if(a)return c.fetchAsString(a,!0);throw new W(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const a=e.option,n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,n,[],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 a=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(d=>c.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:g})}if(a){const g=async()=>{var w,h,Q,E;const d=(w=a.storage)==null?void 0:w.framePatternSrc,B=(h=a.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(Q=t.getStepSpecificServices(e.stepName))==null?void 0:Q.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(a.selectedVariants&&a.selectedVariants.length>0){const d=a.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(h=>this.frameSourceSvg(B,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new It(async()=>{var s;const i=(s=(await b.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{b.getLocalOrFromServer(t.key||"").then(n=>{this.loadPatternFromAsset(n,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({id:e,type:c.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/a.frameData.width,scaleY:t.height/a.frameData.height,path:a.frameData.path,dataWidth:a.frameData.width,dataHeight:a.frameData.height,stepRegion:t,stepName:a.stepName,disablePlaceholder:a.disablePlaceholder,focalBlur:a.focalBlur,focalBlurStrength:a.focalBlurStrength,focalBlurRadius:a.focalBlurRadius,pattern:a.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await c.GetSVGDimensions(e),a=A.width,n=A.height,i={src:e,width:a,height:n,aspect:a/n};c.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await c.fetchAsArrayBuffer(e,!0),a=await c.getAttributesFromArrayBuffer(A),n={src:e,width:a.width,height:a.height,aspect:a.width/a.height};c.patternImageDataCache.set(e,n),t.setPatternData(n)}}async selectVariantCommand(e,t,A,a,n,i){var B;const o=(B=a.getStepSpecificServices(e.stepName))==null?void 0:B.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)));n&&n(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const Q=await c.getFrameData(s[h]),E=o.getImageData(),m=A.map(f=>new c.DeleteElementCommand(f.id)),C=E?c.calculateOffsets(E,Q):void 0,I=E?{id:c.generate(),src:E.src,x:(C==null?void 0:C.x)||0,y:(C==null?void 0:C.y)||0,width:E.width,height:E.height,scaleX:(C==null?void 0:C.zoom)||1,scaleY:(C==null?void 0:C.zoom)||1,rotation:0}:void 0,F=c.generate(),p=a.getLayouts().find(f=>f.panelId===w.panelId);if(!p)throw new k(w);return{command:this.getCreateElementCommand(F,w,p,{frameData:Q,pattern:I,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:F,region:w},removeExistingCommands:m}})),g=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new c.GroupCommand([...g,...d]),followup:async()=>{n&&n(!1),await a.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(a.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=a.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 a;const t=(a=e.versions)==null?void 0:a.find(n=>n.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new W(e)}async loadPatternFromAsset(e,t,A){var o;const a=this.patternSource(e),n=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(a,i),A.updateMetadata(t.stepName,{image:a}),A.updateStorage(t.stepName,{framePatternSrc:a}),A.markUpdateCompleted(n)}}const Ie=new JA;class LA{async getIllustrationBody(e){return new Promise(t=>{c.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({stepRegion:t,stepName:a.stepName,colors:a.svg.colors,id:e,src:a.src,svg:a.svg.svg,cachedObjectURL:a.objectURL,type:c.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 c.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const a=e.option;if(!a)return null;if(A)return this.reload(e,t,A);{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantCommand(e,n,[],()=>{},t)}return null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=a.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 a;const A=e.data.colorOption;return A?A?(a=A.variants)==null?void 0:a.map(n=>({fill:n.color,stroke:n.color,variant:n})):[]:[]}async changeColorsCommand(e,t,A,a,n){var g;const i={};for(const[d,B]of n.entries())i[d]={browserValue:B,spotColor:(g=i[d])==null?void 0:g.spotColor};const o=c.modifySVGWithElementProperties(e,t,A,i),s=await c.svgObjectURL(o),r=[];for(const d of a){for(const[B,w]of n.entries())r.push(new c.IllustrationColorCommand(d,B,w));r.push(new c.IllustrationCacheCommand(d,o,s))}return new c.GroupCommand(r)}async changeColors(e,t,A,a,n){var w,h;if(t.length===0)return;const i=c.findElement(t[0].id,a().map(Q=>Q.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([Q,E])=>{const m={browserValue:E.browserValue},C=E.spotColor;C&&(m.spotColor={profileName:C.profileName,namedColor:C.namedColor}),s[Q]=m});for(const[Q,E]of n.entries())o[Q]={browserValue:E,spotColor:(w=o[Q])==null?void 0:w.spotColor},s[Q]={browserValue:E};let r=Array.from(Object.values(o)).map(Q=>Q.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(Q=>{r=r.map(E=>{var m;return E.toLowerCase()===((m=Q.color)==null?void 0:m.toLowerCase())?Q.name:E})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([Q,E])=>{d.set(Q,E.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(Q=>Q.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,a,n){var m;if(!e.data||!e.data.regions)throw new ne(e,"Missing regions.");a(!0);const i=A.map(C=>new c.DeleteElementCommand(C.id));n.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new z(t);const s=o.fileLink;if(!s)throw new W(o);const r=await c.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),g=await c.svgObjectURL(r.svg),d=C=>{const I=n.getLayouts().find(D=>D.panelId===C.panelId);if(!I)throw new k(C);const F=c.generate();return{regionElement:{id:F,region:C},command:this.getCreateElementCommand(F,C,I,{stepName:e.stepName,src:s,objectURL:g,svg:r})}},B=e.data.regions.map(d),h=[...B.map(C=>C.command),...i];let Q=Array.from(Object.values(r.colors)).map(C=>C.browserValue);const E=e.data.colorOption;return E&&((m=E.variants)==null||m.forEach(C=>{Q=Q.map(I=>{var F;return I.toLowerCase()===((F=C.color)==null?void 0:F.toLowerCase())?C.name:I})})),n.updateMetadata(e.stepName,{colors:Q}),{command:new c.GroupCommand(h),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[t],B.map(C=>C.regionElement),async()=>{n.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ge=new LA;class OA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=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 ae(e);if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=d.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const h=t.getModelContainer();if(h){const Q=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",B||{}));Promise.all(Q).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){const n=A.getModelContainer();a(!0);const i=t.material;if(!i)throw a(!1),new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{n&&e.data.targetMaterials.forEach(o=>{e.option&&n.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const Ge=new OA;class zA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const Q=(h=d.asset)==null?void 0:h.fileLink;if(!Q)throw new z(d);await w.applyModelVariant(e.stepName||"",{model:Q,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){var i;a(!0);const n=(i=t.asset)==null?void 0:i.fileLink;if(!n)throw new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:n,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const ve=new zA;class jA{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 a=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=a==null?void 0:a.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=a==null?void 0:a.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,a,n){const i=await this.changeTextCommand(e,t,A,a,n);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,a,n){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,n))return A.setMandatoryFulfilled(e.stepName,!1),console.error(a),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=(d,B,w)=>{const h=w||c.generate(),E=A.getLayouts().find(C=>C.panelId===B.panelId);if(!E)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new c.DeleteElementCommand(h)),m.push(new c.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:h,svg:d,type:c.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},E)),{id:h,region:B,command:new c.GroupCommand(m)}};if(i.length>0){const B=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 c.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new c.GroupCommand(B),followup:async()=>{const w=d.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,a){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return a("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return a("Unsupported characters."),!1;const n=ye.split(t.toLowerCase());for(const i of n)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return a("Blocked profanity."),!1}return a(""),!0}}const Dt=new jA;class KA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else if(a.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,a.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(e,t,A,a){const n=t.asset;if(!n)throw new z(t);const i=n==null?void 0:n.fileLink;if(!i)return console.error("No URL for picture!"),null;a(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new c.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(Q=>Q.panelId===d.panelId);if(!w)throw new k(d);const h=c.generate();return{regionElement:{id:h,region:d},command:new c.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:h,src:i,type:c.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"},w)}},g=e.data.regions.map(r);return{command:new c.GroupCommand([...s,...g.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],g.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ke=new KA;class VA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else{const n=a.variants;if(T.getDefaultVariant(a)){const o=n==null?void 0:n.find(s=>{var r;return s.id===((r=a.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),n=e.option;if(a!=null&&a.selectedVariants){const o=a.selectedVariants[0].id;if(n&&o){const s=(i=n.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 a=await this.selectVariantLambda(e,t,A);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A){const a=e.option;if(!a)return null;const n=a.variants;if(!n)return null;const i=n.length>1?n.find(o=>o.id===t):n[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new VA;class WA{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(a=>({fill:a.color,stroke:a.color,variant:a})))||[]:[]}setCustomColor(e,t,A){const a=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!a.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new k(s);return new c.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new c.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,{fill:n.color,stroke:n.color,variant:n},[],t):null}return null}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&a.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=a==null?void 0:a.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,a){var s;const n=a.getLayouts(),i=(s=a.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=d=>{const B=d.region;if(!n.find(Q=>Q.panelId===(B==null?void 0:B.panelId)))throw new k(B);const h=o();return new c.IllustrationColorCommand(d.id,this.shapeFillId,h)},g=A.map(r).filter(d=>!!d);return{command:new c.GroupCommand(g),followup:async()=>{await a.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),a.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=n.find(I=>I.panelId===w.panelId);if(!h)throw new k(w);const Q=o(),E=`
|
|
559
|
+
`,xe=l=>{const e=[];for(const t of l.steps)switch(t.type){case c.StepType.DigitalContent:t.data.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Frame:const a=t.data;a.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),a.varyUpload&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Upload});break;case c.StepType.Illustration:const n=t.data;n.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),n.varyColors&&n.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Colors});break;case c.StepType.Material:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Model:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Picture:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Question:t.data.varySelections&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selections});break;case c.StepType.Shape:t.data.varySelection&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection});break;case c.StepType.Text:const d=t.data;d.varyText&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Text}),d.varySelection&&t.option&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Selection}),d.varyColor&&d.colorPickerEnabled&&e.push({stepName:t.stepName,stepType:t.type,aspectType:c.StepAspectType.Color});break}return e},ce=[c.StepType.SilentIllustration,c.StepType.ProductOverlay],GA=async(l,e,t)=>{var a;const A=[];l.introduction&&A.push({name:"Introduction",title:l.name,renderableSteps:[{type:c.StepType.Introduction,stepName:"Introduction",stepTitle:l.name,helpText:l.introduction,data:{},conditions:[]}],silentSteps:[]});for(const n of l.steps){if(e.bulkScene){let o=!1;switch(n.type){case c.StepType.DigitalContent:n.data.varyUpload&&(o=!0);break;case c.StepType.Frame:{const s=n.data;s.varyUpload&&(s.varySelection||!n.option)&&(o=!0)}break;case c.StepType.Illustration:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColors||!s.colorPickerEnabled)&&(o=!0)}break;case c.StepType.Material:n.data.varySelection&&(o=!0);break;case c.StepType.Model:n.data.varySelection&&(o=!0);break;case c.StepType.Picture:n.data.varySelection&&(o=!0);break;case c.StepType.Question:n.data.varySelections&&(o=!0);break;case c.StepType.Shape:n.data.varySelection&&(o=!0);break;case c.StepType.Text:{const s=n.data;(s.varySelection||!n.option||(n.option.variants||[]).length===1)&&(s.varyColor||!s.colorPickerEnabled||!s.colorOption)&&s.varyText&&(o=!0)}break}if(o)continue}const i=vA(n.stepName,l.stepGroups);if(!i)A.push({name:n.stepName,title:n.stepTitle,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]});else{const o=A.find(s=>s.name===i.name);o?ce.includes(n.type)?o.silentSteps.push(n):o.renderableSteps.push(n):A.push({name:i.name,title:i.name,renderableSteps:ce.includes(n.type)?[]:[n],silentSteps:ce.includes(n.type)?[n]:[]})}}if(e.bulkScene){const n=(a=t==null?void 0:t.product)==null?void 0:a.bulkConfiguration;A.push({name:"Bulk",title:(n==null?void 0:n.sceneTitle)??e.bulkSceneTitle,renderableSteps:[{type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(n==null?void 0:n.stepTitle)??e.bulkSceneTitle,helpText:n==null?void 0:n.helpText,data:{aspects:xe(l)},conditions:[]}],silentSteps:[]})}return e.finishScene&&A.push({name:"Finish",title:e.finishSceneTitle,renderableSteps:[{type:c.StepType.Finish,stepName:"Finish",stepTitle:e.finishSceneTitle,helpText:"",data:{modelAnimation:l.finalizeStepConfig?l.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:l.finalizeStepConfig?l.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),A},vA=(l,e)=>e.find(t=>t.stepNames.includes(l)),Z=(l,e)=>(l.conditions||[]).every(t=>{const A=e[t.targetStepName];if(A&&A.selectedVariants){const a=A.selectedVariants;return t.requiredVariantSelections.some(n=>a.find(i=>i.id===n)!==void 0)}return!1}),kA=(l,e)=>{const t={name:l.name,title:l.title,renderableSteps:l.renderableSteps.filter(A=>Z(A,e)),silentSteps:l.silentSteps.filter(A=>Z(A,e))};return t.silentSteps.length===0&&t.renderableSteps.length===0?null:t},$=(l,e)=>l.map(t=>kA(t,e)).filter(t=>t!==null),bA=async(l,e,t=!1)=>{var i;const A=$(l,e),a=[];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===c.StepType.Model||s.type===c.StepType.Material||s.type===c.StepType.Picture||s.type===c.StepType.Shape?(r>1||t)&&a.push(s.stepName):a.push(s.stepName))}const n=A.filter(o=>o.renderableSteps.filter(r=>a.includes(r.stepName)).length>0);for(const o of n)o.renderableSteps=o.renderableSteps.filter(s=>a.includes(s.stepName));return n};class He{constructor(){this.timestamp=Date.now()}}class Ue{constructor(e){this.queue=[],this.activePromise=void 0,this.queueMaxSize=void 0,this.queueMaxSize=e}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.activePromise||(this.activePromise=this.dequeue())}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 Ct(l,e,t,A){const a=t.width*l.zoom,n=t.height*l.zoom;if(A){const o=l,s=Math.max(e.width/t.width,e.height/t.height);o.zoom=Math.max(s,l.zoom);const r=t.width*o.zoom,g=t.height*o.zoom;return o.x=me(l.x,e.width-r,0),o.y=me(l.y,e.height-g,0),o}const i=l;return i.x=me(i.x,-a,e.width),i.y=me(i.y,-n,e.height),i}function me(l,e,t){return Math.min(Math.max(l,e),t)}class Qt{constructor(e){this.minZoomScale=[.03],this.maxZoomScale=[20],this._debouncedUpdateFrameOffsets=_e(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback(async A=>{if(A){const a=A;if(a.currentFrameSources){let n=!1;for(let i=0;i<a.currentFrameSources.length;i++){const o=a.currentFrameSources[i],s=await c.getFrameData(o);et(s,this.frameData)||(this.frameData||(this.frameData=new Array(a.currentFrameSources.length)),this.frameData[i]=s,n=!0)}n&&(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 a=c.frameDataCache.get(t);a&&(this.frameData||(this.frameData=new Array(e.length)),this.frameData[A]=a)})}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,A,a){if(this.imageData&&this.offsets&&this.frameData){(!this.offsets||this.offsets.length!==this.frameData.length)&&(this.offsets=new Array(this.frameData.length));const n=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],d=A[o]-r*e[o];return{x:g,y:d,zoom:this.imageData.width*e[o]/this.imageData.width}});this.updateOffsets(n,a),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 a=this.imageData;if(!a||!this.frameData)return;if(this.frameData.length!==e.length)throw new U("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]=Ct(e[o],i,this.imageData,this.forceImageCover)}),this._debouncedUpdateFrameOffsets(this.offsets,a,this.frameData,this.targetElements,t)}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,t,A,a,n){if(!A||A.length===0||A.some(o=>!o))throw new U("Frame data not set. This is a bug");if(!this.workflowManager)throw new U("No workflow manager set, cannot update offsets.");const i=this.workflowManager.getCommandDispatcher();a.forEach((o,s)=>{i(new c.UpdateFramePattern(o,t,e[s]))}),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsetsList:e}),n&&n()}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,a)=>{const n=Math.max(A.width/e.width,A.height/e.height);this.forceImageCover?(this.minZoomScale[a]=n,this.maxZoomScale[a]=n*2.5):(this.minZoomScale[a]=n/10,this.maxZoomScale[a]=n*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]=c.calculateOffsets(e,t)}),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements))}}class ut{constructor(e,t,A){this.processRegion=async a=>{var s,r,g,d;const n=this.layouts.find(B=>B.panelId===a.panelId);if(!n)throw new k(a);let i="";if(this.configuration.type===c.StepType.ProductOverlay){let B="";if((s=this.product)!=null&&s.overlayImageUrl&&(B=this.product.overlayImageUrl),i=B,!B)throw new ne(this.configuration,"Couldn't find an asset for product overlay step")}const o=this.evaluateAssetType();if(o===c.LayoutElementType.Image){const B=this.configuration.type===c.StepType.SilentIllustration?(r=this.configuration.data.asset)==null?void 0:r.fileLink:(g=this.product)==null?void 0:g.overlayImageUrl;if(!B)throw new Error("Undefined raster silent step source");const w={stepName:this.configuration.stepName,id:c.generate(),src:B,type:o,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===c.StepType.ProductOverlay?!0:void 0,rotation:a.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:w.id,region:a},command:new c.CreateElementCommand(w,n)}}else{const B=this.configuration.type===c.StepType.SilentIllustration?(d=this.configuration.data.asset)==null?void 0:d.fileLink:i,w=async()=>new Promise((E,m)=>{if(!B){m("Undefined vector silent step source");return}c.fetchAsString(B,!0).then(C=>{E(C)}).catch(C=>console.error(C))}),h=await c.generateSVGWithUnknownColors(await w()),Q={stepName:this.configuration.stepName,id:c.generate(),cachedObjectURL:await c.svgObjectURL(h.svg),src:B,svg:h.svg,colors:h.colors,type:o,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===c.StepType.ProductOverlay?!0:void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:Q.id,region:a},command:new c.CreateElementCommand(Q,n)}}},this.configuration=e,this.layouts=t,this.product=A||void 0}async trigger(){if(!this.configuration.data.regions)throw new ne(this.configuration,"Missing regions.");if(this.configuration.type===c.StepType.SilentIllustration){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}else return this.configuration.type===c.StepType.ProductOverlay?Promise.all(this.configuration.data.regions.map(e=>{if(!this.layouts.find(A=>e.panelId===A.panelId))throw new k(e);return this.processRegion(e)})):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){var t,A,a;const e=this.configuration.type===c.StepType.ProductOverlay&&((t=this.product)!=null&&t.overlayImageUrl)?this.product.overlayImageUrl.toLowerCase():(a=(A=this.configuration.data.asset)==null?void 0:A.fileLink)==null?void 0:a.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")?c.LayoutElementType.Image:(e!=null&&e.endsWith(".svg")||e!=null&&e.startsWith("image/svg+xml"),c.LayoutElementType.Illustration)}}const mt=async l=>{const e=`${ie.getServicesApiUrl()}/shortener`;try{return(await(await fetch(e,{method:"POST",body:JSON.stringify({longUrl:l}),headers:{"Content-Type":"application/json"}})).json()).shortUrl}catch(t){throw console.error(t),new Ce("Failed to shorten URL, see console.")}};class It{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,a=3e3,n=10){this.onSuccess=t,this.onFailure=A,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=a,this.maxAttempts=n,this.poll()}}class TA{async init(e,t,A){return A&&await this.reload(e,t,A),null}async reload(e,t,A){const a=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 d,B;const r=(d=a==null?void 0:a.storage)==null?void 0:d.videoShortUrl,g=(B=a==null?void 0:a.storage)==null?void 0:B.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:r,videoUrl:g})})}async regenerateQRCode(e,t,A,a,n,i,o,s,r){if(!t&&A!==""&&a===""){const g=async()=>{var F,D;const C=(await ct([A]))[0],I=(D=(F=C==null?void 0:C.versions)==null?void 0:F.find(p=>p.name==="mpeg4"))==null?void 0:D.link;return{asset:C,link:I}},d=await new Promise((C,I)=>{new It(async()=>!!(await g()).link,async()=>{const F=await g();if(!F.link||!F.link)throw new W(F.asset);C({rel:"mpeg4",href:F.link})},()=>{I("Poller timed out with 40 attempts @ 3 second interval")},3e3,40)});e.forEach(C=>s(new c.DeleteElementCommand(C.id)));const B=i.data.baseUrl.slice(0,4)==="http"?"":"https://",w=new URL(B+i.data.baseUrl);w.searchParams.append("video",btoa(JSON.stringify([d]))),w.pathname=w.pathname+(w.pathname.slice(-1)==="/"?"":"/");const h=w.toString();if(h.length>=2e3)throw new Ce("Cannot create QR code, URL too long.");const Q=await mt(h);if(o(Q),!i.data||!i.data.regions)throw new ne(i,"Missing regions.");const E=await this.regionElements(i),m=await this.command(Q,E,n,i.stepName);m&&(m.command&&n.getCommandDispatcher()(m.command),m.followup&&await m.followup()),await n.setSelectionsAndElements(i.stepName,[],E,async()=>{n.updateStorage(i.stepName,{videoShortUrl:Q,videoUrl:a}),r(!1)})}else r(!1)}async regionElements(e){const t=A=>({id:c.generate(),region:A});return e.data.regions.map(t)}async command(e,t,A,a){const n=A.getLayouts(),o=`data:image/svg+xml;base64,${btoa(await tt.toString(e,{type:"svg"}))}`,s=t.map(r=>{const g=r.region,d=n.find(B=>B.panelId===(g==null?void 0:g.panelId));if(!d&&g)throw new k(g);if(d&&!g)throw new Error("Region not found");if(!d||!g)throw new Error("Neither a region or layout found!");return new c.CreateElementCommand({stepRegion:g,stepName:a,id:r.id,src:o,type:c.LayoutElementType.Image,y:g.top,x:g.left,width:g.width,height:g.height,rotation:0},d)});return{command:new c.GroupCommand(s),followup:async()=>{}}}}const ft=new TA;class JA{constructor(){this.frameSourceSvg=async(e,t)=>{if(!e)return c.generateDefaultRectangleFrameSvg(t);const A=e.asset;if(!A)throw new z(e);const a=A.fileLink;if(a)return c.fetchAsString(a,!0);throw new W(A)}}async init(e,t,A){if(A)return await this.reload(e,t,A),null;if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),e.option&&e.option.variants&&e.option.variants.length>0){const a=e.option,n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,n,[],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 a=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(d=>c.generateDefaultRectangleFrameSvg(d));t.updateStorage(e.stepName,{currentFrameSources:g})}if(a){const g=async()=>{var w,h,Q,E;const d=(w=a.storage)==null?void 0:w.framePatternSrc,B=(h=a.storage)==null?void 0:h.frameOffsetsList;if(t.updateMetadata(e.stepName,{frameOffsetsList:B,framePatternSrc:d}),d){const m=(Q=t.getStepSpecificServices(e.stepName))==null?void 0:Q.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");await this.loadPatternFromString(d,m),t.updateMetadata(e.stepName,{image:d}),t.updateStorage(e.stepName,{framePatternSrc:d})}if(B!=null&&B.some(m=>m.zoom)){const m=(E=t.getStepSpecificServices(e.stepName))==null?void 0:E.frameService;if(!m)throw new Error("Frame service unavailable, cannot load pattern!");m.updateOffsets(B)}t.setMandatoryFulfilled(e.stepName,!0)};if(a.selectedVariants&&a.selectedVariants.length>0){const d=a.selectedVariants[0].id;if(e.option&&d){const B=(r=e.option.variants)==null?void 0:r.find(w=>w.id===d);B&&await t.setSelectionsAndElements(e.stepName,[B],s,async()=>{const w=await Promise.all(e.data.regions.map(h=>this.frameSourceSvg(B,h)));t.updateStorage(e.stepName,{currentFrameSources:w}),await g()})}}else await t.setSelectionsAndElements(e.stepName,[],s,g)}}selectImage(e,t,A){A.setEditedStatus(e.stepName,!0),(t.fileLink||"").endsWith("pdf")?A.addPoller(new It(async()=>{var s;const i=(s=(await b.getLocalOrFromServer(t.key||"")).versions)==null?void 0:s.find(r=>r.name==="svg");return i?(await fetch(i.link)).status===200:!1},()=>{b.getLocalOrFromServer(t.key||"").then(n=>{this.loadPatternFromAsset(n,e,A)})},()=>{throw new Ce("Failed to resolve transcoded PDF")})):this.loadPatternFromAsset(t,e,A)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&a.getCommandDispatcher()(i.command),i.followup&&await i.followup())}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({id:e,type:c.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/a.frameData.width,scaleY:t.height/a.frameData.height,path:a.frameData.path,dataWidth:a.frameData.width,dataHeight:a.frameData.height,stepRegion:t,stepName:a.stepName,disablePlaceholder:a.disablePlaceholder,focalBlur:a.focalBlur,focalBlurStrength:a.focalBlurStrength,focalBlurRadius:a.focalBlurRadius,pattern:a.pattern,immutable:t.immutable},A)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const A=await c.GetSVGDimensions(e),a=A.width,n=A.height,i={src:e,width:a,height:n,aspect:a/n};c.patternImageDataCache.set(e,i),t.setPatternData(i)}else{const A=await c.fetchAsArrayBuffer(e,!0),a=await c.getAttributesFromArrayBuffer(A),n={src:e,width:a.width,height:a.height,aspect:a.width/a.height};c.patternImageDataCache.set(e,n),t.setPatternData(n)}}async selectVariantCommand(e,t,A,a,n,i){var B;const o=(B=a.getStepSpecificServices(e.stepName))==null?void 0:B.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)));n&&n(!0);const r=await Promise.all(e.data.regions.map(async(w,h)=>{const Q=await c.getFrameData(s[h]),E=o.getImageData(),m=A.map(f=>new c.DeleteElementCommand(f.id)),C=E?c.calculateOffsets(E,Q):void 0,I=E?{id:c.generate(),src:E.src,x:(C==null?void 0:C.x)||0,y:(C==null?void 0:C.y)||0,width:E.width,height:E.height,scaleX:(C==null?void 0:C.zoom)||1,scaleY:(C==null?void 0:C.zoom)||1,rotation:0}:void 0,F=c.generate(),p=a.getLayouts().find(f=>f.panelId===w.panelId);if(!p)throw new k(w);return{command:this.getCreateElementCommand(F,w,p,{frameData:Q,pattern:I,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:F,region:w},removeExistingCommands:m}})),g=r.map(w=>w.command),d=r.map(w=>w.removeExistingCommands).flat();return{command:new c.GroupCommand([...g,...d]),followup:async()=>{n&&n(!1),await a.setSelectionsAndElements(e.stepName,t?[t]:[],[...r.map(w=>w.regionEl)],async()=>{var w;if(a.updateStorage(e.stepName,{currentFrameSources:s}),i){const h=(w=a.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 a;const t=(a=e.versions)==null?void 0:a.find(n=>n.name==="svg");if(t)return t.link;const A=e.fileLink;if(A)return A;throw new W(e)}async loadPatternFromAsset(e,t,A){var o;const a=this.patternSource(e),n=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(a,i),A.updateMetadata(t.stepName,{image:a}),A.updateStorage(t.stepName,{framePatternSrc:a}),A.markUpdateCompleted(n)}}const Ie=new JA;class LA{async getIllustrationBody(e){return new Promise(t=>{c.fetchAsString(e,!0).then(A=>{t(A)}).catch(A=>console.error(A))})}getCreateElementCommand(e,t,A,a){return new c.CreateElementCommand({stepRegion:t,stepName:a.stepName,colors:a.svg.colors,id:e,src:a.src,svg:a.svg.svg,cachedObjectURL:a.objectURL,type:c.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 c.findElement(A[0].id,t.getAllLayoutData()).colors}catch{return[]}}async init(e,t,A){const a=e.option;if(!a)return null;if(A)return this.reload(e,t,A);{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantCommand(e,n,[],()=>{},t)}return null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateMetadata(e.stepName,{colors:(w=a.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 a;const A=e.data.colorOption;return A?A?(a=A.variants)==null?void 0:a.map(n=>({fill:n.color,stroke:n.color,variant:n})):[]:[]}async changeColorsCommand(e,t,A,a,n){var g;const i={};for(const[d,B]of n.entries())i[d]={browserValue:B,spotColor:(g=i[d])==null?void 0:g.spotColor};const o=c.modifySVGWithElementProperties(e,t,A,i),s=await c.svgObjectURL(o),r=[];for(const d of a){for(const[B,w]of n.entries())r.push(new c.IllustrationColorCommand(d,B,w));r.push(new c.IllustrationCacheCommand(d,o,s))}return new c.GroupCommand(r)}async changeColors(e,t,A,a,n){var w,h;if(t.length===0)return;const i=c.findElement(t[0].id,a().map(Q=>Q.layoutState)),o={...i.colors},s={};Object.entries(o).forEach(([Q,E])=>{const m={browserValue:E.browserValue},C=E.spotColor;C&&(m.spotColor={profileName:C.profileName,namedColor:C.namedColor}),s[Q]=m});for(const[Q,E]of n.entries())o[Q]={browserValue:E,spotColor:(w=o[Q])==null?void 0:w.spotColor},s[Q]={browserValue:E};let r=Array.from(Object.values(o)).map(Q=>Q.browserValue);const g=e.data.colorOption;g&&((h=g.variants)==null||h.forEach(Q=>{r=r.map(E=>{var m;return E.toLowerCase()===((m=Q.color)==null?void 0:m.toLowerCase())?Q.name:E})})),A.updateMetadata(e.stepName,{colors:r});const d=new Map;if(Object.entries(o).forEach(([Q,E])=>{d.set(Q,E.browserValue)}),!i.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const B=await this.changeColorsCommand(i.svg,i.width,i.height,t.map(Q=>Q.id),d);A.updateStorage(e.stepName,{colors:s}),A.getCommandDispatcher()(B)}async selectVariant(e,t,A,a,n){const i=await this.selectVariantCommand(e,t,A,a,n);i&&(i.command&&n.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async selectVariantCommand(e,t,A,a,n){var m;if(!e.data||!e.data.regions)throw new ne(e,"Missing regions.");a(!0);const i=A.map(C=>new c.DeleteElementCommand(C.id));n.setMandatoryFulfilled(e.stepName,!1);const o=t.asset;if(!o)throw new z(t);const s=o.fileLink;if(!s)throw new W(o);const r=await c.generateSVGWithUnknownColors(await this.getIllustrationBody(s)),g=await c.svgObjectURL(r.svg),d=C=>{const I=n.getLayouts().find(D=>D.panelId===C.panelId);if(!I)throw new k(C);const F=c.generate();return{regionElement:{id:F,region:C},command:this.getCreateElementCommand(F,C,I,{stepName:e.stepName,src:s,objectURL:g,svg:r})}},B=e.data.regions.map(d),h=[...B.map(C=>C.command),...i];let Q=Array.from(Object.values(r.colors)).map(C=>C.browserValue);const E=e.data.colorOption;return E&&((m=E.variants)==null||m.forEach(C=>{Q=Q.map(I=>{var F;return I.toLowerCase()===((F=C.color)==null?void 0:F.toLowerCase())?C.name:I})})),n.updateMetadata(e.stepName,{colors:Q}),{command:new c.GroupCommand(h),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[t],B.map(C=>C.regionElement),async()=>{n.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ge=new LA;class OA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=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 ae(e);if(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=d.material,w=o.map(h=>({id:h.id,region:h.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],w,async()=>{const h=t.getModelContainer();if(h){const Q=e.data.targetMaterials.map(E=>h.applyMaterialVariant(E,s.id||"",B||{}));Promise.all(Q).then(()=>t.setMandatoryFulfilled(e.stepName,!0))}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){const n=A.getModelContainer();a(!0);const i=t.material;if(!i)throw a(!1),new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{n&&e.data.targetMaterials.forEach(o=>{e.option&&n.applyMaterialVariant(o,e.option.id||"",i)}),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const Ge=new OA;class zA{async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);if(n)return await this.selectVariantLambda(e,n,t,()=>{})}return null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var h;const w=t.getModelContainer();if(w&&e.option){const Q=(h=d.asset)==null?void 0:h.fileLink;if(!Q)throw new z(d);await w.applyModelVariant(e.stepName||"",{model:Q,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1),t.setMandatoryFulfilled(e.stepName,!0)}})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantLambda(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantLambda(e,t,A,a){var i;a(!0);const n=(i=t.asset)==null?void 0:i.fileLink;if(!n)throw new z(t);return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],[],async()=>{try{const o=A.getModelContainer();o&&await o.applyModelVariant(e.stepName,{model:n,contextService:A.getLayoutPreviewService()},e.data.replaceProductModel||!1),A.setMandatoryFulfilled(e.stepName,!0)}finally{a(!1)}})}}}}const ve=new zA;class jA{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 a=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=a==null?void 0:a.storage)==null?void 0:r.text}),t.setMandatoryFulfilled(e.stepName,((g=a==null?void 0:a.storage)==null?void 0:g.text)!=="")})}async changeText(e,t,A,a,n){const i=await this.changeTextCommand(e,t,A,a,n);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}async changeTextCommand(e,t,A,a,n){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,n))return A.setMandatoryFulfilled(e.stepName,!1),console.error(a),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=(d,B,w)=>{const h=w||c.generate(),E=A.getLayouts().find(C=>C.panelId===B.panelId);if(!E)return console.error(`Can not find layout for region: ${B.panelId}`),null;const m=[];return w&&m.push(new c.DeleteElementCommand(h)),m.push(new c.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:{},id:h,svg:d,type:c.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable},E)),{id:h,region:B,command:new c.GroupCommand(m)}};if(i.length>0){const B=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 c.GroupCommand(B),followup:async()=>{}}}else{const d=e.data.regions.map(w=>r(o.svgPrint(t,w),w)),B=d.filter(w=>!!w).map(w=>w&&w.command);return{command:new c.GroupCommand(B),followup:async()=>{const w=d.filter(h=>h).map(h=>h&&{id:h.id,region:h.region});await A.setSelectionsAndElements(e.stepName,[],w)}}}}validateInput(e,t,A,a){if(e.data&&e.data.maxLength){const i=e.data.maxLength;if(t.length>i)return a("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return a("Unsupported characters."),!1;const n=ye.split(t.toLowerCase());for(const i of n)for(const o in A){const s=A[o].toLowerCase().replace(/\s/g,"");if(i===s)return a("Blocked profanity."),!1}return a(""),!0}}const Dt=new jA;class KA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else if(a.defaultVariant)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,a.defaultVariant,t,()=>{});return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&A.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async selectVariantCommand(e,t,A,a){const n=t.asset;if(!n)throw new z(t);const i=n==null?void 0:n.fileLink;if(!i)return console.error("No URL for picture!"),null;a(!0),A.setMandatoryFulfilled(e.stepName,!1);const s=A.getRegionElements(e.stepName).map(d=>new c.DeleteElementCommand(d.id)),r=d=>{const w=A.getLayouts().find(Q=>Q.panelId===d.panelId);if(!w)throw new k(d);const h=c.generate();return{regionElement:{id:h,region:d},command:new c.CreateElementCommand({stepName:e.stepName,stepRegion:d,id:h,src:i,type:c.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"},w)}},g=e.data.regions.map(r);return{command:new c.GroupCommand([...s,...g.map(d=>d.command)]),followup:async()=>{await A.setSelectionsAndElements(e.stepName,[t],g.map(d=>d.regionElement),async()=>{A.setMandatoryFulfilled(e.stepName,!0),a(!1)})}}}}const ke=new KA;class VA{async init(e,t,A){const a=e.option;if(!a)return null;if(A)await this.reload(e,t,A);else{const n=a.variants;if(T.getDefaultVariant(a)){const o=n==null?void 0:n.find(s=>{var r;return s.id===((r=a.defaultVariant)==null?void 0:r.id)});return this.selectVariantLambda(e,(o==null?void 0:o.id)||"",t)}}return null}async reload(e,t,A){var i;const a=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),n=e.option;if(a!=null&&a.selectedVariants){const o=a.selectedVariants[0].id;if(n&&o){const s=(i=n.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 a=await this.selectVariantLambda(e,t,A);a&&(a.command&&A.getCommandDispatcher()(a.command),a.followup&&await a.followup())}async selectVariantLambda(e,t,A){const a=e.option;if(!a)return null;const n=a.variants;if(!n)return null;const i=n.length>1?n.find(o=>o.id===t):n[0];if(!i)throw new Error("Failed to find selected variant in step variants, this should never happen!");return{command:void 0,followup:async()=>{await A.setSelectionsAndElements(e.stepName,[i],[],async()=>{A.setMandatoryFulfilled(e.stepName,!0)})}}}}const be=new VA;class WA{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(a=>({fill:a.color,stroke:a.color,variant:a})))||[]:[]}setCustomColor(e,t,A){const a=A.getLayouts(),i=(A.getRegionElements(t.stepName)||[]).map(o=>{const s=o.region;if(!a.find(g=>g.panelId===(s==null?void 0:s.panelId)))throw new k(s);return new c.IllustrationColorCommand(o.id,this.shapeFillId,e)}).filter(o=>!!o);A.getCommandDispatcher()(new c.GroupCommand(i)),A.updateStorage(t.stepName,{colour:e})}async init(e,t,A){const a=e.option;if(!a)throw new ae(e);if(A)await this.reload(e,t,A);else{const n=T.getDefaultVariant(a);return n?this.selectVariantCommand(e,{fill:n.color,stroke:n.color,variant:n},[],t):null}return null}async selectVariant(e,t,A,a){const n=await this.selectVariantCommand(e,t,A,a);n&&(n.command&&a.getCommandDispatcher()(n.command),n.followup&&await n.followup())}async reload(e,t,A){var r;const a=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(a!=null&&a.selectedVariants){const g=a.selectedVariants[0].id;if(s&&g){const d=(r=s.variants)==null?void 0:r.find(B=>B.id===g);if(d){const B=o.map(w=>({id:w.id,region:w.stepRegion}));await t.setSelectionsAndElements(e.stepName,[d],B,async()=>{var w;t.updateStorage(e.stepName,{colour:((w=a==null?void 0:a.storage)==null?void 0:w.colour)||""}),t.setMandatoryFulfilled(e.stepName,!0)})}}}}async selectVariantCommand(e,t,A,a){var s;const n=a.getLayouts(),i=(s=a.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=d=>{const B=d.region;if(!n.find(Q=>Q.panelId===(B==null?void 0:B.panelId)))throw new k(B);const h=o();return new c.IllustrationColorCommand(d.id,this.shapeFillId,h)},g=A.map(r).filter(d=>!!d);return{command:new c.GroupCommand(g),followup:async()=>{await a.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],A),a.updateStorage(e.stepName,{colour:o()})}}}else{const r=w=>{const h=n.find(I=>I.panelId===w.panelId);if(!h)throw new k(w);const Q=o(),E=`
|
|
560
560
|
<svg
|
|
561
561
|
xmlns="http://www.w3.org/2000/svg"
|
|
562
562
|
xmlnsXlink="http://www.w3.org/1999/xlink"
|