1/** 2 * @copyright 2026 Fortee Uniforme Inc. All rights reserved. 3 * @license PROPRIETARY - Unauthorized copying prohibited. 4 * Protected under the Canadian Copyright Act (R.S.C., 1985, c. C-42). 5 */(function(){"use strict";var NEW_LOGO_KEY="__newlogo__";window.forteeLogoEditorState=function(){return{SWATCH_COLORS:["#ffffff","#16181b","#c8322b","#2b3a55","#d9a441"],TEXT_FONTS:[{label:"Archivo Black",css:"'Archivo Black', sans-serif"},{label:"Inter",css:"'Inter', sans-serif"},{label:"Georgia",css:"Georgia, serif"},{label:"Courier Prime",css:"'Courier Prime', monospace"}],_editorOpen:!1,_editorView:null,_editorVersionKey:"original",_editorGarmentBg:null,_fabricProductId:null,_selHasObj:!1,_selType:"",_edSeg:"background",_edSegPrev:"background",_canUndo:!1,_canRedo:!1,_histT:null,_shapeTilesOpen:!1,_shpFill:"#16181b",_shpOutlineOnly:!1,_shpThickness:3,_txtColor:"#16181b",_txtCurve:0,_txtEffect:"none",_txtFont:"'Archivo Black', sans-serif",_txtFxColor:"",_txtSize:36,_txtSpacing:0,_fxWidth:3,_fxAngle:90,_fxDistance:3,_fxBlur:4,_scopeOpen:!1,_scopeChoice:"front",_scopePendingUrl:null,_scopePendingEditorJSON:null,_scopePendingSource:null,_scopePendingEdits:null,_pendingScopeProductId:null,_pendingUploadIsNew:!1,_uploadNewProductId:null,_artworkEditFor:null,_artColorsDraft:[],_artNoteDraft:"",_artConfirm:!1,_editorFontsLoaded:!1,_edMqlBound:!1,_outlineMinHold:!1}},window.forteeLogoEditor=function(){return{openEditor:function(productId){this._artworkEditFor=null,this._fabricProductId=productId,this._editorView||(this._editorView=this._activeViewForProduct(productId)),this._ensureEditorState(this._editorView);var _d=this.colorDirective[this._editorView];this._artNoteDraft=_d&&_d.note||"",this._artColorsDraft=_d&&_d.colors?_d.colors.slice():[],this._artConfirm=!!(_d&&_d.mode==="art_instructions"&&(_d.note||_d.colors&&_d.colors.length));var _ec=this._activeArtworkContext(productId,this._editorView),_ek="original";_ec&&_ec.artwork&&_ec.artwork.versionUrls&&(_ek=this._autoVersionKey(_ec.product,_ec.color,_ec.artwork)),this._editorVersionKey=_ek||"original",this._editorGarmentBg=_ec&&_ec.product&&_ec.color&&this.step2_getColorHex(_ec.product,_ec.color)||null,this._selHasObj=!1,this._selType="",this._editorOpen=!0;var self=this;this.$nextTick(function(){self._initEditorCanvas()})},closeEditor:function(){this._editorOpen=!1,this._disposeCanvas()},editorCurrentUrl:function(){var c=this._activeArtworkContext(this._fabricProductId,this._editorView),urls=c&&c.artwork?c.artwork.versionUrls:null;return urls&&urls[this._editorVersionKey]?urls[this._editorVersionKey]:c&&c.artwork?this._artworkUrlFromObj(c.artwork):null},_disposeCanvas:function(){var canvas=window.__ftb2FabricCanvas;if(canvas){try{canvas.dispose()}catch(e){}window.__ftb2FabricCanvas=null}window.__ftb2BaseLogo=null,window.__ftb2Hist=null},_initEditorCanvas:function(){var self=this;if(!(!window.forteeShared||!window.forteeShared.ensureFabric)){self._loadEditorFonts();var url=self.editorCurrentUrl();if(self._disposeCanvas(),self._canUndo=!1,self._canRedo=!1,self._selHasObj=!1,self._selType="",self._edSeg="background",self._edSegPrev="background",!self._edMqlBound&&window.matchMedia){self._edMqlBound=!0;try{window.matchMedia("(min-width: 768px)").addEventListener("change",function(){self._editorOpen&&self._refitEditorCanvas()})}catch(e){}}window.forteeShared.ensureFabric().then(function(){var host=document.getElementById("ftb2-fabric-host"),wrap=document.querySelector(".ftb2-ed2-canvas-wrap");if(!(!host||typeof fabric=="undefined")){host.innerHTML="";var avail=wrap&&wrap.clientWidth||host.clientWidth||480,w=Math.max(300,Math.min(560,avail-36)),h=Math.round(w*.732),el=document.createElement("canvas");host.appendChild(el);var canvas=new fabric.Canvas(el,{width:w,height:h,selection:!0,preserveObjectStacking:!0});window.__ftb2FabricCanvas=canvas;try{fabric.Object.prototype.transparentCorners=!1,fabric.Object.prototype.cornerColor="#2563eb",fabric.Object.prototype.cornerStrokeColor="#ffffff",fabric.Object.prototype.cornerSize=11,fabric.Object.prototype.borderColor="#2563eb",fabric.Object.prototype.padding=4}catch(e){}canvas.on("selection:created",function(){self.showPanelFor()}),canvas.on("selection:updated",function(){self.showPanelFor()}),canvas.on("selection:cleared",function(){self.showPanelFor(null)}),canvas.on("object:added",function(){self._pushHistory()}),canvas.on("object:removed",function(){self._pushHistory()}),canvas.on("object:modified",function(){self._pushHistory()}),canvas.on("text:changed",function(){self._recurveActive()}),self._buildEditorScene(canvas,url)}})}},_buildEditorScene:function(canvas,url){var self=this;window.__ftb2Hist={stack:[],idx:-1,restoring:!0};var seed=function(){var H=window.__ftb2Hist;H&&(H.restoring=!1,self._pushHistory())},art=self._editorView?self.groupArtwork[self._editorView]:null,reopenJSON=art&&art.editorJSON?art.editorJSON:null;reopenJSON?canvas.loadFromJSON(JSON.parse(reopenJSON)).then(function(){if(window.__ftb2FabricCanvas===canvas){var base=canvas.getObjects().find(function(o){return o.isBase})||null;base&&(base.set({selectable:!1,evented:!1}),canvas.sendObjectToBack(base)),window.__ftb2BaseLogo=base,canvas.requestRenderAll(),seed()}}).catch(function(){seed()}):self._loadBaseLogo(canvas,url,seed)},_loadBaseLogo:function(canvas,url,done){if(!url){done&&done();return}fabric.FabricImage.fromURL(url,{crossOrigin:"anonymous"}).then(function(img){if(window.__ftb2FabricCanvas===canvas){var logoBox=Math.min(canvas.getWidth(),canvas.getHeight())*.55;img.scale(Math.min(logoBox/img.width,logoBox/img.height)),img.set({left:canvas.getWidth()/2,to
5p:canvas.getHeight()/2,originX:"center",originY:"center",selectable:!1,evented:!1,isBase:!0}),canvas.add(img),canvas.sendObjectToBack(img),window.__ftb2BaseLogo=img,canvas.requestRenderAll(),done&&done()}}).catch(function(e){console.warn("[FORTTEE 2step] base logo load failed",e),done&&done()})},_ensureEditorState:function(view){view&&(this.editorBg[view]==null&&(this.editorBg[view]="removed"),this.colorDirective[view]||(this.colorDirective[view]={mode:"art_decide",note:"",colors:[]}))},_dirMode:function(){var view=this._editorView;return view&&this.colorDirective[view]&&this.colorDirective[view].mode||"art_decide"},_editorBaseUrl:function(){var c=this._activeArtworkContext(this._fabricProductId,this._editorView);if(!c||!c.artwork)return null;var a=c.artwork;if((this.editorBg[this._editorView]||"removed")==="original")return a.originalCroppedUrl||a.originalUrl||a.url||null;var urls=a.versionUrls;return urls&&this._editorVersionKey&&urls[this._editorVersionKey]?urls[this._editorVersionKey]:a.bgRemovedCroppedUrl||a.bgRemovedUrl||a.url||null},setEditorBg:function(mode){var view=this._editorView;view&&(this._ensureEditorState(view),this.editorBg[view]=mode,this._swapBaseLogo(),this.showToast(mode==="removed"?this._t("artwork_bg_removed","Background removed."):this._t("artwork_bg_kept","Original background restored."),!1))},_swapBaseLogo:function(skipHistory){var canvas=window.__ftb2FabricCanvas;if(!(!canvas||typeof fabric=="undefined")){var url=this._editorBaseUrl();if(url){var self=this,old=window.__ftb2BaseLogo,H=window.__ftb2Hist;fabric.FabricImage.fromURL(url,{crossOrigin:"anonymous"}).then(function(img){if(window.__ftb2FabricCanvas===canvas){var logoBox=Math.min(canvas.getWidth(),canvas.getHeight())*.55,left=old&&old.left!=null?old.left:canvas.getWidth()/2,top=old&&old.top!=null?old.top:canvas.getHeight()/2,angle=old&&old.angle||0;img.scale(Math.min(logoBox/img.width,logoBox/img.height)),img.set({left:left,top:top,angle:angle,originX:"center",originY:"center",selectable:!1,evented:!1,isBase:!0}),H&&(H.restoring=!0),old&&canvas.remove(old),canvas.add(img),canvas.sendObjectToBack(img),window.__ftb2BaseLogo=img,canvas.requestRenderAll(),H&&(H.restoring=!1),skipHistory||self._pushHistory()}}).catch(function(){})}}},setArtMode:function(mode){var view=this._editorView;if(view){this._ensureEditorState(view);var d=this.colorDirective[view];d.mode=mode,mode==="art_decide"?(d.note="",d.colors=[],this._artNoteDraft="",this._artColorsDraft=[],this._artConfirm=!1,this.showToast(this._t("artwork_art_decide","Our art team will pick the best colors for every garment."),!0)):(this._artNoteDraft=d.note||"",this._artColorsDraft=(d.colors||[]).slice(),this._artConfirm=!!(d.note||d.colors&&d.colors.length))}},addArtColor:function(hex){hex&&(hex=String(hex),this._artColorsDraft.indexOf(hex)===-1&&this._artColorsDraft.push(hex))},removeArtColor:function(i){i>=0&&i<this._artColorsDraft.length&&this._artColorsDraft.splice(i,1)},saveArtNote:function(){var view=this._editorView;if(view){this._ensureEditorState(view);var note=(this._artNoteDraft||"").trim(),colors=(this._artColorsDraft||[]).slice();if(!note&&!colors.length){this.showToast(this._t("artwork_art_need_input","Add a note or a color so our team knows what to do."),!1);return}var d=this.colorDirective[view];d.mode="art_instructions",d.note=note,d.colors=colors,this._artConfirm=!0,this.showToast(this._t("artwork_art_saved","Instructions saved \u2014 our art team will follow them exactly."),!0)}},_artColorsSavedCount:function(){var view=this._editorView,d=view&&this.colorDirective[view];return d&&d.colors&&d.colors.length||0},_lineDirective:function(views){var self=this,mode="art_decide",notes=[],colors=[];return(views||[]).forEach(function(vw){var d=self.colorDirective[vw];!d||d.mode!=="art_instructions"||!d.note&&!(d.colors&&d.colors.length)||(mode="art_instructions",d.note&¬es.indexOf(d.note)===-1&¬es.push(d.note),(d.colors||[]).forEach(function(col){colors.indexOf(col)===-1&&colors.push(col)}))}),{mode:mode,note:notes.join(" \xB7 "),colors:colors}},_previewIsRecolored:function(){return!this._editorOpen||(this.editorBg[this._editorView]||"removed")==="original"?!1:!!(this._editorVersionKey&&this._editorVersionKey!=="original")},editorGarmentChips:function(){var self=this,_bStore=window.Alpine&&typeof window.Alpine.store=="function"?window.Alpine.store("builder"):null,products=_bStore&&_bStore.bundleProducts||[];
5if(self._fabricProductId!=null){var scoped=products.filter(function(p){return String(p.id)===String(self._fabricProductId)});scoped.length&&(products=scoped)}var seen={},out=[];return products.forEach(function(p){var colors=self.step2_getColors(p)||[];colors.forEach(function(name){if(name){var hex=self.step2_getColorHex(p,name),key=String(hex||"").toLowerCase();!key||seen[key]||(seen[key]=!0,out.push({name:name,hex:hex,tone:self._toneForHex(hex)}))}})}),out},_toneForHex:function(hex){var s=String(hex||"").trim().replace(/^#/,"");if(s.length===3&&(s=s.split("").map(function(c){return c+c}).join("")),s.length!==6)return"medium";var r=parseInt(s.slice(0,2),16),g=parseInt(s.slice(2,4),16),b=parseInt(s.slice(4,6),16);if(isNaN(r)||isNaN(g)||isNaN(b))return"medium";var lum=(.2126*r+.7152*g+.0722*b)/255;return lum>.62?"light":lum<.32?"dark":"medium"},_versionKeyForTone:function(tone){var c=this._activeArtworkContext(this._fabricProductId,this._editorView),art=c&&c.artwork;if(!art||!art.versionUrls||!this._whiteOutlineOnDark)return"original";var binary=tone==="light"||tone==="none"?"light":"dark";return binary==="dark"?"outlineDark":"original"},setGarment:function(hex,tone){this._editorGarmentBg=hex||null,this._editorVersionKey=this._versionKeyForTone(tone||"none"),this._swapBaseLogo(!0)},_loadEditorFonts:function(){if(!this._editorFontsLoaded){if(this._editorFontsLoaded=!0,!document.querySelector("link[data-ftb2-editor-fonts]")){var link=document.createElement("link");link.rel="stylesheet",link.setAttribute("data-ftb2-editor-fonts",""),link.href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Inter:wght@400&family=Courier+Prime&display=swap",document.head.appendChild(link)}if(document.fonts&&document.fonts.load){var accented="\xC9QUIPE MONTR\xC9AL";Promise.all([document.fonts.load('16px "Archivo Black"',accented),document.fonts.load('16px "Inter"',accented),document.fonts.load('16px "Courier Prime"',accented)]).then(function(){var c=window.__ftb2FabricCanvas;c&&c.requestRenderAll()}).catch(function(){var c=window.__ftb2FabricCanvas;c&&c.requestRenderAll()})}}},_defaultInk:function(){return this._editorVersionKey==="white"?"#ffffff":"#16181b"},_isLight:function(hex){if(!hex||typeof hex!="string"||hex[0]!=="#"||hex.length<7)return!1;var r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);return(r*299+g*587+b*114)/1e3>150},_pushHistoryDebounced:function(){var self=this;clearTimeout(this._histT),this._histT=setTimeout(function(){self._pushHistory()},350)},addText:function(){var c=window.__ftb2FabricCanvas;if(!(!c||typeof fabric=="undefined")){var t=new fabric.IText("Your text",{left:c.width/2,top:c.height-70,originX:"center",originY:"center",fontFamily:"'Archivo Black', sans-serif",fontSize:36,fill:this._defaultInk(),objType:"text",fxEffect:"none",fxColor:"",fxCurve:0,charSpacing:0});c.add(t),c.setActiveObject(t);try{t.enterEditing(),t.selectAll&&t.selectAll()}catch(e){}c.requestRenderAll(),this.showPanelFor(t)}},applyText:function(){var c=window.__ftb2FabricCanvas,o=c&&c.getActiveObject();if(!(!o||o.objType!=="text")){var size=parseInt(this._txtSize,10)||36;o.set({fontFamily:this._txtFont,fontSize:size,charSpacing:parseInt(this._txtSpacing,10)||0}),this._applyFx(o,this._txtEffect||"none",this._txtColor,size),this._applyCurve(o,this._txtCurve),o.setCoords&&o.setCoords(),c.requestRenderAll(),this._pushHistoryDebounced()}},pickTextColor:function(col){this._txtColor=col,this.applyText()},_fxAuto:function(size){return size=size||36,{width:Math.max(1,size/12),distance:Math.max(2,
5size*.08),blur:Math.max(3,size*.11)}},setTextEffect:function(fx){this._txtEffect=fx||"none";var a=this._fxAuto(parseInt(this._txtSize,10)||36);this._fxWidth=Math.round(a.width*10)/10,this._fxDistance=Math.round(a.distance*10)/10,this._fxBlur=Math.round(a.blur*10)/10,fx==="shadow"&&!this._fxAngle&&(this._fxAngle=90),this.applyText()},setFxWidth:function(v){this._fxWidth=Number(v),this.applyText()},setFxAngle:function(v){this._fxAngle=Number(v),this.applyText()},setFxDistance:function(v){this._fxDistance=Number(v),this.applyText()},setFxBlur:function(v){this._fxBlur=Number(v),this.applyText()},pickFxColor:function(col){this._txtFxColor=col==null?"":col,this.applyText()},_applyFx:function(o,fx,color,size){if(o){color=typeof color=="string"&&color?color:"#16181b",size=size||36;var fxCol=typeof this._txtFxColor=="string"&&this._txtFxColor?this._txtFxColor:null,contrast=this._isLight(color)?"#16181b":"#ffffff",auto=this._fxAuto(size),w=this._fxWidth>0?Number(this._fxWidth):auto.width,dist=this._fxDistance>=0?Number(this._fxDistance):auto.distance,blur=this._fxBlur>=0?Number(this._fxBlur):auto.blur,rad=(Number(this._fxAngle)||0)*Math.PI/180;o.set({fill:color,stroke:null,strokeWidth:0,paintFirst:"fill",shadow:null}),fx==="outline"?o.set({fill:color,stroke:fxCol||contrast,strokeWidth:Math.max(.5,w),paintFirst:"stroke"}):fx==="hollow"?o.set({fill:"transparent",stroke:fxCol||color,strokeWidth:Math.max(.5,w),paintFirst:"stroke"}):fx==="shadow"&&o.set({shadow:new fabric.Shadow({color:fxCol?this._rgba(fxCol,.5):"rgba(20,23,26,.38)",blur:Math.max(0,blur),offsetX:Math.round(Math.cos(rad)*dist*100)/100,offsetY:Math.round(Math.sin(rad)*dist*100)/100})}),o.fxEffect=fx||"none",o.fxColor=fxCol||"",o.fxWidth=w,o.fxAngle=Number(this._fxAngle)||0,o.fxDistance=dist,o.fxBlur=blur}},_rgba:function(hex,a){var s=String(hex||"").trim().replace(/^#/,"");if(s.length===3&&(s=s.split("").map(function(ch){return ch+ch}).join("")),s.length!==6)return"rgba(20,23,26,"+a+")";var r=parseInt(s.slice(0,2),16),g=parseInt(s.slice(2,4),16),b=parseInt(s.slice(4,6),16);return"rgba("+r+","+g+","+b+","+a+")"},_applyCurve:function(o,curve){if(curve=parseInt(curve,10)||0,o.fxCurve=curve,!curve){o.path&&o.set({path:null});return}var w=(o.calcTextWidth?o.calcTextWidth():0)||o.width||o.fontSize*4;w=Math.max(24,w);var sag=Math.abs(curve)/100*w*.4;if(sag<1){o.path&&o.set({path:null});return}var r=w*w/(8*sag)+sag/2,sweep=curve>0?1:0,d="M "+(-w/2).toFixed(2)+" 0 A "+r.toFixed(2)+" "+r.toFixed(2)+" 0 0 "+sweep+" "+(w/2).toFixed(2)+" 0";o.set({path:new fabric.Path(d,{fill:"",stroke:""}),pathAlign:"center",pathSide:"left",pathStartOffset:0})},_recurveActive:function(){var c=window.__ftb2FabricCanvas,o=c&&c.getActiveObject();o&&o.objType==="text"&&o.fxCurve&&(this._applyCurve(o,o.fxCurve),c.requestRenderAll()),this._pushHistoryDebounced()},toggleShapeTiles:function(){this._shapeTilesOpen=!this._shapeTilesOpen},addShape:function(kind){var c=window.__ftb2FabricCanvas;if(!(!c||typeof fabric=="undefined")){var cx=c.width/2,cy=c.height/2,fill=this._defaultInk(),o;kind==="line"?o=new fabric.Rect({width:170,height:5,rx:2.5,ry:2.5,fill:fill}):kind==="circle"?o=new fabric.Circle({radius:55,fill:fill}):kind==="rect"?o=new fabric.Rect({width:150,height:95,fill:fill}):o=new fabric.Rect({width:150,height:95,rx:16,ry:16,fill:fill}),o.set({left:cx,top:cy,originX:"center",originY:"center",objType:"shape",baseFill:fill}),c.add(o),c.setActiveObject(o),c.requestRenderAll(),this._shapeTilesOpen=!1,this.showPanelFor(o)}},applyShape:function(){var c=window.__ftb2FabricCanvas,o=c&&c.getActiveObject();!o||o.objType!=="shape"||(o.baseFill=this._shpFill,this._shpOutlineOnly?o.set({fill:"transparent",stroke:this._shpFill,strokeWidth:parseInt(this._shpThickness,10)||3}):o.set({fill:this._shpFill,stroke:null,strokeWidth:0}),o.setCoords&&o.setCoords(),c.requestRenderAll(),this._pushHistoryDebounced())},pickShapeFill:function(col){this._shpFill=col,this.applyShape()},_edIsMobile:function(){return!!(window.matchMedia&&window.matchMedia("(max-width: 767px)").matches)},edSetSeg:function(s){this._edSeg=s,s!=="style"&&(this._edSegPrev=s)},_refitEditorCanvas:function(){var c=window.__ftb2FabricCanvas,wrap=document.querySelector(".ftb2-ed2-canvas-wrap");if(!(!c||!wrap)){var avail=wrap.clientWidth||480,w=Math.max(300,Math.min(560,avail-36)),oldW=c.getWidth();if(!(!oldW||Math.abs(w-oldW)<2)){var ratio=w/oldW;c.setDimensions({width:w,height:Math.round(w*.732)}
5),c.getObjects().forEach(function(o){o.set({scaleX:(o.scaleX||1)*ratio,scaleY:(o.scaleY||1)*ratio,left:(o.left||0)*ratio,top:(o.top||0)*ratio}),o.setCoords()}),c.requestRenderAll()}}},showPanelFor:function(o){var c=window.__ftb2FabricCanvas;if(o===void 0&&(o=c?c.getActiveObject():null),!o||o.isBase){this._selHasObj=!1,this._selType="",this._edIsMobile()&&this._edSeg==="style"&&(this._edSeg=this._edSegPrev||"background");return}var isText=o.type==="i-text"||o.type==="text"||o.type==="textbox";if(this._selType=isText?"text":o.type==="image"?"image":"shape",this._selHasObj=!0,this._edIsMobile()&&(this._edSeg="style"),isText){this._txtFont=o.fontFamily||"'Archivo Black', sans-serif",this._txtSize=Math.round(o.fontSize||36);var fx=o.fxEffect;fx||(o.shadow?fx="shadow":o.stroke&&o.fill==="transparent"?fx="hollow":o.stroke?fx="outline":fx="none"),this._txtEffect=fx;var _fa=this._fxAuto(Math.round(o.fontSize||36));this._fxWidth=typeof o.fxWidth=="number"?o.fxWidth:Math.round(_fa.width*10)/10,this._fxAngle=typeof o.fxAngle=="number"?o.fxAngle:90,this._fxDistance=typeof o.fxDistance=="number"?o.fxDistance:Math.round(_fa.distance*10)/10,this._fxBlur=typeof o.fxBlur=="number"?o.fxBlur:Math.round(_fa.blur*10)/10,this._txtColor=fx==="hollow"&&typeof o.stroke=="string"?o.stroke:typeof o.fill=="string"&&o.fill!=="transparent"?o.fill:"#16181b",this._txtFxColor=typeof o.fxColor=="string"?o.fxColor:"",this._txtSpacing=o.charSpacing||0,this._txtCurve=o.fxCurve||0}else this._selType==="shape"&&(this._shpFill=o.baseFill||(typeof o.fill=="string"&&o.fill!=="transparent"?o.fill:"#16181b"),this._shpOutlineOnly=(o.fill==="transparent"||o.fill==null)&&(o.strokeWidth||0)>0,this._shpThickness=o.strokeWidth||3)},duplicateObj:function(){var c=window.__ftb2FabricCanvas,o=c&&c.getActiveObject(),self=this;!o||o.isBase||!o.clone||o.clone(["objType","baseFill"]).then(function(cl){cl.set({left:(o.left||0)+22,top:(o.top||0)+22}),cl.objType=o.objType,o.baseFill!=null&&(cl.baseFill=o.baseFill),c.add(cl),c.setActiveObject(cl),c.requestRenderAll(),self.showPanelFor(cl)})},deleteObj:function(){var c=window.__ftb2FabricCanvas,o=c&&c.getActiveObject();!o||o.isBase||(c.remove(o),c.discardActiveObject(),c.requestRenderAll(),this.showPanelFor(null))},_editorKeydown:function(e){if(this._editorOpen){var t=e.target&&e.target.tagName||"";if(!(t==="INPUT"||t==="TEXTAREA"||e.target&&e.target.isContentEditable)){var c=window.__ftb2FabricCanvas;if(c){var o=c.getActiveObject();e.key==="Delete"||e.key==="Backspace"?o&&!o.isBase&&!o.isEditing&&(e.preventDefault(),this.deleteObj()):(e.ctrlKey||e.metaKey)&&(e.key==="z"||e.key==="Z")&&(e.preventDefault(),e.shiftKey?this.edRedo():this.edUndo())}}}},_HIST_KEYS:["objType","baseFill","isBase","selectable","evented","fxEffect","fxColor","fxCurve","fxWidth","fxAngle","fxDistance","fxBlur","pathAlign","pathSide","pathStartOffset"],_pushHistory:function(){var c=window.__ftb2FabricCanvas,H=window.__ftb2Hist;if(!(!c||!H||H.restoring)){var json;try{json=JSON.stringify(c.toJSON(this._HIST_KEYS))}catch(e){return}H.stack=H.stack.slice(0,H.idx+1),H.stack.push(json),H.stack.length>30&&H.stack.shift(),H.idx=H.stack.length-1,this._syncHistoryFlags()}},_syncHistoryFlags:function(){var H=window.__ftb2Hist||{stack:[],idx:-1};this._canUndo=H.idx>0,this._canRedo=H.idx<H.stack.length-1},_restoreHistory:function(json){var c=window.__ftb2FabricCanvas,H=window.__ftb2Hist,self=this;!c||!H||(H.restoring=!0,c.loadFromJSON(JSON.parse(json)).then(function(){var base=c.getObjects().find(function(o){return o.isBase})||null;base&&(base.set({selectable:!1,evented:!1}),c.sendObjectToBack(base)),window.__ftb2BaseLogo=base,c.discardActiveObject(),c.requestRenderAll(),self._selHasObj=!1,self._selType="",H.restoring=!1,self._syncHistoryFlags()}).catch(function(){H.restoring=!1}))},edUndo:function(){var H=window.__ftb2Hist;!H||H.idx<=0||(H.idx--,this._restoreHistory(H.stack[H.idx]),this._syncHistoryFlags())},edRedo:function(){var H=window.__ftb2Hist;!H||H.idx>=H.stack.length-1||(H.idx++,this._restoreHistory(H.stack[H.idx]),this._syncHistoryFlags())},_cropDataUrlToContent:function(dataUrl){return new Promise(function(resolveRaw){var w=0,h=0;function resolve(out,rect){resolveRaw({dataUrl:out,rect:rect||{x:0,y:0,w:w,h:h}})}try{var img=new Image;
5img.onload=function(){try{if(w=img.naturalWidth||img.width,h=img.naturalHeight||img.height,!w||!h)return resolve(dataUrl);var cv=document.createElement("canvas");cv.width=w,cv.height=h;var ctx=cv.getContext("2d");ctx.drawImage(img,0,0);var cb=window.forteeContentBox;if(!cb)return console.error("[FORTEE editor] fortee-content-box.js not loaded \u2014 design saved uncropped"),resolve(dataUrl);var box=cb.analyzeContent(w,h,ctx.getImageData(0,0,w,h).data).box;if(!box)return resolve(dataUrl);var out=document.createElement("canvas");out.width=box.w,out.height=box.h,out.getContext("2d").drawImage(cv,box.x,box.y,box.w,box.h,0,0,box.w,box.h),resolve(out.toDataURL("image/png"),{x:box.x,y:box.y,w:box.w,h:box.h})}catch(e){resolve(dataUrl)}},img.onerror=function(){resolve(dataUrl)},img.src=dataUrl}catch(e){resolve(dataUrl)}})},_cropDataUrlToRect:function(dataUrl,rect){return new Promise(function(resolve){if(!rect||!(rect.w>0&&rect.h>0))return resolve(dataUrl);try{var img=new Image;img.onload=function(){try{var w=img.naturalWidth||img.width,h=img.naturalHeight||img.height;if(!w||!h||rect.x===0&&rect.y===0&&rect.w>=w&&rect.h>=h)return resolve(dataUrl);var out=document.createElement("canvas");out.width=rect.w,out.height=rect.h,out.getContext("2d").drawImage(img,rect.x,rect.y,rect.w,rect.h,0,0,rect.w,rect.h),resolve(out.toDataURL("image/png"))}catch(e){resolve(dataUrl)}},img.onerror=function(){resolve(dataUrl)},img.src=dataUrl}catch(e){resolve(dataUrl)}})},_editsSpec:function(objects,rect,multiplier){var LIMIT=255,m=Number(multiplier)||1,rw=rect&&rect.w>0?rect.w:1,rh=rect&&rect.h>0?rect.h:1,rx=rect&&rect.x||0,ry=rect&&rect.y||0;function frac(n){var s=(Math.round(n*100)/100).toFixed(2);return s.replace(/^(-?)0\./,"$1.")}function num(n){return String(Math.round((Number(n)||0)*10)/10)}function colour(c){return typeof c=="string"&&c?c:"custom"}function clean(s){return s=String(s==null?"":s).replace(/[\u0000-\u001f\u007f]+/g," ").replace(/"/g,"'").replace(/\s+/g," ").trim(),s.length>40?s.slice(0,37)+"...":s}function centre(o){var p=typeof o.getCenterPoint=="function"?o.getCenterPoint():{x:o.left,y:o.top};return"@"+frac(((Number(p.x)||0)*m-rx)/rw)+","+frac(((Number(p.y)||0)*m-ry)/rh)}function describe(o){var type=String(o.type||"").toLowerCase(),isText=o.objType==="text"||/^(text|i-?text|textbox)$/.test(type);if(isText){var font=String(o.fontFamily||"").split(",")[0].replace(/['"]/g,"").trim()||"default",parts=['text "'+clean(o.text)+'"',font,colour(o.fill),"h"+frac((Number(o.fontSize)||0)*(Number(o.scaleY)||1)*m/rh)],fx=o.fxEffect;return fx==="outline"||fx==="hollow"?parts.push(fx+" "+colour(o.stroke)+" w"+num(o.strokeWidth)):fx==="shadow"&&parts.push("shadow "+colour(o.shadow&&o.shadow.color)),Number(o.charSpacing)&&parts.push("spacing"+num(o.charSpacing)),Number(o.fxCurve)&&parts.push("curve"+num(o.fxCurve)),parts.push(centre(o)),parts.join(" ")}var sw=typeof o.getScaledWidth=="function"?o.getScaledWidth():(Number(o.width)||0)*(Number(o.scaleX)||1),sh=typeof o.getScaledHeight=="function"?o.getScaledHeight():(Number(o.height)||0)*(Number(o.scaleY)||1),kind;type==="circle"?kind="circle":Number(o.rx)>0&&(Number(o.height)||0)*(Number(o.scaleY)||1)<=8?kind="line":Number(o.rx)>0?kind="rrect":kind="rect";var paint=o.fill==="transparent"&&Number(o.strokeWidth)>0?"outline "+colour(o.stroke)+" t"+num(o.strokeWidth):"fill "+colour(typeof o.fill=="string"&&o.baseFill||o.fill);return kind+" "+paint+" w"+frac(sw*m/rw)+" h"+frac(sh*m/rh)+" "+centre(o)}var items=(objects||[]).filter(function(o){return o&&!o.isBase}).map(describe),all=items.join("; ");if(all.length<=LIMIT)return all;for(var out="",used=0,i=0;i<items.length;i++){var next=out?out+"; "+items[i]:items[i],suffix="; +"+(items.length-i-1)+" more";if(next.length+suffix.length>LIMIT)break;out=next,used=i+1}var rest="+"+(items.length-used)+" more";return out?out+"; "+rest:rest},editorSaveEdit:function(){var self=this,canvas=window.__ftb2FabricCanvas;if(!canvas)return Promise.resolve();canvas.discardActiveObject(),canvas.requestRenderAll();var dataUrl,editorJSON,edits;try{dataUrl=canvas.toDataURL({format:"png",multiplier:3}),editorJSON=JSON.stringify(canvas.toJSON(this._HIST_KEYS)),edits=canvas.getObjects().filter(function(o){return!o.isBase})}catch(e){return this.showToast(this._t("artwork_save_failed","Could not save \u2014 please try again."),!1),Promise.resolve()}var editsDataUrl=null;if(edits.length){var base=canvas.getObjects().find(function(o){return o.isBase})||null;try{base&&(base.visible=!1),editsDataUrl=canvas.toDataURL({format:"png",multiplier:3})}catch(e){console.error("[FORTEE editor] edits layer export failed \u2014 the design is saved without its edits copy",e),editsDataUrl=null}
5finally{base&&(base.visible=!0),canvas.requestRenderAll()}}this._scopePendingEditorJSON=editorJSON,this._scopePendingEdits=null;var pid=this._fabricProductId,pubkey=window.bundleData&&window.bundleData.uploadcarePubkey||window.forteeShared&&window.forteeShared._uploadcarePubkey||"";function upload(d){return window.forteeShared&&window.forteeShared.uploadToUploadcare?window.forteeShared.uploadToUploadcare(d,pubkey):Promise.resolve(null)}return this.showToast(this._t("artwork_saving","Saving your design\u2026"),!1),self._cropDataUrlToContent(dataUrl).then(function(crop){var spec=edits.length?self._editsSpec(edits,crop.rect,3):"",layer=editsDataUrl?self._cropDataUrlToRect(editsDataUrl,crop.rect).then(upload).catch(function(e){return console.error("[FORTEE editor] edits layer upload failed for product "+pid,e),null}):Promise.resolve(null);return Promise.all([upload(crop.dataUrl),layer]).then(function(res){var url=res[0],layerUrl=res[1];if(self.closeEditor(),!url){self.showToast(self._t("artwork_save_failed","Could not save \u2014 please try again."),!1);return}if(edits.length){var layerOk=typeof layerUrl=="string"&&/^https:\/\//.test(layerUrl);editsDataUrl&&!layerOk&&console.error("[FORTEE editor] edits layer upload returned no https url for product "+pid+" \u2014 the design is saved, the order will carry the edit spec without the edits layer"),self._scopePendingEdits={editsLayerUrl:layerOk?layerUrl:null,editsSpec:spec||null}}self._openScope(pid,url)})}).catch(function(){self.closeEditor(),self.showToast(self._t("artwork_save_failed","Could not save \u2014 please try again."),!1)})},startUploadNew:function(productId){this._artworkEditFor=null,this._editorOpen=!1,this._uploadNewProductId=productId,this._pendingUploadIsNew=!0,this.triggerUpload(NEW_LOGO_KEY)},_openScope:function(productId,newLogoUrl,sourceRecord){this._pendingScopeProductId=productId,this._scopePendingUrl=newLogoUrl,this._scopePendingSource=sourceRecord?Object.assign({},sourceRecord):null;var view=this._editorView||this._activeViewForProduct(productId)||"",choice=view.indexOf("cap")!==-1?"cap":view.indexOf("back")!==-1?"back":"front";if(!this._scopeHasOption(choice)){for(var order=["this","front","back","cap","all"],i=0;i<order.length;i++)if(this._scopeHasOption(order[i])){choice=order[i];break}}this._scopeChoice=choice,this._scopeOpen=!0},setScope:function(choice){this._scopeChoice=choice},closeScope:function(){this._scopeOpen=!1,this._scopePendingUrl=null,this._scopePendingEditorJSON=null,this._scopePendingSource=null,this._scopePendingEdits=null},_viewMatchesScope:function(view,choice){return choice==="all"?!0:choice==="this"?view===(this._editorView||this._activeViewForProduct(null)):choice==="cap"?view.indexOf("cap")!==-1:choice==="front"?view.indexOf("front")!==-1&&view.indexOf("cap")===-1:choice==="back"?view.indexOf("back")!==-1:!1},_scopeEligibleViews:function(choice){var store=this.groupArtwork||{},self=this;return Object.keys(store).filter(function(view){if(view===NEW_LOGO_KEY)return!1;var a=store[view];return!a||!(a.url||a.bgRemovedUrl||a.originalUrl)?!1:self._viewMatchesScope(view,choice)})},_scopeHasOption:function(choice){var eligible=this._scopeEligibleViews(choice);if(choice==="all")return eligible.length>1;if(choice==="this"){if(eligible.length!==1)return!1;for(var view=eligible[0],named=["front","back","cap"],i=0;i<named.length;i++){var set=this._scopeEligibleViews(named[i]);if(set.length===1&&set[0]===view)return!1}return!0}return eligible.length>0},applyScope:function(){var self=this,url=this._scopePendingUrl;if(!url){this.closeScope();return}var choice=this._scopeChoice,source=this._scopePendingSource,edits=this._scopePendingEdits||{},newArt={url:url,originalUrl:url,bgRemovedUrl:url,originalCroppedUrl:null,bgRemovedCroppedUrl:null,filename:"edited-logo.png",editorJSON:self._scopePendingEditorJSON||null,editsLayerUrl:edits.editsLayerUrl||null,editsSpec:edits.editsSpec||null},targets=this._scopeEligibleViews(choice);if(!targets.length){this.closeScope(),this.showToast(this._t("artwork_scope_none","Nothing to apply to \u2014 add the placement first."),!1);return}
5targets.forEach(function(view){if(source){self.groupArtwork[view]=Object.assign({},source,{originalUrl:source.originalUrl||source.url,editedFrom:null,editorJSON:null,editsLayerUrl:null,editsSpec:null}),self._generateVersions(view);return}var prev=self.groupArtwork[view],editedFrom=prev&&(prev.editedFrom||prev.originalUrl||prev.url)||null;self.groupArtwork[view]=Object.assign({},newArt,{editedFrom:editedFrom}),self._generateVersions(view)}),this._mockup2Cache={},this._buildPrePlacedTiles(),this.closeScope(),this.showToast(this._t("artwork_applied","Your changes are live."),!0)},_scopeLabel:function(choice){return{all:this._t("scope_all","all placements"),front:this._t("scope_front","all front placements"),back:this._t("scope_back","all back placements"),cap:this._t("scope_cap","caps"),this:this._t("scope_this","this placement")}[choice]||choice}}}})(); 6//# sourceMappingURL=/cdn/shop/t/38/assets/fortee-logo-editor.js.map?v=180717250399962521061790345777
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.