').appendTo(e);if(i.append(t),this.settings.sortable&&(i.append('
'),this.structureDrag.addItems(e)),this.settings.newChildUrl){var s=$('
').appendTo(i);this.initNewChildMenus(s)}i.css("margin-bottom",-30),i.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,i=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(i),i.siblings().length||(e=i.parent()),i.css("visibility","hidden").velocity({marginBottom:-i.height()},"fast",()=>{i.remove(),void 0!==e&&this._removeUl(e)})},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},67:function(){},70:function(t,e,i){var s=i(520);s.__esModule&&(s=s.default),"string"==typeof s&&(s=[[t.id,s,""]]),s.locals&&(t.exports=s.locals),(0,i(233).A)("7dc1a956",s,!0,{})},92:function(){Craft.Queue=Garnish.Base.extend({running:!1,paused:!1,pausedForVisibility:!1,jobs:null,get length(){return this.jobs.length},get isPaused(){return this.paused||this.pausedForVisibility},init:function(){this.jobs=[],Garnish.$doc.on("visibilitychange",()=>{this.pausedForVisibility&&Craft.isVisible()&&(this.pausedForVisibility=!1,this._resume())})},push:function(t){return this._add(t,"push")},unshift:function(t){return this._add(t,"unshift")},pause:function(){this.paused||(this.paused=!0,this.pausedForVisibility||this.trigger("pause"))},resume:function(){this.paused&&(this.paused=!1,this._resume())},_add:function(t,e){return new Promise((i,s)=>{this.jobs[e](()=>new Promise((e,n)=>{t().then(t=>{i(t),e()}).catch(t=>{s(t),n()})})),this.running||(this.trigger("beforeRun"),this.running=!0,this._exec())})},clear:function(){this.jobs.length=0},_exec:function(){if(!this.jobs.length)return this.running=!1,void this.trigger("afterRun");this.pausedForVisibility||Craft.isVisible()||(this.pausedForVisibility=!0,this.paused||this.trigger("pause")),this.paused||this.pausedForVisibility||(this.trigger("beforeExec"),this.jobs.shift()().finally(()=>{this.trigger("afterExec"),this._exec()}))},_resume:function(){this.isPaused||(this.trigger("resume"),this._exec())}}),Craft.queue=new Craft.Queue},154:function(){Craft.ElementEditor=Garnish.Base.extend({isFullPage:null,$container:null,$activityContainer:null,$contentContainer:null,$sidebar:null,$spinner:null,$expandSiteStatusesBtn:null,$statusIcon:null,$previewBtn:null,metaModal:null,$nameTextInput:null,$saveMetaBtn:null,$siteStatusPane:null,$globalLightswitch:null,$siteLightswitches:null,$additionalSiteField:null,siteIds:null,newSiteIds:null,enableAutosave:null,lastSerializedValue:null,formObserver:null,formHost:null,cancelToken:null,ignoreFailedRequest:!1,queue:null,savingDraft:!1,saveDraftCallbacks:null,submittingForm:!1,draftElementIds:null,draftElementUids:null,failed:!1,httpStatus:null,httpError:null,preview:null,activatedPreviewToken:!1,previewTokenQueue:null,previewLinks:null,hiddenTipsStorageKey:"Craft-"+Craft.systemUid+".TipField.hiddenTips",_checkActivityTimeout:null,get tipDismissBtn(){return this.$container.find(".tip-dismiss-btn")},get slideout(){return this.$container.data("slideout")},get tabManager(){return(this.settings.getTabManager??(()=>this.isFullPage?Craft.cp.tabManager:null))()},init:function(t,e){if(this.$container=$(t),this.$container.data("elementEditor")&&(console.warn("Double-instantiating an element editor on an element."),this.$container.data("elementEditor").destroy()),this.$container.data("elementEditor",this),this.$container.attr("data-element-editor",""),this.setSettings(e,Craft.ElementEditor.defaults),this.isFullPage=[Craft.cp.$primaryForm[0],Craft.cp.$main[0]].includes(this.$container[0]),this.$contentContainer=this.settings.$contentContainer??(this.isFullPage?$("#content"):$()),this.$sidebar=this.settings.$sidebar??(this.isFullPage?$("#details .details"):$()),this.formHost=this.$contentContainer.find("craft-entry-field-layout-form")[0],this.queue=this._createQueue(),this.previewTokenQueue=this._createQueue(),this.draftElementIds={},this.draftElementUids={},this.enableAutosave=this.settings.autosaveDrafts??Craft.autosaveDrafts,this.previewLinks=[],this.settings.previewTargets?.length){const t=this.settings.$actionBtn??(this.isFullPage?$("#action-btn"):$()),e=this.namespaceId("action-view"),i=t.data("disclosureMenu")?.$container.find(`a[id^="${e}-"]`);if(i?.length){const t=i.attr("href");i.data("targetUrl",t).attr("href",this.getTokenizedPreviewUrl(t,null,!1)),this.previewLinks.push(i)}}this.siteIds=Object.keys(this.settings.siteStatuses).map(t=>parseInt(t)),this.$previewBtn=this.$container.find(".preview-btn");const i=this.settings.$spinnerContainer??(this.isFullPage?$("#revision-indicators"):$());if(this.$spinner=$("
",{class:"revision-spinner spinner hidden",title:Craft.t("app","Saving")}).appendTo(i),this.$statusIcon=$("
",{class:"revision-status "+(this.isFullPage?"invisible":"hidden")}).appendTo(i),this.$expandSiteStatusesBtn=this.$container.find(".expand-status-btn"),this.settings.canEditMultipleSites&&(this.addListener(this.$expandSiteStatusesBtn,"click","expandSiteStatuses"),Garnish.$bod.on("activate","[data-cross-site-copy]",t=>{const e=$(t.currentTarget),i=e.closest(".menu").data("disclosureMenu")?.$trigger.closest(".field");i.closest(this.$container).length&&(t.preventDefault(),this.showFieldCopyModal(e,i))})),this.settings.previewTargets.length&&this.isFullPage){this.settings.enablePreview&&this.addListener(this.$previewBtn,"click","openPreview");const t=this.$container.find(".preview-btn-container");if(1===this.settings.previewTargets.length){const[e]=this.settings.previewTargets;this.createPreviewLink(e).addClass("view-btn btn").attr("aria-label",Craft.t("app","View")).appendTo(t)}else this.createShareMenu(t)}if(this.settings.canSave){if("FORM"!==this.$container.prop("tagName"))throw"Element editors may only be used with forms.";Craft.edition!==Craft.Solo&&(this.$activityContainer=this.$container.find(".activity-container"),this._checkActivity()),this.$container.data("serializer",()=>this.serializeForm(!0)),this.$container.data("initialSerializedValue",this.serializeForm(!0)),Garnish.requestAnimationFrame(()=>{this.$container.data("initialSerializedValue",this.serializeForm(!0))}),this.slideout||this.addListener(this.$container,"submit","handleSubmit"),this.settings.isProvisionalDraft?this.initForProvisionalDraft():this.settings.draftId&&!this.settings.isUnpublishedDraft?this.initForDraft():this.settings.canSaveCanonical||this.addListener(this.$container,"submit.saveShortcut",t=>{t.saveShortcut&&(t.preventDefault(),this.saveDraft(),this.removeListener(this.$container,"submit.saveShortcut"))}),this.listenForChanges(),this.addListener(this.$statusIcon,"click",()=>{this.showStatusHud(this.$statusIcon)}),this.handleDismissibleTips(),Craft.messageReceiver&&Craft.broadcaster.addEventListener("message",t=>{if(["saveDraft","reorderNestedElements"].includes(t.data.event)&&t.data.canonicalId===this.settings.canonicalId&&(t.data.draftId===this.settings.draftId||t.data.isProvisionalDraft&&!this.settings.draftId)||"saveElement"===t.data.event&&t.data.id===this.settings.canonicalId&&(!this.settings.draftId||this.settings.isProvisionalDraft))(this.settings.reloadOnBroadcastSave||t.data.draftId!==this.settings.draftId)&&(this.isFullPage?(Craft.setUrl(Craft.getUrl(document.location.href,{scrollY:window.scrollY})),window.location.reload()):this.slideout&&this.queue?.push(async()=>{this.slideout.reload()}));else if("deleteDraft"===t.data.event&&t.data.canonicalId===this.settings.canonicalId&&t.data.draftId===this.settings.draftId)if(this.isFullPage){const t=new URL(window.location.href);t.searchParams.delete("draftId"),t.href!==document.location.href?window.location.href=t:(Craft.setUrl(Craft.getUrl(document.location.href,{scrollY:window.scrollY})),window.location.reload())}else this.slideout&&this.queue?.push(async()=>{this.slideout.settings.elementId=t.data.id,this.slideout.settings.draftId=!1,this.slideout.reload()})}),this.isFullPage&&Craft.ui.setFocusOnErrorSummary(this.$container)}},_createQueue:function(){const t=new Craft.Queue;return t.on("beforeRun",()=>{this.showSpinner()}),t.on("afterRun",()=>{this.hideSpinner()}),t},get namespace(){return this.settings.namespace},namespaceInputName(t){return Craft.namespaceInputName(t,this.namespace)},namespaceId(t){return Craft.namespaceId(t,this.namespace)},get listeningForChanges(){return!!this.formObserver},get pauseLevel(){return this.formObserver?._pauseLevel??0},listenForChanges:function(){this.formObserver||(this.formObserver=new Craft.FormObserver(this.$container,()=>{this.checkForm()}))},stopListeningForChanges:function(){this.formObserver&&(this.formObserver.destroy(),this.formObserver=null)},pause:function(){return this.formObserver?.pause(),new Promise(t=>{this.savingDraft?this.saveDraftCallbacks.push(()=>{t()}):t()})},resume:function(){this.formObserver?.resume()},initForProvisionalDraft:function(){let t=this.$container.find(".discard-changes-btn");if(!t.length){const e=this.settings.$noticeContainer??(this.isFullPage?Craft.cp.$noticeContainer:this.$container.find(".so-notice"));let i,s;this.isFullPage&&(i=$("#content").height(),s=Garnish.$win.scrollTop());const n=$("
",{class:"draft-notice"}).append($("
",{class:"draft-icon","aria-hidden":"true","data-icon":"edit"})).append($("
",{text:Craft.t("app","Showing your unsaved changes.")})).appendTo(e);if(t=$("
",{type:"button",class:"discard-changes-btn btn",text:Craft.t("app","Discard")}).appendTo(n),this.isFullPage){const t=$("#content").height()-i;if(Garnish.$win.scrollTop(s+t),Garnish.$win.scrollTop()===s){Craft.cp.$contentContainer.css("pointer-events","none"),$("#content-header").css("min-height","auto");const i=e.height();e.css({height:i-t,overflow:"hidden"}).velocity({height:i},"fast",()=>{$("#content-header").css("min-height",""),e.css({height:"",overflow:""}),setTimeout(()=>{Craft.cp.$contentContainer.css("pointer-events","")},300)})}}}this.addListener(t,"keypress,keyup,change,focus,blur,click,mousedown,mouseup",t=>{t.stopPropagation()}),this.addListener(t,"click",()=>{confirm(Craft.t("app","Are you sure you want to discard your changes?"))&&this.queue?.unshift(()=>new Promise((t,e)=>{this.isFullPage?Craft.submitForm(this.$container,{action:"elements/delete-draft",redirect:this.settings.hashedCpEditUrl,params:{draftId:this.settings.draftId,fieldId:this.settings.fieldId,ownerId:this.settings.ownerId,provisional:1}}):Craft.sendActionRequest("POST","elements/delete-draft",{data:{elementId:this.settings.canonicalId,draftId:this.settings.draftId,fieldId:this.settings.fieldId,ownerId:this.settings.ownerId,siteId:this.settings.siteId,provisional:1}}).then(t=>{Craft.cp.displaySuccess(t.data.message),Craft.broadcaster.postMessage({event:"deleteDraft",canonicalId:this.settings.canonicalId,draftId:this.settings.draftId}),this.slideout?.close()}).catch(e)}))}),this.isFullPage||this.slideout?.$cancelBtn.text(Craft.t("app","Close"))},initForDraft:function(){this.createEditMetaAction(),this.settings.canSaveCanonical&&Garnish.uiLayerManager.registerShortcut({keyCode:Garnish.S_KEY,ctrl:!0,alt:!0},()=>{Craft.submitForm(this.$container,{action:"elements/apply-draft",redirect:this.settings.hashedCpEditUrl})},0)},expandSiteStatuses:function(){this.removeListener(this.$expandSiteStatusesBtn,"click"),this.$expandSiteStatusesBtn.velocity({opacity:0},"fast",()=>{this.$expandSiteStatusesBtn.remove()});const t=this.$container.find(`.enabled-for-site-${this.settings.siteId}-field`);if(this.$siteStatusPane=t.parent(),this.settings.revisionId)return void this._getOtherSupportedSites().forEach(t=>this._createSiteStatusField(t));t.addClass("nested");const e=Craft.ui.createLightswitchField({label:Craft.t("app","Enabled for all sites"),name:this.namespaceInputName("enabled")}).insertBefore(t);e.find("label").css("font-weight","bold"),this.$globalLightswitch=e.find("craft-switch"),this.settings.revisionId||this._showField(e);const i=Object.values(this.settings.siteStatuses),s=i.includes(!0),n=i.includes(!1),a=s&&n?"-":s?"1":"",r=encodeURIComponent(this.namespaceInputName(`enabledForSite[${this.settings.siteId}]`))+"="+(this.settings.enabledForSite?"1":"");this.$siteLightswitches=t.find("craft-switch").on("change",this._updateGlobalStatus.bind(this)),this._getOtherSupportedSites().forEach(t=>this._createSiteStatusField(t));let o=encodeURIComponent(this.namespaceInputName("enabled"))+`=${a}`;for(let t=0;t
",{class:"modal fitted cross-site-copy-modal","aria-labelledby":i}),n=$("
",{class:"body"}).appendTo(s);n.append(``);const a=Craft.createForm().appendTo(n);a.append(Craft.getCsrfInput());const r=$("
",{class:"flex flex-end flex-nowrap"}).appendTo(a),o=Craft.ui.createSelectField({label:Craft.t("app","Copy from"),class:["fullwidth"],options:this._getOtherSupportedSites().map(t=>({label:t.name,value:t.id}))}).addClass("flex-grow").appendTo(r);Craft.ui.createSubmitButton({label:Craft.t("app","Copy"),spinner:!0}).appendTo(r);const l=new Garnish.Modal(s),h=o.find("select").focus();this.addListener(a,"submit",async i=>{i.preventDefault();const s=a.find("[type=submit]");s.addClass("loading"),Craft.cp.announce(Craft.t("app","Loading"));try{const i=await Craft.sendActionRequest("POST","elements/copy-values-from-site",{data:{elementId:this.getDraftElementId(t.data("element-id")),siteId:this.settings.siteId,fromSiteId:parseInt(h.val()),layoutElementUid:t.data("layout-element"),namespace:t.data("namespace")}}),{fieldHtml:s,headHtml:n,bodyHtml:a,message:r}=i.data,o=$(s);e.replaceWith(o),await Craft.appendHeadHtml(n),await Craft.appendBodyHtml(a),Craft.initUiElements(o),l.$triggerElement=o.find("[data-disclosure-trigger]"),Craft.cp.displaySuccess(r)}finally{s.removeClass("loading"),Craft.cp.announce(Craft.t("app","Loading complete")),l.hide()}})},_getOtherSupportedSites:function(){return Craft.sites.filter(t=>t.id!=this.settings.siteId&&this.siteIds.includes(t.id))},_showField:function(t){const e=t.height();t.css({overflow:"hidden","min-height":"auto"}).height(0).velocity({height:e},"fast",()=>{t.css({overflow:"",height:"","min-height":""})})},_removeField:function(t){t.css({overflow:"hidden","min-height":"auto"}).velocity({height:0},"fast",()=>{t.remove()})},_updateGlobalStatus:function(){let t=!0,e=!0;this.$siteLightswitches.each(function(){if(this.on?e=!1:t=!1,!t&&!e)return!1}),t?this.$globalLightswitch[0].turnOn(!0):e?this.$globalLightswitch[0].turnOff(!0):this.$globalLightswitch[0].turnIndeterminate(!0)},_updateSiteStatuses:function(){const t=this.$globalLightswitch[0].on;this.$siteLightswitches.each(function(){t?this.turnOn(!0):this.turnOff(!0)})},_createSiteStatusField:function(t,e){const i=Craft.ui.createLightswitchField({fieldClass:`enabled-for-site-${t.id}-field`,label:t.name,name:this.namespaceInputName(`enabledForSite[${t.id}]`),on:void 0!==e?e:!this.settings.siteStatuses.hasOwnProperty(t.id)||this.settings.siteStatuses[t.id],disabled:!!this.settings.revisionId});if(this.$additionalSiteField?i.insertBefore(this.$additionalSiteField):i.appendTo(this.$siteStatusPane),!this.settings.revisionId){i.addClass("nested");const t=i.find("craft-switch").on("change",this._updateGlobalStatus.bind(this));this.$siteLightswitches=this.$siteLightswitches.add(t)}return this._showField(i),i},_createAddlSiteField:function(){const t=Craft.sites.filter(t=>!this.siteIds.includes(t.id)&&this.settings.additionalSites.some(e=>e.siteId==t.id));if(!t.length)return;const e="add-site-label",i=$("
",{text:Craft.t("app","Add a site..."),class:"visually-hidden",id:e}),s=Craft.ui.createSelect({options:[{label:Craft.t("app","Add a site…")},...t.map(t=>({label:t.name,value:t.id}))],labelledBy:e}).addClass("fullwidth");this.$additionalSiteField=Craft.ui.createField(s,{}).addClass("nested add").appendTo(this.$siteStatusPane),i.prependTo(this.$additionalSiteField);const n=s.find("select");n.on("change",()=>{const t=parseInt(n.val()),e=Craft.sites.find(e=>e.id===t);if(!e)return;const i=this.settings.additionalSites.find(t=>t.siteId==e.id);this._createSiteStatusField(e,i.enabledByDefault),this._updateGlobalStatus(),n.val("").find(`option[value="${t}"]`).remove(),null===this.newSiteIds&&(this.newSiteIds=[]),this.siteIds.push(t),this.newSiteIds.push(t),1===n.find("option").length&&this._removeField(this.$additionalSiteField)}),this._showField(this.$additionalSiteField)},showStatusHud:function(t){let e;this.failed?(e=`
${this._saveFailMessage()}
`,this.httpError&&(e+=`
${Craft.escapeHtml(this.httpError)}
`),400===this.httpStatus&&(e+=`
`)):e=`
${this._saveSuccessMessage()}
`;const i=new Garnish.HUD(t,e,{hudClass:"hud revision-status-hud",onHide:function(){i.destroy()}});i.$mainContainer.find(".refresh-btn").on("click",()=>{window.location.reload()})},_saveSuccessMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes have been stored."):Craft.t("app","The draft has been saved.")},_saveFailMessage:function(){return this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft?Craft.t("app","Your changes could not be stored."):Craft.t("app","The draft could not be saved.")},spinners:function(){return this.$spinner},showSpinner:function(){this.spinners().removeClass("hidden")},hideSpinner:function(){this.spinners().addClass("hidden")},statusIcons:function(){return this.$statusIcon},createEditMetaAction:function(){if(!this.isFullPage)return;const t=$("#action-menu").disclosureMenu().data("disclosureMenu"),e=t.getFirstDestructiveGroup(),i=t.addGroup(null,!0,e),s=t.addItem({type:"button",icon:async()=>await Craft.ui.icon("edit"),label:Craft.t("app","Edit draft settings")},i);this.addListener(s,"click","showMetaModal")},createPreviewLink:function(t,e){const i=$("
",{href:this.getTokenizedPreviewUrl(t.url,null,!1),text:e||Craft.t("app","View"),target:"_blank",data:{targetUrl:t.url,targetLabel:t.label}});return this.addListener(i,"click",()=>{decodeURIComponent(i.attr("href")).match(/\bpreview\/create-token\b/)&&setTimeout(()=>{this.activatePreviewToken()},1)}),this.previewLinks.push(i),i},updatePreviewLinks:function(){this.previewLinks.forEach(t=>{this.updatePreviewLinkHref(t),this.activatedPreviewToken&&this.removeListener(t,"click")})},updatePreviewLinkHref:function(t){t.attr("href",this.getTokenizedPreviewUrl(t.data("targetUrl"),null,!1))},activatePreviewToken:function(){this.activatedPreviewToken=!0,this.updatePreviewLinks()},createShareMenu:function(t){const e=$("
",{type:"button",class:"view-btn btn menubtn",text:Craft.t("app","View")}).appendTo(t),i=$("
",{class:"menu"}).appendTo(t),s=$("
").appendTo(i);this.settings.previewTargets.forEach(t=>{$("
").append(this.createPreviewLink(t,t.label)).appendTo(s)}),new Garnish.MenuBtn(e)},getPreviewTokenParams:function(){const t={elementType:this.settings.elementType,canonicalId:this.settings.canonicalId,siteId:this.settings.siteId,revisionId:this.settings.revisionId,previewToken:this.settings.hashedPreviewToken};return this.settings.draftId&&!this.settings.isProvisionalDraft&&(t.draftId=this.settings.draftId),t},getPreviewToken:function(){return this.previewTokenQueue.push(()=>new Promise((t,e)=>{this.activatedPreviewToken?t(this.settings.previewToken):Craft.sendActionRequest("POST","preview/create-token",{data:this.getPreviewTokenParams()}).then(()=>{this.activatePreviewToken(),t(this.settings.previewToken)}).catch(e)}))},getTokenizedPreviewUrl:function(t,e,i=!0){const s={},n=this.settings.previewParamValue&&(e||!this.settings.isLive);if(n&&(s[e||"x-craft-preview"]=this.settings.previewParamValue),this.settings.siteToken&&(s[Craft.siteToken]=this.settings.siteToken),!n){const e=Craft.getUrl(t,s);return i?new Promise(t=>{t(e)}):e}if(!this.settings.previewToken||!this.settings.hashedPreviewToken)throw"Missing preview token";s[Craft.tokenParam]=this.settings.previewToken;const a=Craft.getUrl(t,s);if(this.activatedPreviewToken)return i?new Promise(t=>{t(a)}):a;if(i)return new Promise((t,e)=>{this.getPreviewToken().then(()=>{t(a)}).catch(e)});const r=this.getPreviewTokenParams();return r.redirect=a,Craft.getActionUrl("preview/create-token",r)},getPreview:function(){if(this.preview&&!this.preview.isVisible&&this.preview.elementEditor?.settings.updatedTimestamp!==this.settings.updatedTimestamp&&(this.preview.destroy(),delete this.preview),!this.preview){let t;this.preview=new Craft.Preview({elementType:this.settings.elementType,elementId:this.settings.isProvisionalDraft?this.settings.canonicalId:this.settings.elementId,draftId:this.settings.isProvisionalDraft?null:this.settings.draftId,revisionId:this.settings.revisionId,siteId:this.settings.siteId,onBeforeLoad:async()=>{await this.checkForm(!1,!0)}}),this.preview.on("open",()=>{t=this.settings.updatedTimestamp,this.pause()}),this.preview.on("close",async()=>{this.$previewBtn&&this.$previewBtn.focus(),this.settings.updatedTimestamp!==t&&await this.refreshContent();const e=this.preview.tabManager?.getSelectedTabIndex()??null;null!==e&&this.tabManager?.selectTab(e),this.resume()}),this.preview.on("afterSaveDraft",({response:t})=>{this._handleSaveDraftResponse(t)})}return this.preview},openPreview:async function(){if(!Garnish.hasAttr(this.$previewBtn,"aria-disabled")){this.$previewBtn.attr("aria-disabled",!0);try{const t=this.getPreview();await t.open();const e=this.tabManager?.getSelectedTabIndex()??null;null!==e&&t.tabManager?.selectTab(e)}finally{this.$previewBtn.removeAttr("aria-disabled")}}},ensureIsDraftOrRevision:function(t){return new Promise((e,i)=>{if(this.settings.draftId||this.settings.revisionId)e();else{if(t&&this.serializeForm(!0)===this.$container.data("initialSerializedValue"))return void e();this.saveDraft().then(e).catch(i)}})},async setFormValue(t,e){if(this.settings.revisionId)throw"Unable to set form values on a revision.";return await this.checkForm(),!this.$container.serialize().split("&").includes(`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)&&($("
",{type:"hidden",name:t,value:e}).prependTo(this.$container),this.settings.canCreateDrafts&&await this.saveDraft(),!0)},async markDeltaNameAsModified(t){let e=this.$container.data("modified-delta-names")||[];e.includes(t)||(e.push(t),this.$container.data("modified-delta-names",e),await this.saveDraft())},serializeForm:function(t){let e=this.$container.serialize();if(t&&!this.settings.isUnpublishedDraft){const t=encodeURIComponent(this.namespaceInputName("action")),i=encodeURIComponent(this.namespaceInputName("redirect"));e=e.replace(new RegExp(`&${Craft.escapeRegex(t)}=[^&]*`),""),e=e.replace(new RegExp(`&${Craft.escapeRegex(i)}=[^&]*`),"")}e=e.replace(/&elementindex-[^&]*/g,"");const i={serialized:e};return this.trigger("serializeForm",{data:i}),i.serialized},checkForm:function(t,e=null){return this.queue?.push(()=>new Promise((i,s)=>{if(this.settings.revisionId)return void i();if(this.savingDraft&&this.saveDraftCallbacks.push(async()=>{try{await this.checkForm(t,e)}catch(t){return void s(t)}i()}),void 0===this.$container.data("initialSerializedValue"))return void setTimeout(async()=>{try{await this.checkForm(t,e)}catch(t){return void s(t)}i()},500);const n=this.serializeForm(!0);t||n!==(this.lastSerializedValue||this.$container.data("initialSerializedValue"))?(e??this.enableAutosave)&&this.settings.canCreateDrafts?this._saveDraftInternal(n).then(i).catch(t=>{console.warn("Couldn’t save draft:",t),s(t)}):this.formHost?i():this.updateFieldLayout(n).then(i).catch(t=>{console.warn("Couldn’t update field layout:",t),s(t)}):i()}))},async refreshContent(t){const e=[this.serializeForm(!0)];e.push($.param({[this.namespaceInputName("applyParams")]:0})),t&&!$.isEmptyObject(t)&&e.push($.param(t)),await this.updateFieldLayout(e.join("&"))},isPreviewActive:function(){return this.preview&&this.preview.isActive},saveDraft:function(){return this.queue?.push(()=>new Promise((t,e)=>{this._saveDraftInternal(this.serializeForm(!0)).then(t).catch(e)}))},_saveDraftInternal:async function(t){if(this.submittingForm)throw"Form already being submitted.";if(this.savingDraft)throw"Draft already being saved.";this.lastSerializedValue=t,this.savingDraft=!0,this.saveDraftCallbacks=[],this.failed=!1,this.httpStatus=null,this.httpError=null,this.cancelToken=axios.CancelToken.source(),this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden invisible checkmark-icon alert-icon fade-out").addClass("hidden"),this.$saveMetaBtn&&this.$saveMetaBtn.addClass("active");const[e]=Craft.findModifiedDeltaNames(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names"),!0),i=this.prepareData(t,null,!0);let s=$();for(const t of e){const e=s=s.add(this.$container.find(`.field[data-base-input-name="${$.escapeSelector(t)}"]`));s=s.add(e).add(e.parentsUntil(this.$container,".field"))}!this.settings.isProvisionalDraft&&this.settings.draftId||i.push(`${this.namespaceInputName("provisional")}=1`);const n=this.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");let a;n&&i.push(`${this.namespaceInputName("selectedTab")}=${n}`);try{a=await Craft.sendActionRequest("POST","elements/save-draft",{cancelToken:this.cancelToken.token,headers:this._saveHeaders,data:i.join("&")})}catch(t){this._afterSaveDraft();const e=this.ignoreFailedRequest;if(this.ignoreFailedRequest=!1,!e)throw this.failed=!0,t&&t.response&&(this.httpStatus=t.response.status,this.httpError=t.response.data?t.response.data.message:null),this._showFailStatus(),t}finally{this.savingDraft=!1;const t=[...this.saveDraftCallbacks];this.saveDraftCallbacks=[];for(const e of t)await e()}this._afterSaveDraft(),this.settings.previewParamValue=a.data.previewParamValue,await this._afterUpdateFieldLayout(a);const r={};if(a.data.deltaNames?.length){let t=this.$container.data("delta-names");t=Array.isArray(t)?[...t]:[];const e=[];for(const i of a.data.deltaNames)-1===t.indexOf(i)&&(t.push(i),e.push(i));if(e.length){this.$container.data("delta-names",t);const i=Craft.groupParams(this.serializeForm(),e);for(const t of Object.values(i))for(const e of t){const[t,i]=e.split("=",2);r[decodeURIComponent(t)]=decodeURIComponent(i)}}}this._handleSaveDraftResponse(a),$.isPlainObject(a.data.draftElementUids)&&(this.draftElementUids={...this.draftElementUids,...a.data.draftElementUids});const o=a.data.modifiedAttributes.map(t=>[`[name="${t=this.namespaceInputName(t)}"]`,`[name^="${t}["]`]).flat().join(",");s=s.add(this.$contentContainer.find(o).parentsUntil(this.$container,".flex-fields > .field")).add(this.$sidebar?.find(o).closest(".field")).not(".no-status,:has(> .status-badge)");for(let t=0;t
",{class:"status-badge modified","aria-hidden":"true",title:Craft.t("app","This field has been modified.")}).append($("
",{class:"visually-hidden",html:Craft.t("app","This field has been modified.")})));this.afterUpdate(this.lastSerializedValue,r),this.trigger("afterSaveDraft",{response:a}),Craft.broadcaster&&Craft.broadcaster.postMessage({pageId:Craft.pageId,event:"saveDraft",canonicalId:this.settings.canonicalId,draftId:this.settings.draftId,isProvisionalDraft:this.settings.isProvisionalDraft})},_handleSaveDraftResponse(t){const e=!this.settings.draftId;e&&(this.settings.isProvisionalDraft=!0),this.isFullPage&&(t.data.title&&this.$container.find(".screen-title").text(t.data.title),t.data.docTitle&&(document.title=t.data.docTitle)),this.newSiteIds&&(this.newSiteIds.forEach(t=>{const e=this.settings.additionalSites.find(e=>e.siteId==t),i=!e||void 0===e.enabledByDefault||e.enabledByDefault;Craft.cp.showSiteCrumbMenuItem(t),Craft.cp.setSiteCrumbMenuItemStatus(t,i?"enabled":"disabled")}),this.newSiteIds=null),this.settings.isProvisionalDraft?e&&(this.$container.find("input.action-input").attr("value","elements/apply-draft"),this.settings.elementId=t.data.elementId,this.settings.draftId=t.data.draftId,this.settings.isLive=!1,this.previewToken=null,this.initForProvisionalDraft()):(this.settings.draftName=t.data.draftName,this.isFullPage&&Craft.cp.updateContext(t.data.draftName,t.data.creator?Craft.t("app","Saved {timestamp} by {creator}",{timestamp:t.data.timestamp,creator:t.data.creator}):Craft.t("app","Saved {timestamp}",{timestamp:t.data.timestamp}))),t.data.previewTargets&&JSON.stringify(t.data.previewTargets)!==JSON.stringify(this.settings.previewTargets)&&this.updatePreviewTargets(t.data.previewTargets),e&&(this.updatePreviewLinks(),this.trigger("createProvisionalDraft")),this.$nameTextInput&&this.checkMetaValues(),$.isPlainObject(t.data.draftElementIds)&&(this.draftElementIds={...this.draftElementIds,...t.data.draftElementIds}),this.settings.updatedTimestamp=t.data.updatedTimestamp,this.settings.canonicalUpdatedTimestamp=t.data.canonicalUpdatedTimestamp},_afterSaveDraft:function(){this.$saveMetaBtn&&this.$saveMetaBtn.removeClass("active")},_showFailStatus:function(){this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden checkmark-icon").addClass("alert-icon"),this.setStatusMessage(this._saveFailMessage())},updateFieldLayout:async function(t){if(this.submittingForm)throw"Form already being submitted.";this.lastSerializedValue=t,this.cancelToken=axios.CancelToken.source();let e=this.prepareData(t);const i={};this.settings.isProvisionalDraft&&(i[this.namespaceInputName("provisional")]=1);const s=this.$contentContainer.children("[data-layout-tab]:not(.hidden)").data("id");let n;s&&(i[this.namespaceInputName("selectedTab")]=s),e+=`&${$.param(i)}`;try{n=await Craft.sendActionRequest("POST","elements/update-field-layout",{cancelToken:this.cancelToken.token,headers:this._saveHeaders,data:e})}catch(t){this._afterSaveDraft();const e=this.ignoreFailedRequest;if(this.ignoreFailedRequest=!1,!e)throw this.failed=!0,t&&t.response&&(this.httpStatus=t.response.status,this.httpError=t.response.data?t.response.data.message:null),this._showFailStatus(),t}await this._afterUpdateFieldLayout(n)},prepareData:function(t,e=()=>{},i=!1){const s=Craft.findDeltaData(this.$container.data("initialSerializedValue"),t,this.$container.data("delta-names"),e,this.$container.data("initial-delta-values"),this.$container.data("modified-delta-names"),!0);if(this.settings.draftId&&(s.push(`${this.namespaceInputName("draftId")}=${this.settings.draftId}`),this.settings.isProvisionalDraft&&s.push(`${this.namespaceInputName("provisional")}=1`)),null!==this.settings.draftName&&s.push(`${this.namespaceInputName("draftName")}=${encodeURIComponent(this.settings.draftName)}`),null!==this.settings.fieldId&&s.push(`${this.namespaceInputName("fieldId")}=${this.settings.fieldId}`),null!==this.settings.ownerId&&s.push(`${this.namespaceInputName("ownerId")}=${this.settings.ownerId}`),this.settings.saveParams)for(const[t,e]of Object.entries(this.settings.saveParams))s.push(`${this.namespaceInputName(t)}=${e}`);return i?s:s.join("&")},get _saveHeaders(){const t={"content-type":"application/x-www-form-urlencoded"};return this.namespace&&(t["X-Craft-Namespace"]=this.namespace),t},getDraftElementId(t){return t==this.settings.canonicalId?this.settings.elementId:this.draftElementIds[t]||t},getDraftElementUid(t){return this.draftElementUids[t]||t},updatePreviewTargets:function(t){t.forEach(t=>{const e=this.settings.previewTargets.find(e=>e.label===t.label);e&&(e.url=t.url);const i=this.previewLinks.find(e=>e.data("targetLabel")===t.label);i&&(i.data("targetUrl",t.url),this.updatePreviewLinkHref(i))})},async _afterUpdateFieldLayout(t){if(!this.formHost||!t.data.form)throw new Error("Entry Form refresh requires a Form host.");this.formHost.payload=t.data.form;const e=this.settings.updateTabs??(this.isFullPage?t=>Craft.cp.updateTabs(t):null);if(!e)throw new Error("Entry Form refresh requires a tab updater.");e(t.data.tabs),await Craft.appendHeadHtml(t.data.headHtml),await Craft.appendBodyHtml(t.data.bodyHtml),this.handleDismissibleTips()},afterUpdate:function(t,e={}){this.$container.data("initialSerializedValue",t),this.$container.data("initial-delta-values",e);const i=this.statusIcons().velocity("stop").css("opacity","").removeClass("hidden").addClass("checkmark-icon");this.setStatusMessage(this._saveSuccessMessage()),this.settings.autosaveDrafts||i.velocity("stop").velocity({opacity:0},{delay:2e3,complete:()=>{i.addClass("hidden")}}),this.trigger("update"),(this.settings.isProvisionalDraft||this.settings.isUnpublishedDraft)&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:this.settings.canonicalId})},setStatusMessage:function(t){this.statusIcons().attr("title",t),Craft.cp.announce(t)},showMetaModal:function(){this.metaModal?this.metaModal.show():this.createMetaModal(),Garnish.isMobileBrowser(!0)||setTimeout(()=>{this.$nameTextInput.focus()},100)},createMetaModal:function(){const t=$("
",{class:"modal fitted"}),e=$("
",{class:"body"}).appendTo(t),i=$('
").appendTo(e),s=$('
').appendTo(i);this.$nameTextInput=$('
').appendTo(s).val(this.settings.draftName);const n=$('').appendTo(t);$('
').appendTo(n),this.$saveMetaBtn=$("
",{type:"submit",class:"btn submit disabled","aria-disabled":"true",text:Craft.t("app","Save")}).appendTo(n),this.metaModal=new Garnish.Modal(t),this.addListener(this.$nameTextInput,"input","checkMetaValues"),this.addListener(t,"submit",t=>{t.preventDefault(),this.saveMeta()}),this.metaModal.on("escape",()=>{this.$nameTextInput.val(this.settings.draftName)})},checkMetaValues:function(){return this.$nameTextInput.val()&&this.$nameTextInput.val()!==this.settings.draftName?(this.$saveMetaBtn.removeClass("disabled"),this.$saveMetaBtn.removeAttr("aria-disabled"),!0):(this.$saveMetaBtn.addClass("disabled"),this.$saveMetaBtn.attr("aria-disabled","true"),!1)},shakeMetaModal:function(){Garnish.shake(this.metaModal.$container)},saveMeta:function(){return new Promise((t,e)=>{if(!this.checkMetaValues())return this.shakeMetaModal(),void e();this.settings.draftName=this.$nameTextInput.val(),this.metaModal.hide(),this.checkForm(!0).then(t).catch(e)})},handleSubmit:async function(t){if(t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation(),this.submittingForm)return;if(this.settings.draftId&&!this.settings.isUnpublishedDraft&&!this.settings.isProvisionalDraft&&(void 0===t.autosave||t.autosave)&&(t.saveShortcut||t.customTrigger&&"elements/save-draft"===t.customTrigger.data("action"))&&this.enableAutosave)return void this.checkForm(!0);this.submittingForm=!0,Craft.cp.$confirmUnloadForms=Craft.cp.$confirmUnloadForms.not(this.$container),this.cancelToken&&(this.ignoreFailedRequest=!0,this.cancelToken.cancel()),this.trigger("beforeSubmit");const e=this.prepareData(this.serializeForm(!1));if(this.isFullPage){this.stopListeningForChanges();const t=Craft.createForm(e);t.appendTo(Garnish.$bod),t.submit()}else{let t;try{t=await Craft.sendActionRequest("POST",null,{headers:this._saveHeaders,data:e})}catch(t){return void this.settings.handleSubmitError(t)}finally{this.submittingForm=!1,this.trigger("afterSubmit"),this.checkForm(!1,!1)}if(this.settings.isUnpublishedDraft){const t=$(`div.element[data-id="${this.settings.elementId}"][data-settings]`);for(let e=0;e
{this.hideTip(t)})},getHiddenTipsUids:function(){return Craft.getLocalStorage("dismissedTips",[])},setHiddenTipsUids:function(t){Craft.setLocalStorage("dismissedTips",t)},hideTip:function(t){const e=t.target;if(e){const t=$(e).closest("[data-layout-element]");if(t.length){const e=t.data("layout-element");if(t.remove(),"undefined"!=typeof Storage){const t=this.getHiddenTipsUids();t.includes(e)||(t.push(e),this.setHiddenTipsUids(t))}}}},_checkActivity:function(){Craft.remainingSessionTime?this.queue?.push(()=>new Promise((t,e)=>{Craft.sendActionRequest("POST","elements/recent-activity",{params:{dontExtendSession:1},data:{elementType:this.settings.elementType,elementId:this.settings.canonicalId,draftId:this.settings.draftId,siteId:this.settings.siteId,provisional:this.settings.isProvisionalDraft}}).then(({data:e})=>{const i=document.activeElement,s=i instanceof HTMLElement&&i.classList.contains("activity-btn")?i.getAttribute("data-user-id"):null;if(this.$activityContainer.html("").attr("role","region").attr("aria-label",Craft.t("app","Recent Activity")),e.activity.length){$("",{class:"visually-hidden",text:Craft.t("app","Recent Activity")}).appendTo(this.$activityContainer);const t=$("").appendTo(this.$activityContainer);for(let i=0;i").appendTo(t),o=$("",{type:"button",id:a,class:"activity-btn","data-user-id":n.userId,"aria-label":Craft.t("app","{name} active, more info",{name:n.userName})}).appendTo(r),l=$(n.userThumb).addClass("elementthumb").css("z-index",e.activity.length-i).appendTo(o);l.find("img,svg").attr("role","presentation"),Craft.cp.elementThumbLoader.load(r),l.find("title").remove(),$("").attr("for",a).text(n.message).appendTo(r),null!==s&&n.userId==s&&o.focus()}}if(this.isFullPage){const t=this.settings.updatedTimestamp&&this.settings.updatedTimestamp!==e.updatedTimestamp,i=this.settings.canonicalUpdatedTimestamp&&this.settings.canonicalUpdatedTimestamp!==e.canonicalUpdatedTimestamp;if(t||i){const e=Craft.ui.createButton({label:Craft.t("app","Reload"),spinner:!0});Craft.cp.displayNotice(Craft.uppercaseFirst(Craft.t("app","This {type} has been updated.",{type:t&&this.settings.draftId&&!this.settings.isProvisionalDraft?Craft.t("app","draft"):Craft.elementTypeNames[this.settings.elementType]?Craft.elementTypeNames[this.settings.elementType][2]:Craft.t("app","element")})),{details:e}),e.on("click",()=>{window.location.reload()})}}this.settings.updatedTimestamp=e.updatedTimestamp,this.settings.canonicalUpdatedTimestamp=e.canonicalUpdatedTimestamp,this.trigger("checkActivity",e),this._checkActivityTimeout=setTimeout(()=>{this._checkActivity()},15e3),t()}).catch(i=>{400===i?.response?.status?(Garnish.once(Craft.AuthManager,"login",()=>{this._checkActivity()}),t()):e(i)})})):Garnish.once(Craft.AuthManager,"login",()=>{this._checkActivity()})},destroy:function(){this.queue?.destroy(),delete this.queue,this.formObserver?.destroy(),delete this.formObserver,this.preview?.destroy(),delete this.preview,this.$container.removeData("elementEditor"),clearTimeout(this._checkActivityTimeout),this.base()}},{defaults:{namespace:null,additionalSites:[],canCreateDrafts:!1,canEditMultipleSites:!1,canSave:!1,canSaveCanonical:!1,elementId:null,canonicalId:null,draftId:null,draftName:null,elementType:null,enablePreview:!1,enabled:!1,enabledForSite:!1,hashedCpEditUrl:null,isLive:!1,isProvisionalDraft:!1,isUnpublishedDraft:!1,previewTargets:[],previewToken:null,hashedPreviewToken:null,previewParamValue:null,revisionId:null,fieldId:null,ownerId:null,siteId:null,siteStatuses:[],saveParams:null,siteToken:null,updatedTimestamp:null,canonicalUpdatedTimestamp:null,reloadOnBroadcastSave:!0,$contentContainer:null,$sidebar:null,$actionBtn:null,$spinnerContainer:null,updateTabs:null,getTabManager:null,handleSubmitResponse:()=>{},handleSubmitError:()=>{},autosaveDrafts:null}})},167:function(){Craft.AssetImageEditor=Garnish.Modal.extend({$body:null,$footer:null,$imageTools:null,$buttons:null,$cancelBtn:null,$replaceBtn:null,$saveBtn:null,$focalPointBtn:null,$editorContainer:null,$straighten:null,$croppingCanvas:null,$fabricElementEditBtn:null,$spinner:null,$constraintContainer:null,$constraintRadioInputs:null,$orientationField:null,$customConstraints:null,canvas:null,image:null,viewport:null,focalPoint:null,prevFocalPoint:null,focalPointInnerCircle:null,focalPointOuterCircle:null,focalPointPickedIndicator:null,grid:null,croppingCanvas:null,clipper:null,handleFocusIndicator:null,croppingRectangle:null,cropperHandles:null,cropperGrid:null,croppingShade:null,mediumBlueColor:null,moveIcon:null,imageStraightenAngle:0,viewportRotation:0,originalWidth:0,originalHeight:0,imageVerticeCoords:null,zoomRatio:1,animationInProgress:!1,currentView:"",assetId:null,cacheBust:null,draggingCropper:!1,movingCropper:!1,scalingCropper:!1,handlePicked:!1,draggingFocal:!1,cropperPickedUp:!1,focusedEditButton:null,focalPickedUp:!1,focalClicked:!1,cropperClicked:!1,previousMouseX:0,previousMouseY:0,shiftKeyHeld:!1,editorHeight:0,editorWidth:0,cropperState:!1,scaleFactor:1,flipData:{},focalPointState:!1,maxImageSize:null,lastLoadedDimensions:null,imageIsLoading:!1,mouseMoveEvent:null,croppingConstraint:!1,constraintOrientation:"landscape",showingCustomConstraint:!1,rectangleHasFocusOutline:!1,saving:!1,dragEditMode:!0,announcerTimeout:null,renderImage:null,renderCropper:null,_queue:null,init:function(t,e){this._queue=new Craft.Queue,this.cacheBust=Date.now(),this.setSettings(e,Craft.AssetImageEditor.defaults),null===this.settings.allowDegreeFractions&&(this.settings.allowDegreeFractions=Craft.isImagick),Garnish.prefersReducedMotion()&&(this.settings.animationDuration=1),this.assetId=t,this.flipData={x:0,y:0},this.$container=$('').appendTo(Garnish.$bod),this.$body=$('').appendTo(this.$container),this.$footer=$('').appendTo(this.$container),this.base(this.$container,this.settings),this.$buttons=$('').appendTo(this.$footer),this.$cancelBtn=$("",{type:"button",class:"btn cancel",text:Craft.t("app","Cancel")}).appendTo(this.$buttons),this.settings.allowSavingAsNew&&(this.$saveBtn=Craft.ui.createButton({class:"save copy",label:Craft.t("app","Save as a new {type}",{type:Craft.elementTypeNames["CraftCms\\Cms\\Asset\\Elements\\Asset"][2]}),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$saveBtn,"activate",this.saveImage)),this.$replaceBtn=Craft.ui.createSubmitButton({class:"save replace",label:Craft.t("app","Save"),spinner:!0}).appendTo(this.$buttons),this.addListener(this.$replaceBtn,"activate",this.saveImage),this.addListener(this.$cancelBtn,"activate",this.hide),this.removeListener(this.$shade,"click"),this.maxImageSize=this.getMaxImageSize(),Craft.sendActionRequest("POST","assets/image-editor",{data:{assetId:t}}).then(t=>this.loadEditor(t.data));const i=document.documentElement,s=window.getComputedStyle(i);this.mediumBlueColor=s.getPropertyValue("--blue-500"),this.addLiveRegion()},getMaxImageSize:function(){var t=Garnish.$doc.get(0).documentElement.clientWidth,e=Garnish.$doc.get(0).documentElement.clientHeight;return Math.max(e,t)*(window.devicePixelRatio>1?2:1)},loadEditor:function(t){t.html||Craft.cp.displayError(Craft.t("app","Could not load the image editor.")),this.$body.html(t.html),this.$tabs=$(".tabs li",this.$body),this.$viewsContainer=$(".views",this.$body),this.$views=$("> div",this.$viewsContainer),this.$imageTools=$(".image-container .image-tools",this.$body),this.$editorContainer=$(".image-container .image",this.$body),this.$constraintContainer=$(".constraint-group",this.$body),this.$constraintRadioInputs=$('[name="constraint"]',this.$constraintContainer),this.$orientationField=$("#orientation",this.$body),this.$focalPointBtn=$(".focal-point",this.$body),this.editorHeight=this.$editorContainer.innerHeight(),this.editorWidth=this.$editorContainer.innerWidth(),this.$fabricElementEditBtn=$("[data-fabric-element]",this.$body);const e=$("#move-icon-wrapper svg").prop("outerHTML");fabric.loadSVGFromString(e,(t,e)=>{var i=fabric.util.groupSVGElements(t,e);i.set({left:0,top:0,scaleX:.03,scaleY:.03,originX:"center",originY:"center",fill:"white"}),this.moveIcon=i}),this._showSpinner(),this.updateSizeAndPosition(),$customConstraintWrapper=this.$constraintRadioInputs.filter('[value="custom"]').parent(),$customConstraintGroupLabel=$customConstraintWrapper.find("label"),this.$customConstraints=$("",{class:"constraint custom hidden","data-constraint":"custom",role:"group","aria-labelledby":$customConstraintGroupLabel.attr("id")}).append($("",{type:"text",class:"custom-constraint-w",size:3,value:1,"aria-label":Craft.t("app","Width unit")})).append($("",{class:"custom-constraint-spacer",text:"x","aria-hidden":"true"})).append($("",{type:"text",class:"custom-constraint-h",size:3,value:1,"aria-label":Craft.t("app","Height unit")})).appendTo($customConstraintWrapper),this.$constraintRadioInputs.filter(function(){const t=$(this).val();return/^\d*\.\d+$/.test(t)}).addClass("flip"),this.canvas=new fabric.StaticCanvas("image-canvas"),this.$croppingCanvas=$("#cropping-canvas",this.$editorContainer),this.$croppingCanvas.width(this.editorWidth),this.$croppingCanvas.height(this.editorHeight),this.canvas.enableRetinaScaling=!0,this.renderImage=()=>{Garnish.requestAnimationFrame(this.canvas.renderAll.bind(this.canvas))};var i=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});fabric.Image.fromURL(i,e=>{this.image=e,this.image.set({originX:"center",originY:"center",left:this.editorWidth/2,top:this.editorHeight/2}),this.canvas.add(this.image),this.originalHeight=this.image.getHeight(),this.originalWidth=this.image.getWidth(),this.zoomRatio=1,this.lastLoadedDimensions=this.getScaledImageDimensions(),this._setFittedImageVerticeCoordinates(),this._repositionEditorElements();var i={imageDimensions:this.getScaledImageDimensions(),offsetX:0,offsetY:0},s=!1;if(t.focalPoint){var n=t.focalPoint,a=i.imageDimensions.width*n.x,r=i.imageDimensions.height*n.y;i.offsetX=a-i.imageDimensions.width/2,i.offsetY=r-i.imageDimensions.height/2,s=!0}this.storeFocalPointState(i),s&&this._createFocalPoint(),this._createViewport(),this.storeCropperState(),this._addControlListeners(),this.addListener(this.$croppingCanvas,"mousemove,touchmove",this._handleMouseMove),this.addListener(this.$croppingCanvas,"mousedown,touchstart",this._handleMouseDown),this.addListener(this.$croppingCanvas,"mouseup,touchend",this._handleMouseUp),this.addListener(this.$croppingCanvas,"mouseout,touchcancel",this._handleMouseOut),this._hideSpinner(),this.renderImage(),this.$tabs.first().trigger("click")})},_reloadImage:function(){if(!this.imageIsLoading){this.imageIsLoading=!0,this.maxImageSize=this.getMaxImageSize();var t=Craft.getActionUrl("assets/edit-image",{assetId:this.assetId,size:this.maxImageSize,cacheBust:this.cacheBust});this.image.setSrc(t,t=>{this.originalHeight=t.getHeight(),this.originalWidth=t.getWidth(),this.lastLoadedDimensions={width:this.originalHeight,height:this.originalWidth},this.updateSizeAndPosition(),this.renderImage(),this.imageIsLoading=!1})}},updateSizeAndPosition:function(){if(this.$container){var t=window.innerWidth,e=window.innerHeight;this.$container.css({width:t,"min-width":t,left:0,height:e,"min-height":e,top:0}),this.$body.css({height:e-(this.$footer.outerHeight()-1)}),t1.5||e.height/this.lastLoadedDimensions.height>1.5)&&this._reloadImage()},_repositionImage:function(t){this.image.set({left:this.image.left-(t.width-this.editorWidth)/2,top:this.image.top-(t.height-this.editorHeight)/2})},_createViewport:function(){this.viewport=new fabric.Rect({width:this.image.width,height:this.image.height,fill:"rgba(127,0,0,1)",originX:"center",originY:"center",globalCompositeOperation:"destination-in",left:this.image.left,top:this.image.top}),this.canvas.add(this.viewport),this.renderImage()},_createFocalPoint:function(){var t=this.focalPointState,e=this.getScaledImageDimensions().width/t.imageDimensions.width,i=t.offsetX*e*this.zoomRatio*this.scaleFactor,s=t.offsetY*e*this.zoomRatio*this.scaleFactor;i+=this.image.left,s+=this.image.top;var n=0,a=0;this.viewport&&0===t.offsetX&&0===t.offsetY&&("crop"!==this.currentView?(n=this.viewport.left-this.image.left,a=this.viewport.top-this.image.top):(n=this.clipper.left-this.image.left,a=this.clipper.top-this.image.top),i+=n,s+=a,t.offsetX+=n/(e*this.zoomRatio*this.scaleFactor),t.offsetY+=a/(e*this.zoomRatio*this.scaleFactor)),this.focalPointOuterCircle=new fabric.Circle({radius:8,fill:"rgba(0,0,0,0.5)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),this.focalPointInnerCircle=new fabric.Circle({radius:1,fill:"rgba(255,255,255,0)",strokeWidth:2,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),this.focalPointPickedIndicator=new fabric.Circle({radius:12,strokeWidth:0,stroke:"rgba(255,255,255,0.8)",left:0,top:0,originX:"center",originY:"center"}),this.focalPoint=new fabric.Group([this.focalPointPickedIndicator,this.focalPointOuterCircle,this.focalPointInnerCircle],{originX:"center",originY:"center",left:i,top:s}),this.storeFocalPointState(t),this.canvas.add(this.focalPoint)},toggleFocalPoint:function(){this.focalPoint?(this.prevFocalPoint=this.focalPoint,this.canvas.remove(this.focalPoint),this.focalPoint=null):(this._createFocalPoint(),this.prevFocalPoint=null),this.renderImage()},_repositionViewport:function(){if(this.viewport){var t={left:this.editorWidth/2,top:this.editorHeight/2};if("crop"===this.currentView)t.width=this.editorWidth,t.height=this.editorHeight;else if(this.cropperState){var e=this.cropperState,i=this.getScaledImageDimensions().width/e.imageDimensions.width;t.width=e.width*i*this.zoomRatio,t.height=e.height*i*this.zoomRatio,this.image.set({left:this.editorWidth/2-e.offsetX*i,top:this.editorHeight/2-e.offsetY*i})}else $.extend(t,this.getScaledImageDimensions());this.viewport.set(t)}},_repositionFocalPoint:function(t){if(this.focalPoint){var e=this.focalPoint.left-this.editorWidth/2,i=this.focalPoint.top-this.editorHeight/2,s=this.image.width,n=this.getScaledImageDimensions().width*this.zoomRatio/s/this.scaleFactor;e-=(t.width-this.editorWidth)/2,i-=(t.height-this.editorHeight)/2,e*=n,i*=n,this.focalPoint.set({left:this.editorWidth/2+e,top:this.editorHeight/2+i})}},hasOrientationChanged:function(){return this.viewportRotation%180!=0},getScaledImageDimensions:function(){return void 0===this.getScaledImageDimensions._&&(this.getScaledImageDimensions._={}),this.getScaledImageDimensions._.imageRatio=this.originalHeight/this.originalWidth,this.getScaledImageDimensions._.editorRatio=this.editorHeight/this.editorWidth,this.getScaledImageDimensions._.dimensions={},this.getScaledImageDimensions._.imageRatio>this.getScaledImageDimensions._.editorRatio?(this.getScaledImageDimensions._.dimensions.height=Math.min(this.editorHeight,this.originalHeight),this.getScaledImageDimensions._.dimensions.width=Math.round(this.originalWidth/(this.originalHeight/this.getScaledImageDimensions._.dimensions.height))):(this.getScaledImageDimensions._.dimensions.width=Math.min(this.editorWidth,this.originalWidth),this.getScaledImageDimensions._.dimensions.height=Math.round(this.originalHeight*(this.getScaledImageDimensions._.dimensions.width/this.originalWidth))),this.getScaledImageDimensions._.dimensions},_zoomImage:function(){void 0===this._zoomImage._&&(this._zoomImage._={}),this._zoomImage._.imageDimensions=this.getScaledImageDimensions(),this.image.set({width:this._zoomImage._.imageDimensions.width*this.zoomRatio,height:this._zoomImage._.imageDimensions.height*this.zoomRatio})},_getPrevTab:function(){const t=this._getActiveTabIndex();if(t<0)return;let e;return e=t>0?t-1:this.$tabs.length-1,this.$tabs.eq(e)},_getNextTab:function(){const t=this._getActiveTabIndex();if(t<0)return;let e;return e=t{switch(t.keyCode){case Garnish.LEFT_KEY:case Garnish.UP_KEY:t.preventDefault();const e=this._getPrevTab();this.activateTab(e);break;case Garnish.RIGHT_KEY:case Garnish.DOWN_KEY:t.preventDefault();const i=this._getNextTab();this.activateTab(i)}}),this.addListener($(".rotate-left"),"click",function(){this.rotateImage(-90)}),this.addListener($(".rotate-right"),"click",function(){this.rotateImage(90)}),this.addListener($(".flip-vertical"),"click",function(){this.flipImage("y")}),this.addListener($(".flip-horizontal"),"click",function(){this.flipImage("x")}),this.addListener(this.$fabricElementEditBtn,"click",t=>{this._handleEditButtonClick(t)}),this.addListener(this.$fabricElementEditBtn,"keydown",t=>{this.dragEditMode=!1,this._handleKeydownOnFabricElementEditBtn(t)}),this.addListener(Garnish.$doc,"focusin",t=>{const e=$(t.target).is(this.$fabricElementEditBtn),i=this.handleFocusIndicator||this.rectangleHasFocusOutline;(e||i&&!e)&&(this.focusedEditButton=e?$(t.target):null,this._resetEditState(),this.clipper&&(this._redrawCropperElements(),this.renderCropper()))}),this.straighteningInput=document.getElementById("slide-rule"),this.straighteningInput.addEventListener("start",()=>{this._showGrid()}),this.straighteningInput.addEventListener("change",()=>{this.straighten(this.straighteningInput)}),this.straighteningInput.addEventListener("end",()=>{this._hideGrid(),this._cleanupFocalPointAfterStraighten()}),this.addListener(Garnish.$doc,"keydown",function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!0)}),this.addListener(Garnish.$doc,"keyup",function(t){t.keyCode===Garnish.SHIFT_KEY&&(this.shiftKeyHeld=!1)}),this.addListener(this.$constraintRadioInputs,"change",this._handleConstraintChange),this.orientationBtnGroup=new Craft.Listbox(this.$orientationField,{onChange:t=>{this._handleOrientationClick(t)}}),this.addListener($(".constraint-group .custom input",this.$container),"keyup",this._applyCustomConstraint)},_handleConstraintClick:function(t){var e=$(t.currentTarget).data("constraint"),i=$(t.currentTarget);if(i.siblings().removeClass("active"),i.addClass("active"),"custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleConstraintChange:function(t){const e=$(t.target).val();if("custom"==e)return this._showCustomConstraint(),void this._applyCustomConstraint();this._hideCustomConstraint(),this.setCroppingConstraint(e),this.enforceCroppingConstraint()},_handleOrientationClick:function(t){if(t.data("value")===this.constraintOrientation)return;this.constraintOrientation=t.data("value");const e=$(".flip",this.$constraintContainer);for(var i=0;i0&&t.h>0&&(this.setCroppingConstraint(t.w/t.h),this.enforceCroppingConstraint())},_getCustomConstraint:function(){var t=parseFloat($(".custom-constraint-w").val()),e=parseFloat($(".custom-constraint-h").val());return{w:isNaN(t)?0:t,h:isNaN(e)?0:e}},_setCustomConstraint:function(t,e){$(".custom-constraint-w").val(parseFloat(t)),$(".custom-constraint-h").val(parseFloat(e))},_hideCustomConstraint:function(){this.showingCustomConstraint=!1,this.$customConstraints.addClass("hidden"),$(".orientation",this.$container).removeClass("hidden")},_showCustomConstraint:function(){this.showingCustomConstraint||(this.showingCustomConstraint=!0,this.$customConstraints.removeClass("hidden"),$(".orientation",this.$container).addClass("hidden"))},_handleTabClick:function(t){if(!this.animationInProgress){var e=$(t.currentTarget);this.activateTab(e)}},activateTab:function(t){const e=$(t).data("view");this.$tabs.removeClass("selected").attr({"aria-selected":"false",tabindex:"-1"}),$(t).addClass("selected").attr({"aria-selected":"true",tabindex:"0"}).focus(),this.showView(e)},showView:function(t){this.currentView!==t&&(this.$views.addClass("hidden"),this.$views.filter('[data-view="'+t+'"]').removeClass("hidden"),"rotate"===t?this.enableSlider():this.disableSlider(),this.updateSizeAndPosition(),"crop"===this.currentView&&"crop"!==t?this._queue.push(()=>new Promise((t,e)=>{this.disableCropMode(),t()})):"crop"!==this.currentView&&"crop"===t&&this._queue.push(()=>new Promise((t,e)=>{this.enableCropMode(),t()})),this.currentView=t)},storeCropperState:function(t){void 0===this.storeCropperState._&&(this.storeCropperState._={}),t?this.cropperState=t:this.clipper?(this.storeCropperState._.zoomFactor=1/this.zoomRatio,this.cropperState={offsetX:(this.clipper.left-this.image.left)*this.storeCropperState._.zoomFactor,offsetY:(this.clipper.top-this.image.top)*this.storeCropperState._.zoomFactor,height:this.clipper.height*this.storeCropperState._.zoomFactor,width:this.clipper.width*this.storeCropperState._.zoomFactor,imageDimensions:this.getScaledImageDimensions()}):(this.storeCropperState._.dimensions=this.getScaledImageDimensions(),this.cropperState={offsetX:0,offsetY:0,height:this.storeCropperState._.dimensions.height,width:this.storeCropperState._.dimensions.width,imageDimensions:this.storeCropperState._.dimensions})},storeFocalPointState:function(t){void 0===this.storeFocalPointState._&&(this.storeFocalPointState._={}),t?this.focalPointState=t:this.focalPoint&&(this.storeFocalPointState._.zoomFactor=1/this.zoomRatio,this.focalPointState={offsetX:(this.focalPoint.left-this.image.left)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,offsetY:(this.focalPoint.top-this.image.top)*this.storeFocalPointState._.zoomFactor/this.scaleFactor,imageDimensions:this.getScaledImageDimensions()})},rotateImage:function(t){if(!this.animationInProgress){if(90!==t&&-90!==t)return!1;this.animationInProgress=!0,this.viewportRotation+=t,this.viewportRotation=parseInt((this.viewportRotation+360)%360,10);var e,i=this.image.angle+t,s=this.getScaledImageDimensions();e=this.hasOrientationChanged()?this.getZoomToCoverRatio({height:s.width,width:s.height}):this.getZoomToCoverRatio(s),this.zoomRatio>e&&(e=this.zoomRatio);var n={angle:90===t?"+=90":"-=90"},a={angle:i,width:s.width*e,height:s.height*e},r=1;this.scaleFactor<1?(r=1/this.scaleFactor,this.scaleFactor=1):(this.viewport.width>this.editorHeight?r=this.editorHeight/this.viewport.width:this.viewport.height>this.editorWidth&&(r=this.editorWidth/this.viewport.height),this.scaleFactor=r),r<1&&(a.width*=r,a.height*=r);var o=this.cropperState,l=o.offsetX,h=o.offsetY,c=t*(Math.PI/180),d=l*Math.cos(c)-h*Math.sin(c),u=l*Math.sin(c)+h*Math.cos(c),p=s.width/o.imageDimensions.width,f=d*p*this.zoomRatio*this.scaleFactor,g=u*p*this.zoomRatio*this.scaleFactor;a.left=this.editorWidth/2-f,a.top=this.editorHeight/2-g,o.offsetX=d,o.offsetY=u;var m=o.width;o.width=o.height,o.height=m,this.storeCropperState(o),this.focalPoint&&this.canvas.remove(this.focalPoint),this.viewport.animate(n,{duration:this.settings.animationDuration,onComplete:()=>{var t=this.viewport.height*r;this.viewport.height=this.viewport.width*r,this.viewport.width=t,this.viewport.set({angle:0})}}),this.image.animate(a,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:()=>{var e=parseFloat((this.image.angle+360)%360);this.image.set({angle:e}),this.animationInProgress=!1,this.focalPoint?(this._adjustFocalPointByAngle(t),this.straighten(this.straighteningInput),this.canvas.add(this.focalPoint)):this._resetFocalPointPosition()}})}},flipImage:function(t){if(!this.animationInProgress){this.animationInProgress=!0,this.hasOrientationChanged()&&(t="y"===t?"x":"y"),this.focalPoint?this.canvas.remove(this.focalPoint):this._resetFocalPointPosition();var e={x:this.editorWidth/2,y:this.editorHeight/2};this.straighteningInput.value=-this.imageStraightenAngle,this.imageStraightenAngle=-this.imageStraightenAngle;var i,s,n={angle:this.viewportRotation+this.imageStraightenAngle},a=this.cropperState,r=this.focalPointState;"y"===t&&this.hasOrientationChanged()||"y"!==t&&!this.hasOrientationChanged()?(a.offsetX=-a.offsetX,r.offsetX=-r.offsetX,s=this.image.left-e.x,n.left=e.x-s):(a.offsetY=-a.offsetY,r.offsetY=-r.offsetY,i=this.image.top-e.y,n.top=e.y-i),"y"===t?(n.scaleY=-1*this.image.scaleY,this.flipData.y=1-this.flipData.y):(n.scaleX=-1*this.image.scaleX,this.flipData.x=1-this.flipData.x),this.storeCropperState(a),this.storeFocalPointState(r);var o=this.image._set;this.image._set=function(t,e){return"scaleX"===t||"scaleY"===t?(this[t]=e,this.dirty=!0,this):o.call(this,t,e)},this.image.flipX=!1,this.image.flipY=!1,this.image.animate(n,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:()=>{this.image._set=o,this.animationInProgress=!1,this.focalPoint&&(this._adjustFocalPointByAngle(0),this.canvas.add(this.focalPoint))}})}},straighten:function(t){if(!this.animationInProgress){this.animationInProgress=!0;var e=this.image.angle;this.imageStraightenAngle=(this.settings.allowDegreeFractions?parseFloat(t.value):Math.round(parseFloat(t.value)))%360,this.image.set({angle:this.viewportRotation+this.imageStraightenAngle}),this.zoomRatio=this.getZoomToCoverRatio(this.getScaledImageDimensions())*this.scaleFactor,this._zoomImage(),this.cropperState&&this._adjustEditorElementsOnStraighten(e),this.renderImage(),this.animationInProgress=!1}},_adjustEditorElementsOnStraighten:function(t){var e,i,s,n,a,r=this.getScaledImageDimensions(),o=this.image.angle-t,l=this.cropperState,h=this.zoomRatio,c=1;do{var d=l.offsetX,u=l.offsetY,p=o*(Math.PI/180);s=d*Math.cos(p)-u*Math.sin(p),n=d*Math.sin(p)+u*Math.cos(p),e=s*h*(a=r.width/l.imageDimensions.width),i=n*h*a;var f=this.getImageVerticeCoords(h),g={width:this.viewport.width,height:this.viewport.height,left:this.editorWidth/2-this.viewport.width/2+e,top:this.editorHeight/2-this.viewport.height/2+i};h*=c=this._getZoomRatioToFitRectangle(g,f)}while(1!==c);this.image.set({left:this.editorWidth/2-e,top:this.editorHeight/2-i}),l.offsetX=s,l.offsetY=n,l.width=this.viewport.width/h/a,l.height=this.viewport.height/h/a,this.storeCropperState(l),this.zoomRatio=h,this.focalPoint?(this._adjustFocalPointByAngle(o),this._isCenterInside(this.focalPoint,this.viewport)?this.focalPoint.set({opacity:1}):this.focalPoint.set({opacity:0})):0!==o&&this._resetFocalPointPosition(),this._zoomImage()},_cleanupFocalPointAfterStraighten:function(){if(this.focalPoint&&!this._isCenterInside(this.focalPoint,this.viewport)){this.focalPoint.set({opacity:1});var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t),this.toggleFocalPoint()}},_resetFocalPointPosition:function(){var t=this.focalPointState;t.offsetX=0,t.offsetY=0,this.storeFocalPointState(t)},_isCenterInside:function(t,e){return t.left>e.left-e.width/2&&t.top>e.top-e.height/2&&t.left{this.onSave(t),i&&Craft.broadcaster&&Craft.broadcaster.postMessage({event:"saveElement",id:this.assetId}),this.hide(),Craft.cp.runQueue(),Craft.Preview.refresh()}).catch(({response:t})=>{Craft.cp.displayError(t.data.message)}).finally(()=>{this.$buttons.find(".btn").removeClass("loading"),this.saving=!1})},getZoomToCoverRatio:function(t){var e=Math.abs(this.imageStraightenAngle)*(Math.PI/180),i=Math.sin(e)*t.height+Math.cos(e)*t.width,s=Math.sin(e)*t.width+Math.cos(e)*t.height;return Math.max(i/t.width,s/t.height)},getZoomToFitRatio:function(t){var e=this._getImageBoundingBox(t),i=1;if(e.height>this.editorHeight||e.width>this.editorWidth){var s=this.editorHeight/e.height,n=this.editorWidth/e.width;i=Math.min(n,s)}return i},getCombinedZoomRatio:function(t){return this.getZoomToCoverRatio(t)/this.getZoomToFitRatio(t)},_showGrid:function(){if(!this.grid){var t,e={strokeWidth:1,stroke:"rgba(255,255,255,0.5)"},i=this.viewport.width,s=this.viewport.height,n=i/9,a=s/9,r=[new fabric.Rect({strokeWidth:2,stroke:this.settings.colors.white,originX:"center",originY:"center",width:i,height:s,left:i/2,top:s/2,fill:"rgba(255,255,255,0)"})];for(t=1;t<=8;t++)r.push(new fabric.Line([t*n,0,t*n,s],e));for(t=1;t<=8;t++)r.push(new fabric.Line([0,t*a,i,t*a],e));this.grid=new fabric.Group(r,{left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",angle:this.viewport.angle}),this.canvas.add(this.grid),this.renderImage()}},_hideGrid:function(){this.canvas.remove(this.grid),this.grid=null,this.renderImage()},onFadeOut:function(){this.destroy()},show:function(){this.base(),Garnish.$bod.addClass("no-scroll")},hide:function(){this.removeAllListeners(),Garnish.$bod.removeClass("no-scroll"),this.base()},onSave:function(t){this.settings.onSave(t),this.trigger("save")},enableSlider:function(){this.$imageTools.removeClass("hidden")},disableSlider:function(){this.$imageTools.addClass("hidden")},enableCropMode:function(){var t=this.getScaledImageDimensions();this.zoomRatio=this.getZoomToFitRatio(t);var e={width:this.editorWidth,height:this.editorHeight},i={width:t.width*this.zoomRatio,height:t.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2};this._editorModeTransition(()=>{this._setFittedImageVerticeCoordinates();var t=this.cropperState,e=this.getScaledImageDimensions(),i=e.width/t.imageDimensions.width,s={left:this.image.left+t.offsetX*i*this.zoomRatio,top:this.image.top+t.offsetY*i*this.zoomRatio,width:t.width*i*this.zoomRatio,height:t.height*i*this.zoomRatio};this._showCropper(s),this.focalPoint&&(i=e.width/this.focalPointState.imageDimensions.width,this.focalPoint.left=this.image.left+this.focalPointState.offsetX*i*this.zoomRatio,this.focalPoint.top=this.image.top+this.focalPointState.offsetY*i*this.zoomRatio,this.canvas.add(this.focalPoint))},i,e)},disableCropMode:function(){var t={};this._hideCropper();var e=this.getScaledImageDimensions(),i=this.getZoomToCoverRatio(e)*this.scaleFactor,s=i/this.zoomRatio;this.zoomRatio=i;var n={width:e.width*this.zoomRatio,height:e.height*this.zoomRatio,left:this.editorWidth/2,top:this.editorHeight/2},a=(this.clipper.left-this.image.left)*s,r=(this.clipper.top-this.image.top)*s;n.left=this.editorWidth/2-a,n.top=this.editorHeight/2-r,t.height=this.clipper.height*s,t.width=this.clipper.width*s,(!this.focalPoint||this.focalPoint&&!this._isCenterInside(this.focalPoint,this.clipper))&&(this.focalPoint&&this.toggleFocalPoint(),this._resetFocalPointPosition()),this._editorModeTransition(()=>{if(this.focalPoint){var t=this.getScaledImageDimensions().width/this.focalPointState.imageDimensions.width;this.focalPoint.left=this.image.left+this.focalPointState.offsetX*t*this.zoomRatio,this.focalPoint.top=this.image.top+this.focalPointState.offsetY*t*this.zoomRatio,this.canvas.add(this.focalPoint)}},n,t)},_editorModeTransition:function(t,e,i){this._queue.pause(),this.animationInProgress||(this.animationInProgress=!0,this.focalPoint&&(this.canvas.remove(this.focalPoint),this.renderImage()),this.image.animate(e,{onChange:this.canvas.renderAll.bind(this.canvas),duration:this.settings.animationDuration,onComplete:()=>{t(),this.animationInProgress=!1,this.renderImage(),this._queue.resume()}}),this.viewport.animate(i,{duration:this.settings.animationDuration}))},_showSpinner:function(){this.$spinner||(this.$spinner=$('')),this.$spinner.appendTo(this.$container.find(".image"))},_hideSpinner:function(){this.$spinner.remove()},_showCropper:function(t){this._setupCropperLayer(t),this._redrawCropperElements(),this.renderCropper()},_hideCropper:function(){this.clipper&&(this.croppingCanvas.remove(this.clipper),this.croppingCanvas.remove(this.croppingShade),this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle),this.croppingCanvas=null,this.renderCropper=null)},_setupCropperLayer:function(t){this.croppingCanvas=new fabric.StaticCanvas("cropping-canvas",{backgroundColor:this.settings.colors.transparent,hoverCursor:"default",selection:!1}),this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight}),this.renderCropper=()=>Garnish.requestAnimationFrame(this.croppingCanvas.renderAll.bind(this.croppingCanvas)),$("#cropping-canvas",this.$editorContainer).css({position:"absolute",top:0,left:0}),this.croppingShade=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:this.editorWidth,height:this.editorHeight,fill:this.settings.colors.transparentBlack});var e=this.getScaledImageDimensions(),i=0===this.imageStraightenAngle?1:1.2*this.getCombinedZoomRatio(e),s=e.width/i,n=e.height/i;if(this.hasOrientationChanged()){var a=n;n=s,s=a}this.clipper=new fabric.Rect({left:this.editorWidth/2,top:this.editorHeight/2,originX:"center",originY:"center",width:s,height:n,stroke:"black",fill:"rgba(128,0,0,1)",strokeWidth:0}),t&&this.clipper.set(t),this.clipper.globalCompositeOperation="destination-out",this.croppingCanvas.add(this.croppingShade),this.croppingCanvas.add(this.clipper)},_redrawCropperElements:function(){this.croppingCanvas&&(void 0===this._redrawCropperElements._&&(this._redrawCropperElements._={}),this.cropperHandles&&(this.croppingCanvas.remove(this.cropperHandles),this.croppingCanvas.remove(this.cropperGrid),this.croppingCanvas.remove(this.croppingRectangle)),this.handleFocusIndicator&&(this.croppingCanvas.remove(this.handleFocusIndicator),this.handleFocusIndicator=null),this._redrawCropperElements._.lineOptions={strokeWidth:4,stroke:this.settings.colors.white,fill:!1},this._redrawCropperElements._.gridOptions={strokeWidth:2,stroke:"rgba(255,255,255,0.5)"},this._redrawCropperElements._.pathGroup=[new fabric.Path("M 0,10 L 0,0 L 10,0",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width-8)+",0 L "+(this.clipper.width+4)+",0 L "+(this.clipper.width+4)+",10",this._redrawCropperElements._.lineOptions),new fabric.Path("M "+(this.clipper.width+4)+","+(this.clipper.height-8)+" L"+(this.clipper.width+4)+","+(this.clipper.height+4)+" L "+(this.clipper.width-8)+","+(this.clipper.height+4),this._redrawCropperElements._.lineOptions),new fabric.Path("M 10,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height+4)+" L 0,"+(this.clipper.height-8),this._redrawCropperElements._.lineOptions)],this.cropperHandles=new fabric.Group(this._redrawCropperElements._.pathGroup,{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this.handleFocusIndicator=this._getHandleFocusIndicator(),this.croppingRectangle=this._getCroppingRectangle(),this.cropperGrid=new fabric.Group([new fabric.Line([.33*this.clipper.width,0,.33*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([.66*this.clipper.width,0,.66*this.clipper.width,this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.33*this.clipper.height,this.clipper.width,.33*this.clipper.height],this._redrawCropperElements._.gridOptions),new fabric.Line([0,.66*this.clipper.height,this.clipper.width,.66*this.clipper.height],this._redrawCropperElements._.gridOptions)],{left:this.clipper.left,top:this.clipper.top,originX:"center",originY:"center"}),this._redrawCropperElements._.cropTextTop=this.croppingRectangle.top+this.clipper.height/2+12,this._redrawCropperElements._.cropTextBackgroundColor=this.settings.colors.transparent,this._redrawCropperElements._.cropTextTop+12>this.editorHeight-2&&(this._redrawCropperElements._.cropTextTop-=24,this._redrawCropperElements._.cropTextBackgroundColor="rgba(0,0,0,0.5)"),this.croppingCanvas.add(this.croppingRectangle),this.croppingCanvas.add(this.cropperHandles),this.croppingCanvas.add(this.cropperGrid),this.handleFocusIndicator&&this.croppingCanvas.add(this.handleFocusIndicator))},_resetEditState:function(){this.cropperPickedUp=!1,this.handlePicked=!1,this.focalPickedUp=!1},_getRectangleButtonIsFocused:function(){if(this.focusedEditButton)return"rectangle"===this._getElementHandleFromButton(this.focusedEditButton)},_getHandleButtonIsFocused:function(){if(this.focusedEditButton){const t=this._getElementHandleFromButton(this.focusedEditButton);return"rectangle"!==t&&"focalpoint"!==t}},_getCroppingRectangle:function(){const t=this.clipper.width,e=this.clipper.height;this.rectangleHasFocusOutline=!1;const i={fill:this.settings.colors.transparent,top:0,left:0,strokeWidth:2,originX:"center",originY:"center"},s=new fabric.Rect({width:t+8,height:e+8,stroke:null,...i}),n=new fabric.Rect({width:t+4,height:e+4,stroke:null,...i}),a=new fabric.Rect({width:t,height:e,stroke:this.settings.colors.white,...i}),r=new fabric.Group([s,n,a],{originX:"center",originY:"center",left:this.clipper.left,top:this.clipper.top});if((this.cropperPickedUp||this._getRectangleButtonIsFocused())&&(this.rectangleHasFocusOutline=!0,s.set({stroke:this.settings.colors.white}),n.set({stroke:this.mediumBlueColor}),this.cropperPickedUp)){const t=new fabric.Circle({fill:this.settings.colors.black,top:0,left:0,radius:15,stroke:this.settings.colors.white,strokeWidth:2,originX:"center",originY:"center"});r.add(t),r.add(this.moveIcon)}return r},_getHandleFocusIndicator:function(){if(this.dragEditMode||!this._getHandleButtonIsFocused()&&!this.handlePicked)return;const t=this.handlePicked?this.handlePicked:this._getElementHandleFromButton(this.focusedEditButton);let e=this._getClipperHandlePosition(t);const i={fill:null,strokeWidth:3,left:0,top:0,originX:"center",originY:"center"},s=new fabric.Circle({radius:12,stroke:this.mediumBlueColor,...i}),n=new fabric.Circle({radius:15,stroke:this.settings.colors.white,...i}),a=new fabric.Circle({radius:18,stroke:this.mediumBlueColor,...i}),r=new fabric.Group([a,n,s],{originX:"center",originY:"center",left:e.x,top:e.y});return this.handlePicked&&(r.add(this.moveIcon),r.item(0).set({fill:this.settings.colors.transparentBlack})),r},_repositionCropper:function(t){if(this.croppingCanvas){var e=this.clipper.left-this.croppingCanvas.width/2,i=this.clipper.top-this.croppingCanvas.height/2;this.croppingCanvas.setDimensions({width:this.editorWidth,height:this.editorHeight});var s=this._getBoundingRectangle(this.imageVerticeCoords).width/t.width;this.clipper.width=Math.round(this.clipper.width*s),this.clipper.height=Math.round(this.clipper.height*s),this.clipper.left=this.editorWidth/2+e*s,this.clipper.top=this.editorHeight/2+i*s,this.croppingShade.set({width:this.editorWidth,height:this.editorHeight,left:this.editorWidth/2,top:this.editorHeight/2}),this._redrawCropperElements(),this.renderCropper()}},_getBoundingRectangle:function(t){return{width:Math.max(t.a.x,t.b.x,t.c.x,t.d.x)-Math.min(t.a.x,t.b.x,t.c.x,t.d.x),height:Math.max(t.a.y,t.b.y,t.c.y,t.d.y)-Math.min(t.a.y,t.b.y,t.c.y,t.d.y)}},_handleEditButtonClick:function(t){const e=$(t.target.closest("button")),i="true"===e.attr("aria-pressed"),s=this._getElementHandleFromButton(e);"focalpoint"===s&&this.toggleFocalPoint(),i?this._dropFabricElement(s):(this.dragEditMode=!1,this._pickUpFabricElement(s))},_getRelativePositionMessage:function(t){if(t.left&&t.top)return`Centered at X axis: ${((t.left-this.image.left+this.image.width/2)/this.image.width*100).toFixed(1)}%, Y axis: ${((t.top-this.image.top+this.image.height/2)/this.image.height*100).toFixed(1)}%.`},_getSizeAndRelativePositionMessage:function(t){const e=this._getRelativePositionMessage(t);return`Crop rectangle width: ${t.width}px, height:${t.height}px. ${e}`},_announce:function(t){this.announceTimeout&&clearTimeout(this.announceTimeout),this.announceTimeout=setTimeout(()=>{Craft.cp.announce(t),this.announceTimeout=null},300)},_getElementHandleFromButton:function(t){return $(t).attr("data-fabric-element")},_getEditButtonFromElementHandle:function(t){return this.$fabricElementEditBtn.filter(`[data-fabric-element="${t}"]`)},_pickUpFabricElement:function(t){this._resetEditState();let e="",i="",s="";const n=this._getEditButtonFromElementHandle(t);n.attr("aria-pressed","true");const a=n.attr("data-item-name");"rectangle"===t?(this.cropperPickedUp=!0,i=this._getRelativePositionMessage(this.clipper)):"focalpoint"===t?(this.focalPickedUp=!0,i=this._getRelativePositionMessage(this.focalPoint)):this.handlePicked=t,e=Craft.t("app","{item} picked up.",{item:a}),s+=Craft.t("app","Use the arrow keys to change position, Tab or Spacebar to drop."),this._announce(`${e} ${i} ${s}`),this.renderCropper&&(this._redrawCropperElements(),this.renderCropper())},_dropFabricElement:function(t){const e=this._getEditButtonFromElementHandle(t),i=e.attr("data-item-name");let s="";"rectangle"===t?s=this._getRelativePositionMessage(this.clipper):"focalpoint"===t&&(s=this._getRelativePositionMessage(this.prevFocalPoint)),this._resetEditState(),e.attr("aria-pressed","false");const n=Craft.t("app","{item} dropped.",{item:i});this._announce(`${n} ${s}`),this.renderCropper&&(this._redrawCropperElements(),this.renderCropper())},_toggleFocalModeStyles:function(){let t,e;this.focalPickedUp?(t=2,e="rgba(0,0,0,0.5)",$(".body").css("cursor","grabbing")):(t=0,e=this.settings.colors.transparent,$(".body").css("cursor","pointer")),this.focalPointPickedIndicator.set({strokeWidth:t,fill:e}),this.canvas.renderAll()},_handleKeydownOnFabricElementEditBtn:function(t){const{target:e}=t;(this.focalPoint||this.cropperPickedUp||this.handlePicked)&&[Garnish.LEFT_KEY,Garnish.RIGHT_KEY,Garnish.UP_KEY,Garnish.DOWN_KEY].includes(t.keyCode)&&(event.preventDefault(),this._handleFabricElementKeyboardEdit(t))},_handleMouseDown:function(t){this.dragEditMode=!0;var e=this.focalPoint&&this._isMouseOver(t,this.focalPoint),i=this.croppingCanvas&&this._isMouseOver(t,this.clipper),s=this.croppingCanvas&&this._cropperHandleHitTest(t);(s||i||e)&&(this.previousMouseX=t.pageX,this.previousMouseY=t.pageY,e?this.focalClicked=!0:s?this.handlePicked=s:i&&(this.cropperClicked=!0))},_handleMouseMove:function(t){null!==this.mouseMoveEvent&&Garnish.requestAnimationFrame(this._handleMouseMoveInternal.bind(this)),this.mouseMoveEvent=t},_handleMouseMoveInternal:function(){null!==this.mouseMoveEvent&&(this.dragEditMode&&(this.focalPoint&&this.focalClicked?(this.draggingFocal=!0,this._handleFocalDrag(this.mouseMoveEvent),this.storeFocalPointState(),this.renderImage()):(this.cropperClicked||this.handlePicked)&&(this.cropperClicked?(this.draggingCropper=!0,this._handleCropperDrag(this.mouseMoveEvent)):(this.scalingCropper=!0,this._handleCropperResize(this.mouseMoveEvent)),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper())),this._setMouseCursor(this.mouseMoveEvent),this.previousMouseX=this.mouseMoveEvent.pageX,this.previousMouseY=this.mouseMoveEvent.pageY,this.mouseMoveEvent=null)},_handleMouseUp:function(t){this.focalClicked?this.draggingFocal||(this.focalPickedUp=!this.focalPickedUp,this._toggleFocalModeStyles()):!this.focalPickedUp||this.draggingFocal||this.draggingCropper||this.scalingCropper||this._handleFocalClickToMove(t),this.draggingCropper=!1,this.cropperClicked=!1,this.scalingCropper=!1,this.handlePicked=!1,this.draggingFocal=!1,this.focalClicked=!1},_handleMouseOut:function(t){this._handleMouseUp(t),this.mouseMoveEvent=t,this._handleMouseMoveInternal()},_handleFocalClickToMove:function(t){if(void 0===this._handleFocalClickToMove._&&(this._handleFocalClickToMove._={}),!this.focalPoint)return;this.focalPoint.get("left"),this.focalPoint.get("top");const e=this.$croppingCanvas.offset(),i=e.left,s=e.top;if(this._handleFocalClickToMove._.newX=t.pageX-i,this._handleFocalClickToMove._.newY=t.pageY-s,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._handleFocalClickToMove._.newX,y:this._handleFocalClickToMove._.newY}],this.imageVerticeCoords))return}else if(!this.isPointInsideViewport({x:this._handleFocalClickToMove._.newX,y:this._handleFocalClickToMove._.newY}))return;this.focalPoint.set({left:this._handleFocalClickToMove._.newX,top:this._handleFocalClickToMove._.newY}),this.storeFocalPointState(),this.renderImage()},_getClipperRectProperties:function(){return{left:this.clipper.left-this.clipper.width/2,top:this.clipper.top-this.clipper.height/2,width:this.clipper.width,height:this.clipper.height}},_getClipperHandlePosition:function(t){let e={x:null,y:null};switch(t){case"tl":e.x=this.clipper.left-this.clipper.width/2,e.y=this.clipper.top-this.clipper.height/2;break;case"t":e.x=this.clipper.left,e.y=this.clipper.top-this.clipper.height/2;break;case"b":e.x=this.clipper.left,e.y=this.clipper.top+this.clipper.height/2;break;case"tr":e.x=this.clipper.left+this.clipper.width/2,e.y=this.clipper.top-this.clipper.height/2;break;case"r":e.x=this.clipper.left+this.clipper.width/2,e.y=this.clipper.top;break;case"l":e.x=this.clipper.left-this.clipper.width/2,e.y=this.clipper.top;break;case"br":e.x=this.clipper.left+this.clipper.width/2,e.y=this.clipper.top+this.clipper.height/2;break;case"bl":e.x=this.clipper.left-this.clipper.width/2,e.y=this.clipper.top+this.clipper.height/2}return e},_handleFabricElementKeyboardEdit:function(t){let e;switch(t.keyCode){case Garnish.LEFT_KEY:e="left";break;case Garnish.RIGHT_KEY:e="right";break;case Garnish.UP_KEY:e="up";break;case Garnish.DOWN_KEY:e="down"}const i=this._getDeltaValuesFromDirection(e);this.cropperPickedUp?this._moveCropperByDelta(i.deltaX,i.deltaY):this.handlePicked?this._resizeCropperByHandleAndDeltas(this.handlePicked,{x:i.deltaX,y:i.deltaY}):this.focalPickedUp&&(this._moveFocalPointByDelta(i.deltaX,i.deltaY),this.storeFocalPointState(),this.renderImage())},_resizeCropperByHandleAndDeltas:function(t,e){void 0===this._resizeCropperByHandleAndDeltas._&&(this._resizeCropperByHandleAndDeltas._={}),this._resizeCropperByHandleAndDeltas._.startingRectangle=this._getClipperRectProperties(),this._resizeCropperByHandleAndDeltas._.rectangle=this._calculateNewCropperSizeByDeltas(this._resizeCropperByHandleAndDeltas._.startingRectangle,e.x,e.y,t),this._resizeCropperByHandleAndDeltas._.rectangle.height<30||this._resizeCropperByHandleAndDeltas._.rectangle.width<30||this.arePointsInsideRectangle(this._getRectangleVertices(this._resizeCropperByHandleAndDeltas._.rectangle),this.imageVerticeCoords)&&(this.clipper.set({top:this._resizeCropperByHandleAndDeltas._.rectangle.top+this._resizeCropperByHandleAndDeltas._.rectangle.height/2,left:this._resizeCropperByHandleAndDeltas._.rectangle.left+this._resizeCropperByHandleAndDeltas._.rectangle.width/2,width:this._resizeCropperByHandleAndDeltas._.rectangle.width,height:this._resizeCropperByHandleAndDeltas._.rectangle.height}),this._redrawCropperElements(),this._announce(this._getSizeAndRelativePositionMessage(this.clipper)))},_getDeltaValuesFromDirection:function(t){let e={deltaX:0,deltaY:0};switch(t){case"up":e.deltaY=-5;break;case"down":e.deltaY=5;break;case"left":e.deltaX=-5;break;case"right":e.deltaX=5}return e},_moveCropperByDelta:function(t,e){void 0===this._moveCropperByDelta._&&(this._moveCropperByDelta._={}),this._moveCropperByDelta._.deltaX=t,this._moveCropperByDelta._.deltaY=e,this._moveCropperByDelta._.rectangle=this._getClipperRectProperties();const i=this._getRectangleVertices(this._moveCropperByDelta._.rectangle,this._moveCropperByDelta._.deltaX,this._moveCropperByDelta._.deltaY);if(!this.arePointsInsideRectangle(i,this.imageVerticeCoords)){const{farthest:t,farthestDeltas:e}=this._getFarthestAllowedDeltasForRectangle(this._moveCropperByDelta._.rectangle,{x:this._moveCropperByDelta._.deltaX,y:this._moveCropperByDelta._.deltaY});if(0==t)return;this._moveCropperByDelta._.deltaX=e.x,this._moveCropperByDelta._.deltaY=e.y}this.clipper.set({left:this.clipper.left+this._moveCropperByDelta._.deltaX,top:this.clipper.top+this._moveCropperByDelta._.deltaY}),this._announce(this._getRelativePositionMessage(this.clipper)),this._redrawCropperElements(),this.storeCropperState(),this.renderCropper()},_moveFocalPointByDelta:function(t,e){if(void 0===this._moveFocalPointByDelta._&&(this._moveFocalPointByDelta._={}),this.focalPoint){if(0===t&&0===e)return;if(this._moveFocalPointByDelta._.newX=this.focalPoint.left+t,this._moveFocalPointByDelta._.newY=this.focalPoint.top+e,"crop"===this.currentView){if(!this.arePointsInsideRectangle([{x:this._moveFocalPointByDelta._.newX,y:this._moveFocalPointByDelta._.newY}],this.imageVerticeCoords))return}else if(!this.isPointInsideViewport({x:this._moveFocalPointByDelta._.newX,y:this._moveFocalPointByDelta._.newY}))return;this.focalPoint.set({left:this.focalPoint.left+t,top:this.focalPoint.top+e}),this._announce(this._getRelativePositionMessage(this.focalPoint))}},_getFarthestAllowedDeltasForRectangle:function(t,e){let i=0,s=0;e.x,e.y;const n={farthest:0,farthestDeltas:{}};for(i=Math.min(Math.abs(e.x),10);i>=0;i--)for(s=Math.min(Math.abs(e.y),10);s>=0;s--){const a=this._getRectangleVertices(t,i*(e.x>0?1:-1),s*(e.y>0?1:-1));this.arePointsInsideRectangle(a,this.imageVerticeCoords)&&i+s>n.farthest&&(n.farthest=i+s,n.farthestDeltas={x:i*(e.x>0?1:-1),y:s*(e.y>0?1:-1)})}return n},_handleCropperDrag:function(t){if(void 0===this._handleCropperDrag._&&(this._handleCropperDrag._={}),this._handleCropperDrag._.deltaX=t.pageX-this.previousMouseX,this._handleCropperDrag._.deltaY=t.pageY-this.previousMouseY,0===this._handleCropperDrag._.deltaX&&0===this._handleCropperDrag._.deltaY)return!1;if(this._handleCropperDrag._.rectangle=this._getClipperRectProperties(),this._handleCropperDrag._.vertices=this._getRectangleVertices(this._handleCropperDrag._.rectangle,this._handleCropperDrag._.deltaX,this._handleCropperDrag._.deltaY),!this.arePointsInsideRectangle(this._handleCropperDrag._.vertices,this.imageVerticeCoords)){const{farthest:t,farthestDeltas:e}=this._getFarthestAllowedDeltasForRectangle(this._handleCropperDrag._.rectangle,{x:this._handleCropperDrag._.deltaX,y:this._handleCropperDrag._.deltaY});if(0==t)return;this._handleCropperDrag._.deltaX=e.x,this._handleCropperDrag._.deltaY=e.y}this.clipper.set({left:this.clipper.left+this._handleCropperDrag._.deltaX,top:this.clipper.top+this._handleCropperDrag._.deltaY})},_handleFocalDrag:function(t){void 0===this._handleFocalDrag._&&(this._handleFocalDrag._={}),this.focalPoint&&(this._handleFocalDrag._.deltaX=t.pageX-this.previousMouseX,this._handleFocalDrag._.deltaY=t.pageY-this.previousMouseY,this._moveFocalPointByDelta(this._handleFocalDrag._.deltaX,this._handleFocalDrag._.deltaY))},isPointInsideViewport(t){return this.viewport.left-this.viewport.width/2-t.x<0&&this.viewport.left+this.viewport.width/2-t.x>0&&this.viewport.top-this.viewport.height/2-t.y<0&&this.viewport.top+this.viewport.height/2-t.y>0},setCroppingConstraint:function(t){switch(this.updateSizeAndPosition(),t){case"none":this.croppingConstraint=!1;break;case"original":this.croppingConstraint=this.originalWidth/this.originalHeight;break;case"current":this.croppingConstraint=this.clipper.width/this.clipper.height;break;case"custom":break;default:this.croppingConstraint=parseFloat(t)}},enforceCroppingConstraint:function(){void 0===this.enforceCroppingConstraint._&&(this.enforceCroppingConstraint._={}),!this.animationInProgress&&this.croppingConstraint&&(this.animationInProgress=!0,this.enforceCroppingConstraint._.rectangle=this._getClipperRectProperties(),this.clipper.width>this.clipper.height*this.croppingConstraint?(this.enforceCroppingConstraint._.previousHeight=this.enforceCroppingConstraint._.rectangle.height,this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.top-=(this.enforceCroppingConstraint._.rectangle.height-this.enforceCroppingConstraint._.previousHeight)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.height=this.enforceCroppingConstraint._.rectangle.width/this.croppingConstraint)):(this.enforceCroppingConstraint._.previousWidth=this.enforceCroppingConstraint._.rectangle.width,this.enforceCroppingConstraint._.rectangle.width=this.clipper.height*this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.left-=(this.enforceCroppingConstraint._.rectangle.width-this.enforceCroppingConstraint._.previousWidth)/2,this.arePointsInsideRectangle(this._getRectangleVertices(this.enforceCroppingConstraint._.rectangle),this.imageVerticeCoords)||(this.enforceCroppingConstraint._.rectangle.height=this.clipper.width/this.croppingConstraint,this.enforceCroppingConstraint._.rectangle.width=this.enforceCroppingConstraint._.rectangle.height*this.croppingConstraint)),this.enforceCroppingConstraint._.properties={height:this.enforceCroppingConstraint._.rectangle.height,width:this.enforceCroppingConstraint._.rectangle.width},this.clipper.animate(this.enforceCroppingConstraint._.properties,{onChange:()=>{this._redrawCropperElements(),this.croppingCanvas.renderAll()},duration:this.settings.animationDuration,onComplete:()=>{this._redrawCropperElements(),this.animationInProgress=!1,this.renderCropper(),this.storeCropperState()}}))},_handleCropperResize:function(t){void 0===this._handleCropperResize._&&(this._handleCropperResize._={}),this._handleCropperResize._.deltaX=t.pageX-this.previousMouseX,this._handleCropperResize._.deltaY=t.pageY-this.previousMouseY,"b"!==this.handlePicked&&"t"!==this.handlePicked||(this._handleCropperResize._.deltaX=0),"l"!==this.handlePicked&&"r"!==this.handlePicked||(this._handleCropperResize._.deltaY=0),0===this._handleCropperResize._.deltaX&&0===this._handleCropperResize._.deltaY||this._resizeCropperByHandleAndDeltas(this.handlePicked,{x:this._handleCropperResize._.deltaX,y:this._handleCropperResize._.deltaY})},_calculateNewCropperSizeByDeltas:function(t,e,i,s){if(void 0===this._calculateNewCropperSizeByDeltas._&&(this._calculateNewCropperSizeByDeltas._={}),this._calculateNewCropperSizeByDeltas._.topDelta=0,this._calculateNewCropperSizeByDeltas._.leftDelta=0,this._calculateNewCropperSizeByDeltas._.rectangle=t,this._calculateNewCropperSizeByDeltas._.deltaX=e,this._calculateNewCropperSizeByDeltas._.deltaY=i,this.croppingConstraint){switch(this._calculateNewCropperSizeByDeltas._.change=0,s){case"t":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaY;break;case"b":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"r":this._calculateNewCropperSizeByDeltas._.change=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"l":this._calculateNewCropperSizeByDeltas._.change=-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?-this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX;break;case"br":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.change=Math.abs(this._calculateNewCropperSizeByDeltas._.deltaY)>Math.abs(this._calculateNewCropperSizeByDeltas._.deltaX)?this._calculateNewCropperSizeByDeltas._.deltaY:-this._calculateNewCropperSizeByDeltas._.deltaX}switch(this.croppingConstraint>1?(this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this.croppingConstraint):(this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.change,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this.croppingConstraint),this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX,s){case"t":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"b":this._calculateNewCropperSizeByDeltas._.rectangle.left+=-this._calculateNewCropperSizeByDeltas._.deltaX/2;break;case"r":this._calculateNewCropperSizeByDeltas._.rectangle.top+=-this._calculateNewCropperSizeByDeltas._.deltaY/2;break;case"l":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY/2,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"tr":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY;break;case"tl":this._calculateNewCropperSizeByDeltas._.rectangle.top-=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX;break;case"bl":this._calculateNewCropperSizeByDeltas._.rectangle.left-=this._calculateNewCropperSizeByDeltas._.deltaX}}else!this.shiftKeyHeld||"tl"!==s&&"tr"!==s&&"bl"!==s&&"br"!==s||(this._calculateNewCropperSizeByDeltas._.ratio,Math.abs(e)>Math.abs(i)?(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaY=this._calculateNewCropperSizeByDeltas._.deltaX/this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaY*="tr"===s||"bl"===s?-1:1):(this._calculateNewCropperSizeByDeltas._.ratio=t.width/t.height,this._calculateNewCropperSizeByDeltas._.deltaX=this._calculateNewCropperSizeByDeltas._.deltaY*this._calculateNewCropperSizeByDeltas._.ratio,this._calculateNewCropperSizeByDeltas._.deltaX*="tr"===s||"bl"===s?-1:1)),s.match(/t/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.top+=this._calculateNewCropperSizeByDeltas._.deltaY,this._calculateNewCropperSizeByDeltas._.rectangle.height-=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/b/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.height+=this._calculateNewCropperSizeByDeltas._.deltaY),s.match(/r/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.width+=this._calculateNewCropperSizeByDeltas._.deltaX),s.match(/l/)&&(this._calculateNewCropperSizeByDeltas._.rectangle.left+=this._calculateNewCropperSizeByDeltas._.deltaX,this._calculateNewCropperSizeByDeltas._.rectangle.width-=this._calculateNewCropperSizeByDeltas._.deltaX);return this._calculateNewCropperSizeByDeltas._.rectangle.top=this._calculateNewCropperSizeByDeltas._.rectangle.top,this._calculateNewCropperSizeByDeltas._.rectangle.left=this._calculateNewCropperSizeByDeltas._.rectangle.left,this._calculateNewCropperSizeByDeltas._.rectangle.width=this._calculateNewCropperSizeByDeltas._.rectangle.width,this._calculateNewCropperSizeByDeltas._.rectangle.height=this._calculateNewCropperSizeByDeltas._.rectangle.height,this._calculateNewCropperSizeByDeltas._.rectangle},_setMouseCursor:function(t){void 0===this._setMouseCursor._&&(this._setMouseCursor._={}),Garnish.isMobileBrowser(!0)||(this._setMouseCursor._.cursor="default",this._setMouseCursor._.handle=this.croppingCanvas&&this._cropperHandleHitTest(t),this.focalPoint&&this._isMouseOver(t,this.focalPoint)?this._setMouseCursor._.cursor="pointer":this._setMouseCursor._.handle?"t"===this._setMouseCursor._.handle||"b"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ns-resize":"l"===this._setMouseCursor._.handle||"r"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="ew-resize":"tl"===this._setMouseCursor._.handle||"br"===this._setMouseCursor._.handle?this._setMouseCursor._.cursor="nwse-resize":"bl"!==this._setMouseCursor._.handle&&"tr"!==this._setMouseCursor._.handle||(this._setMouseCursor._.cursor="nesw-resize"):this.croppingCanvas&&this._isMouseOver(t,this.clipper)?this._setMouseCursor._.cursor="move":this.focalPickedUp&&(this._setMouseCursor._.cursor="grabbing"),$(".body").css("cursor",this._setMouseCursor._.cursor))},_cropperHandleHitTest:function(t){if(void 0===this._cropperHandleHitTest._&&(this._cropperHandleHitTest._={}),this._cropperHandleHitTest._.parentOffset=this.$croppingCanvas.offset(),this._cropperHandleHitTest._.mouseX=t.pageX-this._cropperHandleHitTest._.parentOffset.left,this._cropperHandleHitTest._.mouseY=t.pageY-this._cropperHandleHitTest._.parentOffset.top,this._cropperHandleHitTest._.lb=this.clipper.left-this.clipper.width/2,this._cropperHandleHitTest._.rb=this._cropperHandleHitTest._.lb+this.clipper.width,this._cropperHandleHitTest._.tb=this.clipper.top-this.clipper.height/2,this._cropperHandleHitTest._.bb=this._cropperHandleHitTest._.tb+this.clipper.height,this._cropperHandleHitTest._.mouseXthis._cropperHandleHitTest._.lb-3){if(this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.tb-3)return"tl";if(this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.bb-10)return"bl"}if(this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.rb-13&&this._cropperHandleHitTest._.mouseXthis._cropperHandleHitTest._.tb-3)return"tr";if(this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.bb-10)return"br"}return this._cropperHandleHitTest._.mouseXthis._cropperHandleHitTest._.lb-3&&this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.tb+10?"l":this._cropperHandleHitTest._.mouseXthis._cropperHandleHitTest._.rb-5&&this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.tb+10?"r":this._cropperHandleHitTest._.mouseYthis._cropperHandleHitTest._.tb-2&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseXthis._cropperHandleHitTest._.bb-4&&this._cropperHandleHitTest._.mouseX>this._cropperHandleHitTest._.lb+10&&this._cropperHandleHitTest._.mouseX=this._isMouseOver._.lb&&this._isMouseOver._.mouseX<=this._isMouseOver._.rb&&this._isMouseOver._.mouseY>=this._isMouseOver._.tb&&this._isMouseOver._.mouseY<=this._isMouseOver._.bb},_getRectangleVertices:function(t,e,i){return void 0===this._getRectangleVertices._&&(this._getRectangleVertices._={}),void 0===e&&(e=0),void 0===i&&(i=0),this._getRectangleVertices._.topLeft={x:t.left+e,y:t.top+i},this._getRectangleVertices._.topRight={x:this._getRectangleVertices._.topLeft.x+t.width,y:this._getRectangleVertices._.topLeft.y},this._getRectangleVertices._.bottomRight={x:this._getRectangleVertices._.topRight.x,y:this._getRectangleVertices._.topRight.y+t.height},this._getRectangleVertices._.bottomLeft={x:this._getRectangleVertices._.topLeft.x,y:this._getRectangleVertices._.bottomRight.y},[this._getRectangleVertices._.topLeft,this._getRectangleVertices._.topRight,this._getRectangleVertices._.bottomRight,this._getRectangleVertices._.bottomLeft]},_setFittedImageVerticeCoordinates:function(){this.imageVerticeCoords=this.getImageVerticeCoords("fit")},getImageVerticeCoords:function(t){var e,i=-1*((this.hasOrientationChanged()?90:0)+this.imageStraightenAngle)*(Math.PI/180),s=this.getScaledImageDimensions();e="number"==typeof t?t:"cover"===t?this.getZoomToCoverRatio(s):this.getZoomToFitRatio(s);var n=s.height*e,a=s.width*e,r=Math.cos(i)*n,o=Math.sin(i)*a,l=Math.cos(i)*a,h=Math.sin(i)*n,c=(this.editorHeight-(r+o))/2,d=(this.editorWidth-(h+l))/2;return{a:{x:d+l,y:c},b:{x:this.editorWidth-d,y:c+r},c:{x:d+h,y:this.editorHeight-c},d:{x:d,y:c+o}}},_debug:function(t){this.canvas.remove(this.debugger),this.debugger=t,this.canvas.add(this.debugger)},arePointsInsideRectangle:function(t,e){for(void 0===this.arePointsInsideRectangle._&&(this.arePointsInsideRectangle._={}),this.arePointsInsideRectangle._.ab=this._getVector(e.a,e.b),this.arePointsInsideRectangle._.bc=this._getVector(e.b,e.c),this.arePointsInsideRectangle._.scalarAbAb=this._getScalarProduct(this.arePointsInsideRectangle._.ab,this.arePointsInsideRectangle._.ab),this.arePointsInsideRectangle._.scalarBcBc=this._getScalarProduct(this.arePointsInsideRectangle._.bc,this.arePointsInsideRectangle._.bc),this.arePointsInsideRectangle._.i=0;this.arePointsInsideRectangle._.i{this.checkRemainingSessionTime()},1e3*t)},async checkRemainingSessionTime(t){const e=Craft.getActionUrl("users/session-info",t?null:"dontExtendSession=1");try{const{data:t}=await Craft.sendActionRequest("GET",e);void 0!==Craft.csrfTokenValue&&(Craft.csrfTokenValue=t.csrfTokenValue),this.updateRemainingSessionTime(t.timeout,t.isGuest)}catch(t){this.updateRemainingSessionTime(-1,!1)}},updateRemainingSessionTime:function(t,e){this.checkRemainingSessionTimer&&clearTimeout(this.checkRemainingSessionTimer);const i=!Craft.remainingSessionTime&&t;if(Craft.remainingSessionTime=parseInt(t),-1!==Craft.remainingSessionTime&&Craft.remainingSessionTime'),e=$('').appendTo(t),i=$('').appendTo(e),s=$("",{type:"button",class:"btn",text:Craft.t("app","Sign out now")}).appendTo(i),n=$("",{type:"submit",class:"btn submit",text:Craft.t("app","Keep me signed in")}).appendTo(i);this.$logoutWarningPara=$("").prependTo(e),this.logoutWarningModal=new Garnish.Modal(t,{autoShow:!1,closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark logoutwarningmodalshade",onFadeIn:function(){Garnish.isMobileBrowser(!0)||setTimeout(function(){n.focus()},100)}}),this.addListener(s,"activate","logout"),this.addListener(t,"submit",t=>{t.preventDefault(),this.renewSession()})}t?this.logoutWarningModal.quickShow():this.logoutWarningModal.show(),this.updateLogoutWarningMessage(),this.decrementLogoutWarningInterval=setInterval(this.decrementLogoutWarning.bind(this),1e3)},updateLogoutWarningMessage:function(){this.$logoutWarningPara.text(Craft.t("app","Your session will expire in {time}.",{time:Craft.secondsToHumanTimeDuration(Craft.remainingSessionTime)})),this.logoutWarningModal.updateSizeAndPosition()},decrementLogoutWarning:function(){Craft.remainingSessionTime>0&&(Craft.remainingSessionTime--,this.updateLogoutWarningMessage()),0===Craft.remainingSessionTime&&clearInterval(this.decrementLogoutWarningInterval)},hideLogoutWarningModal:function(t){this.showingLogoutWarningModal=!1,this.logoutWarningModal&&(t?this.logoutWarningModal.quickHide():this.logoutWarningModal.hide(),this.decrementLogoutWarningInterval&&clearInterval(this.decrementLogoutWarningInterval))},async showLoginModal(){if(this.showingLoginModal)return;this.showingLoginModal=!0,this.loginModal&&this.loginModal.destroy();const{data:t}=await Craft.sendActionRequest("POST","users/login-modal",{data:{email:Craft.userEmail}}),e=$(t.html),i=document.documentElement.lang,s=e.attr("lang");s===i&&s&&e.removeAttr("lang"),this.loginModal=new Garnish.Modal(e,{closeOtherModals:!1,hideOnEsc:!1,hideOnShadeClick:!1,shadeClass:"modal-shade dark blurred login-modal-shade",onFadeIn:async()=>{Craft.initUiElements(e),e.find("craft-login-form").on("craft:login:success",t=>{t.preventDefault(),this.loginModal.hide(),this.checkRemainingSessionTime()})},onFadeOut:()=>{this.loginModal?.destroy(),this.loginModal=null},onHide:()=>{this.showingLoginModal=!1}})},hideLoginModal:function(t){this.loginModal&&(t?this.loginModal.quickHide():this.loginModal.hide(),this.loginModal.destroy(),this.loginModal=null)},logout:function(){$.get({url:Craft.getActionUrl("users/logout"),dataType:"json",success:()=>{Craft.redirectTo("")}})},renewSession:async function(){this.hideLogoutWarningModal(),this.renewingSession=!0,this.checkRemainingSessionTime(!0,()=>{this.renewingSession=!1})},closeModal:function(){this.loginBtn.successEvent(),this.hideLoginModal(),this.checkRemainingSessionTime()}},{checkInterval:60,minSafeSessionTime:120})},233:function(t,e,i){"use strict";function s(t,e){for(var i=[],s={},n=0;ni.parts.length&&(s.parts.length=i.parts.length)}else{var r=[];for(n=0;n ').appendTo(this.$container));var t={url:Craft.getActionUrl(this.settings.uploadAction),formData:this.settings.postParameters,fileInput:this.$container.find(this.settings.fileInputSelector),paramName:this.settings.uploadParamName};void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t.formData[Craft.csrfTokenName]=Craft.csrfTokenValue),t.events={},t.events.fileuploadstart=this._onUploadStart.bind(this),t.events.fileuploadprogressall=this._onUploadProgress.bind(this),t.events.fileuploaddone=this._onUploadComplete.bind(this),t.events.fileuploadfail=this._onUploadFailure.bind(this),this.uploader=Craft.createUploader(null,this.$container,t),this.initButtons()},initButtons:function(){this.$container.find(this.settings.uploadButtonSelector).on("click",t=>{this.$container.find(this.settings.fileInputSelector).trigger("click")}),this.$container.find(this.settings.deleteButtonSelector).on("click",t=>{confirm(Craft.t("app","Are you sure you want to delete this image?"))&&($(t.currentTarget).parent().append('