@spiffcommerce/core 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1,4 +1,4 @@
1
- var e=require("papyrus/build/main/CommandContext"),t=require("papyrus/build/main/command"),a=(require("papyrus/build/main/Elements/factory"),require("spiff-preview"),require("papyrus/build/main/font")),i=require("swagger-client"),n=require("@apollo/client"),o=require("@apollo/client/link/context"),r=require("@apollo/client/link/error"),s=require("cross-fetch"),l=require("react"),c=require("react/jsx-runtime"),d=require("papyrus/build/main/types"),h=require("lodash.isequal"),p=require("papyrus/build/main/LayoutsState/types"),u=require("papyrus/build/main/math"),m=require("papyrus/build/main/text/algorithm/traditional"),f=require("papyrus/build/main/text/shared"),g=require("papyrus/build/main/image"),w=require("canvg"),y=require("papyrus/build/main/generation/Workflow"),S=require("lodash.clonedeep"),v=require("papyrus/build/main/module/resolver"),x=require("lodash.debounce"),C=require("papyrus/build/main/frame"),b=require("papyrus/build/main/illustration"),k=require("papyrus/build/main/LayoutsState"),E=require("qrcode"),I=require("papyrus/build/main/crossplatform"),N=require("react-dom/server"),R=require("papyrus/build/main/Elements/Patchwork"),O=require("papyrus/build/main/text/algorithm/autosize"),M=require("papyrus/build/main/generation");function T(e,t,a,i){Object.defineProperty(e,t,{get:a,set:i,enumerable:!0,configurable:!0})}function A(e){return e&&e.__esModule?e.default:e}function L(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}T(module.exports,"Client",(()=>Ut)),T(module.exports,"CommandContext",(()=>$eb7869949b641a40$re_export$CommandContext)),T(module.exports,"spiffCoreConfiguration",(()=>V)),T(module.exports,"PromiseQueue",(()=>He)),T(module.exports,"QueueablePromise",(()=>Ge)),T(module.exports,"MockWorkflowManager",(()=>Ft)),T(module.exports,"InformationMessageType",(()=>Ct)),T(module.exports,"assetService",(()=>Ce)),T(module.exports,"optionService",(()=>P)),T(module.exports,"server",(()=>q)),T(module.exports,"persistenceService",(()=>Ee)),T(module.exports,"graphQlManager",(()=>W)),T(module.exports,"toast",(()=>gt)),T(module.exports,"FrameService",(()=>Ze)),T(module.exports,"frameStepService",(()=>rt)),T(module.exports,"modelStepService",(()=>lt)),T(module.exports,"materialStepService",(()=>st)),T(module.exports,"patchworkStepService",(()=>pt)),T(module.exports,"shapeStepService",(()=>mt)),T(module.exports,"questionStepService",(()=>Pe)),T(module.exports,"digitalContentStepService",(()=>ot)),T(module.exports,"moduleStepService",(()=>ct)),T(module.exports,"pictureStepService",(()=>ut)),T(module.exports,"textStepService",(()=>vt)),T(module.exports,"illustrationStepService",(()=>Je)),T(module.exports,"svgObjectURL",(()=>Qe)),T(module.exports,"generate",(()=>de)),T(module.exports,"CreateElementCommand",(()=>$eb7869949b641a40$re_export$CreateElementCommand)),T(module.exports,"TextChangeCommand",(()=>$eb7869949b641a40$re_export$TextChangeCommand)),T(module.exports,"FontAlignmentCommand",(()=>$eb7869949b641a40$re_export$FontAlignmentCommand)),T(module.exports,"FontColorCommand",(()=>$eb7869949b641a40$re_export$FontColorCommand)),T(module.exports,"LayoutElementFactory",(()=>$eb7869949b641a40$re_export$LayoutElementFactory)),T(module.exports,"minZoom",(()=>he)),T(module.exports,"AdvancedEditor",(()=>ve)),T(module.exports,"EditorCore",(()=>Se)),T(module.exports,"useLayouts",(()=>B)),T(module.exports,"useEditorState",(()=>Q)),T(module.exports,"useEditorInteraction",(()=>pe)),T(module.exports,"commandReducer",(()=>X)),T(module.exports,"getDefaultState",(()=>H)),T(module.exports,"CommandContextContext",(()=>$)),T(module.exports,"AdvancedEditorStateProvider",(()=>Y)),T(module.exports,"AdvancedEditorContext",(()=>_)),T(module.exports,"UICommand",(()=>Z)),T(module.exports,"EditorSubMenu",(()=>K)),T(module.exports,"ElementEventType",(()=>te)),T(module.exports,"KeyEvent",(()=>ie)),T(module.exports,"gatherVaryingStepAspects",(()=>ze)),T(module.exports,"SpiffCommerce3DPreviewService",(()=>$eb7869949b641a40$re_export$SpiffCommerce3DPreviewService)),T(module.exports,"ProductCameraRig",(()=>$eb7869949b641a40$re_export$ProductCameraRig));const P=new class{constructor(){L(this,"cache",new Map),L(this,"getDisplayImageSource",(e=>{if(e){const t=e.displayImage?.links.find((e=>"cdn"===e.rel));if(t)return t.href}})),L(this,"getSelectedVariant",((e,t)=>{if(e&&0!==t.length)return e.variants.find((e=>e.id===t[0]))})),L(this,"getSelectedVariants",((e,t)=>e?.variants.filter((e=>t.includes(e.id)))||[]))}async cacheRequiredOptions(e){const t=e.steps.map((e=>e.optionId)).filter((e=>void 0!==e)),i=e.steps.map((e=>e.data.colourOptionId)).filter((e=>void 0!==e)),n=[...new Set([...t,...i])].map((async e=>{const t=await P.getLocalOrFromServer(q,e);"Font"===t.data.type&&t.data.variants.forEach((async e=>{if(e.assetKey){const t=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel))?.href;t&&await(0,a.loadFontFromExternalUrl)(t)}}))}));await Promise.allSettled([...n])}async getLocalOrFromServer(e,t){if(this.cache.has(t))return this.cache.get(t);const a=(await e.execute("getOptionV2",{id:t})).body;return this.cache.set(t,a),a}getLocalOrUndefined(e){if(e)return this.cache.get(e)}async getAssetTileImageForVariant(e){if(e.thumbnailKey){const t=await Ce.getLocalOrFromServer(e.thumbnailKey),a=t.links.find((e=>"thumbnail"===e.rel)),i=t.links.find((e=>"cdn"===e.rel));return a?.href||i?.href}const t=e.assetKey;if(t){const e=await Ce.getLocalOrFromServer(t),a=e.links.find((e=>"thumbnail"===e.rel)),i=e.links.find((e=>"cdn"===e.rel));return a?.href||i?.href}return e.materialId?e.materialId:""}getDefaultVariant(e){const t=e.variants;return 1===t.length?t[0]:void 0!==e.defaultVariant?t.find((t=>t.id===e.defaultVariant)):void 0}};function D(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const V=new class{constructor(){D(this,"defaultServerUrl","https://api.spiff.com.au"),D(this,"defaultServicesApiUrl","https://services.spiff.com.au"),D(this,"defaultHubUrl","https://hub.spiff.com.au"),D(this,"serverUrl",void 0),D(this,"servicesApiUrl",void 0),D(this,"hubUrl",void 0),D(this,"serverUrlCallbacks",void 0),this.serverUrl=this.defaultServerUrl,this.servicesApiUrl=this.defaultServicesApiUrl,this.hubUrl=this.defaultHubUrl,this.serverUrlCallbacks=[]}getServerUrl(){return this.serverUrl}getServicesApiUrl(){return this.servicesApiUrl}getHubUrl(){return this.hubUrl}setServerUrl(e){this.serverUrl=e,this.serverUrlCallbacks.forEach((e=>e()))}setServicesApiUrl(e){this.servicesApiUrl=e}setHubUrl(e){this.hubUrl=e}addServerUrlCallback(e){this.serverUrlCallbacks.push(e)}};function z(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}let U;const F=e=>{U=e},j=async()=>{const e={transactionOwnerId:U};return window.location.href.includes("/workflows/product/")?{...await new Promise((e=>{const t=V.getHubUrl();if(window.location.href.includes("localhost")||window.location.href.includes("ngrok"))return void e({});const a=i=>{i.origin===t&&(window.removeEventListener("message",a),e(i.data))};window.parent!==window&&(window.addEventListener("message",a,!1),window.parent.postMessage("ready",t))})),...e}:e};const q=new class{constructor(){z(this,"client",void 0),z(this,"uncachedOperations",[]),V.addServerUrlCallback((async()=>{this.client=void 0,this.client=await this.constructClient()}))}setUncachedOperations(e){this.uncachedOperations=e}async execute(e,t){const a=this.uncachedOperations.includes(e)?e+"_private":e;return new Promise(((e,i)=>{this.getClient().then((n=>{n.execute({operationId:a,parameters:t}).then((t=>e(t))).catch((e=>{e.response&&e.response.status&&e.response.status>=500||(!e.response&&i(new Error(e)),e.response&&i(new Error(`${e.response.status} ${e.response.url}`)))}))})).catch((e=>{i(e)}))}))}async syncAuth(e){const t=await j();if(t.bearer?e.authorizations={...e.authorizations,OAuth2:{token:{access_token:t.bearer,token_type:"Bearer"}}}:e.authorizations={...e.authorizations,OAuth2:{token:{access_token:"",token_type:"Bearer"}}},t.activeIntegration)e.authorizations={...e.authorizations,ActiveIntegration:t.activeIntegration};else{const t={...e.authorizations};delete t.ActiveIntegration,e.authorizations=t}if(t.partnerId)e.authorizations={...e.authorizations,PartnerId:t.partnerId};else{const t={...e.authorizations};delete t.PartnerId,e.authorizations=t}}async getClient(){return this.client||(this.client=await this.constructClient()),this.syncAuth(this.client),Promise.resolve(this.client)}async constructClient(){const e=await j(),t=V.getServerUrl()+"/v2/api-docs";return await A(i)(t,{authorizations:{OAuth2:{token:{access_token:e.bearer,token_type:"Bearer"}},PartnerId:e.partnerId}})}};const W=new class{constructor(){z(this,"shadowGraphqlClient",void 0),this.shadowGraphqlClient=this.constructShadowGraphqlClient(),V.addServerUrlCallback((()=>{this.shadowGraphqlClient=this.constructShadowGraphqlClient()}))}getShadowGraphqlClient(){return this.shadowGraphqlClient}constructShadowGraphqlClient(){const e=(0,n.createHttpLink)({uri:`${V.getServerUrl()}/graphql`,fetch:A(s)}),t=(0,o.setContext)((async(e,{headers:t})=>{const a=t||{},i=await j();return i.bearer&&(a.Authorization=`Bearer ${i.bearer}`),i.partnerId&&(a.partnerId=i.partnerId),i.activeIntegration&&(a.activeIntegration=i.activeIntegration),i.transactionOwnerId&&(a.transactionOwnerId=i.transactionOwnerId),{headers:a}})),a=(0,r.onError)((({operation:e,graphQLErrors:t,networkError:a})=>{(t||[]).forEach((({message:t,locations:a,path:i})=>{console.log("[GraphQL Operation Error]"),console.log("Name:"+e.operationName),console.log("Query:"+JSON.stringify(e.query)),console.log(`Message: ${t}, Location: ${JSON.stringify(a,null,2)}, Path: ${i}`),console.log("Variables:"+JSON.stringify(e.variables))})),a&&console.log("GraphQL Network error")}));const i=new(0,n.InMemoryCache)({typePolicies:{Transaction:{fields:{transactionOwnerId:{read:(e=null)=>e},customLogoLink:{read:(e=null)=>e},workflowFooterLogoLink:{read:(e=null)=>e},workflowState:{read:(e=null)=>e},bulkSourceUrl:{read:(e=null)=>e}}}}});return new(0,n.ApolloClient)({link:(0,n.from)([a,t,e]),cache:i,name:"Core"})}},$=(0,l.createContext)(new(0,e.CommandContext)),B=()=>{const e=(0,l.useContext)($);(0,l.useEffect)((()=>{e.registerStateCallback((()=>{a(new Date)}))}),[e]);const[t,a]=(0,l.useState)(new Date);return{commandDispatcher:t=>{e.apply(t)},getLayoutById:t=>e.getLayoutById(t),getAllLayouts:()=>e.getAllLayouts(),getReducerState:()=>{const t=e.getState();return t||{transaction:{layouts:{},serializableWorkflow:{steps:[]}}}},lastUpdated:t,flattenSequence:(t,a)=>{e.flattenSequence(t,a)}}};let K;var G;(G=K||(K={})).None="None",G.FrameAdjustment="FrameAdjustment",G.FinalizeDesign="FinalizeDesign";const H=(e,t)=>({layoutId:e()[0].layoutState.layout.id,selectedElement:void 0,zoom:t,maxZoom:5,units:d.UnitOfMeasurement.Pixel,subMenu:K.None,activeModifierKeys:[],metaPressed:!1,elementEvent:void 0,scrolledMovement:!1}),X=(e,t)=>A(h)(e,t.apply(e))?e:t.apply(e),_=(0,l.createContext)({}),Y=e=>{const{getAllLayouts:t}=B(),[a,i]=(0,l.useReducer)(X,H(t,e.defaultZoom||1)),n=(0,l.useMemo)((()=>({state:a,uiDispatcher:i})),[a,i]);return(0,c.jsx)(_.Provider,{value:n,children:e.children})};class Z{constructor(e){var t,a,i;i=void 0,(a="changes")in(t=this)?Object.defineProperty(t,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[a]=i,this.changes=e}apply(e){return{...e,...this.changes}}}const Q=()=>(0,l.useContext)(_),J=7*window.devicePixelRatio,ee=(e,t,a,i)=>{const n=t.layout.width,o=t.layout.height,r=t.elements.filter((t=>t.id!==e.id&&!t.immutable&&!t.productOverlay)),s=r.map((e=>(0,u.getAxisAlignedBoundingBox)(e.x,e.y,e.width,e.height,e.rotation))),l=[],d=new Set;s.forEach((e=>d.add(e.minX))),s.forEach((e=>d.add(e.maxX))),[0,n/2,n].forEach((e=>d.add(e)));const h=new Set;s.forEach((e=>h.add(e.minY))),s.forEach((e=>h.add(e.maxY))),[0,o/2,o].forEach((e=>h.add(e)));const p=r.map((e=>e.y));for(let e=-315;e<=315;e+=45)p.push(e);const m=(0,u.getAxisAlignedBoundingBox)(e.x,e.y,e.width,e.height,e.rotation),f=[{value:m.minX,anchor:-1},{value:m.minX+(m.maxX-m.minX)/2,anchor:0},{value:m.minX+(m.maxX-m.minX),anchor:1}],g=[{value:m.minY,anchor:-1},{value:m.minY+(m.maxY-m.minY)/2,anchor:0},{value:m.minY+(m.maxY-m.minY),anchor:1}],w=[{value:e.rotation,anchor:0}],y=(e,t,i,r)=>{const s=[];return t.forEach((t=>{const l=i.find((e=>(0,u.isCloseToValue)(t,e.value,2*a))),[d,h]=((e,t)=>[{x:"x"===e?t:0,y:"x"===e?0:t},{x:"x"===e?t:n,y:"x"===e?o:t}])(e,t),p="rotation"===e?null:(0,c.jsx)("line",{x1:d.x,y1:d.y,x2:h.x,y2:h.y,stroke:r||"#D61B5C",strokeDasharray:5*a,strokeWidth:1.2*a,overflow:"overlay"},`${e}-${t}-${d.x}-${d.y}-${h.x}-${h.y}`);void 0!==l&&s.push({type:e,value:t,anchorPoint:l.anchor,svgNode:p,guidelineCoordinates:[d,h]})})),s};return l.push(...y("x",Array.from(d),f,i)),l.push(...y("y",Array.from(h),g,i)),l.push(...y("rotation",p,w,i)),l};let te;var ae;let ie;var ne;(ae=te||(te={})).Translate="Translate",ae.Rotate="Rotate",ae.Resize="Resize",(ne=ie||(ie={})).ControlLeft="ControlLeft",ne.ControlRight="ControlRight",ne.Equal="Equal",ne.MetaLeft="MetaLeft",ne.MetaRight="MetaRight",ne.Minus="Minus",ne.ArrowLeft="ArrowLeft",ne.ArrowRight="ArrowRight",ne.ArrowUp="ArrowUp",ne.ArrowDown="ArrowDown",ne.AltLeft="AltLeft",ne.AltRight="AltRight",ne.Delete="Delete",ne.Backspace="Backspace";const oe=(e,a,i,n)=>{const o=()=>{switch(i){case d.UnitOfMeasurement.Pixel:return 1;case d.UnitOfMeasurement.Millimeter:return u.mmPerPixel;case d.UnitOfMeasurement.Centimeter:return u.cmPerPixel;default:throw new Error("Unknown unit of measurement")}};let r=a.x,s=a.y,l=a.x,c=a.y;switch(e){case ie.ArrowLeft:l=a.x-1/o();break;case ie.ArrowUp:c=a.y-1/o();break;case ie.ArrowRight:l=a.x+1/o();break;case ie.ArrowDown:c=a.y+1/o();break;default:throw new Error("Unhandled element interaction!")}const h=(0,u.getAxisAlignedBoundingBox)(l,c,a.width,a.height,a.rotation);return(!n||h.minX>=n.left&&h.maxX<=n.left+n.width&&h.minY>=n.top&&h.maxY<=n.top+n.height)&&(r=l,s=c),new(0,t.MoveCommand)(a.id,r,s)};var re=0,se=0,le=0;const ce=(e,a,i,n,o,r,s)=>{const l=((e,t,a,i,n,o,r)=>{const s=i.width/t.width,l=i.height/t.height,c=e.movementX/s,h=e.movementY/l,g=a.rotation*Math.PI/180,w=Math.sin(g),y=Math.cos(g);let S;switch(n.type){case te.Resize:let t={top:a.y,left:a.x,width:a.width,height:a.height,rotation:a.rotation,fontSize:a.fontSize},v=t;switch(n.screenAxis){case d.ScaleAxis.North:{const e=-c*w+h*y,i=a.y+e,n=a.height-e,o=(0,u.getElementVertices)({...a}).center,r=(0,u.getElementVertices)({...a,y:i,height:n}).center,s=(0,u.rotateAroundPoint)(r,o,g),l=s.x-a.width/2,d=s.y-n/2;v={...t,left:l,top:d,height:n}}break;case d.ScaleAxis.East:{const e=c*y+h*w,i=a.width+e;let n=a.height;if(a.type===p.LayoutElementType.Textbox){const e=a;n=(0,m.calculateTextboxLines)(e.fontSize,e.fontData,e,e.input||e.text||"",e.lineHeight).requiredHeight}const o=(0,u.getElementVertices)({...a}).center,r=(0,u.getElementVertices)({...a,width:i,height:n}).center,s=(0,u.rotateAroundPoint)(r,o,g),l=s.x-i/2,d=s.y-n/2;v={...t,left:l,top:d,width:i,height:n}}break;case d.ScaleAxis.West:{const e=c*y+h*w,i=a.x+e,n=a.width-e;let o=a.height;if(a.type===p.LayoutElementType.Textbox){const e=a;o=(0,m.calculateTextboxLines)(e.fontSize,e.fontData,e,e.input||e.text||"",e.lineHeight).requiredHeight}const r=(0,u.getElementVertices)({...a}).center,s=(0,u.getElementVertices)({...a,width:n,height:o,x:i}).center,l=(0,u.rotateAroundPoint)(s,r,g),d=l.x-n/2,f=l.y-o/2;v={...t,left:d,top:f,width:n,height:o}}break;case d.ScaleAxis.South:{const e=-c*w+h*y,i=a.height+e,n=(0,u.getElementVertices)({...a}).center,o=(0,u.getElementVertices)({...a,height:i}).center,r=(0,u.rotateAroundPoint)(o,n,g),s=r.x-a.width/2,l=r.y-i/2;v={...t,left:s,top:l,height:i}}break;case d.ScaleAxis.Northeast:{const e=c*y+h*w,i=a.width+e;let n=a.height+e,o=a.y-e,r=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;r=t.fontSize+e/8,n=(0,m.calculateTextboxLines)(r,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight;const i=t.lineHeight||f.defaultLineHeightFactor;o=a.y-e*i/8}const s=(0,u.getElementVertices)({...a}).center,l=(0,u.getElementVertices)({...a,width:i,height:n,y:o}).center,d=(0,u.rotateAroundPoint)(l,s,g),S=d.x-i/2,x=d.y-n/2;v={...t,left:S,top:x,width:i,height:n,fontSize:r}}break;case d.ScaleAxis.Northwest:{const e=-c*y+-h*w,i=a.x-e,n=a.width+e;let o=a.y-e,r=a.height+e,s=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;s=t.fontSize+e/8,r=(0,m.calculateTextboxLines)(s,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight;const i=t.lineHeight||f.defaultLineHeightFactor;o=a.y-e*i/8}const l=(0,u.getElementVertices)({...a}).center,d=(0,u.getElementVertices)({...a,x:i,y:o,width:n,height:r}).center,S=(0,u.rotateAroundPoint)(d,l,g),x=S.x-n/2,C=S.y-r/2;v={...t,left:x,top:C,width:n,height:r,fontSize:s}}break;case d.ScaleAxis.Southeast:{const e=c*y+h*w,i=a.width+e;let n=a.height+e,o=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;o=t.fontSize+e/8,n=(0,m.calculateTextboxLines)(o,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight}const r=(0,u.getElementVertices)({...a}).center,s=(0,u.getElementVertices)({...a,width:i,height:n}).center,l=(0,u.rotateAroundPoint)(s,r,g),d=l.x-i/2,f=l.y-n/2;v={...t,left:d,top:f,width:i,height:n,fontSize:o}}break;case d.ScaleAxis.Southwest:{const e=-c*y+-h*w,i=a.width+e;let n=a.x-e,o=a.height+e,r=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;r=t.fontSize+e/8,o=(0,m.calculateTextboxLines)(r,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight}const s=(0,u.getElementVertices)({...a}).center,l=(0,u.getElementVertices)({...a,width:i,height:o,x:n}).center,d=(0,u.rotateAroundPoint)(l,s,g),f=d.x-i/2,S=d.y-o/2;v={...t,left:f,top:S,width:i,height:o,fontSize:r}}}return S=(0,u.getAxisAlignedBoundingBox)(v.left,v.top,v.width,v.height,v.rotation),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(t=v),t;case te.Rotate:const x={x:e.clientX,y:e.clientY};let C,b=a.rotation;const k=(0,u.getElementVertices)(a,i,{x:s,y:l}),E=(0,u.findAngle)(x,k.c,k.d),I=(0,u.findAngle)(x,k.d,k.c);if(0===o.filter((e=>"rotation"===e.type)).length)le=0,C=(a.rotation+E-I)%360;else{le+=Math.sqrt(c**2+h**2);const e=Math.abs(le)>J/s;C=e?(a.rotation+E-I)%360:o.find((e=>"rotation"===e.type))?.value||0,e&&(le=0)}return S=(0,u.getAxisAlignedBoundingBox)(a.x,a.y,a.width,a.height,C),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(b=C),{top:a.y,left:a.x,width:a.width,height:a.height,rotation:b};case te.Translate:let N,R,O=a.x,M=a.y;if(0===o.filter((e=>"rotation"!==e.type)).length)re=0,se=0,N=a.x+c,R=a.y+h;else{const e=o.find((e=>"x"===e.type)),t=o.find((e=>"y"===e.type));e||(re=0),t||(se=0);const i=Math.abs(re)>J/s,n=Math.abs(se)>J/l;N=e?i?a.x+re:a.x:a.x+c,R=t?n?a.y+se:a.y:a.y+h,re=i?0:re+c,se=n?0:se+h}return S=(0,u.getAxisAlignedBoundingBox)(N,R,a.width,a.height,a.rotation),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(O=N,M=R),{top:M,left:O,width:a.width,height:a.height,rotation:a.rotation}}})(e,a,i,n,o,r,s),c=[];if(i.type===p.LayoutElementType.Textbox){const e=i;c.push(new(0,t.TextChangeCommand)(e.id,e.text||e.input||""))}if(c.push(new(0,t.MoveCommand)(i.id,l.left,l.top),new(0,t.ResizeCommand)(i.id,l.width,l.height),new(0,t.RotateCommand)(i.id,l.rotation)),i.type===p.LayoutElementType.Textbox){const e=i;l.fontSize&&e.fontSize!==l.fontSize&&c.push(new(0,t.FontSizeCommand)(e.id,l.fontSize))}return c},de=()=>{const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},he=.5,pe=(e,a,i,n,o,r,s)=>{const{state:c,uiDispatcher:d}=(0,l.useContext)(_),{getLayoutById:h,getReducerState:p,flattenSequence:u}=B(),[m,f]=(0,l.useState)(void 0),[g,w]=(0,l.useState)(void 0),y=h(c.layoutId);(0,l.useEffect)((()=>{if("adjustment"===o&&e?.current&&n){if(n<he)return void d(new Z({zoom:he}));if(n>c.maxZoom)return void d(new Z({zoom:c.maxZoom}));d(new Z({zoom:n}))}}),[n,d,e,o,c.maxZoom]);const S=(0,l.useCallback)(((e,t)=>{d(new Z({zoom:t}));const n=a?.current?.scrollWidth-a?.current?.clientWidth!=0,r=a?.current?.scrollHeight-a?.current?.clientHeight!=0;a.current&&i.current&&!c.scrolledMovement&&"advanced"===o&&(r&&(a.current.scrollTop=i.current.offsetTop+(a.current.scrollHeight-a.current.clientHeight)/2),n&&(a.current.scrollLeft=(i.current.offsetLeft+a.current.scrollWidth-a.current.clientWidth)/2))}),[d,a,i,c.scrolledMovement,o]);(0,l.useEffect)((()=>{c.zoom<=1&&d(new Z({scrolledMovement:!1}))}),[d,c.zoom]);const v=a?.current?.getBoundingClientRect(),x=((v?.width||1)+(v?.height||1))/2,C=(y.layoutState.layout.width+y.layoutState.layout.height)/2/x/c.zoom,b=(0,l.useMemo)((()=>{const e=c.activeModifierKeys,t=c.elementEvent,a=e.includes(ie.ControlLeft)||e.includes(ie.MetaLeft)||e.includes(ie.ControlRight)||e.includes(ie.MetaRight);if(!c.selectedElement||!t||a)return[];const i=t&&t.type===te.Translate,n=t&&t.type===te.Rotate,o=y.layoutState.elements.find((e=>e.id===c.selectedElement));return(i||n)&&o?ee(o,y.layoutState,C,s):[]}),[c.selectedElement,c.elementEvent,c.activeModifierKeys,y.layoutState,C]),k=(0,l.useCallback)((()=>{const e=de();f(e),w(p().transaction)}),[p]),E=(0,l.useCallback)((()=>{d(new Z({selectedElement:void 0}))}),[d]),I=(0,l.useCallback)((()=>{d(new Z({scrolledMovement:!0}))}),[d]),N=(0,l.useCallback)(((i,n)=>{const o=y.layoutState.elements.find((e=>e.id===c.selectedElement));if(!(c.elementEvent&&e.current&&a.current&&c.selectedElement&&o))return;a.current.hasPointerCapture(i.pointerId)||a.current.setPointerCapture(i.pointerId);const s=e.current.getBoundingClientRect(),l=new(0,t.GroupCommand)(ce(i,y.layoutState.layout,o,s,c.elementEvent,b,n));l.sequenceId=m,r(l)}),[y.layoutState.elements,y.layoutState.layout,c.elementEvent,e,c.selectedElement,a,b,r]),R=(0,l.useCallback)((e=>{d(new Z({elementEvent:e}))}),[d]),O=(0,l.useCallback)((()=>{d(new Z({elementEvent:void 0})),m&&g&&(u(m,g),f(void 0),w(void 0))}),[d,m,g,u]),M=(0,l.useCallback)(((e,a)=>{let i=c.zoom;const n=c.maxZoom,s=c.selectedElement,l=c.activeModifierKeys;if((l.includes(ie.AltLeft)||l.includes(ie.AltRight))&&(e.code===ie.Equal||e.code===ie.Minus)){const t=.05*n;e.code===ie.Equal?d(new Z({zoom:i+t<=n?i+=t:i})):d(new Z({zoom:i-t>=he?i-t:i}))}const h=y.layoutState.elements.find((e=>e.id===s));if(s&&h){if(e.code===ie.MetaLeft||e.code===ie.ControlLeft||e.code===ie.MetaRight||e.code===ie.ControlRight){const t=e.code,a=c.activeModifierKeys;if(!a.includes(t))return d(new Z({activeModifierKeys:a.concat(t)}))}if(e.code===ie.ArrowDown||e.code===ie.ArrowUp||e.code===ie.ArrowLeft||e.code===ie.ArrowRight){d(new Z({elementEvent:{type:te.Translate}}));const t=oe(e.code,h,c.units,a);r(t),d(new Z({elementEvent:void 0}))}e.code!==ie.Delete&&e.code!==ie.Backspace||"advanced"!==o||(d(new Z({selectedElement:void 0})),r(new(0,t.DeleteElementCommand)(h.id)))}}),[r,d,y.layoutState.elements,o,c.activeModifierKeys,c.maxZoom,c.selectedElement,c.units,c.zoom]),T=(0,l.useCallback)((e=>{if(e.code===ie.MetaLeft||e.code===ie.ControlLeft||e.code===ie.MetaRight||e.code===ie.ControlRight){const t=c.activeModifierKeys,a=e.code;d(new Z({activeModifierKeys:t.filter((e=>e!==a))}))}}),[d,c.activeModifierKeys]);return{guidelines:b,scale:C,zoomableElementRef:i,setElementEvent:R,handleZoom:S,handleKeyDown:M,handleKeyUp:T,handlePointerPressedBackground:E,handlePointerReleased:O,handlePointerMove:N,handleScroll:I,handleSequenceStart:k}},ue=e=>{const{x:t,y:a,cursorStyle:i,onPointerDown:n,handleClass:o,cornerRadius:r,color:s,strokeWidth:l}=e;return(0,c.jsx)("circle",{className:o,cx:t,cy:a,r:r,fill:"#ffffff",style:{cursor:i},stroke:s,strokeWidth:l,onPointerDown:n})},me=e=>{const{x:t,y:a,width:i,height:n,cursorStyle:o,onPointerDown:r,edgeHandleRadius:s,color:l,strokeWidth:d}=e;return(0,c.jsx)("rect",{x:t,y:a,width:i,height:n,rx:s,fill:"#ffffff",style:{cursor:o},stroke:l,strokeWidth:d,onPointerDown:r})},fe=e=>{const{color:t,elementHeight:a,elementWidth:i,onBeginResize:n,rotation:o,scaleFactor:r,disableX:s,disableY:h}=e,p=7.5*r,m=3*r,f=28*r,g=6*r,w=1.2*r,y=a-2*p,S=(0,l.useCallback)(((e,t,a)=>{e.stopPropagation(),n(t,a)}),[n]),v=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.West,360-o),d.ScaleAxis.West)),[S,o]),x=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.East,360-o),d.ScaleAxis.East)),[S,o]),C=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.North,360-o),d.ScaleAxis.North)),[S,o]),b=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.South,360-o),d.ScaleAxis.South)),[S,o]),k=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northwest,d.ScaleAxis.Northwest)),[S]),E=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northeast,d.ScaleAxis.Northeast)),[S]),I=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Southwest,d.ScaleAxis.Southwest)),[S]),N=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northeast,d.ScaleAxis.Southeast)),[S]),R=f<=y;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ue,{x:0,y:0,cursorStyle:"nwse-resize",onPointerDown:k,handleClass:"cornerNorthWest",cornerRadius:p,color:t,strokeWidth:w}),R?(0,c.jsx)(ue,{x:i,y:0,cursorStyle:"nesw-resize",onPointerDown:E,handleClass:"cornerNorthEast",cornerRadius:p,color:t,strokeWidth:w}):void 0,R?(0,c.jsx)(ue,{x:i,y:a,cursorStyle:"nwse-resize",onPointerDown:N,handleClass:"cornerSouthEast",cornerRadius:p,color:t,strokeWidth:w}):void 0,R?(0,c.jsx)(ue,{x:0,y:a,cursorStyle:"nesw-resize",onPointerDown:I,handleClass:"cornerSouthWest",cornerRadius:p,color:t,strokeWidth:w}):void 0,R&&!s?(0,c.jsx)(me,{x:-g/2,y:a/2-f/2,width:g,height:f,onPointerDown:v,edgeHandleRadius:m,cursorStyle:"ew-resize",color:t,strokeWidth:w}):void 0,R&&!h?(0,c.jsx)(me,{x:i/2-f/2,y:a-g/2,width:f,height:g,onPointerDown:b,edgeHandleRadius:m,cursorStyle:"ns-resize",color:t,strokeWidth:w}):void 0,s?void 0:(0,c.jsx)(me,{x:i-g/2,y:a/2-Math.min(f,.8*a)/2,width:g,height:Math.min(f,.8*a),onPointerDown:x,edgeHandleRadius:m,cursorStyle:"ew-resize",color:t,strokeWidth:w}),R&&!h?(0,c.jsx)(me,{x:i/2-f/2,y:-g/2,width:f,height:g,onPointerDown:C,edgeHandleRadius:m,cursorStyle:"ns-resize",color:t,strokeWidth:w}):void 0]})},ge=e=>{const{color:t,elementWidth:a,onBeginRotate:i,scaleFactor:n}=e,o=(0,l.useCallback)((e=>{e.stopPropagation(),i()}),[i]),r=10*n,s=1.2*n;return(0,c.jsxs)("g",{children:[(0,c.jsx)("circle",{cx:a/2,cy:-2.5*r,r:1.3*r,fill:"rgba(0, 0, 0, 0.5)",opacity:.4,style:{cursor:"ew-resize"},onPointerDown:o}),(0,c.jsx)("circle",{cx:a/2,cy:-2.5*r,r:r,fill:"#fff",style:{cursor:"ew-resize"},stroke:t,strokeWidth:s,onPointerDown:o}),(0,c.jsxs)("svg",{x:a/2-r,y:-2.5*r-r,xmlns:"http://www.w3.org/2000/svg",style:{cursor:"ew-resize"},height:2*r,viewBox:"0 0 24 24",width:2*r,fill:t,onPointerDown:o,children:[(0,c.jsx)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,c.jsx)("path",{d:"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"})]})]})},we=e=>{const{color:t,height:a,highlighted:i,id:n,immutable:o,onBeginMove:r,onBeginResize:s,onBeginRotate:d,onPointerEnter:h,onPointerLeave:p,onSelected:u,pressed:m,rotation:f,scaleFactor:g,selected:w,width:y,x:S,y:v,disableX:x,disableY:C}=e,b=1.2*g,k=(0,l.useCallback)((e=>{2===e.button&&(e.stopPropagation(),u(n,e)),0===e.button&&(e.stopPropagation(),!w&&u(n,e),r())}),[n,w,u,r]),E=(0,l.useCallback)((()=>{h(n)}),[n,h]),I=(0,l.useCallback)((()=>{p(n)}),[n,p]),N=o?void 0:w?m?"grabbing":"grab":"pointer",R=o?"none":"visibleFill";return(0,c.jsxs)("g",{transform:`translate(${S}, ${v}) rotate(${f} ${y/2} ${a/2})`,children:[(0,c.jsx)("rect",{className:"interactableInnerRect",width:y,height:a,stroke:w||i?t:"none",pointerEvents:R,fill:"none",strokeWidth:b,style:{cursor:N},onPointerDown:o?void 0:k,onPointerEnter:o?void 0:E,onPointerLeave:o?void 0:I}),w&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{color:t,elementWidth:y,onBeginRotate:d,scaleFactor:g}),(0,c.jsx)(fe,{color:t,elementHeight:a,elementWidth:y,rotation:f,scaleFactor:g,onBeginResize:s,disableX:x,disableY:C})]})]})},ye=({primaryColor:e,containerHeight:t,containerWidth:a,customViewbox:i,editorRef:n,elementEvent:o,guidelines:r,layoutHeight:s,layoutWidth:d,targetedElements:h,scale:u,selectedElement:m,onElementEvent:f,onElementSelected:g,onSequenceStart:w})=>{const{state:y}=Q(),{getLayoutById:S}=B(),v=S(y.layoutId),[x,C]=(0,l.useState)(void 0),b=(0,l.useCallback)((e=>{C(e)}),[]),k=(0,l.useCallback)((e=>{x===e&&C(void 0)}),[x]),E=(0,l.useCallback)((()=>{w(),f({type:te.Translate})}),[f]),I=(0,l.useCallback)(((e,t)=>{w(),f({type:te.Resize,relativeAxis:e,screenAxis:t})}),[f]),N=(0,l.useCallback)((()=>{w(),f({type:te.Rotate})}),[f]),R=i||{x:0,y:0,width:d,height:s},O=u*(Math.sqrt(R.width*R.height)/1e3)*(100/Math.sqrt(t*a))*Math.sqrt((M=a/t,Math.exp(Math.abs(Math.log(M)))));var M;const T=v.layoutState.elements.findIndex((({id:e})=>e===m)),A=[...v.layoutState.elements];return T>=0&&A.push(A.splice(T,1)[0]),(0,c.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",version:"1.1",style:{touchAction:"none",position:"absolute",maxWidth:"100%",maxHeight:"100%"},width:"100%",height:"100%",viewBox:`${R.x} ${R.y} ${R.width} ${R.height}`,overflow:"overlay",children:[(0,c.jsx)("rect",{fill:"none",stroke:"none",ref:n,width:d,height:s}),r.map((e=>e.svgNode)),A.map((t=>{const a=void 0!==m&&t.id===m,i=a&&void 0!==o,n=void 0!==x&&t.id===x;return(0,c.jsx)(we,{color:e,id:t.id,selected:a,highlighted:n,pressed:i,x:t.x,y:t.y,disableX:t.type===p.LayoutElementType.Frame,disableY:t.type===p.LayoutElementType.Textbox||t.type===p.LayoutElementType.Frame,width:t.width,height:t.height,rotation:t.rotation,immutable:t.immutable||h&&!h.includes(t.id),onSelected:g,onBeginMove:E,onBeginResize:I,onBeginRotate:N,onPointerEnter:b,onPointerLeave:k,scaleFactor:O},t.id)}))]})},Se=e=>{const{color:t,editorRef:a,zoomableElementRef:i,interactionElementRef:n,guidelines:o,isMakingAdjustments:r,viewmask:s,visibleLayoutId:d,xTranslation:h,yTranslation:p,targetedElements:u,borderRadius:m,handleContextMenu:f,handleKeyDown:g,handleKeyUp:w,handlePointerMove:y,handlePointerPressedBackground:S,handlePointerReleased:v,handleScroll:x,onSequenceStart:C,setElementEvent:b,onElementSelected:k}=e,{getLayoutById:E}=B(),I=E(d),N=I.layoutState,{state:R}=Q(),O=(0,l.useCallback)((e=>{if(s){const t={left:s.x,top:s.y,width:s.width,height:s.height,panelId:"",rotation:0};return g(e,t)}return g(e)}),[g,s]),M=(0,l.useCallback)((e=>{if(s){const t={left:s.x,top:s.y,width:s.width,height:s.height,panelId:"",rotation:0};return y(e,t)}return y(e)}),[y,s]);return(0,c.jsx)("div",{style:{justifyContent:"center",position:"relative",height:"100%",width:"100%",scrollbarWidth:"none",outline:"none"},onContextMenu:f,onKeyDown:O,onKeyUp:w,onPointerDown:S,onPointerMoveCapture:M,onPointerUp:v,onWheelCapture:x,ref:n,tabIndex:-1,children:(0,c.jsxs)("div",{ref:i,style:{height:"100%",transform:`scale(${R.zoom}) translate(${h}px, ${p}px)`,display:"grid",filter:"drop-shadow(rgba(0, 0, 0, 0.2) 0px 0px 6px)"},children:[e.children,I.getComponentWithProps({height:r?"100%":"auto",maxHeight:"100%",maxWidth:"100%",position:"absolute",viewmask:s,width:r?"100%":"auto",borderRadius:m}),(0,c.jsx)(ye,{primaryColor:t,containerHeight:i.current?.offsetHeight||1024,containerWidth:i.current?.offsetWidth||1024,editorRef:a,elementEvent:R.elementEvent,guidelines:o,layoutHeight:N.layout.height,layoutWidth:N.layout.width,onElementEvent:b,onSequenceStart:C,onElementSelected:k,scale:10/R.zoom,selectedElement:R.selectedElement,targetedElements:u})]})})},ve=({color:e,borderRadius:a,guidelineColor:i,handleContextMenu:n,onElementSelected:o})=>{const{commandDispatcher:r,getLayoutById:s}=B(),{state:d,uiDispatcher:h}=Q(),u=(0,l.useRef)(null),m=(0,l.useRef)(null),f=(0,l.useRef)(null),{guidelines:g,handleKeyDown:w,handleKeyUp:y,handlePointerMove:S,handlePointerPressedBackground:v,handlePointerReleased:x,handleScroll:C,handleSequenceStart:b,setElementEvent:k}=pe(u,m,f,void 0,"advanced",r,i),E=(0,l.useCallback)(((e,a)=>{const i=s(d.layoutId).layoutState.elements.find((t=>t.id===e));if(e&&i&&i.type===p.LayoutElementType.Textbox){const a=i.algorithm;(!a||a===p.TextAlgorithm.Autosize)&&r(new(0,t.FontAlgorithmCommand)(e,p.TextAlgorithm.Traditional))}o&&o(e,a),h(new Z({selectedElement:e}))}),[r,s,d.layoutId,h]);return(0,c.jsx)(Se,{color:e,editorRef:u,interactionElementRef:m,zoomableElementRef:f,guidelines:g,visibleLayoutId:d.layoutId,xTranslation:0,yTranslation:0,borderRadius:a,handleContextMenu:n,handleKeyDown:w,handleKeyUp:y,handlePointerMove:S,handlePointerPressedBackground:v,handlePointerReleased:x,handleScroll:C,onSequenceStart:b,setElementEvent:k,onElementSelected:E})};function xe(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const Ce=new class{constructor(){xe(this,"server",void 0),xe(this,"cache",new Map),xe(this,"materialCache",new Map),xe(this,"loadImageAsFileInfo",(async e=>{const t=await e.arrayBuffer(),a=await(0,g.getAttributesFromArrayBuffer)(t);return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:((e,t)=>{let a=atob(e.split(",")[1]),i=[];for(let e=0;e<a.length;e++)i.push(a.charCodeAt(e));return new Blob([new Uint8Array(i)],{type:t})})(a.dataUrl,e.type)}})),this.server=q}async getLocalOrFromServer(e){if(this.cache.has(e))return this.cache.get(e);const t=(async()=>(await q.execute("getAssetByKeyV2",{assetKey:e.replace(/\//g,"_")})).body)();return this.cache.set(e,t),t}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const t=(async()=>(await q.execute("getMaterialV2",{id:e})).body)();return this.materialCache.set(e,t),t}async uploadAssetWithProgress(e,t,a,i,n,o){const r=await this.dispatchCreateAssetRequest(e,t,n,o);var s=new XMLHttpRequest;return s.open("PUT",r.assetResponse.uploadUrl,!0),s.setRequestHeader("Content-Type",r.mimeType),s.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),s.upload.onprogress=e=>{e.lengthComputable&&a(100*e.loaded/e.total)},s.onload=()=>{const e=r.assetResponse.asset;i(e)},s.onerror=()=>{console.warn("Asset upload failed")},s.send(e.blob),r.assetResponse.asset}async dispatchCreateAssetRequest(e,t,a,i){const n=e.blob.type?e.blob.type:this.guessMIME(e.name);return{assetResponse:(await this.server.execute("createAsset",{assetDetails:{name:e.name,type:t,mimeType:n,storageOwnerId:i,userAnonymous:!0}},a)).body,mimeType:n}}guessMIME(e){const t=e.split(".").pop();switch(t){case"glb":return"model/gltf-binary";case"ttf":return"font/ttf";case"mkv":return"video/x-matroska";default:throw new Error("Unexpected mimetype: "+t)}}};class be{get(e){return localStorage.getItem(e)||void 0}set(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const a=JSON.stringify([...t.entries()]);this.set(e,a)}}class ke{constructor(){var e,t,a;e=this,t="storage",a=new Map,t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a}get(e){return this.storage.get(e)||void 0}set(e,t){this.storage.set(e,t)}remove(e){this.storage.delete(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const a=JSON.stringify([...t.entries()]);this.set(e,a)}}const Ee=(()=>{try{return localStorage?new be:new ke}catch{return console.warn("Local storage was unavilable due to browser security settings. Using in-memory storage instead."),new ke}})(),Ie=n.gql`
1
+ var e=require("papyrus/build/main/CommandContext"),t=require("papyrus/build/main/command"),a=(require("papyrus/build/main/Elements/factory"),require("spiff-preview"),require("papyrus/build/main/font")),i=require("swagger-client"),n=require("@apollo/client"),o=require("@apollo/client/link/context"),r=require("@apollo/client/link/error"),s=require("cross-fetch"),l=require("react"),c=require("react/jsx-runtime"),d=require("papyrus/build/main/types"),h=require("lodash.isequal"),p=require("papyrus/build/main/LayoutsState/types"),u=require("papyrus/build/main/math"),m=require("papyrus/build/main/text/algorithm/traditional"),f=require("papyrus/build/main/text/shared"),g=require("papyrus/build/main/image"),w=require("papyrus/build/main/LayoutsState"),y=require("papyrus/build/main/illustration"),S=require("canvg"),v=require("papyrus/build/main/generation/Workflow"),x=require("lodash.clonedeep"),C=require("papyrus/build/main/module/resolver"),b=require("lodash.debounce"),k=require("papyrus/build/main/frame"),E=require("qrcode"),I=require("papyrus/build/main/crossplatform"),N=require("react-dom/server"),R=require("papyrus/build/main/Elements/Patchwork"),O=require("papyrus/build/main/text/algorithm/autosize"),M=require("papyrus/build/main/generation");function T(e,t,a,i){Object.defineProperty(e,t,{get:a,set:i,enumerable:!0,configurable:!0})}function A(e){return e&&e.__esModule?e.default:e}function L(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}T(module.exports,"Client",(()=>Ut)),T(module.exports,"CommandContext",(()=>$eb7869949b641a40$re_export$CommandContext)),T(module.exports,"spiffCoreConfiguration",(()=>V)),T(module.exports,"PromiseQueue",(()=>_e)),T(module.exports,"QueueablePromise",(()=>Xe)),T(module.exports,"MockWorkflowManager",(()=>Ft)),T(module.exports,"InformationMessageType",(()=>Ct)),T(module.exports,"assetService",(()=>Ce)),T(module.exports,"optionService",(()=>P)),T(module.exports,"server",(()=>q)),T(module.exports,"persistenceService",(()=>Ee)),T(module.exports,"graphQlManager",(()=>W)),T(module.exports,"toast",(()=>gt)),T(module.exports,"FrameService",(()=>Je)),T(module.exports,"frameStepService",(()=>rt)),T(module.exports,"modelStepService",(()=>lt)),T(module.exports,"materialStepService",(()=>st)),T(module.exports,"patchworkStepService",(()=>pt)),T(module.exports,"shapeStepService",(()=>mt)),T(module.exports,"questionStepService",(()=>Ve)),T(module.exports,"digitalContentStepService",(()=>ot)),T(module.exports,"moduleStepService",(()=>ct)),T(module.exports,"pictureStepService",(()=>ut)),T(module.exports,"textStepService",(()=>vt)),T(module.exports,"illustrationStepService",(()=>De)),T(module.exports,"svgObjectURL",(()=>Pe)),T(module.exports,"generate",(()=>de)),T(module.exports,"CreateElementCommand",(()=>$eb7869949b641a40$re_export$CreateElementCommand)),T(module.exports,"TextChangeCommand",(()=>$eb7869949b641a40$re_export$TextChangeCommand)),T(module.exports,"FontAlignmentCommand",(()=>$eb7869949b641a40$re_export$FontAlignmentCommand)),T(module.exports,"FontColorCommand",(()=>$eb7869949b641a40$re_export$FontColorCommand)),T(module.exports,"LayoutElementFactory",(()=>$eb7869949b641a40$re_export$LayoutElementFactory)),T(module.exports,"minZoom",(()=>he)),T(module.exports,"AdvancedEditor",(()=>ve)),T(module.exports,"EditorCore",(()=>Se)),T(module.exports,"useLayouts",(()=>B)),T(module.exports,"useEditorState",(()=>Q)),T(module.exports,"useEditorInteraction",(()=>pe)),T(module.exports,"commandReducer",(()=>X)),T(module.exports,"getDefaultState",(()=>H)),T(module.exports,"CommandContextContext",(()=>$)),T(module.exports,"AdvancedEditorStateProvider",(()=>Y)),T(module.exports,"AdvancedEditorContext",(()=>_)),T(module.exports,"UICommand",(()=>Z)),T(module.exports,"EditorSubMenu",(()=>K)),T(module.exports,"ElementEventType",(()=>te)),T(module.exports,"KeyEvent",(()=>ie)),T(module.exports,"gatherVaryingStepAspects",(()=>Fe)),T(module.exports,"SpiffCommerce3DPreviewService",(()=>$eb7869949b641a40$re_export$SpiffCommerce3DPreviewService)),T(module.exports,"ProductCameraRig",(()=>$eb7869949b641a40$re_export$ProductCameraRig));const P=new class{constructor(){L(this,"cache",new Map),L(this,"getDisplayImageSource",(e=>{if(e){const t=e.displayImage?.links.find((e=>"cdn"===e.rel));if(t)return t.href}})),L(this,"getSelectedVariant",((e,t)=>{if(e&&0!==t.length)return e.variants.find((e=>e.id===t[0]))})),L(this,"getSelectedVariants",((e,t)=>e?.variants.filter((e=>t.includes(e.id)))||[]))}async cacheRequiredOptions(e){const t=e.steps.map((e=>e.optionId)).filter((e=>void 0!==e)),i=e.steps.map((e=>e.data.colourOptionId)).filter((e=>void 0!==e)),n=[...new Set([...t,...i])].map((async e=>{const t=await P.getLocalOrFromServer(q,e);"Font"===t.data.type&&t.data.variants.forEach((async e=>{if(e.assetKey){const t=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel))?.href;t&&await(0,a.loadFontFromExternalUrl)(t)}}))}));await Promise.allSettled([...n])}async getLocalOrFromServer(e,t){if(this.cache.has(t))return this.cache.get(t);const a=(await e.execute("getOptionV2",{id:t})).body;return this.cache.set(t,a),a}getLocalOrUndefined(e){if(e)return this.cache.get(e)}async getAssetTileImageForVariant(e){if(e.thumbnailKey){const t=await Ce.getLocalOrFromServer(e.thumbnailKey),a=t.links.find((e=>"thumbnail"===e.rel)),i=t.links.find((e=>"cdn"===e.rel));return a?.href||i?.href}const t=e.assetKey;if(t){const e=await Ce.getLocalOrFromServer(t),a=e.links.find((e=>"thumbnail"===e.rel)),i=e.links.find((e=>"cdn"===e.rel));return a?.href||i?.href}return e.materialId?e.materialId:""}getDefaultVariant(e){const t=e.variants;return 1===t.length?t[0]:void 0!==e.defaultVariant?t.find((t=>t.id===e.defaultVariant)):void 0}};function D(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const V=new class{constructor(){D(this,"defaultServerUrl","https://api.spiff.com.au"),D(this,"defaultServicesApiUrl","https://services.spiff.com.au"),D(this,"defaultHubUrl","https://hub.spiff.com.au"),D(this,"serverUrl",void 0),D(this,"servicesApiUrl",void 0),D(this,"hubUrl",void 0),D(this,"serverUrlCallbacks",void 0),this.serverUrl=this.defaultServerUrl,this.servicesApiUrl=this.defaultServicesApiUrl,this.hubUrl=this.defaultHubUrl,this.serverUrlCallbacks=[]}getServerUrl(){return this.serverUrl}getServicesApiUrl(){return this.servicesApiUrl}getHubUrl(){return this.hubUrl}setServerUrl(e){this.serverUrl=e,this.serverUrlCallbacks.forEach((e=>e()))}setServicesApiUrl(e){this.servicesApiUrl=e}setHubUrl(e){this.hubUrl=e}addServerUrlCallback(e){this.serverUrlCallbacks.push(e)}};function z(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}let U;const F=e=>{U=e},j=async()=>{const e={transactionOwnerId:U};return window.location.href.includes("/workflows/product/")?{...await new Promise((e=>{const t=V.getHubUrl();if(window.location.href.includes("localhost")||window.location.href.includes("ngrok"))return void e({});const a=i=>{i.origin===t&&(window.removeEventListener("message",a),e(i.data))};window.parent!==window&&(window.addEventListener("message",a,!1),window.parent.postMessage("ready",t))})),...e}:e};const q=new class{constructor(){z(this,"client",void 0),z(this,"uncachedOperations",[]),V.addServerUrlCallback((async()=>{this.client=void 0,this.client=await this.constructClient()}))}setUncachedOperations(e){this.uncachedOperations=e}async execute(e,t){const a=this.uncachedOperations.includes(e)?e+"_private":e;return new Promise(((e,i)=>{this.getClient().then((n=>{n.execute({operationId:a,parameters:t}).then((t=>e(t))).catch((e=>{e.response&&e.response.status&&e.response.status>=500||(!e.response&&i(new Error(e)),e.response&&i(new Error(`${e.response.status} ${e.response.url}`)))}))})).catch((e=>{i(e)}))}))}async syncAuth(e){const t=await j();if(t.bearer?e.authorizations={...e.authorizations,OAuth2:{token:{access_token:t.bearer,token_type:"Bearer"}}}:e.authorizations={...e.authorizations,OAuth2:{token:{access_token:"",token_type:"Bearer"}}},t.activeIntegration)e.authorizations={...e.authorizations,ActiveIntegration:t.activeIntegration};else{const t={...e.authorizations};delete t.ActiveIntegration,e.authorizations=t}if(t.partnerId)e.authorizations={...e.authorizations,PartnerId:t.partnerId};else{const t={...e.authorizations};delete t.PartnerId,e.authorizations=t}}async getClient(){return this.client||(this.client=await this.constructClient()),this.syncAuth(this.client),Promise.resolve(this.client)}async constructClient(){const e=await j(),t=V.getServerUrl()+"/v2/api-docs";return await A(i)(t,{authorizations:{OAuth2:{token:{access_token:e.bearer,token_type:"Bearer"}},PartnerId:e.partnerId}})}};const W=new class{constructor(){z(this,"shadowGraphqlClient",void 0),this.shadowGraphqlClient=this.constructShadowGraphqlClient(),V.addServerUrlCallback((()=>{this.shadowGraphqlClient=this.constructShadowGraphqlClient()}))}getShadowGraphqlClient(){return this.shadowGraphqlClient}constructShadowGraphqlClient(){const e=(0,n.createHttpLink)({uri:`${V.getServerUrl()}/graphql`,fetch:A(s)}),t=(0,o.setContext)((async(e,{headers:t})=>{const a=t||{},i=await j();return i.bearer&&(a.Authorization=`Bearer ${i.bearer}`),i.partnerId&&(a.partnerId=i.partnerId),i.activeIntegration&&(a.activeIntegration=i.activeIntegration),i.transactionOwnerId&&(a.transactionOwnerId=i.transactionOwnerId),{headers:a}})),a=(0,r.onError)((({operation:e,graphQLErrors:t,networkError:a})=>{(t||[]).forEach((({message:t,locations:a,path:i})=>{console.log("[GraphQL Operation Error]"),console.log("Name:"+e.operationName),console.log("Query:"+JSON.stringify(e.query)),console.log(`Message: ${t}, Location: ${JSON.stringify(a,null,2)}, Path: ${i}`),console.log("Variables:"+JSON.stringify(e.variables))})),a&&console.log("GraphQL Network error")}));const i=new(0,n.InMemoryCache)({typePolicies:{Transaction:{fields:{transactionOwnerId:{read:(e=null)=>e},customLogoLink:{read:(e=null)=>e},workflowFooterLogoLink:{read:(e=null)=>e},workflowState:{read:(e=null)=>e},bulkSourceUrl:{read:(e=null)=>e}}}}});return new(0,n.ApolloClient)({link:(0,n.from)([a,t,e]),cache:i,name:"Core"})}},$=(0,l.createContext)(new(0,e.CommandContext)),B=()=>{const e=(0,l.useContext)($);(0,l.useEffect)((()=>{e.registerStateCallback((()=>{a(new Date)}))}),[e]);const[t,a]=(0,l.useState)(new Date);return{commandDispatcher:t=>{e.apply(t)},getLayoutById:t=>e.getLayoutById(t),getAllLayouts:()=>e.getAllLayouts(),getReducerState:()=>{const t=e.getState();return t||{transaction:{layouts:{},serializableWorkflow:{steps:[]}}}},lastUpdated:t,flattenSequence:(t,a)=>{e.flattenSequence(t,a)}}};let K;var G;(G=K||(K={})).None="None",G.FrameAdjustment="FrameAdjustment",G.FinalizeDesign="FinalizeDesign";const H=(e,t)=>({layoutId:e()[0].layoutState.layout.id,selectedElement:void 0,zoom:t,maxZoom:5,units:d.UnitOfMeasurement.Pixel,subMenu:K.None,activeModifierKeys:[],metaPressed:!1,elementEvent:void 0,scrolledMovement:!1}),X=(e,t)=>A(h)(e,t.apply(e))?e:t.apply(e),_=(0,l.createContext)({}),Y=e=>{const{getAllLayouts:t}=B(),[a,i]=(0,l.useReducer)(X,H(t,e.defaultZoom||1)),n=(0,l.useMemo)((()=>({state:a,uiDispatcher:i})),[a,i]);return(0,c.jsx)(_.Provider,{value:n,children:e.children})};class Z{constructor(e){var t,a,i;i=void 0,(a="changes")in(t=this)?Object.defineProperty(t,a,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[a]=i,this.changes=e}apply(e){return{...e,...this.changes}}}const Q=()=>(0,l.useContext)(_),J=7*window.devicePixelRatio,ee=(e,t,a,i)=>{const n=t.layout.width,o=t.layout.height,r=t.elements.filter((t=>t.id!==e.id&&!t.immutable&&!t.productOverlay)),s=r.map((e=>(0,u.getAxisAlignedBoundingBox)(e.x,e.y,e.width,e.height,e.rotation))),l=[],d=new Set;s.forEach((e=>d.add(e.minX))),s.forEach((e=>d.add(e.maxX))),[0,n/2,n].forEach((e=>d.add(e)));const h=new Set;s.forEach((e=>h.add(e.minY))),s.forEach((e=>h.add(e.maxY))),[0,o/2,o].forEach((e=>h.add(e)));const p=r.map((e=>e.y));for(let e=-315;e<=315;e+=45)p.push(e);const m=(0,u.getAxisAlignedBoundingBox)(e.x,e.y,e.width,e.height,e.rotation),f=[{value:m.minX,anchor:-1},{value:m.minX+(m.maxX-m.minX)/2,anchor:0},{value:m.minX+(m.maxX-m.minX),anchor:1}],g=[{value:m.minY,anchor:-1},{value:m.minY+(m.maxY-m.minY)/2,anchor:0},{value:m.minY+(m.maxY-m.minY),anchor:1}],w=[{value:e.rotation,anchor:0}],y=(e,t,i,r)=>{const s=[];return t.forEach((t=>{const l=i.find((e=>(0,u.isCloseToValue)(t,e.value,2*a))),[d,h]=((e,t)=>[{x:"x"===e?t:0,y:"x"===e?0:t},{x:"x"===e?t:n,y:"x"===e?o:t}])(e,t),p="rotation"===e?null:(0,c.jsx)("line",{x1:d.x,y1:d.y,x2:h.x,y2:h.y,stroke:r||"#D61B5C",strokeDasharray:5*a,strokeWidth:1.2*a,overflow:"overlay"},`${e}-${t}-${d.x}-${d.y}-${h.x}-${h.y}`);void 0!==l&&s.push({type:e,value:t,anchorPoint:l.anchor,svgNode:p,guidelineCoordinates:[d,h]})})),s};return l.push(...y("x",Array.from(d),f,i)),l.push(...y("y",Array.from(h),g,i)),l.push(...y("rotation",p,w,i)),l};let te;var ae;let ie;var ne;(ae=te||(te={})).Translate="Translate",ae.Rotate="Rotate",ae.Resize="Resize",(ne=ie||(ie={})).ControlLeft="ControlLeft",ne.ControlRight="ControlRight",ne.Equal="Equal",ne.MetaLeft="MetaLeft",ne.MetaRight="MetaRight",ne.Minus="Minus",ne.ArrowLeft="ArrowLeft",ne.ArrowRight="ArrowRight",ne.ArrowUp="ArrowUp",ne.ArrowDown="ArrowDown",ne.AltLeft="AltLeft",ne.AltRight="AltRight",ne.Delete="Delete",ne.Backspace="Backspace";const oe=(e,a,i,n)=>{const o=()=>{switch(i){case d.UnitOfMeasurement.Pixel:return 1;case d.UnitOfMeasurement.Millimeter:return u.mmPerPixel;case d.UnitOfMeasurement.Centimeter:return u.cmPerPixel;default:throw new Error("Unknown unit of measurement")}};let r=a.x,s=a.y,l=a.x,c=a.y;switch(e){case ie.ArrowLeft:l=a.x-1/o();break;case ie.ArrowUp:c=a.y-1/o();break;case ie.ArrowRight:l=a.x+1/o();break;case ie.ArrowDown:c=a.y+1/o();break;default:throw new Error("Unhandled element interaction!")}const h=(0,u.getAxisAlignedBoundingBox)(l,c,a.width,a.height,a.rotation);return(!n||h.minX>=n.left&&h.maxX<=n.left+n.width&&h.minY>=n.top&&h.maxY<=n.top+n.height)&&(r=l,s=c),new(0,t.MoveCommand)(a.id,r,s)};var re=0,se=0,le=0;const ce=(e,a,i,n,o,r,s)=>{const l=((e,t,a,i,n,o,r)=>{const s=i.width/t.width,l=i.height/t.height,c=e.movementX/s,h=e.movementY/l,g=a.rotation*Math.PI/180,w=Math.sin(g),y=Math.cos(g);let S;switch(n.type){case te.Resize:let t={top:a.y,left:a.x,width:a.width,height:a.height,rotation:a.rotation,fontSize:a.fontSize},v=t;switch(n.screenAxis){case d.ScaleAxis.North:{const e=-c*w+h*y,i=a.y+e,n=a.height-e,o=(0,u.getElementVertices)({...a}).center,r=(0,u.getElementVertices)({...a,y:i,height:n}).center,s=(0,u.rotateAroundPoint)(r,o,g),l=s.x-a.width/2,d=s.y-n/2;v={...t,left:l,top:d,height:n}}break;case d.ScaleAxis.East:{const e=c*y+h*w,i=a.width+e;let n=a.height;if(a.type===p.LayoutElementType.Textbox){const e=a;n=(0,m.calculateTextboxLines)(e.fontSize,e.fontData,e,e.input||e.text||"",e.lineHeight).requiredHeight}const o=(0,u.getElementVertices)({...a}).center,r=(0,u.getElementVertices)({...a,width:i,height:n}).center,s=(0,u.rotateAroundPoint)(r,o,g),l=s.x-i/2,d=s.y-n/2;v={...t,left:l,top:d,width:i,height:n}}break;case d.ScaleAxis.West:{const e=c*y+h*w,i=a.x+e,n=a.width-e;let o=a.height;if(a.type===p.LayoutElementType.Textbox){const e=a;o=(0,m.calculateTextboxLines)(e.fontSize,e.fontData,e,e.input||e.text||"",e.lineHeight).requiredHeight}const r=(0,u.getElementVertices)({...a}).center,s=(0,u.getElementVertices)({...a,width:n,height:o,x:i}).center,l=(0,u.rotateAroundPoint)(s,r,g),d=l.x-n/2,f=l.y-o/2;v={...t,left:d,top:f,width:n,height:o}}break;case d.ScaleAxis.South:{const e=-c*w+h*y,i=a.height+e,n=(0,u.getElementVertices)({...a}).center,o=(0,u.getElementVertices)({...a,height:i}).center,r=(0,u.rotateAroundPoint)(o,n,g),s=r.x-a.width/2,l=r.y-i/2;v={...t,left:s,top:l,height:i}}break;case d.ScaleAxis.Northeast:{const e=c*y+h*w,i=a.width+e;let n=a.height+e,o=a.y-e,r=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;r=t.fontSize+e/8,n=(0,m.calculateTextboxLines)(r,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight;const i=t.lineHeight||f.defaultLineHeightFactor;o=a.y-e*i/8}const s=(0,u.getElementVertices)({...a}).center,l=(0,u.getElementVertices)({...a,width:i,height:n,y:o}).center,d=(0,u.rotateAroundPoint)(l,s,g),S=d.x-i/2,x=d.y-n/2;v={...t,left:S,top:x,width:i,height:n,fontSize:r}}break;case d.ScaleAxis.Northwest:{const e=-c*y+-h*w,i=a.x-e,n=a.width+e;let o=a.y-e,r=a.height+e,s=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;s=t.fontSize+e/8,r=(0,m.calculateTextboxLines)(s,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight;const i=t.lineHeight||f.defaultLineHeightFactor;o=a.y-e*i/8}const l=(0,u.getElementVertices)({...a}).center,d=(0,u.getElementVertices)({...a,x:i,y:o,width:n,height:r}).center,S=(0,u.rotateAroundPoint)(d,l,g),x=S.x-n/2,C=S.y-r/2;v={...t,left:x,top:C,width:n,height:r,fontSize:s}}break;case d.ScaleAxis.Southeast:{const e=c*y+h*w,i=a.width+e;let n=a.height+e,o=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;o=t.fontSize+e/8,n=(0,m.calculateTextboxLines)(o,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight}const r=(0,u.getElementVertices)({...a}).center,s=(0,u.getElementVertices)({...a,width:i,height:n}).center,l=(0,u.rotateAroundPoint)(s,r,g),d=l.x-i/2,f=l.y-n/2;v={...t,left:d,top:f,width:i,height:n,fontSize:o}}break;case d.ScaleAxis.Southwest:{const e=-c*y+-h*w,i=a.width+e;let n=a.x-e,o=a.height+e,r=a.fontSize;if(a.type===p.LayoutElementType.Textbox){const t=a;r=t.fontSize+e/8,o=(0,m.calculateTextboxLines)(r,t.fontData,t,t.input||t.text||"",t.lineHeight).requiredHeight}const s=(0,u.getElementVertices)({...a}).center,l=(0,u.getElementVertices)({...a,width:i,height:o,x:n}).center,d=(0,u.rotateAroundPoint)(l,s,g),f=d.x-i/2,S=d.y-o/2;v={...t,left:f,top:S,width:i,height:o,fontSize:r}}}return S=(0,u.getAxisAlignedBoundingBox)(v.left,v.top,v.width,v.height,v.rotation),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(t=v),t;case te.Rotate:const x={x:e.clientX,y:e.clientY};let C,b=a.rotation;const k=(0,u.getElementVertices)(a,i,{x:s,y:l}),E=(0,u.findAngle)(x,k.c,k.d),I=(0,u.findAngle)(x,k.d,k.c);if(0===o.filter((e=>"rotation"===e.type)).length)le=0,C=(a.rotation+E-I)%360;else{le+=Math.sqrt(c**2+h**2);const e=Math.abs(le)>J/s;C=e?(a.rotation+E-I)%360:o.find((e=>"rotation"===e.type))?.value||0,e&&(le=0)}return S=(0,u.getAxisAlignedBoundingBox)(a.x,a.y,a.width,a.height,C),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(b=C),{top:a.y,left:a.x,width:a.width,height:a.height,rotation:b};case te.Translate:let N,R,O=a.x,M=a.y;if(0===o.filter((e=>"rotation"!==e.type)).length)re=0,se=0,N=a.x+c,R=a.y+h;else{const e=o.find((e=>"x"===e.type)),t=o.find((e=>"y"===e.type));e||(re=0),t||(se=0);const i=Math.abs(re)>J/s,n=Math.abs(se)>J/l;N=e?i?a.x+re:a.x:a.x+c,R=t?n?a.y+se:a.y:a.y+h,re=i?0:re+c,se=n?0:se+h}return S=(0,u.getAxisAlignedBoundingBox)(N,R,a.width,a.height,a.rotation),(!r||S.minX>=r.left&&S.maxX<=r.left+r.width&&S.minY>=r.top&&S.maxY<=r.top+r.height)&&(O=N,M=R),{top:M,left:O,width:a.width,height:a.height,rotation:a.rotation}}})(e,a,i,n,o,r,s),c=[];if(i.type===p.LayoutElementType.Textbox){const e=i;c.push(new(0,t.TextChangeCommand)(e.id,e.text||e.input||""))}if(c.push(new(0,t.MoveCommand)(i.id,l.left,l.top),new(0,t.ResizeCommand)(i.id,l.width,l.height),new(0,t.RotateCommand)(i.id,l.rotation)),i.type===p.LayoutElementType.Textbox){const e=i;l.fontSize&&e.fontSize!==l.fontSize&&c.push(new(0,t.FontSizeCommand)(e.id,l.fontSize))}return c},de=()=>{const e=()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1);return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()},he=.5,pe=(e,a,i,n,o,r,s)=>{const{state:c,uiDispatcher:d}=(0,l.useContext)(_),{getLayoutById:h,getReducerState:p,flattenSequence:u}=B(),[m,f]=(0,l.useState)(void 0),[g,w]=(0,l.useState)(void 0),y=h(c.layoutId);(0,l.useEffect)((()=>{if("adjustment"===o&&e?.current&&n){if(n<he)return void d(new Z({zoom:he}));if(n>c.maxZoom)return void d(new Z({zoom:c.maxZoom}));d(new Z({zoom:n}))}}),[n,d,e,o,c.maxZoom]);const S=(0,l.useCallback)(((e,t)=>{d(new Z({zoom:t}));const n=a?.current?.scrollWidth-a?.current?.clientWidth!=0,r=a?.current?.scrollHeight-a?.current?.clientHeight!=0;a.current&&i.current&&!c.scrolledMovement&&"advanced"===o&&(r&&(a.current.scrollTop=i.current.offsetTop+(a.current.scrollHeight-a.current.clientHeight)/2),n&&(a.current.scrollLeft=(i.current.offsetLeft+a.current.scrollWidth-a.current.clientWidth)/2))}),[d,a,i,c.scrolledMovement,o]);(0,l.useEffect)((()=>{c.zoom<=1&&d(new Z({scrolledMovement:!1}))}),[d,c.zoom]);const v=a?.current?.getBoundingClientRect(),x=((v?.width||1)+(v?.height||1))/2,C=(y.layoutState.layout.width+y.layoutState.layout.height)/2/x/c.zoom,b=(0,l.useMemo)((()=>{const e=c.activeModifierKeys,t=c.elementEvent,a=e.includes(ie.ControlLeft)||e.includes(ie.MetaLeft)||e.includes(ie.ControlRight)||e.includes(ie.MetaRight);if(!c.selectedElement||!t||a)return[];const i=t&&t.type===te.Translate,n=t&&t.type===te.Rotate,o=y.layoutState.elements.find((e=>e.id===c.selectedElement));return(i||n)&&o?ee(o,y.layoutState,C,s):[]}),[c.selectedElement,c.elementEvent,c.activeModifierKeys,y.layoutState,C]),k=(0,l.useCallback)((()=>{const e=de();f(e),w(p().transaction)}),[p]),E=(0,l.useCallback)((()=>{d(new Z({selectedElement:void 0}))}),[d]),I=(0,l.useCallback)((()=>{d(new Z({scrolledMovement:!0}))}),[d]),N=(0,l.useCallback)(((i,n)=>{const o=y.layoutState.elements.find((e=>e.id===c.selectedElement));if(!(c.elementEvent&&e.current&&a.current&&c.selectedElement&&o))return;a.current.hasPointerCapture(i.pointerId)||a.current.setPointerCapture(i.pointerId);const s=e.current.getBoundingClientRect(),l=new(0,t.GroupCommand)(ce(i,y.layoutState.layout,o,s,c.elementEvent,b,n));l.sequenceId=m,r(l)}),[y.layoutState.elements,y.layoutState.layout,c.elementEvent,e,c.selectedElement,a,b,r]),R=(0,l.useCallback)((e=>{d(new Z({elementEvent:e}))}),[d]),O=(0,l.useCallback)((()=>{d(new Z({elementEvent:void 0})),m&&g&&(u(m,g),f(void 0),w(void 0))}),[d,m,g,u]),M=(0,l.useCallback)(((e,a)=>{let i=c.zoom;const n=c.maxZoom,s=c.selectedElement,l=c.activeModifierKeys;if((l.includes(ie.AltLeft)||l.includes(ie.AltRight))&&(e.code===ie.Equal||e.code===ie.Minus)){const t=.05*n;e.code===ie.Equal?d(new Z({zoom:i+t<=n?i+=t:i})):d(new Z({zoom:i-t>=he?i-t:i}))}const h=y.layoutState.elements.find((e=>e.id===s));if(s&&h){if(e.code===ie.MetaLeft||e.code===ie.ControlLeft||e.code===ie.MetaRight||e.code===ie.ControlRight){const t=e.code,a=c.activeModifierKeys;if(!a.includes(t))return d(new Z({activeModifierKeys:a.concat(t)}))}if(e.code===ie.ArrowDown||e.code===ie.ArrowUp||e.code===ie.ArrowLeft||e.code===ie.ArrowRight){d(new Z({elementEvent:{type:te.Translate}}));const t=oe(e.code,h,c.units,a);r(t),d(new Z({elementEvent:void 0}))}e.code!==ie.Delete&&e.code!==ie.Backspace||"advanced"!==o||(d(new Z({selectedElement:void 0})),r(new(0,t.DeleteElementCommand)(h.id)))}}),[r,d,y.layoutState.elements,o,c.activeModifierKeys,c.maxZoom,c.selectedElement,c.units,c.zoom]),T=(0,l.useCallback)((e=>{if(e.code===ie.MetaLeft||e.code===ie.ControlLeft||e.code===ie.MetaRight||e.code===ie.ControlRight){const t=c.activeModifierKeys,a=e.code;d(new Z({activeModifierKeys:t.filter((e=>e!==a))}))}}),[d,c.activeModifierKeys]);return{guidelines:b,scale:C,zoomableElementRef:i,setElementEvent:R,handleZoom:S,handleKeyDown:M,handleKeyUp:T,handlePointerPressedBackground:E,handlePointerReleased:O,handlePointerMove:N,handleScroll:I,handleSequenceStart:k}},ue=e=>{const{x:t,y:a,cursorStyle:i,onPointerDown:n,handleClass:o,cornerRadius:r,color:s,strokeWidth:l}=e;return(0,c.jsx)("circle",{className:o,cx:t,cy:a,r:r,fill:"#ffffff",style:{cursor:i},stroke:s,strokeWidth:l,onPointerDown:n})},me=e=>{const{x:t,y:a,width:i,height:n,cursorStyle:o,onPointerDown:r,edgeHandleRadius:s,color:l,strokeWidth:d}=e;return(0,c.jsx)("rect",{x:t,y:a,width:i,height:n,rx:s,fill:"#ffffff",style:{cursor:o},stroke:l,strokeWidth:d,onPointerDown:r})},fe=e=>{const{color:t,elementHeight:a,elementWidth:i,onBeginResize:n,rotation:o,scaleFactor:r,disableX:s,disableY:h}=e,p=7.5*r,m=3*r,f=28*r,g=6*r,w=1.2*r,y=a-2*p,S=(0,l.useCallback)(((e,t,a)=>{e.stopPropagation(),n(t,a)}),[n]),v=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.West,360-o),d.ScaleAxis.West)),[S,o]),x=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.East,360-o),d.ScaleAxis.East)),[S,o]),C=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.North,360-o),d.ScaleAxis.North)),[S,o]),b=(0,l.useCallback)((e=>S(e,(0,u.currentDirection)(d.ScaleAxis.South,360-o),d.ScaleAxis.South)),[S,o]),k=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northwest,d.ScaleAxis.Northwest)),[S]),E=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northeast,d.ScaleAxis.Northeast)),[S]),I=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Southwest,d.ScaleAxis.Southwest)),[S]),N=(0,l.useCallback)((e=>S(e,d.ScaleAxis.Northeast,d.ScaleAxis.Southeast)),[S]),R=f<=y;return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ue,{x:0,y:0,cursorStyle:"nwse-resize",onPointerDown:k,handleClass:"cornerNorthWest",cornerRadius:p,color:t,strokeWidth:w}),R?(0,c.jsx)(ue,{x:i,y:0,cursorStyle:"nesw-resize",onPointerDown:E,handleClass:"cornerNorthEast",cornerRadius:p,color:t,strokeWidth:w}):void 0,R?(0,c.jsx)(ue,{x:i,y:a,cursorStyle:"nwse-resize",onPointerDown:N,handleClass:"cornerSouthEast",cornerRadius:p,color:t,strokeWidth:w}):void 0,R?(0,c.jsx)(ue,{x:0,y:a,cursorStyle:"nesw-resize",onPointerDown:I,handleClass:"cornerSouthWest",cornerRadius:p,color:t,strokeWidth:w}):void 0,R&&!s?(0,c.jsx)(me,{x:-g/2,y:a/2-f/2,width:g,height:f,onPointerDown:v,edgeHandleRadius:m,cursorStyle:"ew-resize",color:t,strokeWidth:w}):void 0,R&&!h?(0,c.jsx)(me,{x:i/2-f/2,y:a-g/2,width:f,height:g,onPointerDown:b,edgeHandleRadius:m,cursorStyle:"ns-resize",color:t,strokeWidth:w}):void 0,s?void 0:(0,c.jsx)(me,{x:i-g/2,y:a/2-Math.min(f,.8*a)/2,width:g,height:Math.min(f,.8*a),onPointerDown:x,edgeHandleRadius:m,cursorStyle:"ew-resize",color:t,strokeWidth:w}),R&&!h?(0,c.jsx)(me,{x:i/2-f/2,y:-g/2,width:f,height:g,onPointerDown:C,edgeHandleRadius:m,cursorStyle:"ns-resize",color:t,strokeWidth:w}):void 0]})},ge=e=>{const{color:t,elementWidth:a,onBeginRotate:i,scaleFactor:n}=e,o=(0,l.useCallback)((e=>{e.stopPropagation(),i()}),[i]),r=10*n,s=1.2*n;return(0,c.jsxs)("g",{children:[(0,c.jsx)("circle",{cx:a/2,cy:-2.5*r,r:1.3*r,fill:"rgba(0, 0, 0, 0.5)",opacity:.4,style:{cursor:"ew-resize"},onPointerDown:o}),(0,c.jsx)("circle",{cx:a/2,cy:-2.5*r,r:r,fill:"#fff",style:{cursor:"ew-resize"},stroke:t,strokeWidth:s,onPointerDown:o}),(0,c.jsxs)("svg",{x:a/2-r,y:-2.5*r-r,xmlns:"http://www.w3.org/2000/svg",style:{cursor:"ew-resize"},height:2*r,viewBox:"0 0 24 24",width:2*r,fill:t,onPointerDown:o,children:[(0,c.jsx)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,c.jsx)("path",{d:"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"})]})]})},we=e=>{const{color:t,height:a,highlighted:i,id:n,immutable:o,onBeginMove:r,onBeginResize:s,onBeginRotate:d,onPointerEnter:h,onPointerLeave:p,onSelected:u,pressed:m,rotation:f,scaleFactor:g,selected:w,width:y,x:S,y:v,disableX:x,disableY:C}=e,b=1.2*g,k=(0,l.useCallback)((e=>{2===e.button&&(e.stopPropagation(),u(n,e)),0===e.button&&(e.stopPropagation(),!w&&u(n,e),r())}),[n,w,u,r]),E=(0,l.useCallback)((()=>{h(n)}),[n,h]),I=(0,l.useCallback)((()=>{p(n)}),[n,p]),N=o?void 0:w?m?"grabbing":"grab":"pointer",R=o?"none":"visibleFill";return(0,c.jsxs)("g",{transform:`translate(${S}, ${v}) rotate(${f} ${y/2} ${a/2})`,children:[(0,c.jsx)("rect",{className:"interactableInnerRect",width:y,height:a,stroke:w||i?t:"none",pointerEvents:R,fill:"none",strokeWidth:b,style:{cursor:N},onPointerDown:o?void 0:k,onPointerEnter:o?void 0:E,onPointerLeave:o?void 0:I}),w&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{color:t,elementWidth:y,onBeginRotate:d,scaleFactor:g}),(0,c.jsx)(fe,{color:t,elementHeight:a,elementWidth:y,rotation:f,scaleFactor:g,onBeginResize:s,disableX:x,disableY:C})]})]})},ye=({primaryColor:e,containerHeight:t,containerWidth:a,customViewbox:i,editorRef:n,elementEvent:o,guidelines:r,layoutHeight:s,layoutWidth:d,targetedElements:h,scale:u,selectedElement:m,onElementEvent:f,onElementSelected:g,onSequenceStart:w})=>{const{state:y}=Q(),{getLayoutById:S}=B(),v=S(y.layoutId),[x,C]=(0,l.useState)(void 0),b=(0,l.useCallback)((e=>{C(e)}),[]),k=(0,l.useCallback)((e=>{x===e&&C(void 0)}),[x]),E=(0,l.useCallback)((()=>{w(),f({type:te.Translate})}),[f]),I=(0,l.useCallback)(((e,t)=>{w(),f({type:te.Resize,relativeAxis:e,screenAxis:t})}),[f]),N=(0,l.useCallback)((()=>{w(),f({type:te.Rotate})}),[f]),R=i||{x:0,y:0,width:d,height:s},O=u*(Math.sqrt(R.width*R.height)/1e3)*(100/Math.sqrt(t*a))*Math.sqrt((M=a/t,Math.exp(Math.abs(Math.log(M)))));var M;const T=v.layoutState.elements.findIndex((({id:e})=>e===m)),A=[...v.layoutState.elements];return T>=0&&A.push(A.splice(T,1)[0]),(0,c.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",xmlSpace:"preserve",version:"1.1",style:{touchAction:"none",position:"absolute",maxWidth:"100%",maxHeight:"100%"},width:"100%",height:"100%",viewBox:`${R.x} ${R.y} ${R.width} ${R.height}`,overflow:"overlay",children:[(0,c.jsx)("rect",{fill:"none",stroke:"none",ref:n,width:d,height:s}),r.map((e=>e.svgNode)),A.map((t=>{const a=void 0!==m&&t.id===m,i=a&&void 0!==o,n=void 0!==x&&t.id===x;return(0,c.jsx)(we,{color:e,id:t.id,selected:a,highlighted:n,pressed:i,x:t.x,y:t.y,disableX:t.type===p.LayoutElementType.Frame,disableY:t.type===p.LayoutElementType.Textbox||t.type===p.LayoutElementType.Frame,width:t.width,height:t.height,rotation:t.rotation,immutable:t.immutable||h&&!h.includes(t.id),onSelected:g,onBeginMove:E,onBeginResize:I,onBeginRotate:N,onPointerEnter:b,onPointerLeave:k,scaleFactor:O},t.id)}))]})},Se=e=>{const{color:t,editorRef:a,zoomableElementRef:i,interactionElementRef:n,guidelines:o,isMakingAdjustments:r,viewmask:s,visibleLayoutId:d,xTranslation:h,yTranslation:p,targetedElements:u,borderRadius:m,handleContextMenu:f,handleKeyDown:g,handleKeyUp:w,handlePointerMove:y,handlePointerPressedBackground:S,handlePointerReleased:v,handleScroll:x,onSequenceStart:C,setElementEvent:b,onElementSelected:k}=e,{getLayoutById:E}=B(),I=E(d),N=I.layoutState,{state:R}=Q(),O=(0,l.useCallback)((e=>{if(s){const t={left:s.x,top:s.y,width:s.width,height:s.height,panelId:"",rotation:0};return g(e,t)}return g(e)}),[g,s]),M=(0,l.useCallback)((e=>{if(s){const t={left:s.x,top:s.y,width:s.width,height:s.height,panelId:"",rotation:0};return y(e,t)}return y(e)}),[y,s]);return(0,c.jsx)("div",{style:{justifyContent:"center",position:"relative",height:"100%",width:"100%",scrollbarWidth:"none",outline:"none"},onContextMenu:f,onKeyDown:O,onKeyUp:w,onPointerDown:S,onPointerMoveCapture:M,onPointerUp:v,onWheelCapture:x,ref:n,tabIndex:-1,children:(0,c.jsxs)("div",{ref:i,style:{height:"100%",transform:`scale(${R.zoom}) translate(${h}px, ${p}px)`,display:"grid",filter:"drop-shadow(rgba(0, 0, 0, 0.2) 0px 0px 6px)"},children:[e.children,I.getComponentWithProps({height:r?"100%":"auto",maxHeight:"100%",maxWidth:"100%",position:"absolute",viewmask:s,width:r?"100%":"auto",borderRadius:m}),(0,c.jsx)(ye,{primaryColor:t,containerHeight:i.current?.offsetHeight||1024,containerWidth:i.current?.offsetWidth||1024,editorRef:a,elementEvent:R.elementEvent,guidelines:o,layoutHeight:N.layout.height,layoutWidth:N.layout.width,onElementEvent:b,onSequenceStart:C,onElementSelected:k,scale:10/R.zoom,selectedElement:R.selectedElement,targetedElements:u})]})})},ve=({color:e,borderRadius:a,guidelineColor:i,handleContextMenu:n,onElementSelected:o})=>{const{commandDispatcher:r,getLayoutById:s}=B(),{state:d,uiDispatcher:h}=Q(),u=(0,l.useRef)(null),m=(0,l.useRef)(null),f=(0,l.useRef)(null),{guidelines:g,handleKeyDown:w,handleKeyUp:y,handlePointerMove:S,handlePointerPressedBackground:v,handlePointerReleased:x,handleScroll:C,handleSequenceStart:b,setElementEvent:k}=pe(u,m,f,void 0,"advanced",r,i),E=(0,l.useCallback)(((e,a)=>{const i=s(d.layoutId).layoutState.elements.find((t=>t.id===e));if(e&&i&&i.type===p.LayoutElementType.Textbox){const a=i.algorithm;(!a||a===p.TextAlgorithm.Autosize)&&r(new(0,t.FontAlgorithmCommand)(e,p.TextAlgorithm.Traditional))}o&&o(e,a),h(new Z({selectedElement:e}))}),[r,s,d.layoutId,h]);return(0,c.jsx)(Se,{color:e,editorRef:u,interactionElementRef:m,zoomableElementRef:f,guidelines:g,visibleLayoutId:d.layoutId,xTranslation:0,yTranslation:0,borderRadius:a,handleContextMenu:n,handleKeyDown:w,handleKeyUp:y,handlePointerMove:S,handlePointerPressedBackground:v,handlePointerReleased:x,handleScroll:C,onSequenceStart:b,setElementEvent:k,onElementSelected:E})};function xe(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const Ce=new class{constructor(){xe(this,"server",void 0),xe(this,"cache",new Map),xe(this,"materialCache",new Map),xe(this,"loadImageAsFileInfo",(async e=>{const t=await e.arrayBuffer(),a=await(0,g.getAttributesFromArrayBuffer)(t);return{name:e.name.substring(e.name.lastIndexOf("/")+1),blob:((e,t)=>{let a=atob(e.split(",")[1]),i=[];for(let e=0;e<a.length;e++)i.push(a.charCodeAt(e));return new Blob([new Uint8Array(i)],{type:t})})(a.dataUrl,e.type)}})),this.server=q}async getLocalOrFromServer(e){if(this.cache.has(e))return this.cache.get(e);const t=(async()=>(await q.execute("getAssetByKeyV2",{assetKey:e.replace(/\//g,"_")})).body)();return this.cache.set(e,t),t}async getMaterialLocalOrFromServer(e){if(this.materialCache.has(e))return this.materialCache.get(e);const t=(async()=>(await q.execute("getMaterialV2",{id:e})).body)();return this.materialCache.set(e,t),t}async uploadAssetWithProgress(e,t,a,i,n,o){const r=await this.dispatchCreateAssetRequest(e,t,n,o);var s=new XMLHttpRequest;return s.open("PUT",r.assetResponse.uploadUrl,!0),s.setRequestHeader("Content-Type",r.mimeType),s.setRequestHeader("Cache-Control","public,max-age=31536000,immutable"),s.upload.onprogress=e=>{e.lengthComputable&&a(100*e.loaded/e.total)},s.onload=()=>{const e=r.assetResponse.asset;i(e)},s.onerror=()=>{console.warn("Asset upload failed")},s.send(e.blob),r.assetResponse.asset}async dispatchCreateAssetRequest(e,t,a,i){const n=e.blob.type?e.blob.type:this.guessMIME(e.name);return{assetResponse:(await this.server.execute("createAsset",{assetDetails:{name:e.name,type:t,mimeType:n,storageOwnerId:i,userAnonymous:!0}},a)).body,mimeType:n}}guessMIME(e){const t=e.split(".").pop();switch(t){case"glb":return"model/gltf-binary";case"ttf":return"font/ttf";case"mkv":return"video/x-matroska";default:throw new Error("Unexpected mimetype: "+t)}}};class be{get(e){return localStorage.getItem(e)||void 0}set(e,t){localStorage.setItem(e,t)}remove(e){localStorage.removeItem(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const a=JSON.stringify([...t.entries()]);this.set(e,a)}}class ke{constructor(){var e,t,a;e=this,t="storage",a=new Map,t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a}get(e){return this.storage.get(e)||void 0}set(e,t){this.storage.set(e,t)}remove(e){this.storage.delete(e)}getMap(e){const t=this.get(e);if(t)return new Map(JSON.parse(t))}setMap(e,t){const a=JSON.stringify([...t.entries()]);this.set(e,a)}}const Ee=(()=>{try{return localStorage?new be:new ke}catch{return console.warn("Local storage was unavilable due to browser security settings. Using in-memory storage instead."),new ke}})(),Ie=n.gql`
2
2
  mutation CreateTransaction($integrationProductId: String!, $bulk: Boolean) {
3
3
  transactionCreate(integrationProductId: $integrationProductId, bulk: $bulk) {
4
4
  id
@@ -94,5 +94,5 @@ var e=require("papyrus/build/main/CommandContext"),t=require("papyrus/build/main
94
94
  workflowState
95
95
  }
96
96
  }
97
- `;const Pe=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=i.data.variants,n=P.getDefaultVariant(i.data);if(!e.data.allowMultipleSelections&&n){const n=a.find((e=>e.id===i.data.defaultVariant));return this.selectVariantLambda(e,n?.id||"",t)}}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(n&&a){const i=n.variants.find((e=>e.id===a));i&&await t.setSelectionsAndElements(e.stepName,[i],[])}}}selectVariant(e,t,a){this.selectVariantLambda(e,t,a).then((e=>e&&e()))}async selectVariantLambda(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;const n=i.data.variants,o=n.length>1?n.find((e=>e.id===t)):n[0];if(!o)throw new Error("Failed to find selected variant in step variants, this should never happen!");return async()=>{await a.setSelectionsAndElements(e.stepName,[o],[]),a.setMandatoryFulfilled(e.stepName,!0)}}};function De(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Ve{constructor(e,t){De(this,"manager",void 0),De(this,"stepConfiguration",void 0),this.manager=e,this.stepConfiguration=t}getCurrentVariant(){return this.manager.getWorkflowSelections()[this.stepConfiguration.stepName].selections}async getAvailableVariants(){const e=this.stepConfiguration.optionId;return(await P.getLocalOrFromServer(q,e)).data.variants}selectVariant(e){if(this.stepConfiguration.type!==y.StepType.Question)throw new Error(`Step type ${this.stepConfiguration.type} not yet supported in Core SDK`);Pe.selectVariant(this.stepConfiguration,e.id,this.manager)}}const ze=e=>{const t=[];for(const a of e.steps)switch(a.type){case y.StepType.DigitalContent:a.data.varyUpload&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Upload});break;case y.StepType.Frame:const e=a.data;e.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection}),e.varyUpload&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Upload});break;case y.StepType.Illustration:const i=a.data;i.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection}),i.varyColors&&i.colourPickerEnabled&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Colors});break;case y.StepType.Material:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection});break;case y.StepType.Model:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection});break;case y.StepType.Picture:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection});break;case y.StepType.Question:a.data.varySelections&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selections});break;case y.StepType.Shape:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection});break;case y.StepType.Text:const n=a.data;n.varyText&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Text}),n.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Selection}),n.varyColor&&n.colourPickerEnabled&&t.push({stepName:a.stepName,stepType:a.type,aspectType:y.StepAspectType.Color})}return t},Ue=[y.StepType.SilentIllustration,"ProductOverlay"],Fe=(e,t)=>{const a=[];e.introduction&&a.push({name:"Introduction",title:e.name,renderableSteps:[{type:y.StepType.Introduction,stepName:"Introduction",stepTitle:e.name,helpText:e.introduction,data:{},conditions:[]}],silentSteps:[]});for(const i of e.steps){if(t.bulkScene){let e=!1;switch(i.type){case y.StepType.DigitalContent:i.data.varyUpload&&(e=!0);break;case y.StepType.Frame:const t=i.data;!t.varyUpload||!t.varySelection&&i.optionId||(e=!0);break;case y.StepType.Illustration:const a=i.data;!a.varySelection&&i.optionId&&1!==P.getLocalOrUndefined(i.optionId)?.data.variants.length||!a.varyColors&&a.colourPickerEnabled||(e=!0);break;case y.StepType.Material:i.data.varySelection&&(e=!0);break;case y.StepType.Model:i.data.varySelection&&(e=!0);break;case y.StepType.Picture:i.data.varySelection&&(e=!0);break;case y.StepType.Question:i.data.varySelections&&(e=!0);break;case y.StepType.Shape:i.data.varySelection&&(e=!0);break;case y.StepType.Text:const n=i.data;!n.varySelection&&i.optionId&&1!==P.getLocalOrUndefined(i.optionId)?.data.variants.length||!n.varyColor&&n.colourPickerEnabled&&n.colourOptionId||!n.varyText||(e=!0)}if(e)continue}const n=je(i.stepName,e.stepGroups);if(n){const e=a.find((e=>e.name===n.name));e?Ue.includes(i.type)?e.silentSteps.push(i):e.renderableSteps.push(i):a.push({name:n.name,title:n.name,renderableSteps:Ue.includes(i.type)?[]:[i],silentSteps:Ue.includes(i.type)?[i]:[]})}else a.push({name:i.stepName,title:i.stepTitle,renderableSteps:Ue.includes(i.type)?[]:[i],silentSteps:Ue.includes(i.type)?[i]:[]})}return t.bulkScene&&a.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:y.StepType.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:ze(e)},conditions:[]}],silentSteps:[]}),t.finishScene&&a.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:y.StepType.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:e.finalizeStepConfig?e.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:e.finalizeStepConfig?e.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),a},je=(e,t)=>t.find((t=>t.stepNames.includes(e))),qe=(e,t)=>(e.conditions||[]).every((e=>{const a=t[e.targetStepName];if(a&&a.selectedVariants){const t=a.selectedVariants;return e.requiredVariantSelections.some((e=>void 0!==t.find((t=>t.id===e))))}return!1})),We=(e,t)=>e.map((e=>((e,t)=>{const a={name:e.name,title:e.title,renderableSteps:e.renderableSteps.filter((e=>qe(e,t))),silentSteps:e.silentSteps.filter((e=>qe(e,t)))};return 0===a.silentSteps.length&&0===a.renderableSteps.length?null:a})(e,t))).filter((e=>null!==e)),$e=(e,t)=>We(e,t).filter((e=>e.renderableSteps.filter(((e,t,a)=>e.type===y.StepType.Model||e.type===y.StepType.Material||e.type===y.StepType.Picture||e.type===y.StepType.Shape?P.getLocalOrUndefined(e.optionId)?.data.variants&&P.getLocalOrUndefined(e.optionId).data.variants.length>1?e:null:e)).length>0)),Be=(e,t)=>We(e,t).filter((e=>e.renderableSteps.filter((e=>e)).length>0));function Ke(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Ge{constructor(){Ke(this,"timestamp",Date.now())}}class He{constructor(e){Ke(this,"queue",[]),Ke(this,"activePromise",void 0),Ke(this,"queueMaxSize",void 0),this.queueMaxSize=e}enqueue(e){if(this.queue.push(e),void 0!==this.queueMaxSize&&this.queue.length>this.queueMaxSize){const e=this.queue.length-1;for(let t=0;t<e;++t)this.queue.shift()}return this.process()}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async process(){return this.activePromise||(this.activePromise=this.dequeue(),this.activePromise.then((()=>{this.activePromise=void 0}))),this.activePromise}async dequeue(){const e=this.queue.shift();if(e)try{await e.execute(),await this.dequeue()}catch(e){await this.dequeue()}}}function Xe(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function _e(e,t,a,i){const n=a.width*e.zoom,o=a.height*e.zoom;if(i){const i=e,n=Math.max(t.width/a.width,t.height/a.height);i.zoom=Math.max(n,e.zoom);const o=a.width*i.zoom,r=a.height*i.zoom;return i.x=Ye(e.x,t.width-o,0),i.y=Ye(e.y,t.height-r,0),i}const r=e;return r.x=Ye(r.x,-n,t.width),r.y=Ye(r.y,-o,t.height),r}function Ye(e,t,a){return Math.min(Math.max(e,t),a)}class Ze{constructor(e){Xe(this,"offsets",void 0),Xe(this,"forceImageCover",void 0),Xe(this,"targetElements",void 0),Xe(this,"imageData",void 0),Xe(this,"frameData",void 0),Xe(this,"_debouncedUpdateFrameOffsets",void 0),Xe(this,"minZoomScale",.03),Xe(this,"maxZoomScale",20),Xe(this,"onFrameDataChangeListeners",void 0),Xe(this,"onZoomChangeListeners",void 0),Xe(this,"workflowManager",void 0),Xe(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=A(x)(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback((async e=>{if(e){const t=e;if(t.currentFrameSource){const e=await(0,C.getFrameData)(t.currentFrameSource);A(h)(e,this.frameData)||(this.frameData=e,this.onFrameDataChangeListeners.forEach((e=>e(this.frameData))),this.frameData&&this.imageData&&(this.offsets=(0,C.calculateOffsets)(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}async setFrameData(e){const t=C.frameDataCache.get(e);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,a,i){if(this.imageData&&this.offsets&&this.frameData){const n=(t-this.offsets.x)/this.offsets.zoom,o=(a-this.offsets.y)/this.offsets.zoom,r={x:t-n*e,y:a-o*e,zoom:this.imageData.width*e/this.imageData.width};this.updateOffsets(_e(r,this.frameData,this.imageData,this.forceImageCover),i),this.onZoomChangeListeners.forEach((t=>t(e)))}}setPatternData(e){(e&&this.frameData||e&&this.frameData&&!this.imageData)&&(this.offsets=(0,C.calculateOffsets)(e,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements),this.updateOffsets(_e(this.offsets,this.frameData,e,this.forceImageCover))),this.imageData=e,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t){const a=this.imageData;a&&this.frameData&&(this.offsets&&e.x===this.offsets.x&&e.y===this.offsets.y&&e.zoom===this.offsets.zoom?t&&t():(this.offsets=_e(e,this.frameData,a,this.forceImageCover),this._debouncedUpdateFrameOffsets(e,a,this.frameData,this.targetElements,t)))}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,a,i,n,o){if(!i)throw new Error("Frame data not set. This is a bug");if(!this.workflowManager)throw new Error("No workflow manager set, cannot update offsets.");const r=this.workflowManager.getCommandDispatcher();n.forEach((i=>{r(new(0,t.UpdateFramePattern)(i,a,e))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:e}),o&&o()}recalculateZoomLimits(e,t){const a=Math.max(t.width/e.width,t.height/e.height);this.forceImageCover?(this.minZoomScale=a,this.maxZoomScale=2.5*a):(this.minZoomScale=a/10,this.maxZoomScale=2.5*a)}}const Qe=async e=>{const t=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;if(!t)throw new Error("Failed to read SVG");const a=(new XMLSerializer).serializeToString(t),i=document.createElement("canvas"),n=i.getContext("2d"),o=await w.Canvg.from(n,a,{anonymousCrossOrigin:!0,ignoreDimensions:!1}),r=t.getAttribute("width"),s=t.getAttribute("height");if(s&&r){const e=parseFloat(s),t=parseFloat(r)/e;t>1?o.resize(2048,2048/t):o.resize(2048*t,2048)}else o.resize(2048,2048);return await o.render(),await(async e=>new Promise(((t,a)=>{try{e.toBlob((e=>{if(e){const a=URL.createObjectURL(e);t(a)}else a("Failed to generate canvas object URL")}))}catch(e){a(e)}})))(i)},Je=new class{async getIllustrationBody(e){return new Promise((t=>{fetch(e).then((e=>{t(e.text())})).catch((e=>console.error(e)))}))}getCreateElementCommand(e,a,i,n){return new(0,t.CreateElementCommand)({stepRegion:a,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:p.LayoutElementType.Illustration,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable},i)}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)return this.reload(e,t,a);{t.updateMetadata(e.stepName,{colors:[]});const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantCommand(e,a,[],(()=>{}),t)}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(!o||!a)throw new Error("Required illustration variant no longer available");{const r=o.variants.find((e=>e.id===a));if(r){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[r],a),t.updateMetadata(e.stepName,{colors:i.storage?.colors}),t.setMandatoryFulfilled(e.stepName,!0)}}}return null}availableColors(e){return P.getLocalOrUndefined(e.data.colourOptionId)?P.getLocalOrUndefined(e.data.colourOptionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e}))):(e.data.colours||[]).map((e=>({fill:e,stroke:e})))}async changeColorsCommand(e,a,i,n,o){const r={};for(const[e,t]of o.entries())r[e]={browserValue:t,spotColor:r[e]?.spotColor};const s=(0,b.modifySVGWithElementProperties)(e,a,i,r),l=await Qe(s),c=[];for(const e of n){for(const[a,i]of o.entries())c.push(new(0,t.IllustrationColorCommand)(e,a,i));c.push(new(0,t.IllustrationCacheCommand)(e,s,l))}return new(0,t.GroupCommand)(c)}async changeColors(e,t,a,i,n){if(0===t.length)return;const o=(0,k.findElement)(t[0].id,i().map((e=>e.layoutState))),r={...o.colors},s={};Object.entries(r).forEach((([e,t])=>{const a={browserValue:t.browserValue},i=t.spotColor;i&&(a.spotColor={profileName:i.profileName,namedColor:i.namedColor}),s[e]=a}));for(const[e,t]of n.entries())r[e]={browserValue:t,spotColor:r[e]?.spotColor},s[e]={browserValue:t};a.updateStorage(e.stepName,{colors:s});let l=Array.from(Object.values(r)).map((e=>e.browserValue));P.getLocalOrUndefined(e.data.colourOptionId)&&P.getLocalOrUndefined(e.data.colourOptionId).data.variants.forEach((e=>{l=l.map((t=>t.toLowerCase()===e.color?.toLowerCase()?e.name:t))})),a.updateMetadata(e.stepName,{colors:l});const c=new Map;if(Object.entries(r).forEach((([e,t])=>{c.set(e,t.browserValue)})),!o.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const d=await this.changeColorsCommand(o.svg,o.width,o.height,t.map((e=>e.id)),c);a.getCommandDispatcher()(d)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{n.getCommandDispatcher()(e.command),e.followup()}))}selectVariantCommand(e,a,i,n,o){if(!e.data||!e.data.regions)throw new Error("Missing config data.");n(!0);const r=i.map((e=>new(0,t.DeleteElementCommand)(e.id)));return o.setMandatoryFulfilled(e.stepName,!1),new Promise((async i=>{if(!a.assetKey)throw new Error("No Asset for Variant");const s=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!s)throw new Error("CDN Link not found on SVG Asset entity!");const l=await(0,b.generateSVGWithUnknownColors)(await this.getIllustrationBody(s.href)),c=await Qe(l.svg),d=e.data.regions.map((t=>{const a=o.getLayouts().find((e=>e.panelId===t.panelId));if(!a)throw new Error("Tried to create illustration but no layout.");const i=de();return{regionElement:{id:i,region:t},command:this.getCreateElementCommand(i,t,a,{stepName:e.stepName,src:s.href,objectURL:c,svg:l})}})),h=[...d.map((e=>e.command)),...r];i({command:new(0,t.GroupCommand)(h),followup:async()=>{await o.setSelectionsAndElements(e.stepName,[a],d.map((e=>e.regionElement))),o.setMandatoryFulfilled(e.stepName,!0),n(!1)}})}))}};function et(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class tt{constructor(e,a,i){et(this,"configuration",void 0),et(this,"layouts",void 0),et(this,"product",void 0),et(this,"processRegion",(async e=>{const a=this.layouts.find((t=>t.panelId===e.panelId));if(!a)throw new Error(`Can not find layout for region: ${e.panelId}`);let i="";if("ProductOverlay"===this.configuration.type){let e="";if(this.product?.overlayImageUrl&&(e=this.product.overlayImageUrl),i=e,!e)throw new Error("Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if("image"===n){const i="SilentIllustration"===this.configuration.type?this.configuration.data.assetKey:this.product?.overlayImageUrl,o={id:de(),src:i,type:n,y:e.top,x:e.left,width:e.width,height:e.height,layerIndex:e.layerIndex,immutable:e.immutable,productOverlay:"ProductOverlay"===this.configuration.type||void 0,rotation:e.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:o.id,region:e},command:new(0,t.CreateElementCommand)(o,a)}}{const o="SilentIllustration"===this.configuration.type?this.configuration.data.assetKey:i,r=async()=>new Promise((e=>{fetch(o).then((t=>{e(t.text())})).catch((e=>console.error(e)))})),s=await(0,b.generateSVGWithUnknownColors)(await r()),l={id:de(),cachedObjectURL:await Qe(s.svg),src:o,svg:s.svg,colors:s.colors,type:n,y:e.top,x:e.left,width:e.width,height:e.height,layerIndex:e.layerIndex,rotation:e.rotation,immutable:e.immutable,productOverlay:"ProductOverlay"===this.configuration.type||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:l.id,region:e},command:new(0,t.CreateElementCommand)(l,a)}}})),this.configuration=e,this.layouts=a,this.product=i||void 0}async trigger(){if(!this.configuration.data.regions)throw new Error("Missing regions.");if("SilentIllustration"===this.configuration.type){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}return"ProductOverlay"===this.configuration.type?Promise.all(this.configuration.data.regions.map((e=>{if(!this.layouts.find((t=>e.panelId===t.panelId)))throw new Error("Can't find layout from region. This is a bug");return this.processRegion(e)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const e="ProductOverlay"===this.configuration.type&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return e?.endsWith(".jpeg")||e?.endsWith(".jpg")||e?.endsWith(".png")?p.LayoutElementType.Image:(e?.endsWith(".svg"),p.LayoutElementType.Illustration)}}const at=async e=>{const t=`${V.getServicesApiUrl()}/shortener`;try{const a=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:e}),headers:{"Content-Type":"application/json"}});return(await a.json()).shortUrl}catch(e){throw console.error(e),new Error("Failed to shorten URL.")}};function it(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class nt{async poll(){if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId));this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,a,i=3e3,n=10){it(this,"pollingId",void 0),it(this,"attempts",void 0),it(this,"interval",void 0),it(this,"maxAttempts",void 0),it(this,"predicate",void 0),it(this,"onSuccess",void 0),it(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=a,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=i,this.maxAttempts=n,this.poll()}}const ot=new class{async init(e,t,a){return a&&await this.reload(e,t,a),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[],n);const o=i?.storage?.videoShortUrl,r=i?.storage?.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:o,videoUrl:r})}async regenerateQRCode(e,a,i,n,o,r,s,l,c){if(!a&&""!==i&&""===n){const a=async()=>(await q.execute("getAssetByKeyV2_private",{assetKey:i.replace(/\//g,"_")})).body.links.find((e=>"mpeg4"===e.rel)),c=await new Promise(((e,t)=>{new nt((async()=>!!await a()),(async()=>{const t=await a();if(!t||!t.href)throw new Error("Poller succeeded but no mpeg link found");e(t)}),(()=>{t("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));e.forEach((e=>l(new(0,t.DeleteElementCommand)(e.id))));const d="http"===r.data.baseUrl.slice(0,4)?"":"https://",h=new URL(d+r.data.baseUrl);h.searchParams.append("video",btoa(JSON.stringify([c]))),h.pathname=h.pathname+("/"===h.pathname.slice(-1)?"":"/");const p=h.toString();if(p.length>=2e3)throw new Error("Cannot create QR code, URL too long.");const u=await at(p);if(s(u),!r.data||!r.data.regions)throw new Error("Missing config data.");const m=await this.regionElements(r),f=await this.command(u,m,o,r.stepName);f&&l(f.command),await o.setSelectionsAndElements(r.stepName,[],m),o.updateStorage(r.stepName,{videoShortUrl:u,videoUrl:n})}c(!1)}async regionElements(e){return e.data.regions.map((e=>({id:de(),region:e})))}async command(e,a,i,n){const o=i.getLayouts(),r=`data:image/svg+xml;base64,${btoa(await(0,E.toString)(e,{type:"svg"}))}`,s=a.map((e=>{const a=e.region,i=o.find((e=>e.panelId===a?.panelId));if(!i||!a)throw new Error(`Can not find layout for region: ${a?.panelId}`);return new(0,t.CreateElementCommand)({stepRegion:a,stepName:n,id:e.id,src:r,type:p.LayoutElementType.Image,y:a.top,x:a.left,width:a.width,height:a.height,rotation:0},i)}));return{command:new(0,t.GroupCommand)(s),followup:async()=>{}}}};const rt=new class{constructor(){var e,t,a;a=async(e,t)=>{if(!e)return(0,C.generateDefaultRectangleFrameSvg)(t.data.regions[0]);if(!e.assetKey)throw new Error("No Asset for Variant");const a=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel));if(a)return(0,I.fetchAsString)(a.href);throw new Error("No URL for frame!")},(t="frameSourceSvg")in(e=this)?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(a)await this.reload(e,t,a);else{if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),!i||0===i.data.variants.length)return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageKey);{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageKey)}}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion}))),o=P.getLocalOrUndefined(e.optionId)?.data;if(!o||0===o.variants.length){const a=(0,C.generateDefaultRectangleFrameSvg)(e.data.regions[0]);t.updateStorage(e.stepName,{currentFrameSource:a})}if(i){if(i.selectedVariants&&i.selectedVariants.length>0){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){await t.setSelectionsAndElements(e.stepName,[i],n);const a=await this.frameSourceSvg(i,e);t.updateStorage(e.stepName,{currentFrameSource:a})}}}else await t.setSelectionsAndElements(e.stepName,[],n);const a=i.storage?.framePatternSrc,r=i.storage?.frameOffsets;if(t.updateMetadata(e.stepName,{frameOffsets:r,framePatternSrc:a}),a){const i=t.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(a,i),t.updateMetadata(e.stepName,{image:a}),t.updateStorage(e.stepName,{framePatternSrc:a})}if(r?.zoom){const a=t.getStepSpecificServices(e.stepName)?.frameService;a.updateOffsets(r)}t.setMandatoryFulfilled(e.stepName,!0)}}selectImage(e,t,a){a.setEditedStatus(e.stepName,!0);t.links.find((e=>"cdn"===e.rel)).href.endsWith("pdf")?a.addPoller(new nt((async()=>{const e=(await q.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((e=>"svg"===e.rel));if(!e)return!1;return 200===(await fetch(e.href)).status}),(()=>{q.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const i=t.body;this.loadPatternFromAsset(i,e,a)}))}),(()=>{throw new Error("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(t,e,a)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{i.getCommandDispatcher()(e.command),e.followup()}))}getCreateElementCommand(e,a,i,n){return new(0,t.CreateElementCommand)({id:e,type:p.LayoutElementType.Frame,x:a.left,y:a.top,width:a.width,height:a.height,layerIndex:a.layerIndex,rotation:a.rotation,scaleX:a.width/n.frameData.width,scaleY:a.height/n.frameData.height,path:n.frameData.path,stepRegion:a,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:a.immutable},i)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const a=await(0,C.GetSVGDimensions)(e),i=a.width,n=a.height,o={src:e,width:i,height:n,aspect:i/n};C.patternImageDataCache.set(e,o),t.setPatternData(o)}else{const a=await fetch(e),i=await a.arrayBuffer(),n=await(0,g.getAttributesFromArrayBuffer)(i),o={src:e,width:n.width,height:n.height,aspect:n.width/n.height};C.patternImageDataCache.set(e,o),t.setPatternData(o)}}async selectVariantCommand(e,a,i,n,o,r){const s=n.getStepSpecificServices(e.stepName)?.frameService,l=await this.frameSourceSvg(a,e),c=await(0,C.getFrameData)(l),d=s.getImageData(),h=i.map((e=>new(0,t.DeleteElementCommand)(e.id))),p=d?(0,C.calculateOffsets)(d,c):void 0,u=d?{id:de(),src:d.src,x:p?.x||0,y:p?.y||0,width:d.width,height:d.height,scaleX:p?.zoom||1,scaleY:p?.zoom||1,rotation:0}:void 0;o&&o(!0);const m=e.data.regions.map((t=>{const a=de(),i=n.getLayouts().find((e=>e.panelId===t.panelId));if(!i)throw new Error(`Can not find layout for region: ${t.panelId}`);return{command:this.getCreateElementCommand(a,t,i,{frameData:c,pattern:u,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:a,region:t}}})),f=m.map((e=>e.command));return{command:new(0,t.GroupCommand)([...f,...h]),followup:async()=>{if(o&&o(!1),await n.setSelectionsAndElements(e.stepName,a?[a]:[],[...m.map((e=>e.regionEl))]),n.updateStorage(e.stepName,{currentFrameSource:l}),r){const t=n.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(r,t)}}}}patternSource(e){const t=e.links.find((e=>"svg"===e.rel));if(t)return t.href;const a=e.links.find((e=>"cdn"===e.rel));if(a)return a.href;throw new Error("Frame pattern source file could not be find, neither svg or cdn assets existed on requested variant!")}async loadPatternFromAsset(e,t,a){const i=this.patternSource(e),n=de();a.markUpdatePending(n);const o=a.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(i,o),a.updateMetadata(t.stepName,{image:i}),a.updateStorage(t.stepName,{framePatternSrc:i}),a.markUpdateCompleted(n)}};const st=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantLambda(e,a,t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=await Ce.getMaterialLocalOrFromServer(i.materialId),o=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],o);const r=t.getPreviewService();if(r){const i=e.data.targetMaterials.map((t=>r.applyMaterialVariant(t,e.optionId,a.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(e.stepName,!0)))}}}}}selectVariant(e,t,a,i){this.selectVariantLambda(e,t,a,i).then((e=>e&&e()))}async selectVariantLambda(e,t,a,i){const n=a.getPreviewService();if(!n)return null;i(!0);const o=await Ce.getMaterialLocalOrFromServer(t.materialId);if(!o)throw i(!1),new Error("No material set on variant");return async()=>{await a.setSelectionsAndElements(e.stepName,[t],[]);const r=e.data.targetMaterials.map((t=>n.applyMaterialVariant(t,e.optionId,o.data)));Promise.all(r).then((()=>a.setMandatoryFulfilled(e.stepName,!0))).finally((()=>i(!1)))}}};const lt=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantLambda(e,a,t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a);const o=t.getPreviewService();if(o){if(!i.assetKey)throw new Error("No Asset for Variant");const a=(await Ce.getLocalOrFromServer(i.assetKey)).links.find((e=>"cdn"===e.rel));o.applyModelVariant(e.optionId,{model:a.href,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1).then((()=>{t.setMandatoryFulfilled(e.stepName,!0)}))}}}}}selectVariant(e,t,a,i){this.selectVariantLambda(e,t,a,i).then((e=>e&&e()))}async selectVariantLambda(e,t,a,i){const n=a.getPreviewService();if(!n)return null;if(i(!0),!t.assetKey)throw new Error("No Asset for Variant");const o=(await Ce.getLocalOrFromServer(t.assetKey)).links.find((e=>"cdn"===e.rel));return async()=>{if(await a.setSelectionsAndElements(e.stepName,[t],[]),!o)throw new Error("Asset not found:"+t.assetKey);n.applyModelVariant(e.optionId,{model:o.href,contextService:a.getLayoutPreviewService()},e.data.replaceProductModel||!1).then((()=>{a.setMandatoryFulfilled(e.stepName,!0)})).finally((()=>i(!1)))}}};const ct=new class{async init(e,t,a){return a?(await this.reload(e,t,a),null):(t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",(()=>{})))}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[],n),t.updateStorage(e.stepName,{text:i?.storage?.text}),t.setMandatoryFulfilled(e.stepName,""!==i?.storage?.text)}changeText(e,t,a,i,n){this.changeTextCommand(e,t,a,i,n).then((e=>{e&&(a.getCommandDispatcher()(e.command),e.followup())}))}async changeTextCommand(e,a,i,n,o){const r=i.getRegionElements(e.stepName),s=i.getStepSpecificServices(e.stepName)?.module;if(!s)return console.error("Missing module."),null;const l=i.getProfanities();if(!this.validateInput(e,a,l,o))return i.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(i.setMandatoryFulfilled(e.stepName,""!==a),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;i.updateStorage(e.stepName,{text:a});const c=(a,n,o)=>{const r=o||de(),s=i.getLayouts().find((e=>e.panelId===n.panelId));if(!s)return console.error(`Can not find layout for region: ${n.panelId}`),null;const l=[];return o&&l.push(new(0,t.DeleteElementCommand)(r)),l.push(new(0,t.CreateElementCommand)({stepRegion:n,stepName:e.stepName,colors:{},id:r,svg:a,type:p.LayoutElementType.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layerIndex:n.layerIndex,immutable:n.immutable},s)),{id:r,region:n,command:new(0,t.GroupCommand)(l)}},d=s.svgPrint(a);if(r.length>0){const e=r.map((e=>e.region?c(d,e.region,e.id):null)).filter((e=>!!e)).filter((e=>!!e)).map((e=>e&&e.command));return{command:new(0,t.GroupCommand)(e),followup:async()=>{}}}{const a=e.data.regions.map((e=>c(d,e))),n=a.filter((e=>!!e)).map((e=>e&&e.command));return{command:new(0,t.GroupCommand)(n),followup:async()=>{const t=a.filter((e=>e)).map((e=>e&&{id:e.id,region:e.region}));await i.setSelectionsAndElements(e.stepName,[],t)}}}}validateInput(e,t,a,i){if(e.data&&e.data.maxLength){const a=e.data.maxLength;if(t.length>a)return i("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return i("Unsupported characters."),!1;const n=t.toLowerCase();for(const e in a)if(n===a[e].toLowerCase().trim()&&""!==n)return i("Blocked profanity."),!1;return i(""),!0}};const dt=e=>new Promise((t=>{fetch(e).then((e=>e.text())).then((e=>{t(e)})).catch((e=>console.error(e)))})),ht=e=>{const t=e.match(/<svg.*?<\/svg>/s)||[],a=t?.length>0?t[0]:"",i=(new DOMParser).parseFromString(a,"image/svg+xml").firstElementChild;if(!i)throw new Error("Failed to read SVG.");(0,b.sanitizeSvgTree)(i,!0);return(new XMLSerializer).serializeToString(i)},pt=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return console.error(`Patchwork step ${e.stepName} is missing option.`),null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a&&a.assetKey)return this.selectVariantCommand(e,a,[],t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const r=o.variants.find((e=>e.id===a));if(r){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[r],a),t.updateStorage(e.stepName,{patchworkOffsets:i.storage?.patchworkOffsets}),t.setMandatoryFulfilled(e.stepName,!0)}}}}recalculate(e,a,i,n){const o=i.getCommandDispatcher();var r;n(!0);const s=a.map((e=>e.region?this.getRandomPosition(e.region):null)).filter((e=>!!e));o(new(0,t.GroupCommand)(a.map(((e,a)=>{const i=s[a];return 0===a&&(r=i),new(0,t.ShiftPatchworkCommand)(e.id,i.scale,-i.xOffset,-i.yOffset)})))),r&&i.updateStorage(e.stepName,{patchworkOffsets:s}),n(!1)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{e&&(i.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n,o){if(!a.assetKey)throw new Error("No Asset for Variant");const r=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!r)throw new Error("Could not find CDN link for patchwork.");if(!e.data||!e.data.regions)return console.error("Trying to update patchwork in design with no region data"),null;o(!0);const s=r.href,l=n.getLayouts();var c;const d=e.data.regions.map((e=>this.getRandomPosition(e))),h=await dt(s),u=ht(h),m=e.data.regions.map(((a,i)=>((a,i,n)=>{const o=l.find((e=>e.panelId===a.panelId));if(!o)throw new Error("Can't find layout");const r=d[i],s=de();return 0===i&&(c=r),{regionElement:{id:s,region:a},command:new(0,t.CreateElementCommand)({stepRegion:a,stepName:e.stepName,id:s,svg:n,type:p.LayoutElementType.Patchwork,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable,patchX:-r.xOffset,patchY:-r.yOffset,patchScale:r.scale},o)}})(a,i,u))),f=i.map((e=>new(0,t.DeleteElementCommand)(e.id))),g=m.map((e=>e.command));return{command:new(0,t.GroupCommand)([...f,...g]),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[a],m.map((e=>e.regionElement))),c&&n.updateStorage(e.stepName,{patchworkOffsets:d}),o(!1)}}}getRandomPosition(e){const t=Math.random()*(.7-.25)+.25,a=1/t,i=1-t;return{scale:a,xOffset:Math.random()*i*a*e.width,yOffset:Math.random()*i*a*e.height}}constructPreviewSvg(e,t,a,i){if(!i||0===t.length)return null;try{const n=(0,k.findElement)(t[0].id,a().map((e=>e.layoutState))).svg,o=e.data.regions[0],r={x:0,y:0,width:o.width,height:o.height,rotation:0,id:"patchwork-preview",svg:n,patchX:-i.xOffset,patchY:-i.yOffset,patchScale:i.scale},s=(0,c.jsx)(A(R),{...r}),l=A(N).renderToStaticMarkup(s);return`\n <svg\n version="1.1"\n xmlns="http://www.w3.org/2000/svg"\n xmlns:xlink="http://www.w3.org/1999/xlink"\n width="${r.width}px"\n height="${r.height}px"\n viewBox="0 0 ${r.width} ${r.height}"\n >\n ${l}\n </svg>\n `}catch(e){return null}}};const ut=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId)?.data;if(!i)return null;if(a)await this.reload(e,t,a);else if(i.defaultVariant){const a=i.defaultVariant,n=i.variants.find((e=>!!e.assetKey&&e.id===a));if(n)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n,t,(()=>{}))}return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a),t.setMandatoryFulfilled(e.stepName,!0)}}}}selectVariant(e,t,a,i){this.selectVariantCommand(e,t,a,i).then((e=>{e&&(a.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n){if(!a.assetKey)throw new Error("No Asset for Variant");const o=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!o)return console.error("No URL for picture!"),null;const r=o.href;n(!0),i.setMandatoryFulfilled(e.stepName,!1);const s=i.getRegionElements(e.stepName).map((e=>new(0,t.DeleteElementCommand)(e.id))),l=e.data.regions.map((a=>{const n=i.getLayouts().find((e=>e.panelId===a.panelId));if(!n)throw new Error(`Can not find layout for region: ${a.panelId}`);const o=de();return{regionElement:{id:o,region:a},command:new(0,t.CreateElementCommand)({stepName:e.stepName,stepRegion:a,id:o,src:r,type:p.LayoutElementType.Image,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable,preserveAspectRatio:"none"},n)}}));return{command:new(0,t.GroupCommand)([...s,...l.map((e=>e.command))]),followup:async()=>{await i.setSelectionsAndElements(e.stepName,[a],l.map((e=>e.regionElement))),i.setMandatoryFulfilled(e.stepName,!0),n(!1)}}}};const mt=new class{colourOptions(e){return P.getLocalOrUndefined(e.optionId)?P.getLocalOrUndefined(e.optionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e}))):e.data.colours.length>0?e.data.colours.map((e=>({fill:e,stroke:e}))):[]}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(!a){const a=P.getDefaultVariant(i.data);if(!a)return null;const n={fill:a.color,stroke:a.color,variant:a};return this.selectVariantCommand(e,n,[],t)}return await this.reload(e,t,a),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a),t.updateStorage(e.stepName,{colour:i.color||""}),t.setMandatoryFulfilled(e.stepName,!0)}}}}selectVariant(e,t,a,i){this.selectVariantCommand(e,t,a,i).then((e=>{e&&(i.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n){const o=n.getLayouts();if(i.length>0){const r=i=>{const n=i.region;if(!o.find((e=>e.panelId===n?.panelId)))return console.error(`Step ${e.stepName} missing layout for panel: ${n?.panelId}.`),null;const r=a.variant?.color;return r?new(0,t.IllustrationColorCommand)(i.id,"spiff-fill-shape",r):(console.error("Failed to change color."),null)},s=i.map(r).filter((e=>!!e));return{command:new(0,t.GroupCommand)(s),followup:async()=>{n.setSelectionsAndElements(e.stepName,a.variant?[a.variant]:[],i),n.updateStorage(e.stepName,{colour:a.fill||""})}}}{const i=i=>{const n=o.find((e=>e.panelId===i.panelId));if(!n)return console.error(`Step ${e.stepName} missing layout for panel: ${i.panelId}.`),null;const r=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${a.variant?.color}"\n />\n </svg>\n `,s={};s["spiff-fill-shape"]={browserValue:a.variant.color};const l=de();return{id:l,region:i,command:new(0,t.CreateElementCommand)({stepRegion:i,stepName:e.stepName,colors:s,id:l,svg:r,type:p.LayoutElementType.Illustration,y:i.top,x:i.left,rotation:i.rotation,width:i.width,height:i.height,layerIndex:i.layerIndex,immutable:i.immutable,excludeFromExport:e.data.excludeFromPrint},n)}},r=e.data.regions.map(i),s=r.filter((e=>!!e)).map((e=>e?.command)),l=r.filter((e=>!!e)).map((e=>({id:e.id,region:e.region})));return{command:new(0,t.GroupCommand)(s),followup:async()=>{await n.setSelectionsAndElements(e.stepName,a.variant?[a.variant]:[],l),n.updateStorage(e.stepName,{colour:a.fill||""})}}}}};function ft(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const gt=new class{constructor(){ft(this,"latestToast",void 0),ft(this,"toastType",void 0),ft(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(e){e({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(e)}setLatestToast(e,t){this.latestToast=e,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((e=>e({toastMessage:this.latestToast,toastType:this.toastType})))}};function wt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class yt extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=yt.name}}class St extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=St.name}}const vt=new class{constructor(){wt(this,"cachedColors",new Map),wt(this,"filterUnsupportedCharacters",((e,t)=>{let i=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],o=e?.fontData?(0,a.getFontMetrics)(e?.fontData):void 0;if(o){const e=i.split("").map((e=>o.getFont().charToGlyph(e)));for(let t=0;t<e.length;t++){const a=".notdef"===e[t].name;"\n"===i.charAt(t)||a&&n.push(String.fromCharCode(i.charCodeAt(t)))}}for(let e=0;e<n.length;e++)i=i.replaceAll(n[e],"");return i})),wt(this,"getErrorsForText",((e,t,a)=>{const i=[];t.data&&t.data.maxLength&&e.length>t.data.maxLength&&i.push({localizationKey:"workflow.steps.text.characterLimit"});const n=a.getProfanities(),o=e.toLowerCase();if(""!==o)for(const e in n){if(o===n[e].toLowerCase().trim()){i.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(e.includes("\n")||e.includes("\r"))&&i.push({localizationKey:"workflow.steps.text.multipleLines"}),i})),wt(this,"textAlign",(e=>e.vertical?"center":e.textAlign||"center"))}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=e.data.defaultText||"";t.updateStorage(e.stepName,{inputText:a});this.getDefaultColor(e.data)&&t.updateMetadata(e.stepName,{color:e.data.colour});const n=P.getDefaultVariant(i.data);if(n)return this.selectVariantCommand(e,n,{},[],t,!1,(()=>{}),(()=>{}))}return null}async reload(e,a,i){const n=a.getSerializedStep(e.stepName,i.serializableWorkflow.steps),o=Object.values(i.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),r=(await P.getLocalOrFromServer(q,e.optionId))?.data;if(n?.selectedVariants){const i=n.selectedVariants[0].id;if(r&&i){const s=r.variants.find((e=>e.id===i));if(s){const i=await this.fontDataFromVariant(s),r=o.map((e=>({id:e.id,region:e.stepRegion})));await a.setSelectionsAndElements(e.stepName,[s],r),a.updateMetadata(e.stepName,{color:n.storage?.color,text:n.storage?.text}),a.updateStorage(e.stepName,{text:n.storage?.text});const l=o.map((e=>new(0,t.FontSourceCommand)(e.id,i))),c=new(0,t.GroupCommand)(l);a.getCommandDispatcher()(c),a.setMandatoryFulfilled(e.stepName,!0)}}}}getDefaultColor(e){if(P.getLocalOrUndefined(e.colourOptionId)){const t=P.getDefaultVariant(P.getLocalOrUndefined(e.colourOptionId).data);if(t)return t.color}if(e.colour)return e.colour}findLayoutElement(e,t,a){const i=e.getRegionElements(t.stepName);if(i[0])return(0,k.findElement)(i[0].id,a().map((e=>e.layoutState)))}findLayoutElements(e,t,a){return e.getRegionElements(t.stepName).map((e=>(0,k.findElement)(e.id,a().map((e=>e.layoutState)))))}availableColors(e){const t=this.cachedColors.get(e.stepName);if(t)return t;if(P.getLocalOrUndefined(e.data.colourOptionId)){const t=P.getLocalOrUndefined(e.data.colourOptionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e})));return this.cachedColors.set(e.stepName,t),t}if(e.data.colours&&e.data.colours.length>0){const t=e.data.colours.map((e=>({fill:e,stroke:e})));return this.cachedColors.set(e.stepName,t),t}return[]}changeColor(e,a,i,n){if(!e.data||!e.data.regions)return;const o=n.getCommandDispatcher();n.updateStorage(e.stepName,{color:a.fill}),a.variant?n.updateMetadata(e.stepName,{color:a.variant.name}):n.updateMetadata(e.stepName,{color:a.fill});for(const e of i){if(!a.fill)throw new Error("Fill not set on new color selection!");o(new(0,t.FontColorCommand)(e.id,a.fill))}}updateInputText(e,a,i,n,o,r){const s=a?e:this.injectReplaceableText(e,n.data),l=(0,f.applyTextTransformations)(s,{vertical:n.data.vertical,uppercase:n.data.uppercase});let c={command:void 0,helperText:"",errors:this.getErrorsForText(e,n,r)};if(c.errors.length>0)return c.helperText=c.errors[0].localizationKey,c;const d=(n.data.maxLength-s.length).toString();c.helperText=`${d} characters remaining`,r.updateStorage(n.stepName,{text:e}),r.updateMetadata(n.stepName,{text:l}),o.defaultCleared&&r.setMandatoryFulfilled(n.stepName,!0);const h=r.getTransaction().bulk&&n.data.varyText||!1,p=[],u=new Map,m=new Map;for(const e of i){if(!e.fontData)throw new Error("Failed to resolve font data for text.");const[t,a]=(0,O.determineCorrectFontSizeAndLines)(e.fontSize,e.fontData,{left:e.x,top:e.y,width:e.width,height:e.height,rotation:e.rotation,panelId:""},l,{size:n.data.size,minSize:n.data.minSize,maxSize:n.data.maxSize});u.set(e.id,t),m.set(e.id,a);const i=n.data.curved?l:(a||[]).join("\n");p.push(this.generateTextChangeCommandsForRegion(t,n.data,e.id,i,h))}if(!n.data.curved&&i.length>0){if(!Array.from(m.values()).every((e=>e)))return c.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),c}return c.command=new(0,t.GroupCommand)(p),c.command.varying=h,c}async changeInputTextWithRegion(e,a,i,n,o,r,s,l,c,d){const h=n.replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),p=s?h:this.injectReplaceableText(h,e.data),u=r.getRegionElements(e.stepName),m=new Map,f=new Map;for(const t of u)if(t.region){const[n,o]=(0,O.determineCorrectFontSizeAndLines)(a,i,t.region,p,{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});m.set(t.id,n),f.set(t.id,o)}const g=(()=>{if(e.data&&e.data.maxLength&&p.length>e.data.maxLength)return d&&d(!0),{info:"0"};var t=p.toLowerCase();const a=r.getProfanities();for(const e in a)if(t===a[e].toLowerCase().trim()&&""!==t)return l(!0),{error:"Blocked profanity."};if(!e.data.allowNewlines&&(p.includes("\n")||p.includes("\r")))return l(!0),{error:"Cannot span multiple lines."};if(!e.data.curved){if(!Array.from(f.values()).every((e=>e)))return l(!0),{error:"Does not fit."}}return l(!1),{info:(e.data.maxLength-p.length).toString()}})();if(g.error)return void c(g.error);if(c(`${g.info} characters remaining`||""),d)return;r.updateStorage(e.stepName,{text:h}),r.updateMetadata(e.stepName,{text:this.injectReplaceableText(h,e.data)});const w=r.getTransaction().bulk&&e.data.varyText||!1;o.defaultCleared&&r.setMandatoryFulfilled(e.stepName,!0);const y=[];for(const t of u){const a=e.data.curved?p:(f.get(t.id)||[]).join("\n");y.push(this.generateTextChangeCommandsForRegion(m.get(t.id)||1,e.data,t.id,a,w))}const S=new(0,t.GroupCommand)(y);return S.varying=w,S}selectVariant(e,t,a,i,n,o,r,s){this.selectVariantCommand(e,t,a,i,n,o,r,s).then((e=>{n.getCommandDispatcher()(e.command),e.followup()}))}async fontDataFromVariant(e){if(!e.assetKey)throw new Error("No Asset for Variant");const t=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel))?.href;if(!t)throw new Error("Failed to find resource link for font in text step.");return{assetUrl:t,name:(await(0,a.loadFontFromExternalUrl)(t)).names.fullName.en}}async findOrCreateElements(e,a,i){const n=e.getTransaction().bulk&&a.data.varyText||!1,o=this.findLayoutElements(e,a,i);if(o.length>0)return o;const r=P.getLocalOrUndefined(a.optionId);if(!r)throw new Error(`No option for step ${a.stepName}`);const s=P.getDefaultVariant(r.data);if(!s)throw new Error(`No default variant for step ${a.stepName}`);const l=await this.fontDataFromVariant(s),c=await this.createTextboxRegions(a.stepName,s,a.data,l,{},e),d=c.map((e=>e.commands)),h=new(0,t.GroupCommand)(d.flat());return h.varying=n,e.getCommandDispatcher()(h),c.map((e=>e.newElement))}async selectVariantCommand(e,a,i,n,o,r,s,l){const c=de();o.markUpdatePending(c);const d=await this.fontDataFromVariant(a);if(n.length>0){const h=n.map((e=>new(0,t.FontSourceCommand)(e.id,d))),p=await this.changeInputTextWithRegion(e,e.data.size||30,d,i.text||"",i,o,r,s,l);p&&h.push(p);return{command:new(0,t.GroupCommand)(h),followup:async()=>{o.markUpdateCompleted(c),await o.setSelectionsAndElements(e.stepName,[a],n)}}}{const n=await this.createTextboxRegions(e.stepName,a,e.data,d,i,o),h=await this.changeInputTextWithRegion(e,e.data.size||30,d,n[0]?.newElement.text||i.text||"",i,o,r,s,l),p=n.flatMap((e=>e.commands));h&&p.push(h);return{command:new(0,t.GroupCommand)(p),followup:async()=>{o.markUpdateCompleted(c)}}}}injectReplaceableText(e,t){return t.replaceableText?t.replaceableText.replace("{{}}",e):e}async createTextboxRegions(e,a,i,n,o,r){if(!i||!i.regions)throw new Error("Step data not supplied");const s=r.getTransaction().bulk&&i.varyText||!1,l=s?"":o.text||i.defaultText||"",c=await Promise.all(i.regions.map((a=>{const c=r.getLayouts().find((e=>e.panelId===a.panelId)),d=de();try{const r=this.getDefaultColor(i),h=r||"#000000";if(!c)throw new St("Failed to find layout for region: "+a.panelId);const u={stepRegion:a,stepName:e,align:this.textAlign(i),fill:o.color?o.color:h,fontSize:i.size||30,fontData:n,id:d,layerIndex:a.layerIndex,rotation:a.rotation,text:(0,f.applyTextTransformations)(l,{vertical:i.vertical,uppercase:i.uppercase}),input:l,type:p.LayoutElementType.Textbox,vertical:i.vertical,x:a.left,y:a.top,height:a.height,width:a.width,immutable:a.immutable,verticalAlign:i.verticalAlign||"middle",curved:i.curved,paths:i.paths},m=[];if(!i.curved){if(!u.fontData)throw new Error("Failed to resolve font data for text.");const e=new Map,t=new Map,[n,o]=(0,O.determineCorrectFontSizeAndLines)(u.fontSize,u.fontData,a,l,{size:i.size,minSize:i.minSize,maxSize:i.maxSize});e.set(d,n),t.set(d,o);const r=(t.get(d)||[]).join("\n");m.push(this.generateTextChangeCommandsForRegion(e.get(d)||1,i,d,r,s))}const g=new(0,t.CreateElementCommand)(u,c);return g.varying=s,{regionElement:{id:d,region:a},commands:[g,...m],newElement:u,fontData:n}}catch(e){throw console.log(e),new yt("Error adding font to region")}}))).catch((e=>{throw e instanceof yt?(gt.setLatestToast("Failed to load font.",Ct.Error),e):e instanceof St?e:new Error(e)}));return await r.setSelectionsAndElements(e,[a],c.map((e=>e.regionElement))),r.updateMetadata(e,{text:l}),r.updateStorage(e,{text:l}),c}generateTextChangeCommandsForRegion(e,a,i,n,o){const r=[],s=new(0,t.TextChangeCommand)(i,n);if(s.varying=o,r.push(s),!a.size){const a=new(0,t.FontSizeCommand)(i,e);a.varying=o,r.push(a)}const l=new(0,t.GroupCommand)(r);return l.varying=o,l}};function xt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}let Ct;var bt;(bt=Ct||(Ct={})).Error="Error",bt.Warning="Warning";class kt extends Ge{constructor(e){super(),xt(this,"update",void 0),xt(this,"createdAt",new Date),this.update=e}async execute(){await this.update(),await new Promise((e=>{window.setTimeout((()=>{e()}),1e3)}))}}class Et{constructor(e,t,a,i,n,o,r,s,l){xt(this,"initialReducerState",void 0),xt(this,"transaction",void 0),xt(this,"updateTransaction",void 0),xt(this,"ensuredInitialised",void 0),xt(this,"confirmedDesign",void 0),xt(this,"editedSteps",void 0),xt(this,"informationResults",void 0),xt(this,"layouts",void 0),xt(this,"mandatorySteps",void 0),xt(this,"pendingUpdates",void 0),xt(this,"selectionCost",void 0),xt(this,"workflow",void 0),xt(this,"stepSpecificServices",void 0),xt(this,"previewService",void 0),xt(this,"profanityFilter",void 0),xt(this,"pollers",void 0),xt(this,"commandContext",void 0),xt(this,"stepElements",void 0),xt(this,"stepInitialised",void 0),xt(this,"stepMetadata",void 0),xt(this,"stepSelections",void 0),xt(this,"storage",void 0),xt(this,"confirmCallbacks",void 0),xt(this,"editedCallbacks",void 0),xt(this,"elementsCallbacks",void 0),xt(this,"ensuredInitialisedCallbacks",void 0),xt(this,"informationResultCallbacks",void 0),xt(this,"initCallbacks",void 0),xt(this,"makingAdjustmentsCallback",void 0),xt(this,"mandatoryCallbacks",void 0),xt(this,"metadataCallbacks",void 0),xt(this,"selectionCallbacks",void 0),xt(this,"stepSpecificStorageCallbacks",void 0),xt(this,"storageCallbacks",void 0),xt(this,"updateCallbacks",void 0),xt(this,"currentVariationRecordCallbacks",void 0),xt(this,"variationRecordCallbacks",void 0),xt(this,"processingStepInitialisation",void 0),xt(this,"allScenes",void 0),xt(this,"product",void 0),xt(this,"invalidModelVariants",void 0),xt(this,"currentAdjustingStepId",void 0),xt(this,"renderableContextService",void 0),xt(this,"workflowStatePromiseQueue",new He(1)),xt(this,"variationRecords",[]),xt(this,"currentVariationRecord",void 0),this.updateTransaction=n,this.commandContext=i,this.initialReducerState=o.workflowState,this.transaction=o,this.ensuredInitialised=!1,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=e,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.processingStepInitialisation=!1,this.layouts=a,this.product=l,this.previewService=r,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.ensuredInitialisedCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.updateCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.ensureStepsAreLoaded(),this.fireReloadAnimation()}addVariationRecord(e){const t={...e,recordNumber:this.variationRecords.reduce(((e,t)=>t.recordNumber>e?t.recordNumber:e),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(e){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==e)),this.variationRecords.forEach(((e,t)=>{e.recordNumber=t+1})),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===e){const e=this.currentVariationRecord.recordNumber,t=e>1?this.variationRecords[e-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(e){this.variationRecords=e,this.onVariationRecordsChange(),0===e.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(e[0])}setCurrentVariationRecord(e){this.currentVariationRecord=e,this.onCurrentVariationRecordChange()}fireReloadAnimation(){if(!this.initialReducerState)return;const e=this.workflow.finalizeStepConfig;e&&(e.lookAtAnimation&&this.previewService?.executeCameraAnimation(e.lookAtAnimation),e.modelAnimation&&this.previewService?.executeModelAnimation(e.modelAnimation))}addConfirmCallback(e){e(this.confirmedDesign),this.confirmCallbacks.push(e)}addEditedCallback(e){e(this.editedSteps),this.editedCallbacks.push(e)}addElementsCallback(e){e(this.stepElements),this.elementsCallbacks.push(e)}addEnsuredInitialisedCallback(e){e(this.ensuredInitialised),this.ensuredInitialisedCallbacks.push(e)}addInformationResultCallback(e){e(this.informationResults),this.informationResultCallbacks.push(e)}addInitCallback(e){e(this.stepInitialised),this.initCallbacks.push(e)}addMandatoryCallback(e){e(this.mandatorySteps),this.mandatoryCallbacks.push(e)}addMetadataCallback(e){e(this.stepMetadata),this.metadataCallbacks.push(e)}addSelectionCallback(e){e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:this.traversableScenes()}),this.selectionCallbacks.push(e)}addStepSpecificStorageCallback(e,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),e(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(e)}addStorageCallback(e){e(this.storage),this.storageCallbacks.push(e)}addUpdateCallback(e){e(this.pendingUpdates.length>0),this.updateCallbacks.push(e)}addMakingAdjustmentsCallback(e){e(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(e)}addCurrentVariationCallback(e){e(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(e)}addVariationRecordsCallback(e){e(this.variationRecords),this.variationRecordCallbacks.push(e)}addPoller(e){this.pollers.push(e)}getLayouts(){return this.layouts}getLayoutPreviewService(){return this.renderableContextService}getPreviewService(){return this.previewService}getProductName(){return this.product?.name}getProfanities(){return this.profanityFilter}getRegionElements(e){return this.stepElements[e]||[]}getStepSpecificServices(e){return this.stepSpecificServices[e]}getTransaction(){return this.transaction}getWorkflow(){return this.workflow}getCommandDispatcher(){return e=>this.commandContext.apply(e)}getWorkflowSelections(){const e={};return this.workflow.steps.forEach((t=>{const a=this.stepSelections[t.stepName];if(a&&a.selectedVariants&&a.selectedVariants.length>0){const i=this.workflow.stepGroups.find((e=>e.stepNames.includes(t.stepName)));P.getLocalOrUndefined(t.optionId)&&(e[t.stepName]={groupName:i?i.name:void 0,optionName:P.getLocalOrUndefined(t.optionId).data.name,selections:a.selectedVariants})}})),e}markStepsAsInitialised(e){const t={...this.stepInitialised};e.forEach((e=>{t[e]=!0})),this.stepInitialised=t,this.onInitChange()}markUpdateCompleted(e){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==e)),this.onUpdateChange()}markUpdatePending(e){this.pendingUpdates=[...this.pendingUpdates,e],this.onUpdateChange()}setAllScenes(e){const t=this.allScenes;this.allScenes=Fe(this.workflow,e),A(h)(t,this.allScenes)||this.ensureStepsAreLoaded()}setEditedStatus(e,t){this.editedSteps={...this.editedSteps,[e]:t},this.onEditedChange()}setInformationResults(e){this.informationResults=[...e],this.onInformationResultChange()}setCurrentAdjustingStepId(e){this.currentAdjustingStepId=e,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(e,t){this.mandatorySteps[e]!==t&&(this.mandatorySteps={...this.mandatorySteps,[e]:t},this.onMandatoryChange())}async setSelectionsAndElements(e,a,i){const n=this.stepSelections;this.stepSelections={...this.stepSelections,[e]:{selectedVariants:a}},this.selectionCost=Object.values(this.stepSelections).reduce(((e,t)=>e+t.selectedVariants.map((e=>e.priceModifier)).reduce(((e,t)=>e+t),0)),0),this.workflow.steps.forEach((e=>{qe(e,this.stepSelections)||(this.stepInitialised[e.stepName]=!1,delete this.stepMetadata[e.stepName],delete this.stepSelections[e.stepName],delete this.storage[e.stepName])}));const o=this.allScenes,r=We(o,n),s=We(o,this.stepSelections),l=r.map((e=>e.silentSteps)).flat(),c=s.map((e=>e.silentSteps)).flat().filter((e=>!l.some((t=>t.stepName===e.stepName))));l.forEach((e=>{qe(e,this.stepSelections)||(this.stepInitialised[e.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const d=this.getInvalidCanvasRegions(),{stepElements:h,commands:p}=await this.stepElementsForIntroducedSilentSteps(c);this.processingStepInitialisation||this.ensureStepsAreLoaded(),this.stepElements={...this.stepElements,...h,[e]:i},this.removeElements(d),this.onElementsChange();if(this.workflow.steps.find((t=>t.stepName===e))?.type===y.StepType.Frame){this.getStepSpecificServices(e)?.frameService?.setTargetElements(i.map((e=>e.id)))}const u=[...d.map((e=>new(0,t.DeleteElementCommand)(e.id))),...p,new(0,t.UpdateWorkflowStateCommand)(this.constructSerializableWorkflow())];u.length>0&&this.commandContext.apply(new(0,t.GroupCommand)(u)),this.onSelectionChange()}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(e){e(this.mandatorySteps),this.mandatoryCallbacks.push(e)}async updateStorage(e,a){const i={...this.storage,[e]:{...this.storage[e],...a}};if(!A(h)(i,this.storage)){this.storage=i;const a=new(0,t.UpdateWorkflowStateCommand)(this.constructSerializableWorkflow());this.commandContext.apply(a),this.onStepSpecificStorageChange(e),this.onStorageChange()}}constructSerializableWorkflow(){const e=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const a={stepName:t.stepName};a.storage=this.storage[t.stepName],a.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((e=>({id:e.id,priceModifier:e.priceModifier}))),e.push(a)}))})),{steps:e}}updateStateWithServer(e){const t=this.serialize(e);this.workflowStatePromiseQueue.enqueue(new kt((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(e){const t=this.serialize(e);return new kt((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(e){const t=JSON.stringify(this.dehydrateState(A(S)(e().transaction))),a=e().variation;if(!a)return{transaction:t};const i={layouts:{},serializableWorkflow:{steps:[]},...A(S)(a)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(i))}}dehydrateState(e){for(const t of Object.values(e.layouts).map((e=>e.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return e}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(e,t){this.stepMetadata={...this.stepMetadata,[e]:{...this.stepMetadata[e],...t}},this.onMetadataChange()}removeElements(e){this.stepElements=((e,t)=>Object.keys(e).reduce(((a,i)=>{const n=[...e[i]||[]];return t.forEach((e=>{const t=n.findIndex((t=>t.id===e.id));t>-1&&n.splice(t,1)})),a[i]=n,a}),{}))(this.stepElements,e)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((e,t)=>(qe(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>e.push(t))),e)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((e,t)=>(!qe(t,this.stepSelections)&&P.getLocalOrUndefined(t.optionId)&&"Model"===t.type&&e.push(P.getLocalOrUndefined(t.optionId).data.id),e)),[])}async stepElementsForIntroducedSilentSteps(e){const t=this.product;if(!t)return Promise.resolve({stepElements:{},commands:[]});const a=(e,t,a)=>"SilentIllustration"===e.type?new tt(e,t).trigger():"ProductOverlay"===e.type?new tt(e,t,a).trigger():Promise.reject("Unknown silent step. This is a bug"),i=e.filter((e=>!this.stepInitialised[e.stepName]));let n={stepElements:{},commands:[]};for(const e of i){this.markStepsAsInitialised([e.stepName]);const i=await a(e,this.layouts,t);n.stepElements[e.stepName]=i.map((e=>e.regionElement)),n.commands=[...n.commands,...i.map((e=>e.command))]}return n}getSerializedStep(e,t){return t.find((t=>t.stepName===e))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}stepNotReadyForInitialization(e){return("Model"===e.type||"Material"===e.type)&&!this.previewService}async reset(){this.commandContext.getAllLayouts().forEach((e=>e.layoutState.elements.forEach((e=>{this.getCommandDispatcher()(new(0,t.DeleteElementCommand)(e.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async ensureStepsAreLoaded(){const e=this.initialReducerState?JSON.parse(this.initialReducerState):void 0;this.processingStepInitialisation=!0,await P.cacheRequiredOptions(this.workflow);const t=this.allScenes,a=We(t,this.stepSelections).map((e=>e.silentSteps)).flat(),{stepElements:i,commands:n}=await this.stepElementsForIntroducedSilentSteps(a);this.stepElements={...this.stepElements,...i};const o=Be(this.allScenes,this.stepSelections).map((e=>e.renderableSteps)),r=[],s=[];n.forEach((e=>r.push({command:e,followup:async()=>{}})));const l=o.flat();for(const t of l)if(!this.stepInitialised[t.stepName]&&!this.stepNotReadyForInitialization(t))switch(this.stepInitialised[t.stepName]=!0,t.type){case"Bulk":this.updateStorage("Bulk",e?.serializableWorkflow.steps.find((e=>"Bulk"===e.stepName))?.storage||{});break;case"DigitalContent":r.push(await ot.init(t,this,e));break;case"Finish":case"Introduction":default:break;case"Frame":case"Photo":const a=new Ze(t.data.forceImageCover);a.connectWorkflowManager(this,t.stepName),this.stepSpecificServices[t.stepName]={frameService:a},r.push(await rt.init(t,this,e));break;case"Illustration":r.push(await Je.init(t,this,e));break;case"Material":s.push(await st.init(t,this,e));break;case"Model":s.push(await lt.init(t,this,e));break;case"Module":const i=t.data.module;this.stepSpecificServices[t.stepName]={module:await A(v)(i)},r.push(await ct.init(t,this,e));break;case"Patchwork":r.push(await pt.init(t,this,e));break;case"Picture":r.push(await ut.init(t,this,e));break;case"Question":s.push(await Pe.init(t,this,e));break;case"Shape":r.push(await mt.init(t,this,e));break;case"Text":r.push(await vt.init(t,this,e))}const c=r.filter((e=>!!e));for(const e of c)this.commandContext.apply(e.command),await e.followup();const d=s.filter((e=>!!e));if(d.length>0)for(const e of d)await e();(c.length>0||d.length>0)&&await this.ensureStepsAreLoaded();const h=l.map((e=>{if(P.getLocalOrUndefined(e.optionId))return P.getDefaultVariant(P.getLocalOrUndefined(e.optionId).data)}));(e||l.length>0&&!h.some((e=>!!e))||c.length>0||d.length>0)&&(this.ensuredInitialised=!0,this.onEnsuredInitialisedChange()),this.processingStepInitialisation=!1,this.onSelectionChange(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((e=>e(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((e=>e(this.editedSteps)))}onEnsuredInitialisedChange(){this.ensuredInitialisedCallbacks.forEach((e=>e(this.ensuredInitialised)))}onElementsChange(){this.elementsCallbacks.forEach((e=>e(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((e=>e(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((e=>e(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((e=>{e(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((e=>e(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((e=>{e(this.stepMetadata)}))}onSelectionChange(){this.selectionCallbacks.forEach((e=>e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:this.traversableScenes()})))}onStepSpecificStorageChange(e){Object.keys(this.stepSpecificStorageCallbacks).includes(e)||(this.stepSpecificStorageCallbacks[e]=[]),this.stepSpecificStorageCallbacks[e].forEach((t=>t(this.storage[e])))}onStorageChange(){this.storageCallbacks.forEach((e=>e(this.storage)))}onUpdateChange(){this.updateCallbacks.forEach((e=>{e(this.pendingUpdates.length>0)}))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((e=>{e(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((e=>{e(this.variationRecords)}))}traversableScenes(){const e=this.allScenes;return $e(e,this.stepSelections)}}function It(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Nt{constructor(e){if(It(this,"commandContext",void 0),It(this,"workflowManager",void 0),It(this,"isReadOnly",void 0),!e.workflow)throw new Error("No Workflow ID provided.");const t=e.layouts;this.commandContext=new $eb7869949b641a40$re_export$CommandContext;const a=e.transaction.workflowState?JSON.parse(e.transaction.workflowState):void 0;this.commandContext.initialize(t,a),this.isReadOnly=!!e.transaction.lineItem?.id||!Ee.getMap("transactionOwnerIds")?.get(e.transaction.id);this.workflowManager=new Et(e.workflow,e.product.profanities?.map((e=>e.word))||[],t,this.commandContext,(async e=>{this.isReadOnly||W.getShadowGraphqlClient().mutate({...e,mutation:Oe})}),e.transaction,e.previewService,e.renderableContextService,e.product)}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(e){await W.getShadowGraphqlClient().mutate({mutation:Te,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map((e=>({recordNumber:e.recordNumber,values:e.values.map((e=>({aspect:e.aspect,stepName:e.stepName,value:e.value})))})))}})}async createPreviewImage(){const t=document.createElement("canvas");t.width=1024,t.height=1024;const a=this.commandContext.getAllLayouts()[this.workflowManager.getWorkflow().defaultPreviewPanelIndex||0],i=a.layoutState.layout.previewRegion?{x:a.layoutState.layout.previewRegion.left,y:a.layoutState.layout.previewRegion.top,width:a.layoutState.layout.previewRegion.width,height:a.layoutState.layout.previewRegion.height}:{x:0,y:0,width:a.layoutState.layout.width,height:a.layoutState.layout.height},n=this.commandContext.getLayoutById(a.layoutState.layout.id),o=t.getContext("2d");if(!o)throw new Error("Failed to build 2D context for preview image creation.");const r=(0,e.getSvgString)(n.layoutState.layout,n.layoutState.elements,{region:i}),s=await A(w).from(o,r,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await s.render();const l=await(async e=>new Promise(((t,a)=>{try{e.toBlob((e=>{if(e){const a=URL.createObjectURL(e);t(a)}}))}catch(e){a(e)}})))(t);return t.toDataURL(l)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===e));if(t)return new Ve(this.getWorkflowManager(),t)}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===e));if(t)return new Ve(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===e)).map((e=>new Ve(this.getWorkflowManager(),e)))}async onDesignFinished(e,t,a,i){const n=(e,t,a)=>{const i={};return t.steps.forEach((t=>{Object.assign(i,(t=>{const i={};if("Frame"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideImageInCart&&a)return i;i[`${t.stepTitle} exportedData.image`]=n.image}if("Illustration"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideColorsInCart&&a||!n.colors)return i;if(n.colors.length>0){const e=n.colors.join(", ").toUpperCase();i[`${t.stepTitle} exportedData.colors`]=e}}if("Module"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideTextInCart&&a)return i;i[`${t.stepTitle} exportedData.text`]=n.text}if("Text"===t.type){const n=e[t.stepName];if(!n)return i;const o=t.data;o.hideTextInCart&&a||(i[`${t.stepTitle} exportedData.text`]=n.text),!n.color||o.hideColorInCart&&a||(i[`${t.stepTitle} exportedData.color`]=n.color)}return i})(t))})),i},o=(e,t,a,i,n,o,r,s,l)=>({event:"onComplete",lineItemImageUrl:r?r.href:"",transactionId:e.id,metadata:n,selectedVariants:s,designProductVariantId:e.externalDesignProductVariantId,designProductId:e.externalDesignProductId,baseCost:a,weight:t.weight,optionsCost:i,exportedData:o,sku:l,workflowViewerLink:e.workflowViewerLink||""}),r=async(e,t,a,i,r,s,l)=>{const c=(e.product?.basePrice||0)*(e.variationsCount||0),d=e.priceModifierTotal||0,h=((e,t,a,i)=>{const o={};let r;if(a){r=n(a,t,!1);for(const e of Object.keys(r))o[e]={value:r[e],priceModifier:0}}else if(i){r=i;for(const e of Object.keys(r))o[e]={value:r[e],priceModifier:0}}for(const a of Object.keys(e)){const i=e[a],n=t.steps.find((e=>e.stepTitle===a));if(1===i.length)o[`${n?.stepTitle} exportedData.selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let e=0;e<i.length;e++)o[`${n?.stepTitle} exportedData.selection ${e+1}`]={value:i[e].name,priceModifier:i[e].priceModifier}}return o})(i,a,void 0,s);return o(e,t,c,d,s,h,l,i,r)};return(async(e,t,a,i,s,l,c,d,h,p,u,m)=>{h("workflow.steps.finish.finalize.buildingLayouts"),await e.outstandingRequestsPromise();const f=W.getShadowGraphqlClient();await f.resetStore();const g=await f.mutate({mutation:Le,variables:{id:l.id}}),w=g.data?.transactions[0].workflowState;!g.errors&&w||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),g.errors&&g.errors.forEach((e=>{g.errors&&console.log("Server Error:",e.message)})),await e.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const y=e.getPreviewService(),S=t?.finalizeStepConfig?.lookAtAnimation,v=y&&100===y.getSceneInitializationProgress()&&t.showModelOnFinishStep&&S,x=m&&n(m,t,!0),C=m&&n(m,t,!1),b=e=>{const a={};let i=0;if(Object.keys(c).length>0)for(const n of Object.keys(c)){const o=c[n],r=t.steps.find((e=>e.stepName===n));for(let t=0;t<o.selections.length;++t){const n=o.selections[t];if(r&&(!e||P.getLocalOrUndefined(r.optionId)&&P.getLocalOrUndefined(r.optionId).data.variants.length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const e=r.stepTitle;a[e]?a[e].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):a[e]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[a,i]},[k]=b(!0),E=Object.fromEntries(Object.keys(k).map((e=>[e,k[e].map((e=>e.id))]))),[I]=b(!1),N=Object.fromEntries(Object.keys(I).map((e=>[e,I[e].map((e=>e.id))]))),R=await this.createPreviewImage();h("workflow.steps.finish.finalize.creatingDesign");const O=(await q.execute("createDesign",{designDetails:(()=>{const e={designName:d,layouts:a.map((e=>({index:e.index,panelId:e.panelId}))),workflowId:t.id,productId:s.id,transactionId:l.id,threeDimPreview:!!v,previewImage:R};return m&&(e.metadata=C),E&&(e.selectedVariants=N),e})()})).body,M=O.links.find((e=>"image"===e.rel));h("workflow.steps.finish.finalize.updatingTransaction");const T=(await W.getShadowGraphqlClient().query({query:Ae,variables:{id:l.id}})).data.transactions[0];return l.bulk?(await p(u),((e,t,a)=>{const i=(e.product?.basePrice||0)*(e.variationsCount||0),n=e.priceModifierTotal||0,r={items:{value:e.variationsCount?`${e.variationsCount}`:"0",priceModifier:0}};return o(e,t,i,n,void 0,r,a)})(T,s,M)):await r(T,s,t,k,O.data.sku,x,M)})(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),e,this.workflowManager.getTransaction(),a,this.workflowManager.getWorkflow().name,t,(e=>this.updateVariationRecords(e)),this.workflowManager.getVariationRecords(),i)}}function Rt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Ot{constructor(e){Rt(this,"layouts",void 0),Rt(this,"handleCompleteRender",void 0),this.handleCompleteRender=null;const t=new Map;e.forEach((e=>t.set(e.id,new Tt(e.id,e.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}}let Mt;class Tt{constructor(e,t,a){Rt(this,"hasSetStaticContext",!1),Rt(this,"id",void 0),Rt(this,"name",void 0),Rt(this,"service",void 0),Rt(this,"interactiveDirty",!1),Rt(this,"textureCtx",void 0),Rt(this,"staticCtxDirty",!1),Rt(this,"lastRequestedRenderArguments",void 0),Rt(this,"lastCompletedStaticRender",void 0),Rt(this,"lastModificationID",void 0),Rt(this,"renderQueue",new He(2)),Rt(this,"rehydrated",!1),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:e,layouts:t,variationRecord:a,productOverlayImageUrl:i}=this.lastRequestedRenderArguments;this.render(e,t,a,i)}}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,i){const n=A(S)(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,variationRecord:a,productOverlayImageUrl:i};const o=this.getStaticContext();if(!o)return this.markLastCompletedStaticRender(),void this.setStaticContextDirty(!1);this.renderQueue.enqueue(new At(this.getID(),o,(()=>{if(void 0!==Mt)return Mt;const e=document.createElement("canvas").getContext("webgl2");return Mt=!!e,Mt})(),(()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)}),e,n,a,(async()=>{const e={layouts:{},serializableWorkflow:{steps:[]}};if(t.forEach((t=>{e.layouts[t.layoutState.layout.id]=t.layoutState})),!this.rehydrated){await(0,k.rehydrateSerializedLayout)(e);const t=Object.keys(e.layouts);for(let a=0;a<t.length;a++){const i=t[a],n=e.layouts[i].elements.filter((e=>"illustration"===e.type));for(let e=0;e<n.length;++e){const t=n[e];t.src&&t.svg&&(t.cachedObjectURL=await Qe(t.svg))}}this.rehydrated=!0}}),i))}}class At extends Ge{constructor(e,t,a,i,n,o,r,s,l){super(),Rt(this,"layoutId",void 0),Rt(this,"ctx",void 0),Rt(this,"nonPOTSupport",void 0),Rt(this,"onRender",void 0),Rt(this,"workflow",void 0),Rt(this,"layouts",void 0),Rt(this,"variationRecord",void 0),Rt(this,"preprocess",void 0),Rt(this,"productOverlayImageUrl",void 0),this.layoutId=e,this.ctx=t,this.nonPOTSupport=a,this.onRender=i,this.workflow=n,this.layouts=o,this.variationRecord=r,this.preprocess=s,this.productOverlayImageUrl=l}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")&&(!!window.Worker&&!!window.OffscreenCanvas)}async execute(){const t=this.layouts.find((e=>e.layoutState.layout.id===this.layoutId));if(!t)return;const a=t.layoutState.elements||[];if(await this.preprocess(),this.variationRecord){const e=this.variationRecord.values.map((e=>({stepName:e.stepName,stepAspectType:e.aspect,value:e.value})));for(const e of this.workflow.steps)if(e.optionId&&!e.option){e.option=await P.getLocalOrFromServer(q,e.optionId);for(const t of e.option.data.variants)t.assetKey&&!t.asset&&(t.asset=await Ce.getLocalOrFromServer(t.assetKey))}const i=await Pt(Lt(e,this.workflow),this.workflow,this.layouts.map((e=>e.layoutState.layout)),this.productOverlayImageUrl),n=i?.layouts[t.layoutState.layout.id];(n?.elements||[]).forEach((e=>{const t=a.find((t=>t.stepName===e.stepName));t&&t.type===p.LayoutElementType.Textbox?(t.text=e.text,t.fontSize=e.fontSize):a.push(e)})),a.sort(((e,t)=>void 0!==e.layerIndex&&void 0!==t.layerIndex?e.layerIndex-t.layerIndex:0))}const i=t.layoutState.layout.width,n=t.layoutState.layout.height,o=this.getDynamicTextureResolution().width,r=this.getDynamicTextureResolution().height;let s,l;if(this.nonPOTSupport){i/n<o/r?(s=o,l=n*(o/i)):(s=i*(r/n),l=r)}else s=this.getDynamicTextureResolution().width,l=this.getDynamicTextureResolution().height;const c=(0,e.getSvgString)(t.layoutState.layout,a),d=await w.Canvg.from(this.ctx,c,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1});d.resize(s,l),await d.render(),this.onRender()}}const Lt=(e,t)=>{const a=[];return e.forEach((e=>{const i=t.steps.find((t=>t.stepName===e.stepName));i?.type===y.StepType.Text&&"Text"===e.stepAspectType&&a.push({name:i.stepName,data:{text:e.value}})})),a},Pt=async(e,a,i,n)=>{let o={serializableWorkflow:{steps:[]},layouts:{}};i.forEach((e=>{o=new(0,t.CreateLayoutCommand)(e).apply(o)}));return(await(0,M.generateCommands)(e,a,i,n)).forEach((e=>{o=e.apply(o)})),o};function Dt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const Vt=async e=>(await q.execute("getProductById",{productId:e})).body,zt=(e,t)=>{const a=e.workflowState,i=a?JSON.parse(a):void 0;return i?Object.values(i.layouts).map((e=>e.layout)):t.panels.sort(((e,t)=>e.index-t.index)).map((e=>({id:de(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion})))};class Ut{constructor(e){Dt(this,"options",void 0),Dt(this,"initialized",void 0),Dt(this,"experienceOptions",void 0),this.initialized=!1,this.options=e}async initFromIntegrationProduct(e){if(""===e)throw new Error("No integration product ID provided.");this.options.useUncachedEndpoints&&q.setUncachedOperations(["getAssetByKeyV2","getWorkflowV2","getMaterialV2","getOptionV2"]);const t=W.getShadowGraphqlClient();await t.resetStore();const a=await t.mutate({mutation:Ie,variables:{integrationProductId:e,bulk:this.options.bulk||!1}}),i=(await t.mutate({mutation:Ne,variables:{id:a.data?.transactionCreate.id}})).data?.transactionClaim;if(!i)throw new Error("Failed to create transaction.");const n=Ee.getMap("transactionOwnerIds")||new Map;n.set(i.id,i.transactionOwnerId),F(i.transactionOwnerId||""),Ee.setMap("transactionOwnerIds",n);const o=await Vt(i.product?.id||"");this.experienceOptions={product:o.data,transaction:i,layouts:[]},this.initialized=!0}async initFromTransaction(e){if(""===e)throw new Error("No transaction ID provided.");const t=W.getShadowGraphqlClient();await t.resetStore();const a=Ee.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){F(i);const a=(await t.query({query:Re,variables:{id:e}})).data?.transactions[0];if(!a)throw new Error("Failed to read transaction.");const n=await Vt(a.product?.id||"");return this.experienceOptions={product:n.data,transaction:a,layouts:[]},void(this.initialized=!0)}try{const i=(await t.mutate({mutation:Ne,variables:{id:e}})).data?.transactionClaim;if(!i)throw new Error("Failed to read transaction.");i.transactionOwnerId&&(a.set(i.id,i.transactionOwnerId),F(i.transactionOwnerId),Ee.setMap("transactionOwnerIds",a));const n=await Vt(i.product?.id||"");this.experienceOptions={product:n.data,transaction:i,layouts:[]},this.initialized=!0}catch{console.log("Readonly Mode");const a=(await t.query({query:Re,variables:{id:e}})).data?.transactions[0];if(!a)throw new Error("Failed to read transaction.");if(!a.lineItem?.id)throw new Error("Attempted to open an unordered transaction with no line item!");const i=await Vt(a.product?.id||"");this.experienceOptions={product:i.data,transaction:a,layouts:[]},this.initialized=!0}}async getWorkflowExperience(e,t,a){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot launch experience: Not initialized.");if(this.experienceOptions.transaction.workflowId){const e=(await q.execute("getWorkflowV2",{workflowSlug:this.experienceOptions.transaction.workflowId})).body.data;if(this.experienceOptions.workflow=e,this.experienceOptions.transaction.workflowState){const e=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(e.layouts).map((e=>e.layout))}return this.experienceOptions.previewService=a&&a(e),this.experienceOptions.renderableContextService=new Ot(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&await(this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService)),new Nt(this.experienceOptions)}if(e){const i=(await q.execute("getWorkflowV2",{workflowSlug:e})).body.data;if(this.experienceOptions.workflow=i,await W.getShadowGraphqlClient().mutate({mutation:Me,variables:{workflowId:e,id:this.experienceOptions.transaction.id}}),t){this.experienceOptions.transaction.workflowState=t;const e=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(e.layouts).map((e=>e.layout))}else this.experienceOptions.layouts=zt(this.experienceOptions.transaction,this.experienceOptions.workflow);return this.experienceOptions.previewService=a&&a(i),this.experienceOptions.renderableContextService=new Ot(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&await(this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService)),new Nt(this.experienceOptions)}throw new Error("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}class Ft{getVariationRecords(){return[]}async reset(){}updateStateWithServer(e){}addVariationRecord(e){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(e){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addCurrentVariationCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}addUpdateCallback(e){}addVariationRecordsCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProductName(){return""}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(e){}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setAllScenes(e){}setCurrentVariationRecord(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,a){}setVariationRecords(e){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}}
97
+ `;const Pe=async e=>{const t=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;if(!t)throw new Error("Failed to read SVG");const a=(new XMLSerializer).serializeToString(t),i=document.createElement("canvas"),n=i.getContext("2d"),o=await S.Canvg.from(n,a,{anonymousCrossOrigin:!0,ignoreDimensions:!1}),r=t.getAttribute("width"),s=t.getAttribute("height");if(s&&r){const e=parseFloat(s),t=parseFloat(r)/e;t>1?o.resize(2048,2048/t):o.resize(2048*t,2048)}else o.resize(2048,2048);return await o.render(),await(async e=>new Promise(((t,a)=>{try{e.toBlob((e=>{if(e){const a=URL.createObjectURL(e);t(a)}else a("Failed to generate canvas object URL")}))}catch(e){a(e)}})))(i)},De=new class{async getIllustrationBody(e){return new Promise((t=>{fetch(e).then((e=>{t(e.text())})).catch((e=>console.error(e)))}))}getCreateElementCommand(e,a,i,n){return new(0,t.CreateElementCommand)({stepRegion:a,stepName:n.stepName,colors:n.svg.colors,id:e,src:n.src,svg:n.svg.svg,cachedObjectURL:n.objectURL,type:p.LayoutElementType.Illustration,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable},i)}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)return this.reload(e,t,a);{t.updateMetadata(e.stepName,{colors:[]});const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantCommand(e,a,[],(()=>{}),t)}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(!o||!a)throw new Error("Required illustration variant no longer available");{const r=o.variants.find((e=>e.id===a));if(r){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[r],a),t.updateMetadata(e.stepName,{colors:i.storage?.colors}),t.setMandatoryFulfilled(e.stepName,!0)}}}return null}availableColors(e){return P.getLocalOrUndefined(e.data.colourOptionId)?P.getLocalOrUndefined(e.data.colourOptionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e}))):(e.data.colours||[]).map((e=>({fill:e,stroke:e})))}async changeColorsCommand(e,a,i,n,o){const r={};for(const[e,t]of o.entries())r[e]={browserValue:t,spotColor:r[e]?.spotColor};const s=(0,y.modifySVGWithElementProperties)(e,a,i,r),l=await Pe(s),c=[];for(const e of n){for(const[a,i]of o.entries())c.push(new(0,t.IllustrationColorCommand)(e,a,i));c.push(new(0,t.IllustrationCacheCommand)(e,s,l))}return new(0,t.GroupCommand)(c)}async changeColors(e,t,a,i,n){if(0===t.length)return;const o=(0,w.findElement)(t[0].id,i().map((e=>e.layoutState))),r={...o.colors},s={};Object.entries(r).forEach((([e,t])=>{const a={browserValue:t.browserValue},i=t.spotColor;i&&(a.spotColor={profileName:i.profileName,namedColor:i.namedColor}),s[e]=a}));for(const[e,t]of n.entries())r[e]={browserValue:t,spotColor:r[e]?.spotColor},s[e]={browserValue:t};a.updateStorage(e.stepName,{colors:s});let l=Array.from(Object.values(r)).map((e=>e.browserValue));P.getLocalOrUndefined(e.data.colourOptionId)&&P.getLocalOrUndefined(e.data.colourOptionId).data.variants.forEach((e=>{l=l.map((t=>t.toLowerCase()===e.color?.toLowerCase()?e.name:t))})),a.updateMetadata(e.stepName,{colors:l});const c=new Map;if(Object.entries(r).forEach((([e,t])=>{c.set(e,t.browserValue)})),!o.svg)throw new Error("Colors changed before SVG loaded. This should never happen!");const d=await this.changeColorsCommand(o.svg,o.width,o.height,t.map((e=>e.id)),c);a.getCommandDispatcher()(d)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{n.getCommandDispatcher()(e.command),e.followup()}))}selectVariantCommand(e,a,i,n,o){if(!e.data||!e.data.regions)throw new Error("Missing config data.");n(!0);const r=i.map((e=>new(0,t.DeleteElementCommand)(e.id)));return o.setMandatoryFulfilled(e.stepName,!1),new Promise((async i=>{if(!a.assetKey)throw new Error("No Asset for Variant");const s=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!s)throw new Error("CDN Link not found on SVG Asset entity!");const l=await(0,y.generateSVGWithUnknownColors)(await this.getIllustrationBody(s.href)),c=await Pe(l.svg),d=e.data.regions.map((t=>{const a=o.getLayouts().find((e=>e.panelId===t.panelId));if(!a)throw new Error("Tried to create illustration but no layout.");const i=de();return{regionElement:{id:i,region:t},command:this.getCreateElementCommand(i,t,a,{stepName:e.stepName,src:s.href,objectURL:c,svg:l})}})),h=[...d.map((e=>e.command)),...r];i({command:new(0,t.GroupCommand)(h),followup:async()=>{await o.setSelectionsAndElements(e.stepName,[a],d.map((e=>e.regionElement))),o.setMandatoryFulfilled(e.stepName,!0),n(!1)}})}))}};const Ve=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=i.data.variants,n=P.getDefaultVariant(i.data);if(!e.data.allowMultipleSelections&&n){const n=a.find((e=>e.id===i.data.defaultVariant));return this.selectVariantLambda(e,n?.id||"",t)}}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(n&&a){const i=n.variants.find((e=>e.id===a));i&&await t.setSelectionsAndElements(e.stepName,[i],[])}}}selectVariant(e,t,a){this.selectVariantLambda(e,t,a).then((e=>e&&e()))}async selectVariantLambda(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;const n=i.data.variants,o=n.length>1?n.find((e=>e.id===t)):n[0];if(!o)throw new Error("Failed to find selected variant in step variants, this should never happen!");return async()=>{await a.setSelectionsAndElements(e.stepName,[o],[]),a.setMandatoryFulfilled(e.stepName,!0)}}};function ze(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Ue{constructor(e,t){ze(this,"manager",void 0),ze(this,"stepConfiguration",void 0),this.manager=e,this.stepConfiguration=t}getCurrentVariant(){return this.manager.getWorkflowSelections()[this.stepConfiguration.stepName].selections}async getAvailableVariants(){const e=this.stepConfiguration.optionId;return(await P.getLocalOrFromServer(q,e)).data.variants}selectVariant(e){if(this.stepConfiguration.type!==v.StepType.Question)throw new Error(`Step type ${this.stepConfiguration.type} not yet supported in Core SDK`);Ve.selectVariant(this.stepConfiguration,e.id,this.manager)}}const Fe=e=>{const t=[];for(const a of e.steps)switch(a.type){case v.StepType.DigitalContent:a.data.varyUpload&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Upload});break;case v.StepType.Frame:const e=a.data;e.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection}),e.varyUpload&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Upload});break;case v.StepType.Illustration:const i=a.data;i.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection}),i.varyColors&&i.colourPickerEnabled&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Colors});break;case v.StepType.Material:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection});break;case v.StepType.Model:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection});break;case v.StepType.Picture:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection});break;case v.StepType.Question:a.data.varySelections&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selections});break;case v.StepType.Shape:a.data.varySelection&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection});break;case v.StepType.Text:const n=a.data;n.varyText&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Text}),n.varySelection&&a.optionId&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Selection}),n.varyColor&&n.colourPickerEnabled&&t.push({stepName:a.stepName,stepType:a.type,aspectType:v.StepAspectType.Color})}return t},je=[v.StepType.SilentIllustration,"ProductOverlay"],qe=(e,t)=>{const a=[];e.introduction&&a.push({name:"Introduction",title:e.name,renderableSteps:[{type:v.StepType.Introduction,stepName:"Introduction",stepTitle:e.name,helpText:e.introduction,data:{},conditions:[]}],silentSteps:[]});for(const i of e.steps){if(t.bulkScene){let e=!1;switch(i.type){case v.StepType.DigitalContent:i.data.varyUpload&&(e=!0);break;case v.StepType.Frame:const t=i.data;!t.varyUpload||!t.varySelection&&i.optionId||(e=!0);break;case v.StepType.Illustration:const a=i.data;!a.varySelection&&i.optionId&&1!==P.getLocalOrUndefined(i.optionId)?.data.variants.length||!a.varyColors&&a.colourPickerEnabled||(e=!0);break;case v.StepType.Material:i.data.varySelection&&(e=!0);break;case v.StepType.Model:i.data.varySelection&&(e=!0);break;case v.StepType.Picture:i.data.varySelection&&(e=!0);break;case v.StepType.Question:i.data.varySelections&&(e=!0);break;case v.StepType.Shape:i.data.varySelection&&(e=!0);break;case v.StepType.Text:const n=i.data;!n.varySelection&&i.optionId&&1!==P.getLocalOrUndefined(i.optionId)?.data.variants.length||!n.varyColor&&n.colourPickerEnabled&&n.colourOptionId||!n.varyText||(e=!0)}if(e)continue}const n=We(i.stepName,e.stepGroups);if(n){const e=a.find((e=>e.name===n.name));e?je.includes(i.type)?e.silentSteps.push(i):e.renderableSteps.push(i):a.push({name:n.name,title:n.name,renderableSteps:je.includes(i.type)?[]:[i],silentSteps:je.includes(i.type)?[i]:[]})}else a.push({name:i.stepName,title:i.stepTitle,renderableSteps:je.includes(i.type)?[]:[i],silentSteps:je.includes(i.type)?[i]:[]})}return t.bulkScene&&a.push({name:"Bulk",title:t.bulkSceneTitle,renderableSteps:[{type:v.StepType.Bulk,stepName:"Bulk",stepTitle:t.bulkSceneTitle,helpText:"help:/billing/bulk-ordering.md",data:{aspects:Fe(e)},conditions:[]}],silentSteps:[]}),t.finishScene&&a.push({name:"Finish",title:t.finishSceneTitle,renderableSteps:[{type:v.StepType.Finish,stepName:"Finish",stepTitle:t.finishSceneTitle,helpText:"",data:{modelAnimation:e.finalizeStepConfig?e.finalizeStepConfig.modelAnimation:void 0,lookAtAnimation:e.finalizeStepConfig?e.finalizeStepConfig.lookAtAnimation:void 0},conditions:[]}],silentSteps:[]}),a},We=(e,t)=>t.find((t=>t.stepNames.includes(e))),$e=(e,t)=>(e.conditions||[]).every((e=>{const a=t[e.targetStepName];if(a&&a.selectedVariants){const t=a.selectedVariants;return e.requiredVariantSelections.some((e=>void 0!==t.find((t=>t.id===e))))}return!1})),Be=(e,t)=>e.map((e=>((e,t)=>{const a={name:e.name,title:e.title,renderableSteps:e.renderableSteps.filter((e=>$e(e,t))),silentSteps:e.silentSteps.filter((e=>$e(e,t)))};return 0===a.silentSteps.length&&0===a.renderableSteps.length?null:a})(e,t))).filter((e=>null!==e)),Ke=(e,t)=>Be(e,t).filter((e=>e.renderableSteps.filter(((e,t,a)=>e.type===v.StepType.Model||e.type===v.StepType.Material||e.type===v.StepType.Picture||e.type===v.StepType.Shape?P.getLocalOrUndefined(e.optionId)?.data.variants&&P.getLocalOrUndefined(e.optionId).data.variants.length>1?e:null:e)).length>0)),Ge=(e,t)=>Be(e,t).filter((e=>e.renderableSteps.filter((e=>e)).length>0));function He(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Xe{constructor(){He(this,"timestamp",Date.now())}}class _e{constructor(e){He(this,"queue",[]),He(this,"activePromise",void 0),He(this,"queueMaxSize",void 0),this.queueMaxSize=e}enqueue(e){if(this.queue.push(e),void 0!==this.queueMaxSize&&this.queue.length>this.queueMaxSize){const e=this.queue.length-1;for(let t=0;t<e;++t)this.queue.shift()}return this.process()}hasActivePromise(){return!!this.activePromise}getRemainingQueueSize(){return this.queue.length}async finalize(){return this.activePromise?this.activePromise:Promise.resolve()}async process(){return this.activePromise||(this.activePromise=this.dequeue(),this.activePromise.then((()=>{this.activePromise=void 0}))),this.activePromise}async dequeue(){const e=this.queue.shift();if(e)try{await e.execute(),await this.dequeue()}catch(e){await this.dequeue()}}}function Ye(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Ze(e,t,a,i){const n=a.width*e.zoom,o=a.height*e.zoom;if(i){const i=e,n=Math.max(t.width/a.width,t.height/a.height);i.zoom=Math.max(n,e.zoom);const o=a.width*i.zoom,r=a.height*i.zoom;return i.x=Qe(e.x,t.width-o,0),i.y=Qe(e.y,t.height-r,0),i}const r=e;return r.x=Qe(r.x,-n,t.width),r.y=Qe(r.y,-o,t.height),r}function Qe(e,t,a){return Math.min(Math.max(e,t),a)}class Je{constructor(e){Ye(this,"offsets",void 0),Ye(this,"forceImageCover",void 0),Ye(this,"targetElements",void 0),Ye(this,"imageData",void 0),Ye(this,"frameData",void 0),Ye(this,"_debouncedUpdateFrameOffsets",void 0),Ye(this,"minZoomScale",.03),Ye(this,"maxZoomScale",20),Ye(this,"onFrameDataChangeListeners",void 0),Ye(this,"onZoomChangeListeners",void 0),Ye(this,"workflowManager",void 0),Ye(this,"stepName",void 0),this._debouncedUpdateFrameOffsets=A(b)(this.updateFrameOffsets,200),this.targetElements=[],this.onFrameDataChangeListeners=[],this.onZoomChangeListeners=[],this.forceImageCover=e}connectWorkflowManager(e,t){t&&e.addStepSpecificStorageCallback((async e=>{if(e){const t=e;if(t.currentFrameSource){const e=await(0,k.getFrameData)(t.currentFrameSource);A(h)(e,this.frameData)||(this.frameData=e,this.onFrameDataChangeListeners.forEach((e=>e(this.frameData))),this.frameData&&this.imageData&&(this.offsets=(0,k.calculateOffsets)(this.imageData,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,this.imageData,this.frameData,this.targetElements),this.recalculateZoomLimits(this.imageData,this.frameData)))}}}),t),this.workflowManager=e,this.stepName=t}setTargetElements(e){this.targetElements=e}getFrameData(){return this.frameData}async setFrameData(e){const t=k.frameDataCache.get(e);this.frameData=t}getImageData(){return this.imageData}getOffsets(){return this.offsets}setOffsets(e){this.offsets=e}setZoom(e,t,a,i){if(this.imageData&&this.offsets&&this.frameData){const n=(t-this.offsets.x)/this.offsets.zoom,o=(a-this.offsets.y)/this.offsets.zoom,r={x:t-n*e,y:a-o*e,zoom:this.imageData.width*e/this.imageData.width};this.updateOffsets(Ze(r,this.frameData,this.imageData,this.forceImageCover),i),this.onZoomChangeListeners.forEach((t=>t(e)))}}setPatternData(e){(e&&this.frameData||e&&this.frameData&&!this.imageData)&&(this.offsets=(0,k.calculateOffsets)(e,this.frameData),this._debouncedUpdateFrameOffsets(this.offsets,e,this.frameData,this.targetElements),this.updateOffsets(Ze(this.offsets,this.frameData,e,this.forceImageCover))),this.imageData=e,this.imageData&&this.frameData&&this.recalculateZoomLimits(this.imageData,this.frameData)}updateOffsets(e,t){const a=this.imageData;a&&this.frameData&&(this.offsets&&e.x===this.offsets.x&&e.y===this.offsets.y&&e.zoom===this.offsets.zoom?t&&t():(this.offsets=Ze(e,this.frameData,a,this.forceImageCover),this._debouncedUpdateFrameOffsets(e,a,this.frameData,this.targetElements,t)))}onFrameDataChanged(e){e(this.frameData),this.onFrameDataChangeListeners.push(e)}onZoom(e){this.onZoomChangeListeners.push(e)}updateFrameOffsets(e,a,i,n,o){if(!i)throw new Error("Frame data not set. This is a bug");if(!this.workflowManager)throw new Error("No workflow manager set, cannot update offsets.");const r=this.workflowManager.getCommandDispatcher();n.forEach((i=>{r(new(0,t.UpdateFramePattern)(i,a,e))})),this.stepName&&this.workflowManager.updateStorage(this.stepName,{frameOffsets:e}),o&&o()}recalculateZoomLimits(e,t){const a=Math.max(t.width/e.width,t.height/e.height);this.forceImageCover?(this.minZoomScale=a,this.maxZoomScale=2.5*a):(this.minZoomScale=a/10,this.maxZoomScale=2.5*a)}}function et(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class tt{constructor(e,a,i){et(this,"configuration",void 0),et(this,"layouts",void 0),et(this,"product",void 0),et(this,"processRegion",(async e=>{const a=this.layouts.find((t=>t.panelId===e.panelId));if(!a)throw new Error(`Can not find layout for region: ${e.panelId}`);let i="";if("ProductOverlay"===this.configuration.type){let e="";if(this.product?.overlayImageUrl&&(e=this.product.overlayImageUrl),i=e,!e)throw new Error("Couldn't find an asset for product overlay step")}const n=this.evaluateAssetType();if("image"===n){const i="SilentIllustration"===this.configuration.type?this.configuration.data.assetKey:this.product?.overlayImageUrl,o={id:de(),src:i,type:n,y:e.top,x:e.left,width:e.width,height:e.height,layerIndex:e.layerIndex,immutable:e.immutable,productOverlay:"ProductOverlay"===this.configuration.type||void 0,rotation:e.rotation,excludeFromExport:this.configuration.data.excludeFromPrint,preserveAspectRatio:"none"};return{regionElement:{id:o.id,region:e},command:new(0,t.CreateElementCommand)(o,a)}}{const o="SilentIllustration"===this.configuration.type?this.configuration.data.assetKey:i,r=async()=>new Promise((e=>{fetch(o).then((t=>{e(t.text())})).catch((e=>console.error(e)))})),s=await(0,y.generateSVGWithUnknownColors)(await r()),l={id:de(),cachedObjectURL:await Pe(s.svg),src:o,svg:s.svg,colors:s.colors,type:n,y:e.top,x:e.left,width:e.width,height:e.height,layerIndex:e.layerIndex,rotation:e.rotation,immutable:e.immutable,productOverlay:"ProductOverlay"===this.configuration.type||void 0,excludeFromExport:this.configuration.data.excludeFromPrint};return{regionElement:{id:l.id,region:e},command:new(0,t.CreateElementCommand)(l,a)}}})),this.configuration=e,this.layouts=a,this.product=i||void 0}async trigger(){if(!this.configuration.data.regions)throw new Error("Missing regions.");if("SilentIllustration"===this.configuration.type){const e=this.configuration.data.regions.map(this.processRegion);return Promise.all(e)}return"ProductOverlay"===this.configuration.type?Promise.all(this.configuration.data.regions.map((e=>{if(!this.layouts.find((t=>e.panelId===t.panelId)))throw new Error("Can't find layout from region. This is a bug");return this.processRegion(e)}))):Promise.reject("Unknown silent step. This is a bug")}evaluateAssetType(){const e="ProductOverlay"===this.configuration.type&&this.product?.overlayImageUrl?this.product.overlayImageUrl.toLowerCase():this.configuration.data.assetKey?.toLowerCase().split("?")[0];return e?.endsWith(".jpeg")||e?.endsWith(".jpg")||e?.endsWith(".png")?p.LayoutElementType.Image:(e?.endsWith(".svg"),p.LayoutElementType.Illustration)}}const at=async e=>{const t=`${V.getServicesApiUrl()}/shortener`;try{const a=await fetch(t,{method:"POST",body:JSON.stringify({longUrl:e}),headers:{"Content-Type":"application/json"}});return(await a.json()).shortUrl}catch(e){throw console.error(e),new Error("Failed to shorten URL.")}};function it(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class nt{async poll(){if(await this.predicate())return this.onSuccess(),void(this.pollingId>-1&&window.clearInterval(this.pollingId));this.attempts+=1,this.attempts<this.maxAttempts?this.pollingId=window.setTimeout(this.poll.bind(this),this.interval):this.onFailure()}constructor(e,t,a,i=3e3,n=10){it(this,"pollingId",void 0),it(this,"attempts",void 0),it(this,"interval",void 0),it(this,"maxAttempts",void 0),it(this,"predicate",void 0),it(this,"onSuccess",void 0),it(this,"onFailure",void 0),this.onSuccess=t,this.onFailure=a,this.predicate=e,this.attempts=0,this.pollingId=-1,this.interval=i,this.maxAttempts=n,this.poll()}}const ot=new class{async init(e,t,a){return a&&await this.reload(e,t,a),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[],n);const o=i?.storage?.videoShortUrl,r=i?.storage?.videoUrl;t.updateStorage(e.stepName,{videoShortUrl:o,videoUrl:r})}async regenerateQRCode(e,a,i,n,o,r,s,l,c){if(!a&&""!==i&&""===n){const a=async()=>(await q.execute("getAssetByKeyV2_private",{assetKey:i.replace(/\//g,"_")})).body.links.find((e=>"mpeg4"===e.rel)),c=await new Promise(((e,t)=>{new nt((async()=>!!await a()),(async()=>{const t=await a();if(!t||!t.href)throw new Error("Poller succeeded but no mpeg link found");e(t)}),(()=>{t("Poller timed out with 40 attempts @ 3 second interval")}),3e3,40)}));e.forEach((e=>l(new(0,t.DeleteElementCommand)(e.id))));const d="http"===r.data.baseUrl.slice(0,4)?"":"https://",h=new URL(d+r.data.baseUrl);h.searchParams.append("video",btoa(JSON.stringify([c]))),h.pathname=h.pathname+("/"===h.pathname.slice(-1)?"":"/");const p=h.toString();if(p.length>=2e3)throw new Error("Cannot create QR code, URL too long.");const u=await at(p);if(s(u),!r.data||!r.data.regions)throw new Error("Missing config data.");const m=await this.regionElements(r),f=await this.command(u,m,o,r.stepName);f&&l(f.command),await o.setSelectionsAndElements(r.stepName,[],m),o.updateStorage(r.stepName,{videoShortUrl:u,videoUrl:n})}c(!1)}async regionElements(e){return e.data.regions.map((e=>({id:de(),region:e})))}async command(e,a,i,n){const o=i.getLayouts(),r=`data:image/svg+xml;base64,${btoa(await(0,E.toString)(e,{type:"svg"}))}`,s=a.map((e=>{const a=e.region,i=o.find((e=>e.panelId===a?.panelId));if(!i||!a)throw new Error(`Can not find layout for region: ${a?.panelId}`);return new(0,t.CreateElementCommand)({stepRegion:a,stepName:n,id:e.id,src:r,type:p.LayoutElementType.Image,y:a.top,x:a.left,width:a.width,height:a.height,rotation:0},i)}));return{command:new(0,t.GroupCommand)(s),followup:async()=>{}}}};const rt=new class{constructor(){var e,t,a;a=async(e,t)=>{if(!e)return(0,k.generateDefaultRectangleFrameSvg)(t.data.regions[0]);if(!e.assetKey)throw new Error("No Asset for Variant");const a=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel));if(a)return(0,I.fetchAsString)(a.href);throw new Error("No URL for frame!")},(t="frameSourceSvg")in(e=this)?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(a)await this.reload(e,t,a);else{if(t.setMandatoryFulfilled(e.stepName,!1),t.markStepsAsInitialised([e.stepName]),!i||0===i.data.variants.length)return this.selectVariantCommand(e,void 0,[],t,void 0,e.data.placeholderImageKey);{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantCommand(e,a,[],t,void 0,e.data.placeholderImageKey)}}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion}))),o=P.getLocalOrUndefined(e.optionId)?.data;if(!o||0===o.variants.length){const a=(0,k.generateDefaultRectangleFrameSvg)(e.data.regions[0]);t.updateStorage(e.stepName,{currentFrameSource:a})}if(i){if(i.selectedVariants&&i.selectedVariants.length>0){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){await t.setSelectionsAndElements(e.stepName,[i],n);const a=await this.frameSourceSvg(i,e);t.updateStorage(e.stepName,{currentFrameSource:a})}}}else await t.setSelectionsAndElements(e.stepName,[],n);const a=i.storage?.framePatternSrc,r=i.storage?.frameOffsets;if(t.updateMetadata(e.stepName,{frameOffsets:r,framePatternSrc:a}),a){const i=t.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(a,i),t.updateMetadata(e.stepName,{image:a}),t.updateStorage(e.stepName,{framePatternSrc:a})}if(r?.zoom){const a=t.getStepSpecificServices(e.stepName)?.frameService;a.updateOffsets(r)}t.setMandatoryFulfilled(e.stepName,!0)}}selectImage(e,t,a){a.setEditedStatus(e.stepName,!0);t.links.find((e=>"cdn"===e.rel)).href.endsWith("pdf")?a.addPoller(new nt((async()=>{const e=(await q.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")})).body.links.find((e=>"svg"===e.rel));if(!e)return!1;return 200===(await fetch(e.href)).status}),(()=>{q.execute("getAssetByKeyV2_private",{assetKey:t.data.key.replace(/\//g,"_")}).then((t=>{const i=t.body;this.loadPatternFromAsset(i,e,a)}))}),(()=>{throw new Error("Failed to resolve transcoded PDF")}))):this.loadPatternFromAsset(t,e,a)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{i.getCommandDispatcher()(e.command),e.followup()}))}getCreateElementCommand(e,a,i,n){return new(0,t.CreateElementCommand)({id:e,type:p.LayoutElementType.Frame,x:a.left,y:a.top,width:a.width,height:a.height,layerIndex:a.layerIndex,rotation:a.rotation,scaleX:a.width/n.frameData.width,scaleY:a.height/n.frameData.height,path:n.frameData.path,stepRegion:a,stepName:n.stepName,disablePlaceholder:n.disablePlaceholder,focalBlur:n.focalBlur,focalBlurStrength:n.focalBlurStrength,focalBlurRadius:n.focalBlurRadius,pattern:n.pattern,immutable:a.immutable},i)}async loadPatternFromString(e,t){if(e.endsWith("svg")){const a=await(0,k.GetSVGDimensions)(e),i=a.width,n=a.height,o={src:e,width:i,height:n,aspect:i/n};k.patternImageDataCache.set(e,o),t.setPatternData(o)}else{const a=await fetch(e),i=await a.arrayBuffer(),n=await(0,g.getAttributesFromArrayBuffer)(i),o={src:e,width:n.width,height:n.height,aspect:n.width/n.height};k.patternImageDataCache.set(e,o),t.setPatternData(o)}}async selectVariantCommand(e,a,i,n,o,r){const s=n.getStepSpecificServices(e.stepName)?.frameService,l=await this.frameSourceSvg(a,e),c=await(0,k.getFrameData)(l),d=s.getImageData(),h=i.map((e=>new(0,t.DeleteElementCommand)(e.id))),p=d?(0,k.calculateOffsets)(d,c):void 0,u=d?{id:de(),src:d.src,x:p?.x||0,y:p?.y||0,width:d.width,height:d.height,scaleX:p?.zoom||1,scaleY:p?.zoom||1,rotation:0}:void 0;o&&o(!0);const m=e.data.regions.map((t=>{const a=de(),i=n.getLayouts().find((e=>e.panelId===t.panelId));if(!i)throw new Error(`Can not find layout for region: ${t.panelId}`);return{command:this.getCreateElementCommand(a,t,i,{frameData:c,pattern:u,disablePlaceholder:e.data.disablePlaceholder,focalBlur:e.data.focalBlur,focalBlurStrength:e.data.focalBlurStrength,focalBlurRadius:e.data.focalBlurRadius,stepName:e.stepName}),regionEl:{id:a,region:t}}})),f=m.map((e=>e.command));return{command:new(0,t.GroupCommand)([...f,...h]),followup:async()=>{if(o&&o(!1),await n.setSelectionsAndElements(e.stepName,a?[a]:[],[...m.map((e=>e.regionEl))]),n.updateStorage(e.stepName,{currentFrameSource:l}),r){const t=n.getStepSpecificServices(e.stepName)?.frameService;await this.loadPatternFromString(r,t)}}}}patternSource(e){const t=e.links.find((e=>"svg"===e.rel));if(t)return t.href;const a=e.links.find((e=>"cdn"===e.rel));if(a)return a.href;throw new Error("Frame pattern source file could not be find, neither svg or cdn assets existed on requested variant!")}async loadPatternFromAsset(e,t,a){const i=this.patternSource(e),n=de();a.markUpdatePending(n);const o=a.getStepSpecificServices(t.stepName)?.frameService;await this.loadPatternFromString(i,o),a.updateMetadata(t.stepName,{image:i}),a.updateStorage(t.stepName,{framePatternSrc:i}),a.markUpdateCompleted(n)}};const st=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantLambda(e,a,t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=await Ce.getMaterialLocalOrFromServer(i.materialId),o=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],o);const r=t.getPreviewService();if(r){const i=e.data.targetMaterials.map((t=>r.applyMaterialVariant(t,e.optionId,a.data)));Promise.all(i).then((()=>t.setMandatoryFulfilled(e.stepName,!0)))}}}}}selectVariant(e,t,a,i){this.selectVariantLambda(e,t,a,i).then((e=>e&&e()))}async selectVariantLambda(e,t,a,i){const n=a.getPreviewService();if(!n)return null;i(!0);const o=await Ce.getMaterialLocalOrFromServer(t.materialId);if(!o)throw i(!1),new Error("No material set on variant");return async()=>{await a.setSelectionsAndElements(e.stepName,[t],[]);const r=e.data.targetMaterials.map((t=>n.applyMaterialVariant(t,e.optionId,o.data)));Promise.all(r).then((()=>a.setMandatoryFulfilled(e.stepName,!0))).finally((()=>i(!1)))}}};const lt=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a)return this.selectVariantLambda(e,a,t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a);const o=t.getPreviewService();if(o){if(!i.assetKey)throw new Error("No Asset for Variant");const a=(await Ce.getLocalOrFromServer(i.assetKey)).links.find((e=>"cdn"===e.rel));o.applyModelVariant(e.optionId,{model:a.href,contextService:t.getLayoutPreviewService()},e.data.replaceProductModel||!1).then((()=>{t.setMandatoryFulfilled(e.stepName,!0)}))}}}}}selectVariant(e,t,a,i){this.selectVariantLambda(e,t,a,i).then((e=>e&&e()))}async selectVariantLambda(e,t,a,i){const n=a.getPreviewService();if(!n)return null;if(i(!0),!t.assetKey)throw new Error("No Asset for Variant");const o=(await Ce.getLocalOrFromServer(t.assetKey)).links.find((e=>"cdn"===e.rel));return async()=>{if(await a.setSelectionsAndElements(e.stepName,[t],[]),!o)throw new Error("Asset not found:"+t.assetKey);n.applyModelVariant(e.optionId,{model:o.href,contextService:a.getLayoutPreviewService()},e.data.replaceProductModel||!1).then((()=>{a.setMandatoryFulfilled(e.stepName,!0)})).finally((()=>i(!1)))}}};const ct=new class{async init(e,t,a){return a?(await this.reload(e,t,a),null):(t.updateMetadata(e.stepName,{text:""}),this.changeTextCommand(e,"",t,"",(()=>{})))}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)).map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[],n),t.updateStorage(e.stepName,{text:i?.storage?.text}),t.setMandatoryFulfilled(e.stepName,""!==i?.storage?.text)}changeText(e,t,a,i,n){this.changeTextCommand(e,t,a,i,n).then((e=>{e&&(a.getCommandDispatcher()(e.command),e.followup())}))}async changeTextCommand(e,a,i,n,o){const r=i.getRegionElements(e.stepName),s=i.getStepSpecificServices(e.stepName)?.module;if(!s)return console.error("Missing module."),null;const l=i.getProfanities();if(!this.validateInput(e,a,l,o))return i.setMandatoryFulfilled(e.stepName,!1),console.error(n),null;if(i.setMandatoryFulfilled(e.stepName,""!==a),!e.data||!e.data.regions||e.data.regions.length<=0)return console.error("Missing configuration."),null;i.updateStorage(e.stepName,{text:a});const c=(a,n,o)=>{const r=o||de(),s=i.getLayouts().find((e=>e.panelId===n.panelId));if(!s)return console.error(`Can not find layout for region: ${n.panelId}`),null;const l=[];return o&&l.push(new(0,t.DeleteElementCommand)(r)),l.push(new(0,t.CreateElementCommand)({stepRegion:n,stepName:e.stepName,colors:{},id:r,svg:a,type:p.LayoutElementType.Illustration,y:n.top,x:n.left,rotation:n.rotation,width:n.width,height:n.height,layerIndex:n.layerIndex,immutable:n.immutable},s)),{id:r,region:n,command:new(0,t.GroupCommand)(l)}},d=s.svgPrint(a);if(r.length>0){const e=r.map((e=>e.region?c(d,e.region,e.id):null)).filter((e=>!!e)).filter((e=>!!e)).map((e=>e&&e.command));return{command:new(0,t.GroupCommand)(e),followup:async()=>{}}}{const a=e.data.regions.map((e=>c(d,e))),n=a.filter((e=>!!e)).map((e=>e&&e.command));return{command:new(0,t.GroupCommand)(n),followup:async()=>{const t=a.filter((e=>e)).map((e=>e&&{id:e.id,region:e.region}));await i.setSelectionsAndElements(e.stepName,[],t)}}}}validateInput(e,t,a,i){if(e.data&&e.data.maxLength){const a=e.data.maxLength;if(t.length>a)return i("Too many characters."),!1}if(!/^$|^[a-zA-Z0-9 ]+$/.test(t))return i("Unsupported characters."),!1;const n=t.toLowerCase();for(const e in a)if(n===a[e].toLowerCase().trim()&&""!==n)return i("Blocked profanity."),!1;return i(""),!0}};const dt=e=>new Promise((t=>{fetch(e).then((e=>e.text())).then((e=>{t(e)})).catch((e=>console.error(e)))})),ht=e=>{const t=e.match(/<svg.*?<\/svg>/s)||[],a=t?.length>0?t[0]:"",i=(new DOMParser).parseFromString(a,"image/svg+xml").firstElementChild;if(!i)throw new Error("Failed to read SVG.");(0,y.sanitizeSvgTree)(i,!0);return(new XMLSerializer).serializeToString(i)},pt=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return console.error(`Patchwork step ${e.stepName} is missing option.`),null;if(a)await this.reload(e,t,a);else{const a=P.getDefaultVariant(i.data);if(a&&a.assetKey)return this.selectVariantCommand(e,a,[],t,(()=>{}))}return null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const r=o.variants.find((e=>e.id===a));if(r){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[r],a),t.updateStorage(e.stepName,{patchworkOffsets:i.storage?.patchworkOffsets}),t.setMandatoryFulfilled(e.stepName,!0)}}}}recalculate(e,a,i,n){const o=i.getCommandDispatcher();var r;n(!0);const s=a.map((e=>e.region?this.getRandomPosition(e.region):null)).filter((e=>!!e));o(new(0,t.GroupCommand)(a.map(((e,a)=>{const i=s[a];return 0===a&&(r=i),new(0,t.ShiftPatchworkCommand)(e.id,i.scale,-i.xOffset,-i.yOffset)})))),r&&i.updateStorage(e.stepName,{patchworkOffsets:s}),n(!1)}selectVariant(e,t,a,i,n){this.selectVariantCommand(e,t,a,i,n).then((e=>{e&&(i.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n,o){if(!a.assetKey)throw new Error("No Asset for Variant");const r=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!r)throw new Error("Could not find CDN link for patchwork.");if(!e.data||!e.data.regions)return console.error("Trying to update patchwork in design with no region data"),null;o(!0);const s=r.href,l=n.getLayouts();var c;const d=e.data.regions.map((e=>this.getRandomPosition(e))),h=await dt(s),u=ht(h),m=e.data.regions.map(((a,i)=>((a,i,n)=>{const o=l.find((e=>e.panelId===a.panelId));if(!o)throw new Error("Can't find layout");const r=d[i],s=de();return 0===i&&(c=r),{regionElement:{id:s,region:a},command:new(0,t.CreateElementCommand)({stepRegion:a,stepName:e.stepName,id:s,svg:n,type:p.LayoutElementType.Patchwork,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable,patchX:-r.xOffset,patchY:-r.yOffset,patchScale:r.scale},o)}})(a,i,u))),f=i.map((e=>new(0,t.DeleteElementCommand)(e.id))),g=m.map((e=>e.command));return{command:new(0,t.GroupCommand)([...f,...g]),followup:async()=>{await n.setSelectionsAndElements(e.stepName,[a],m.map((e=>e.regionElement))),c&&n.updateStorage(e.stepName,{patchworkOffsets:d}),o(!1)}}}getRandomPosition(e){const t=Math.random()*(.7-.25)+.25,a=1/t,i=1-t;return{scale:a,xOffset:Math.random()*i*a*e.width,yOffset:Math.random()*i*a*e.height}}constructPreviewSvg(e,t,a,i){if(!i||0===t.length)return null;try{const n=(0,w.findElement)(t[0].id,a().map((e=>e.layoutState))).svg,o=e.data.regions[0],r={x:0,y:0,width:o.width,height:o.height,rotation:0,id:"patchwork-preview",svg:n,patchX:-i.xOffset,patchY:-i.yOffset,patchScale:i.scale},s=(0,c.jsx)(A(R),{...r}),l=A(N).renderToStaticMarkup(s);return`\n <svg\n version="1.1"\n xmlns="http://www.w3.org/2000/svg"\n xmlns:xlink="http://www.w3.org/1999/xlink"\n width="${r.width}px"\n height="${r.height}px"\n viewBox="0 0 ${r.width} ${r.height}"\n >\n ${l}\n </svg>\n `}catch(e){return null}}};const ut=new class{async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId)?.data;if(!i)return null;if(a)await this.reload(e,t,a);else if(i.defaultVariant){const a=i.defaultVariant,n=i.variants.find((e=>!!e.assetKey&&e.id===a));if(n)return t.markStepsAsInitialised([e.stepName]),this.selectVariantCommand(e,n,t,(()=>{}))}return t.markStepsAsInitialised([e.stepName]),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a),t.setMandatoryFulfilled(e.stepName,!0)}}}}selectVariant(e,t,a,i){this.selectVariantCommand(e,t,a,i).then((e=>{e&&(a.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n){if(!a.assetKey)throw new Error("No Asset for Variant");const o=(await Ce.getLocalOrFromServer(a.assetKey)).links.find((e=>"cdn"===e.rel));if(!o)return console.error("No URL for picture!"),null;const r=o.href;n(!0),i.setMandatoryFulfilled(e.stepName,!1);const s=i.getRegionElements(e.stepName).map((e=>new(0,t.DeleteElementCommand)(e.id))),l=e.data.regions.map((a=>{const n=i.getLayouts().find((e=>e.panelId===a.panelId));if(!n)throw new Error(`Can not find layout for region: ${a.panelId}`);const o=de();return{regionElement:{id:o,region:a},command:new(0,t.CreateElementCommand)({stepName:e.stepName,stepRegion:a,id:o,src:r,type:p.LayoutElementType.Image,y:a.top,x:a.left,rotation:a.rotation,width:a.width,height:a.height,layerIndex:a.layerIndex,immutable:a.immutable,preserveAspectRatio:"none"},n)}}));return{command:new(0,t.GroupCommand)([...s,...l.map((e=>e.command))]),followup:async()=>{await i.setSelectionsAndElements(e.stepName,[a],l.map((e=>e.regionElement))),i.setMandatoryFulfilled(e.stepName,!0),n(!1)}}}};const mt=new class{colourOptions(e){return P.getLocalOrUndefined(e.optionId)?P.getLocalOrUndefined(e.optionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e}))):e.data.colours.length>0?e.data.colours.map((e=>({fill:e,stroke:e}))):[]}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(!a){const a=P.getDefaultVariant(i.data);if(!a)return null;const n={fill:a.color,stroke:a.color,variant:a};return this.selectVariantCommand(e,n,[],t)}return await this.reload(e,t,a),null}async reload(e,t,a){const i=t.getSerializedStep(e.stepName,a.serializableWorkflow.steps),n=Object.values(a.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),o=P.getLocalOrUndefined(e.optionId)?.data;if(i?.selectedVariants){const a=i.selectedVariants[0].id;if(o&&a){const i=o.variants.find((e=>e.id===a));if(i){const a=n.map((e=>({id:e.id,region:e.stepRegion})));await t.setSelectionsAndElements(e.stepName,[i],a),t.updateStorage(e.stepName,{colour:i.color||""}),t.setMandatoryFulfilled(e.stepName,!0)}}}}selectVariant(e,t,a,i){this.selectVariantCommand(e,t,a,i).then((e=>{e&&(i.getCommandDispatcher()(e.command),e.followup())}))}async selectVariantCommand(e,a,i,n){const o=n.getLayouts();if(i.length>0){const r=i=>{const n=i.region;if(!o.find((e=>e.panelId===n?.panelId)))return console.error(`Step ${e.stepName} missing layout for panel: ${n?.panelId}.`),null;const r=a.variant?.color;return r?new(0,t.IllustrationColorCommand)(i.id,"spiff-fill-shape",r):(console.error("Failed to change color."),null)},s=i.map(r).filter((e=>!!e));return{command:new(0,t.GroupCommand)(s),followup:async()=>{n.setSelectionsAndElements(e.stepName,a.variant?[a.variant]:[],i),n.updateStorage(e.stepName,{colour:a.fill||""})}}}{const i=i=>{const n=o.find((e=>e.panelId===i.panelId));if(!n)return console.error(`Step ${e.stepName} missing layout for panel: ${i.panelId}.`),null;const r=`\n <svg\n xmlns="http://www.w3.org/2000/svg"\n xmlnsXlink="http://www.w3.org/1999/xlink"\n xmlSpace="preserve"\n preserveAspectRatio="none"\n version="1.1"\n width="1"\n height="1"\n viewBox="0 0 1 1"\n >\n <rect\n x="0"\n y="0"\n width="1"\n height="1"\n class="spiff-fill-shape"\n fill="${a.variant?.color}"\n />\n </svg>\n `,s={};s["spiff-fill-shape"]={browserValue:a.variant.color};const l=de();return{id:l,region:i,command:new(0,t.CreateElementCommand)({stepRegion:i,stepName:e.stepName,colors:s,id:l,svg:r,type:p.LayoutElementType.Illustration,y:i.top,x:i.left,rotation:i.rotation,width:i.width,height:i.height,layerIndex:i.layerIndex,immutable:i.immutable,excludeFromExport:e.data.excludeFromPrint},n)}},r=e.data.regions.map(i),s=r.filter((e=>!!e)).map((e=>e?.command)),l=r.filter((e=>!!e)).map((e=>({id:e.id,region:e.region})));return{command:new(0,t.GroupCommand)(s),followup:async()=>{await n.setSelectionsAndElements(e.stepName,a.variant?[a.variant]:[],l),n.updateStorage(e.stepName,{colour:a.fill||""})}}}}};function ft(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const gt=new class{constructor(){ft(this,"latestToast",void 0),ft(this,"toastType",void 0),ft(this,"toastCallbacks",void 0),this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(e){e({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(e)}setLatestToast(e,t){this.latestToast=e,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach((e=>e({toastMessage:this.latestToast,toastType:this.toastType})))}};function wt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class yt extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=yt.name}}class St extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=St.name}}const vt=new class{constructor(){wt(this,"cachedColors",new Map),wt(this,"filterUnsupportedCharacters",((e,t)=>{let i=t.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],o=e?.fontData?(0,a.getFontMetrics)(e?.fontData):void 0;if(o){const e=i.split("").map((e=>o.getFont().charToGlyph(e)));for(let t=0;t<e.length;t++){const a=".notdef"===e[t].name;"\n"===i.charAt(t)||a&&n.push(String.fromCharCode(i.charCodeAt(t)))}}for(let e=0;e<n.length;e++)i=i.replaceAll(n[e],"");return i})),wt(this,"getErrorsForText",((e,t,a)=>{const i=[];t.data&&t.data.maxLength&&e.length>t.data.maxLength&&i.push({localizationKey:"workflow.steps.text.characterLimit"});const n=a.getProfanities(),o=e.toLowerCase();if(""!==o)for(const e in n){if(o===n[e].toLowerCase().trim()){i.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(e.includes("\n")||e.includes("\r"))&&i.push({localizationKey:"workflow.steps.text.multipleLines"}),i})),wt(this,"textAlign",(e=>e.vertical?"center":e.textAlign||"center"))}async init(e,t,a){const i=P.getLocalOrUndefined(e.optionId);if(!i)return null;if(a)await this.reload(e,t,a);else{const a=e.data.defaultText||"";t.updateStorage(e.stepName,{inputText:a});this.getDefaultColor(e.data)&&t.updateMetadata(e.stepName,{color:e.data.colour});const n=P.getDefaultVariant(i.data);if(n)return this.selectVariantCommand(e,n,{},[],t,!1,(()=>{}),(()=>{}))}return null}async reload(e,a,i){const n=a.getSerializedStep(e.stepName,i.serializableWorkflow.steps),o=Object.values(i.layouts).map((e=>e.elements)).flat().filter((t=>t.stepName===e.stepName)),r=(await P.getLocalOrFromServer(q,e.optionId))?.data;if(n?.selectedVariants){const i=n.selectedVariants[0].id;if(r&&i){const s=r.variants.find((e=>e.id===i));if(s){const i=await this.fontDataFromVariant(s),r=o.map((e=>({id:e.id,region:e.stepRegion})));await a.setSelectionsAndElements(e.stepName,[s],r),a.updateMetadata(e.stepName,{color:n.storage?.color,text:n.storage?.text}),a.updateStorage(e.stepName,{text:n.storage?.text});const l=o.map((e=>new(0,t.FontSourceCommand)(e.id,i))),c=new(0,t.GroupCommand)(l);a.getCommandDispatcher()(c),a.setMandatoryFulfilled(e.stepName,!0)}}}}getDefaultColor(e){if(P.getLocalOrUndefined(e.colourOptionId)){const t=P.getDefaultVariant(P.getLocalOrUndefined(e.colourOptionId).data);if(t)return t.color}if(e.colour)return e.colour}findLayoutElement(e,t,a){const i=e.getRegionElements(t.stepName);if(i[0])return(0,w.findElement)(i[0].id,a().map((e=>e.layoutState)))}findLayoutElements(e,t,a){return e.getRegionElements(t.stepName).map((e=>(0,w.findElement)(e.id,a().map((e=>e.layoutState)))))}availableColors(e){const t=this.cachedColors.get(e.stepName);if(t)return t;if(P.getLocalOrUndefined(e.data.colourOptionId)){const t=P.getLocalOrUndefined(e.data.colourOptionId).data.variants.map((e=>({fill:e.color,stroke:e.color,variant:e})));return this.cachedColors.set(e.stepName,t),t}if(e.data.colours&&e.data.colours.length>0){const t=e.data.colours.map((e=>({fill:e,stroke:e})));return this.cachedColors.set(e.stepName,t),t}return[]}changeColor(e,a,i,n){if(!e.data||!e.data.regions)return;const o=n.getCommandDispatcher();n.updateStorage(e.stepName,{color:a.fill}),a.variant?n.updateMetadata(e.stepName,{color:a.variant.name}):n.updateMetadata(e.stepName,{color:a.fill});for(const e of i){if(!a.fill)throw new Error("Fill not set on new color selection!");o(new(0,t.FontColorCommand)(e.id,a.fill))}}updateInputText(e,a,i,n,o,r){const s=a?e:this.injectReplaceableText(e,n.data),l=(0,f.applyTextTransformations)(s,{vertical:n.data.vertical,uppercase:n.data.uppercase});let c={command:void 0,helperText:"",errors:this.getErrorsForText(e,n,r)};if(c.errors.length>0)return c.helperText=c.errors[0].localizationKey,c;const d=(n.data.maxLength-s.length).toString();c.helperText=`${d} characters remaining`,r.updateStorage(n.stepName,{text:e}),r.updateMetadata(n.stepName,{text:l}),o.defaultCleared&&r.setMandatoryFulfilled(n.stepName,!0);const h=r.getTransaction().bulk&&n.data.varyText||!1,p=[],u=new Map,m=new Map;for(const e of i){if(!e.fontData)throw new Error("Failed to resolve font data for text.");const[t,a]=(0,O.determineCorrectFontSizeAndLines)(e.fontSize,e.fontData,{left:e.x,top:e.y,width:e.width,height:e.height,rotation:e.rotation,panelId:""},l,{size:n.data.size,minSize:n.data.minSize,maxSize:n.data.maxSize});u.set(e.id,t),m.set(e.id,a);const i=n.data.curved?l:(a||[]).join("\n");p.push(this.generateTextChangeCommandsForRegion(t,n.data,e.id,i,h))}if(!n.data.curved&&i.length>0){if(!Array.from(m.values()).every((e=>e)))return c.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),c}return c.command=new(0,t.GroupCommand)(p),c.command.varying=h,c}async changeInputTextWithRegion(e,a,i,n,o,r,s,l,c,d){const h=n.replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),p=s?h:this.injectReplaceableText(h,e.data),u=r.getRegionElements(e.stepName),m=new Map,f=new Map;for(const t of u)if(t.region){const[n,o]=(0,O.determineCorrectFontSizeAndLines)(a,i,t.region,p,{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});m.set(t.id,n),f.set(t.id,o)}const g=(()=>{if(e.data&&e.data.maxLength&&p.length>e.data.maxLength)return d&&d(!0),{info:"0"};var t=p.toLowerCase();const a=r.getProfanities();for(const e in a)if(t===a[e].toLowerCase().trim()&&""!==t)return l(!0),{error:"Blocked profanity."};if(!e.data.allowNewlines&&(p.includes("\n")||p.includes("\r")))return l(!0),{error:"Cannot span multiple lines."};if(!e.data.curved){if(!Array.from(f.values()).every((e=>e)))return l(!0),{error:"Does not fit."}}return l(!1),{info:(e.data.maxLength-p.length).toString()}})();if(g.error)return void c(g.error);if(c(`${g.info} characters remaining`||""),d)return;r.updateStorage(e.stepName,{text:h}),r.updateMetadata(e.stepName,{text:this.injectReplaceableText(h,e.data)});const w=r.getTransaction().bulk&&e.data.varyText||!1;o.defaultCleared&&r.setMandatoryFulfilled(e.stepName,!0);const y=[];for(const t of u){const a=e.data.curved?p:(f.get(t.id)||[]).join("\n");y.push(this.generateTextChangeCommandsForRegion(m.get(t.id)||1,e.data,t.id,a,w))}const S=new(0,t.GroupCommand)(y);return S.varying=w,S}selectVariant(e,t,a,i,n,o,r,s){this.selectVariantCommand(e,t,a,i,n,o,r,s).then((e=>{n.getCommandDispatcher()(e.command),e.followup()}))}async fontDataFromVariant(e){if(!e.assetKey)throw new Error("No Asset for Variant");const t=(await Ce.getLocalOrFromServer(e.assetKey)).links.find((e=>"cdn"===e.rel))?.href;if(!t)throw new Error("Failed to find resource link for font in text step.");return{assetUrl:t,name:(await(0,a.loadFontFromExternalUrl)(t)).names.fullName.en}}async findOrCreateElements(e,a,i){const n=e.getTransaction().bulk&&a.data.varyText||!1,o=this.findLayoutElements(e,a,i);if(o.length>0)return o;const r=P.getLocalOrUndefined(a.optionId);if(!r)throw new Error(`No option for step ${a.stepName}`);const s=P.getDefaultVariant(r.data);if(!s)throw new Error(`No default variant for step ${a.stepName}`);const l=await this.fontDataFromVariant(s),c=await this.createTextboxRegions(a.stepName,s,a.data,l,{},e),d=c.map((e=>e.commands)),h=new(0,t.GroupCommand)(d.flat());return h.varying=n,e.getCommandDispatcher()(h),c.map((e=>e.newElement))}async selectVariantCommand(e,a,i,n,o,r,s,l){const c=de();o.markUpdatePending(c);const d=await this.fontDataFromVariant(a);if(n.length>0){const h=n.map((e=>new(0,t.FontSourceCommand)(e.id,d))),p=await this.changeInputTextWithRegion(e,e.data.size||30,d,i.text||"",i,o,r,s,l);p&&h.push(p);return{command:new(0,t.GroupCommand)(h),followup:async()=>{o.markUpdateCompleted(c),await o.setSelectionsAndElements(e.stepName,[a],n)}}}{const n=await this.createTextboxRegions(e.stepName,a,e.data,d,i,o),h=await this.changeInputTextWithRegion(e,e.data.size||30,d,n[0]?.newElement.text||i.text||"",i,o,r,s,l),p=n.flatMap((e=>e.commands));h&&p.push(h);return{command:new(0,t.GroupCommand)(p),followup:async()=>{o.markUpdateCompleted(c)}}}}injectReplaceableText(e,t){return t.replaceableText?t.replaceableText.replace("{{}}",e):e}async createTextboxRegions(e,a,i,n,o,r){if(!i||!i.regions)throw new Error("Step data not supplied");const s=r.getTransaction().bulk&&i.varyText||!1,l=s?"":o.text||i.defaultText||"",c=await Promise.all(i.regions.map((a=>{const c=r.getLayouts().find((e=>e.panelId===a.panelId)),d=de();try{const r=this.getDefaultColor(i),h=r||"#000000";if(!c)throw new St("Failed to find layout for region: "+a.panelId);const u={stepRegion:a,stepName:e,align:this.textAlign(i),fill:o.color?o.color:h,fontSize:i.size||30,fontData:n,id:d,layerIndex:a.layerIndex,rotation:a.rotation,text:(0,f.applyTextTransformations)(l,{vertical:i.vertical,uppercase:i.uppercase}),input:l,type:p.LayoutElementType.Textbox,vertical:i.vertical,x:a.left,y:a.top,height:a.height,width:a.width,immutable:a.immutable,verticalAlign:i.verticalAlign||"middle",curved:i.curved,paths:i.paths},m=[];if(!i.curved){if(!u.fontData)throw new Error("Failed to resolve font data for text.");const e=new Map,t=new Map,[n,o]=(0,O.determineCorrectFontSizeAndLines)(u.fontSize,u.fontData,a,l,{size:i.size,minSize:i.minSize,maxSize:i.maxSize});e.set(d,n),t.set(d,o);const r=(t.get(d)||[]).join("\n");m.push(this.generateTextChangeCommandsForRegion(e.get(d)||1,i,d,r,s))}const g=new(0,t.CreateElementCommand)(u,c);return g.varying=s,{regionElement:{id:d,region:a},commands:[g,...m],newElement:u,fontData:n}}catch(e){throw console.log(e),new yt("Error adding font to region")}}))).catch((e=>{throw e instanceof yt?(gt.setLatestToast("Failed to load font.",Ct.Error),e):e instanceof St?e:new Error(e)}));return await r.setSelectionsAndElements(e,[a],c.map((e=>e.regionElement))),r.updateMetadata(e,{text:l}),r.updateStorage(e,{text:l}),c}generateTextChangeCommandsForRegion(e,a,i,n,o){const r=[],s=new(0,t.TextChangeCommand)(i,n);if(s.varying=o,r.push(s),!a.size){const a=new(0,t.FontSizeCommand)(i,e);a.varying=o,r.push(a)}const l=new(0,t.GroupCommand)(r);return l.varying=o,l}};function xt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}let Ct;var bt;(bt=Ct||(Ct={})).Error="Error",bt.Warning="Warning";class kt extends Xe{constructor(e){super(),xt(this,"update",void 0),xt(this,"createdAt",new Date),this.update=e}async execute(){await this.update(),await new Promise((e=>{window.setTimeout((()=>{e()}),1e3)}))}}class Et{constructor(e,t,a,i,n,o,r,s,l){xt(this,"initialReducerState",void 0),xt(this,"transaction",void 0),xt(this,"updateTransaction",void 0),xt(this,"ensuredInitialised",void 0),xt(this,"confirmedDesign",void 0),xt(this,"editedSteps",void 0),xt(this,"informationResults",void 0),xt(this,"layouts",void 0),xt(this,"mandatorySteps",void 0),xt(this,"pendingUpdates",void 0),xt(this,"selectionCost",void 0),xt(this,"workflow",void 0),xt(this,"stepSpecificServices",void 0),xt(this,"previewService",void 0),xt(this,"profanityFilter",void 0),xt(this,"pollers",void 0),xt(this,"commandContext",void 0),xt(this,"stepElements",void 0),xt(this,"stepInitialised",void 0),xt(this,"stepMetadata",void 0),xt(this,"stepSelections",void 0),xt(this,"storage",void 0),xt(this,"confirmCallbacks",void 0),xt(this,"editedCallbacks",void 0),xt(this,"elementsCallbacks",void 0),xt(this,"ensuredInitialisedCallbacks",void 0),xt(this,"informationResultCallbacks",void 0),xt(this,"initCallbacks",void 0),xt(this,"makingAdjustmentsCallback",void 0),xt(this,"mandatoryCallbacks",void 0),xt(this,"metadataCallbacks",void 0),xt(this,"selectionCallbacks",void 0),xt(this,"stepSpecificStorageCallbacks",void 0),xt(this,"storageCallbacks",void 0),xt(this,"updateCallbacks",void 0),xt(this,"currentVariationRecordCallbacks",void 0),xt(this,"variationRecordCallbacks",void 0),xt(this,"processingStepInitialisation",void 0),xt(this,"allScenes",void 0),xt(this,"product",void 0),xt(this,"invalidModelVariants",void 0),xt(this,"currentAdjustingStepId",void 0),xt(this,"renderableContextService",void 0),xt(this,"workflowStatePromiseQueue",new _e(1)),xt(this,"variationRecords",[]),xt(this,"currentVariationRecord",void 0),this.updateTransaction=n,this.commandContext=i,this.initialReducerState=o.workflowState,this.transaction=o,this.ensuredInitialised=!1,this.confirmedDesign=!1,this.editedSteps={},this.informationResults=[],this.mandatorySteps={},this.pendingUpdates=[],this.selectionCost=0,this.workflow=e,this.stepSpecificServices={},this.profanityFilter=t,this.pollers=[],this.allScenes=[],this.processingStepInitialisation=!1,this.layouts=a,this.product=l,this.previewService=r,this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.confirmCallbacks=[],this.editedCallbacks=[],this.elementsCallbacks=[],this.ensuredInitialisedCallbacks=[],this.informationResultCallbacks=[],this.initCallbacks=[],this.mandatoryCallbacks=[],this.makingAdjustmentsCallback=[],this.metadataCallbacks=[],this.selectionCallbacks=[],this.stepSpecificStorageCallbacks={},this.storageCallbacks=[],this.updateCallbacks=[],this.currentVariationRecordCallbacks=[],this.variationRecordCallbacks=[],this.invalidModelVariants=[],this.currentAdjustingStepId="",this.renderableContextService=s,this.currentVariationRecord=null,this.ensureStepsAreLoaded(),this.fireReloadAnimation()}addVariationRecord(e){const t={...e,recordNumber:this.variationRecords.reduce(((e,t)=>t.recordNumber>e?t.recordNumber:e),0)+1};return this.variationRecords.push(t),this.onVariationRecordsChange(),t}removeVariationRecord(e){if(this.variationRecords=this.variationRecords.filter((t=>t.recordNumber!==e)),this.variationRecords.forEach(((e,t)=>{e.recordNumber=t+1})),this.currentVariationRecord&&this.currentVariationRecord.recordNumber===e){const e=this.currentVariationRecord.recordNumber,t=e>1?this.variationRecords[e-2]:this.variationRecords[0];this.setCurrentVariationRecord(t||null)}return this.onVariationRecordsChange(),this.variationRecords}setVariationRecords(e){this.variationRecords=e,this.onVariationRecordsChange(),0===e.length?this.setCurrentVariationRecord(null):this.setCurrentVariationRecord(e[0])}setCurrentVariationRecord(e){this.currentVariationRecord=e,this.onCurrentVariationRecordChange()}fireReloadAnimation(){if(!this.initialReducerState)return;const e=this.workflow.finalizeStepConfig;e&&(e.lookAtAnimation&&this.previewService?.executeCameraAnimation(e.lookAtAnimation),e.modelAnimation&&this.previewService?.executeModelAnimation(e.modelAnimation))}addConfirmCallback(e){e(this.confirmedDesign),this.confirmCallbacks.push(e)}addEditedCallback(e){e(this.editedSteps),this.editedCallbacks.push(e)}addElementsCallback(e){e(this.stepElements),this.elementsCallbacks.push(e)}addEnsuredInitialisedCallback(e){e(this.ensuredInitialised),this.ensuredInitialisedCallbacks.push(e)}addInformationResultCallback(e){e(this.informationResults),this.informationResultCallbacks.push(e)}addInitCallback(e){e(this.stepInitialised),this.initCallbacks.push(e)}addMandatoryCallback(e){e(this.mandatorySteps),this.mandatoryCallbacks.push(e)}addMetadataCallback(e){e(this.stepMetadata),this.metadataCallbacks.push(e)}addSelectionCallback(e){e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:this.traversableScenes()}),this.selectionCallbacks.push(e)}addStepSpecificStorageCallback(e,t){Object.keys(this.storage).includes(t)||(this.storage[t]={}),e(this.storage[t]),Object.keys(this.stepSpecificStorageCallbacks).includes(t)||(this.stepSpecificStorageCallbacks[t]=[]),this.stepSpecificStorageCallbacks[t].push(e)}addStorageCallback(e){e(this.storage),this.storageCallbacks.push(e)}addUpdateCallback(e){e(this.pendingUpdates.length>0),this.updateCallbacks.push(e)}addMakingAdjustmentsCallback(e){e(this.currentAdjustingStepId),this.makingAdjustmentsCallback.push(e)}addCurrentVariationCallback(e){e(this.currentVariationRecord),this.currentVariationRecordCallbacks.push(e)}addVariationRecordsCallback(e){e(this.variationRecords),this.variationRecordCallbacks.push(e)}addPoller(e){this.pollers.push(e)}getLayouts(){return this.layouts}getLayoutPreviewService(){return this.renderableContextService}getPreviewService(){return this.previewService}getProductName(){return this.product?.name}getProfanities(){return this.profanityFilter}getRegionElements(e){return this.stepElements[e]||[]}getStepSpecificServices(e){return this.stepSpecificServices[e]}getTransaction(){return this.transaction}getWorkflow(){return this.workflow}getCommandDispatcher(){return e=>this.commandContext.apply(e)}getWorkflowSelections(){const e={};return this.workflow.steps.forEach((t=>{const a=this.stepSelections[t.stepName];if(a&&a.selectedVariants&&a.selectedVariants.length>0){const i=this.workflow.stepGroups.find((e=>e.stepNames.includes(t.stepName)));P.getLocalOrUndefined(t.optionId)&&(e[t.stepName]={groupName:i?i.name:void 0,optionName:P.getLocalOrUndefined(t.optionId).data.name,selections:a.selectedVariants})}})),e}markStepsAsInitialised(e){const t={...this.stepInitialised};e.forEach((e=>{t[e]=!0})),this.stepInitialised=t,this.onInitChange()}markUpdateCompleted(e){this.pendingUpdates=this.pendingUpdates.filter((t=>t!==e)),this.onUpdateChange()}markUpdatePending(e){this.pendingUpdates=[...this.pendingUpdates,e],this.onUpdateChange()}setAllScenes(e){const t=this.allScenes;this.allScenes=qe(this.workflow,e),A(h)(t,this.allScenes)||this.ensureStepsAreLoaded()}setEditedStatus(e,t){this.editedSteps={...this.editedSteps,[e]:t},this.onEditedChange()}setInformationResults(e){this.informationResults=[...e],this.onInformationResultChange()}setCurrentAdjustingStepId(e){this.currentAdjustingStepId=e,this.onMakingAdjustmentsChange()}setMandatoryFulfilled(e,t){this.mandatorySteps[e]!==t&&(this.mandatorySteps={...this.mandatorySteps,[e]:t},this.onMandatoryChange())}async setSelectionsAndElements(e,a,i){const n=this.stepSelections;this.stepSelections={...this.stepSelections,[e]:{selectedVariants:a}},this.selectionCost=Object.values(this.stepSelections).reduce(((e,t)=>e+t.selectedVariants.map((e=>e.priceModifier)).reduce(((e,t)=>e+t),0)),0),this.workflow.steps.forEach((e=>{$e(e,this.stepSelections)||(this.stepInitialised[e.stepName]=!1,delete this.stepMetadata[e.stepName],delete this.stepSelections[e.stepName],delete this.storage[e.stepName])}));const o=this.allScenes,r=Be(o,n),s=Be(o,this.stepSelections),l=r.map((e=>e.silentSteps)).flat(),c=s.map((e=>e.silentSteps)).flat().filter((e=>!l.some((t=>t.stepName===e.stepName))));l.forEach((e=>{$e(e,this.stepSelections)||(this.stepInitialised[e.stepName]=!1)})),this.invalidModelVariants=this.getInvalidModelVariants();const d=this.getInvalidCanvasRegions(),{stepElements:h,commands:p}=await this.stepElementsForIntroducedSilentSteps(c);this.processingStepInitialisation||this.ensureStepsAreLoaded(),this.stepElements={...this.stepElements,...h,[e]:i},this.removeElements(d),this.onElementsChange();if(this.workflow.steps.find((t=>t.stepName===e))?.type===v.StepType.Frame){this.getStepSpecificServices(e)?.frameService?.setTargetElements(i.map((e=>e.id)))}const u=[...d.map((e=>new(0,t.DeleteElementCommand)(e.id))),...p,new(0,t.UpdateWorkflowStateCommand)(this.constructSerializableWorkflow())];u.length>0&&this.commandContext.apply(new(0,t.GroupCommand)(u)),this.onSelectionChange()}toggleDesignConfirmed(){this.confirmedDesign=!this.confirmedDesign,this.onConfirmChange()}toggleMakingAdjustmentsCallback(e){e(this.mandatorySteps),this.mandatoryCallbacks.push(e)}async updateStorage(e,a){const i={...this.storage,[e]:{...this.storage[e],...a}};if(!A(h)(i,this.storage)){this.storage=i;const a=new(0,t.UpdateWorkflowStateCommand)(this.constructSerializableWorkflow());this.commandContext.apply(a),this.onStepSpecificStorageChange(e),this.onStorageChange()}}constructSerializableWorkflow(){const e=[];return this.allScenes.forEach((t=>{t.renderableSteps.forEach((t=>{const a={stepName:t.stepName};a.storage=this.storage[t.stepName],a.selectedVariants=this.stepSelections[t.stepName]?.selectedVariants?.map((e=>({id:e.id,priceModifier:e.priceModifier}))),e.push(a)}))})),{steps:e}}updateStateWithServer(e){const t=this.serialize(e);this.workflowStatePromiseQueue.enqueue(new kt((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})))}async updateStateWithServerImmediate(e){const t=this.serialize(e);return new kt((async()=>{await this.updateTransaction({variables:{id:this.transaction.id,workflowState:t.transaction}})})).execute()}serialize(e){const t=JSON.stringify(this.dehydrateState(A(x)(e().transaction))),a=e().variation;if(!a)return{transaction:t};const i={layouts:{},serializableWorkflow:{steps:[]},...A(x)(a)||{}};return{transaction:t,variation:JSON.stringify(this.dehydrateState(i))}}dehydrateState(e){for(const t of Object.values(e.layouts).map((e=>e.elements)).flat())"illustration"===t.type&&(delete t.cachedObjectURL,t.src&&delete t.svg);return e}async outstandingRequestsPromise(){return this.workflowStatePromiseQueue.finalize()}updateMetadata(e,t){this.stepMetadata={...this.stepMetadata,[e]:{...this.stepMetadata[e],...t}},this.onMetadataChange()}removeElements(e){this.stepElements=((e,t)=>Object.keys(e).reduce(((a,i)=>{const n=[...e[i]||[]];return t.forEach((e=>{const t=n.findIndex((t=>t.id===e.id));t>-1&&n.splice(t,1)})),a[i]=n,a}),{}))(this.stepElements,e)}getInvalidCanvasRegions(){return this.workflow.steps.reduce(((e,t)=>($e(t,this.stepSelections)||this.stepElements[t.stepName]&&this.stepElements[t.stepName].forEach((t=>e.push(t))),e)),[])}getInvalidModelVariants(){return this.workflow.steps.reduce(((e,t)=>(!$e(t,this.stepSelections)&&P.getLocalOrUndefined(t.optionId)&&"Model"===t.type&&e.push(P.getLocalOrUndefined(t.optionId).data.id),e)),[])}async stepElementsForIntroducedSilentSteps(e){const t=this.product;if(!t)return Promise.resolve({stepElements:{},commands:[]});const a=(e,t,a)=>"SilentIllustration"===e.type?new tt(e,t).trigger():"ProductOverlay"===e.type?new tt(e,t,a).trigger():Promise.reject("Unknown silent step. This is a bug"),i=e.filter((e=>!this.stepInitialised[e.stepName]));let n={stepElements:{},commands:[]};for(const e of i){this.markStepsAsInitialised([e.stepName]);const i=await a(e,this.layouts,t);n.stepElements[e.stepName]=i.map((e=>e.regionElement)),n.commands=[...n.commands,...i.map((e=>e.command))]}return n}getSerializedStep(e,t){return t.find((t=>t.stepName===e))}getCurrentVariationRecord(){return this.currentVariationRecord||void 0}getVariationRecords(){return this.variationRecords}stepNotReadyForInitialization(e){return("Model"===e.type||"Material"===e.type)&&!this.previewService}async reset(){this.commandContext.getAllLayouts().forEach((e=>e.layoutState.elements.forEach((e=>{this.getCommandDispatcher()(new(0,t.DeleteElementCommand)(e.id))})))),this.stepElements={},this.stepInitialised={},this.stepMetadata={},this.stepSelections={},this.storage={},this.currentVariationRecord=null,await this.ensureStepsAreLoaded()}async ensureStepsAreLoaded(){const e=this.initialReducerState?JSON.parse(this.initialReducerState):void 0;this.processingStepInitialisation=!0,await P.cacheRequiredOptions(this.workflow);const t=this.allScenes,a=Be(t,this.stepSelections).map((e=>e.silentSteps)).flat(),{stepElements:i,commands:n}=await this.stepElementsForIntroducedSilentSteps(a);this.stepElements={...this.stepElements,...i};const o=Ge(this.allScenes,this.stepSelections).map((e=>e.renderableSteps)),r=[],s=[];n.forEach((e=>r.push({command:e,followup:async()=>{}})));const l=o.flat();for(const t of l)if(!this.stepInitialised[t.stepName]&&!this.stepNotReadyForInitialization(t))switch(this.stepInitialised[t.stepName]=!0,t.type){case"Bulk":this.updateStorage("Bulk",e?.serializableWorkflow.steps.find((e=>"Bulk"===e.stepName))?.storage||{});break;case"DigitalContent":r.push(await ot.init(t,this,e));break;case"Finish":case"Introduction":default:break;case"Frame":case"Photo":const a=new Je(t.data.forceImageCover);a.connectWorkflowManager(this,t.stepName),this.stepSpecificServices[t.stepName]={frameService:a},r.push(await rt.init(t,this,e));break;case"Illustration":r.push(await De.init(t,this,e));break;case"Material":s.push(await st.init(t,this,e));break;case"Model":s.push(await lt.init(t,this,e));break;case"Module":const i=t.data.module;this.stepSpecificServices[t.stepName]={module:await A(C)(i)},r.push(await ct.init(t,this,e));break;case"Patchwork":r.push(await pt.init(t,this,e));break;case"Picture":r.push(await ut.init(t,this,e));break;case"Question":s.push(await Ve.init(t,this,e));break;case"Shape":r.push(await mt.init(t,this,e));break;case"Text":r.push(await vt.init(t,this,e))}const c=r.filter((e=>!!e));for(const e of c)this.commandContext.apply(e.command),await e.followup();const d=s.filter((e=>!!e));if(d.length>0)for(const e of d)await e();(c.length>0||d.length>0)&&await this.ensureStepsAreLoaded();const h=l.map((e=>{if(P.getLocalOrUndefined(e.optionId))return P.getDefaultVariant(P.getLocalOrUndefined(e.optionId).data)}));(e||l.length>0&&!h.some((e=>!!e))||c.length>0||d.length>0)&&(this.ensuredInitialised=!0,this.onEnsuredInitialisedChange()),this.processingStepInitialisation=!1,this.onSelectionChange(),this.onInitChange()}onConfirmChange(){this.confirmCallbacks.forEach((e=>e(this.confirmedDesign)))}onEditedChange(){this.editedCallbacks.forEach((e=>e(this.editedSteps)))}onEnsuredInitialisedChange(){this.ensuredInitialisedCallbacks.forEach((e=>e(this.ensuredInitialised)))}onElementsChange(){this.elementsCallbacks.forEach((e=>e(this.stepElements)))}onInformationResultChange(){this.informationResultCallbacks.forEach((e=>e(this.informationResults)))}onInitChange(){this.initCallbacks.forEach((e=>e(this.stepInitialised)))}onMakingAdjustmentsChange(){this.makingAdjustmentsCallback.forEach((e=>{e(this.currentAdjustingStepId)}))}onMandatoryChange(){this.mandatoryCallbacks.forEach((e=>e(this.mandatorySteps)))}onMetadataChange(){this.metadataCallbacks.forEach((e=>{e(this.stepMetadata)}))}onSelectionChange(){this.selectionCallbacks.forEach((e=>e({invalidModelVariants:this.invalidModelVariants,selectionCost:this.selectionCost,selections:this.stepSelections,traversableScenes:this.traversableScenes()})))}onStepSpecificStorageChange(e){Object.keys(this.stepSpecificStorageCallbacks).includes(e)||(this.stepSpecificStorageCallbacks[e]=[]),this.stepSpecificStorageCallbacks[e].forEach((t=>t(this.storage[e])))}onStorageChange(){this.storageCallbacks.forEach((e=>e(this.storage)))}onUpdateChange(){this.updateCallbacks.forEach((e=>{e(this.pendingUpdates.length>0)}))}onCurrentVariationRecordChange(){this.currentVariationRecordCallbacks.forEach((e=>{e(this.currentVariationRecord)}))}onVariationRecordsChange(){this.variationRecordCallbacks.forEach((e=>{e(this.variationRecords)}))}traversableScenes(){const e=this.allScenes;return Ke(e,this.stepSelections)}}function It(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Nt{constructor(e){if(It(this,"commandContext",void 0),It(this,"workflowManager",void 0),It(this,"isReadOnly",void 0),!e.workflow)throw new Error("No Workflow ID provided.");const t=e.layouts;this.commandContext=new $eb7869949b641a40$re_export$CommandContext;const a=e.transaction.workflowState?JSON.parse(e.transaction.workflowState):void 0;this.commandContext.initialize(t,a),this.isReadOnly=!!e.transaction.lineItem?.id||!Ee.getMap("transactionOwnerIds")?.get(e.transaction.id);this.workflowManager=new Et(e.workflow,e.product.profanities?.map((e=>e.word))||[],t,this.commandContext,(async e=>{this.isReadOnly||W.getShadowGraphqlClient().mutate({...e,mutation:Oe})}),e.transaction,e.previewService,e.renderableContextService,e.product)}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(e){await W.getShadowGraphqlClient().mutate({mutation:Te,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map((e=>({recordNumber:e.recordNumber,values:e.values.map((e=>({aspect:e.aspect,stepName:e.stepName,value:e.value})))})))}})}async createPreviewImage(){const t=document.createElement("canvas");t.width=1024,t.height=1024;const a=this.commandContext.getAllLayouts()[this.workflowManager.getWorkflow().defaultPreviewPanelIndex||0],i=a.layoutState.layout.previewRegion?{x:a.layoutState.layout.previewRegion.left,y:a.layoutState.layout.previewRegion.top,width:a.layoutState.layout.previewRegion.width,height:a.layoutState.layout.previewRegion.height}:{x:0,y:0,width:a.layoutState.layout.width,height:a.layoutState.layout.height},n=this.commandContext.getLayoutById(a.layoutState.layout.id),o=t.getContext("2d");if(!o)throw new Error("Failed to build 2D context for preview image creation.");const r=(0,e.getSvgString)(n.layoutState.layout,n.layoutState.elements,{region:i}),s=await A(S).from(o,r,{anonymousCrossOrigin:!0,ignoreDimensions:!1});await s.render();const l=await(async e=>new Promise(((t,a)=>{try{e.toBlob((e=>{if(e){const a=URL.createObjectURL(e);t(a)}}))}catch(e){a(e)}})))(t);return t.toDataURL(l)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepName===e));if(t)return new Ue(this.getWorkflowManager(),t)}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find((t=>t.stepTitle===e));if(t)return new Ue(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter((t=>t.type===e)).map((e=>new Ue(this.getWorkflowManager(),e)))}async onDesignFinished(e,t,a,i){const n=(e,t,a)=>{const i={};return t.steps.forEach((t=>{Object.assign(i,(t=>{const i={};if("Frame"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideImageInCart&&a)return i;i[`${t.stepTitle} exportedData.image`]=n.image}if("Illustration"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideColorsInCart&&a||!n.colors)return i;if(n.colors.length>0){const e=n.colors.join(", ").toUpperCase();i[`${t.stepTitle} exportedData.colors`]=e}}if("Module"===t.type){const n=e[t.stepName],o=t.data;if(!n||o.hideTextInCart&&a)return i;i[`${t.stepTitle} exportedData.text`]=n.text}if("Text"===t.type){const n=e[t.stepName];if(!n)return i;const o=t.data;o.hideTextInCart&&a||(i[`${t.stepTitle} exportedData.text`]=n.text),!n.color||o.hideColorInCart&&a||(i[`${t.stepTitle} exportedData.color`]=n.color)}return i})(t))})),i},o=(e,t,a,i,n,o,r,s,l)=>({event:"onComplete",lineItemImageUrl:r?r.href:"",transactionId:e.id,metadata:n,selectedVariants:s,designProductVariantId:e.externalDesignProductVariantId,designProductId:e.externalDesignProductId,baseCost:a,weight:t.weight,optionsCost:i,exportedData:o,sku:l,workflowViewerLink:e.workflowViewerLink||""}),r=async(e,t,a,i,r,s,l)=>{const c=(e.product?.basePrice||0)*(e.variationsCount||0),d=e.priceModifierTotal||0,h=((e,t,a,i)=>{const o={};let r;if(a){r=n(a,t,!1);for(const e of Object.keys(r))o[e]={value:r[e],priceModifier:0}}else if(i){r=i;for(const e of Object.keys(r))o[e]={value:r[e],priceModifier:0}}for(const a of Object.keys(e)){const i=e[a],n=t.steps.find((e=>e.stepTitle===a));if(1===i.length)o[`${n?.stepTitle} exportedData.selection`]={value:i[0].name,priceModifier:i[0].priceModifier};else if(i.length>1)for(let e=0;e<i.length;e++)o[`${n?.stepTitle} exportedData.selection ${e+1}`]={value:i[e].name,priceModifier:i[e].priceModifier}}return o})(i,a,void 0,s);return o(e,t,c,d,s,h,l,i,r)};return(async(e,t,a,i,s,l,c,d,h,p,u,m)=>{h("workflow.steps.finish.finalize.buildingLayouts"),await e.outstandingRequestsPromise();const f=W.getShadowGraphqlClient();await f.resetStore();const g=await f.mutate({mutation:Le,variables:{id:l.id}}),w=g.data?.transactions[0].workflowState;!g.errors&&w||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(i())),g.errors&&g.errors.forEach((e=>{g.errors&&console.log("Server Error:",e.message)})),await e.updateStateWithServerImmediate(i),console.log("Server state is undefined @ Workflow completion"));const y=e.getPreviewService(),S=t?.finalizeStepConfig?.lookAtAnimation,v=y&&100===y.getSceneInitializationProgress()&&t.showModelOnFinishStep&&S,x=m&&n(m,t,!0),C=m&&n(m,t,!1),b=e=>{const a={};let i=0;if(Object.keys(c).length>0)for(const n of Object.keys(c)){const o=c[n],r=t.steps.find((e=>e.stepName===n));for(let t=0;t<o.selections.length;++t){const n=o.selections[t];if(r&&(!e||P.getLocalOrUndefined(r.optionId)&&P.getLocalOrUndefined(r.optionId).data.variants.length>1&&!r.data.hideSelectionInCart&&!r.data.hideSelectionsInCart)){const e=r.stepTitle;a[e]?a[e].push({id:n.id||"",name:n.name,priceModifier:n.priceModifier}):a[e]=[{id:n.id||"",name:n.name,priceModifier:n.priceModifier}]}i+=n.priceModifier}}return[a,i]},[k]=b(!0),E=Object.fromEntries(Object.keys(k).map((e=>[e,k[e].map((e=>e.id))]))),[I]=b(!1),N=Object.fromEntries(Object.keys(I).map((e=>[e,I[e].map((e=>e.id))]))),R=await this.createPreviewImage();h("workflow.steps.finish.finalize.creatingDesign");const O=(await q.execute("createDesign",{designDetails:(()=>{const e={designName:d,layouts:a.map((e=>({index:e.index,panelId:e.panelId}))),workflowId:t.id,productId:s.id,transactionId:l.id,threeDimPreview:!!v,previewImage:R};return m&&(e.metadata=C),E&&(e.selectedVariants=N),e})()})).body,M=O.links.find((e=>"image"===e.rel));h("workflow.steps.finish.finalize.updatingTransaction");const T=(await W.getShadowGraphqlClient().query({query:Ae,variables:{id:l.id}})).data.transactions[0];return l.bulk?(await p(u),((e,t,a)=>{const i=(e.product?.basePrice||0)*(e.variationsCount||0),n=e.priceModifierTotal||0,r={items:{value:e.variationsCount?`${e.variationsCount}`:"0",priceModifier:0}};return o(e,t,i,n,void 0,r,a)})(T,s,M)):await r(T,s,t,k,O.data.sku,x,M)})(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),(()=>this.commandContext.getState()),e,this.workflowManager.getTransaction(),a,this.workflowManager.getWorkflow().name,t,(e=>this.updateVariationRecords(e)),this.workflowManager.getVariationRecords(),i)}}function Rt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class Ot{constructor(e){Rt(this,"layouts",void 0),Rt(this,"handleCompleteRender",void 0),this.handleCompleteRender=null;const t=new Map;e.forEach((e=>t.set(e.id,new Tt(e.id,e.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}}let Mt;class Tt{constructor(e,t,a){Rt(this,"hasSetStaticContext",!1),Rt(this,"id",void 0),Rt(this,"name",void 0),Rt(this,"service",void 0),Rt(this,"interactiveDirty",!1),Rt(this,"textureCtx",void 0),Rt(this,"staticCtxDirty",!1),Rt(this,"lastRequestedRenderArguments",void 0),Rt(this,"lastCompletedStaticRender",void 0),Rt(this,"lastModificationID",void 0),Rt(this,"renderQueue",new _e(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:e,layouts:t,variationRecord:a,productOverlayImageUrl:i}=this.lastRequestedRenderArguments;this.render(e,t,a,i)}}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,i){const n=A(x)(t);this.lastRequestedRenderArguments={workflow:e,layouts:n,variationRecord:a,productOverlayImageUrl:i};const o=this.getStaticContext();if(!o)return this.markLastCompletedStaticRender(),void this.setStaticContextDirty(!1);this.renderQueue.enqueue(new At(this.getID(),o,(()=>{if(void 0!==Mt)return Mt;const e=document.createElement("canvas").getContext("webgl2");return Mt=!!e,Mt})(),(()=>{this.markLastCompletedStaticRender(),this.setStaticContextDirty(!0)}),e,n,a,i))}}class At extends Xe{constructor(e,t,a,i,n,o,r,s){super(),Rt(this,"layoutId",void 0),Rt(this,"ctx",void 0),Rt(this,"nonPOTSupport",void 0),Rt(this,"onRender",void 0),Rt(this,"workflow",void 0),Rt(this,"layouts",void 0),Rt(this,"variationRecord",void 0),Rt(this,"productOverlayImageUrl",void 0),this.layoutId=e,this.ctx=t,this.nonPOTSupport=a,this.onRender=i,this.workflow=n,this.layouts=o,this.variationRecord=r,this.productOverlayImageUrl=s}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")&&(!!window.Worker&&!!window.OffscreenCanvas)}async execute(){const t=this.layouts.find((e=>e.layoutState.layout.id===this.layoutId));if(!t)return;const a=t.layoutState.elements||[];if(this.variationRecord){const e=this.variationRecord.values.map((e=>({stepName:e.stepName,stepAspectType:e.aspect,value:e.value})));for(const e of this.workflow.steps)if(e.optionId&&!e.option){e.option=await P.getLocalOrFromServer(q,e.optionId);for(const t of e.option.data.variants)t.assetKey&&!t.asset&&(t.asset=await Ce.getLocalOrFromServer(t.assetKey))}const i=await Pt(Lt(e,this.workflow),this.workflow,this.layouts.map((e=>e.layoutState.layout)),this.productOverlayImageUrl),n=i?.layouts[t.layoutState.layout.id];(n?.elements||[]).forEach((e=>{const t=a.find((t=>t.stepName===e.stepName));t&&t.type===p.LayoutElementType.Textbox?(t.text=e.text,t.fontSize=e.fontSize):a.push(e)})),a.sort(((e,t)=>void 0!==e.layerIndex&&void 0!==t.layerIndex?e.layerIndex-t.layerIndex:0))}const i=t.layoutState.layout.width,n=t.layoutState.layout.height,o=this.getDynamicTextureResolution().width,r=this.getDynamicTextureResolution().height;let s,l;if(this.nonPOTSupport){i/n<o/r?(s=o,l=n*(o/i)):(s=i*(r/n),l=r)}else s=this.getDynamicTextureResolution().width,l=this.getDynamicTextureResolution().height;const c=(0,e.getSvgString)(t.layoutState.layout,a),d=await S.Canvg.from(this.ctx,c,{anonymousCrossOrigin:!0,ignoreDimensions:!this.nonPOTSupport,ignoreAnimation:!0,ignoreClear:!0,ignoreMouse:!0,enableRedraw:!1});d.resize(s,l),await d.render(),this.onRender()}}const Lt=(e,t)=>{const a=[];return e.forEach((e=>{const i=t.steps.find((t=>t.stepName===e.stepName));i?.type===v.StepType.Text&&"Text"===e.stepAspectType&&a.push({name:i.stepName,data:{text:e.value}})})),a},Pt=async(e,a,i,n)=>{let o={serializableWorkflow:{steps:[]},layouts:{}};i.forEach((e=>{o=new(0,t.CreateLayoutCommand)(e).apply(o)}));return(await(0,M.generateCommands)(e,a,i,n)).forEach((e=>{o=e.apply(o)})),o};function Dt(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}const Vt=async e=>(await q.execute("getProductById",{productId:e})).body,zt=(e,t)=>{const a=e.workflowState,i=a?JSON.parse(a):void 0;return i?Object.values(i.layouts).map((e=>e.layout)):t.panels.sort(((e,t)=>e.index-t.index)).map((e=>({id:de(),panelId:e.name,name:e.name,index:e.index,createdAt:new Date,updatedAt:new Date,transparentBackground:e.transparentBackground,height:e.height,width:e.width,previewRegion:e.previewRegion})))};class Ut{constructor(e){Dt(this,"options",void 0),Dt(this,"initialized",void 0),Dt(this,"experienceOptions",void 0),this.initialized=!1,this.options=e}async initFromIntegrationProduct(e){if(""===e)throw new Error("No integration product ID provided.");this.options.useUncachedEndpoints&&q.setUncachedOperations(["getAssetByKeyV2","getWorkflowV2","getMaterialV2","getOptionV2"]);const t=W.getShadowGraphqlClient();await t.resetStore();const a=await t.mutate({mutation:Ie,variables:{integrationProductId:e,bulk:this.options.bulk||!1}}),i=(await t.mutate({mutation:Ne,variables:{id:a.data?.transactionCreate.id}})).data?.transactionClaim;if(!i)throw new Error("Failed to create transaction.");const n=Ee.getMap("transactionOwnerIds")||new Map;n.set(i.id,i.transactionOwnerId),F(i.transactionOwnerId||""),Ee.setMap("transactionOwnerIds",n);const o=await Vt(i.product?.id||"");this.experienceOptions={product:o.data,transaction:i,layouts:[]},this.initialized=!0}async initFromTransaction(e){if(""===e)throw new Error("No transaction ID provided.");const t=W.getShadowGraphqlClient();await t.resetStore();const a=Ee.getMap("transactionOwnerIds")||new Map,i=a.get(e);if(i){F(i);const a=(await t.query({query:Re,variables:{id:e}})).data?.transactions[0];if(!a)throw new Error("Failed to read transaction.");const n=await Vt(a.product?.id||"");return this.experienceOptions={product:n.data,transaction:a,layouts:[]},void(this.initialized=!0)}try{const i=(await t.mutate({mutation:Ne,variables:{id:e}})).data?.transactionClaim;if(!i)throw new Error("Failed to read transaction.");i.transactionOwnerId&&(a.set(i.id,i.transactionOwnerId),F(i.transactionOwnerId),Ee.setMap("transactionOwnerIds",a));const n=await Vt(i.product?.id||"");this.experienceOptions={product:n.data,transaction:i,layouts:[]},this.initialized=!0}catch{console.log("Readonly Mode");const a=(await t.query({query:Re,variables:{id:e}})).data?.transactions[0];if(!a)throw new Error("Failed to read transaction.");if(!a.lineItem?.id)throw new Error("Attempted to open an unordered transaction with no line item!");const i=await Vt(a.product?.id||"");this.experienceOptions={product:i.data,transaction:a,layouts:[]},this.initialized=!0}}async getWorkflowExperience(e,t,a){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot launch experience: Not initialized.");const i=async e=>{for(const t in e.layouts){const a=e.layouts[t].elements.filter((e=>"illustration"===e.type));for(let e=0;e<a.length;++e){const t=a[e];t.src&&t.svg&&(t.cachedObjectURL=await Pe(t.svg))}}};if(this.experienceOptions.transaction.workflowId){const e=(await q.execute("getWorkflowV2",{workflowSlug:this.experienceOptions.transaction.workflowId})).body.data;if(this.experienceOptions.workflow=e,this.experienceOptions.transaction.workflowState){const e=JSON.parse(this.experienceOptions.transaction.workflowState);await(0,w.rehydrateSerializedLayout)(e),await i(e),this.experienceOptions.layouts=Object.values(e.layouts).map((e=>e.layout)),console.log(this.experienceOptions.layouts)}return this.experienceOptions.previewService=a&&a(e),this.experienceOptions.renderableContextService=new Ot(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&await(this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService)),new Nt(this.experienceOptions)}if(e){const n=(await q.execute("getWorkflowV2",{workflowSlug:e})).body.data;if(this.experienceOptions.workflow=n,await W.getShadowGraphqlClient().mutate({mutation:Me,variables:{workflowId:e,id:this.experienceOptions.transaction.id}}),t){this.experienceOptions.transaction.workflowState=t;const e=JSON.parse(this.experienceOptions.transaction.workflowState);await(0,w.rehydrateSerializedLayout)(e),await i(e),this.experienceOptions.layouts=Object.values(e.layouts).map((e=>e.layout))}else this.experienceOptions.layouts=zt(this.experienceOptions.transaction,this.experienceOptions.workflow);return this.experienceOptions.previewService=a&&a(n),this.experienceOptions.renderableContextService=new Ot(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&await(this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService)),new Nt(this.experienceOptions)}throw new Error("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new Error("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}class Ft{getVariationRecords(){return[]}async reset(){}updateStateWithServer(e){}addVariationRecord(e){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(e){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(e){}addPoller(e){}addConfirmCallback(e){}addCurrentVariationCallback(e){}addEditedCallback(e){}addElementsCallback(e){}addInformationResultCallback(e){}addInitCallback(e){}addMakingAdjustmentsCallback(e){}addMandatoryCallback(e){}addMetadataCallback(e){}addSelectionCallback(e){}addStepSpecificStorageCallback(e,t){}addStorageCallback(e){}addUpdateCallback(e){}addVariationRecordsCallback(e){}getCommandDispatcher(){return e=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProductName(){return""}getProfanities(){return[]}getRegionElements(e){return[]}getSerializedStep(e,t){}getStepSpecificServices(e){}getTransaction(){return{id:""}}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(e){}markUpdateCompleted(e){}markUpdatePending(e){}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(e){}setAllScenes(e){}setCurrentVariationRecord(e){}setEditedStatus(e,t){}setInformationResults(e){}setMandatoryFulfilled(e,t){}async setSelectionsAndElements(e,t,a){}setVariationRecords(e){}toggleDesignConfirmed(){}updateMetadata(e,t){}async updateStorage(e,t){}}
98
98
  //# sourceMappingURL=main.js.map