alchemy_cms 8.4.1 → 8.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69fe9f3fb567a6a0004b3698561faeca7b592030952271d037dc856008d7ccfa
4
- data.tar.gz: d9a0b0f9e6adce7a7badcb7d8bea593eaef752f4b822cd3e911cd27316b4390c
3
+ metadata.gz: 74d7a2b1ed15cf599a43d514821dc359584ea61fd0a4647d12c1ff3c73c3e48b
4
+ data.tar.gz: 2c07a5b97a2de7abf0165eb8f72b52dc69d848306fa9423eb210d52efaf6c930
5
5
  SHA512:
6
- metadata.gz: 3c57b443d403682803e44c1013e814f4ec763c698f20b9c0a98d909eae2b87b78590cda9ea45461c21ff7828951e20b1557221e370600c028e21723326b70d44
7
- data.tar.gz: ab696ada457d6a22239516bf631d44c8b45e2b59a30005a01a473c3d920e33ea607c6b03a7a56c1dc934e347984be82232e9cfeb7f82adeea5bd740a96cf8c12
6
+ metadata.gz: 2fc997e3dca21a8d0fdf3b040e9813eedc659c2c1c0f9c558ca96e613b12ca6feb05bc58121c2b87f3f7ad6acda0ec7243e28757b1493bf65a86e338b974eb0d
7
+ data.tar.gz: 4de8640b5e4122bb227071d50ebf29381cbacc5a949681576c4768a9631819f7e20f73c7a77e249fd0909a8310d484d5f97695b698b1a554a8608ed1f0ea9494
@@ -1,2 +1,2 @@
1
- import"@ungap/custom-elements";import{Turbo as e}from"@hotwired/turbo-rails";import"keymaster";import t from"tom-select";import{autoUpdate as s,computePosition as i,offset as n,flip as l,shift as o,size as r}from"@floating-ui/dom";import"clipboard";import a from"flatpickr";import c from"cropperjs";import d from"sortablejs";import"tinymce";import{setDefaultAnimation as h,registerIconLibrary as u}from"shoelace";const m=/\./;function p(e){const t=g(),s=window.Alchemy?.translations;return s?m.test(e)?function(e,t){const s=t.split(m),i=e[s[0]];return i&&i[s[1]]||t}(s,e):s[e]||e:(console.warn(`Translations for locale ${t} not found!`),e)}function g(){return document.documentElement.lang?document.documentElement.lang:"en"}function y(e,t=void 0){let s=p(e);return t?s.replace(/%\{.+\}/,t):s}const v=[];function b(e=document){e===document&&v.forEach(e=>key.unbind(e));const t=e.querySelectorAll(".search_input_field"),s=e.querySelectorAll(".search_field_clear, .js_filter_field_clear");key("alt+f",function(){return key.setScope("search"),t.forEach(e=>e.focus({focusVisible:!0})),!1}),v.push("alt+f"),key("esc","search",function(){s.forEach(e=>e.click()),t.forEach(e=>e.blur())}),v.push("esc"),e.querySelectorAll("[data-alchemy-hotkey]").forEach(function(e){const t=e.dataset.alchemyHotkey;key(t,()=>e.click()),v.push(t)})}function f(e){const t=document.createElement("template");return t.innerHTML=e,t.content.children[0]}let E=class{constructor(e,t="currentColor"){this.size=e,this.color=t,this.spinner=void 0}get el(){return this.spinner}spin(e){return void 0===e&&(e=document.body),this.spinner=f(`<alchemy-spinner size="${this.size}" color="${this.color}"></alchemy-spinner>`),e.append(this.spinner),this}stop(){this.spinner&&(this.spinner.remove(),this.spinner=void 0)}};function w(e,t,s={}){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:s}))}function k(e,t,s,i){document.querySelectorAll(t).forEach(t=>{t.addEventListener(e,e=>{const n=Array.from(t.querySelectorAll(s));let l=e.target;for(;l!==t;){if(n.includes(l))return void i.call(l,e);l=l.parentElement}})})}const L=[],_={header_height:36,size:"400x300",padding:!0,title:"",modal:!0,overflow:"visible",ready:()=>{},closed:()=>{}};class S{#e=null;#t=!1;constructor(e,t={}){this.url=e,this.options={..._,...t};const s=this.options.size.split("x");this.width=parseInt(s[0],10),this.height=parseInt(s[1],10),this.build(),this.resize()}open(){w(this.dialog,"Alchemy.DialogOpen"),this.bind_close_events(),this.options.modal?(this.dialog_container.showModal(),this.#s()):this.dialog_container.show(),window.requestAnimationFrame(()=>{this.dialog_container.classList.add("open")}),document.body.classList.add("prevent-scrolling"),L.push(this),this.load()}close(){return this.#t||(this.#t=!0,w(this.dialog,"DialogClose.Alchemy"),this.dialog_container.classList.remove("open"),this.dialog_container.addEventListener("transitionend",()=>{this.#i(),this.dialog_container.close(),this.dialog_container.remove(),L.pop(),0===L.length&&document.body.classList.remove("prevent-scrolling"),null!=this.options.closed&&this.options.closed()},{once:!0})),!0}#s(){const e=document.getElementById("flash_notices");e&&(this.#e=e.parentElement,this.dialog_container.append(e),this.#n(e))}#i(){const e=document.getElementById("flash_notices");e&&this.#e&&this.#e.append(e)}#n(e){e.querySelectorAll('alchemy-message[dismissable]:not([type="error"])').forEach(e=>e.remove())}load(){this.show_spinner(),fetch(this.url,{headers:{"Turbo-Frame":"alchemy_dialog_frame"}}).then(async t=>{const s=await t.text();t.headers.get("content-type")?.includes("text/vnd.turbo-stream.html")?e.renderStreamMessage(s):t.ok?this.replace(s):this.show_error({status:t.status,statusText:t.statusText,responseText:s})}).catch(()=>{this.show_error({status:0})})}reload(){this.dialog_body.innerHTML="",this.load()}replace(e){this.remove_spinner(),this.dialog_body.style.display="none",this.dialog_body.innerHTML=e,this.init(),w(this.dialog,"DialogReady.Alchemy",{body:this.dialog_body}),null!=this.options.ready&&this.options.ready(this.dialog_body),this.dialog_body.style.display=""}show_spinner(){this.spinner=new E("medium"),this.spinner.spin(this.dialog_body)}remove_spinner(){this.spinner.stop()}init(){b(this.dialog_body),window.requestAnimationFrame(()=>this.#l())}#l(e=0){const t=this.dialog_body.querySelector("[autofocus]")??this.dialog_body.querySelector("form [type='submit']");t?.focus(),document.activeElement===this.close_button&&e<20&&window.requestAnimationFrame(()=>this.#l(e+1))}show_error(e,t){if(422===e.status)return this.dialog_body.innerHTML=e.responseText,void this.init();const{error_body:s,error_header:i,error_type:n}=this.error_messages(e,t);this.dialog_body.innerHTML=`<alchemy-message type="${n}">\n <h1>${i}</h1>\n <p>${s}</p>\n </alchemy-message>`}error_messages(e,t){let s,i,n="warning";switch(e.status){case 0:i="The server does not respond.",s="Please check server and try again.";break;case 403:i="You are not authorized!",s="Please close this window.";break;default:n="error",t?(i=t,console.error(e.responseText)):i=`${e.statusText} (${e.status})`,s="Please check log and try again."}return{error_header:i,error_body:s,error_type:n}}bind_close_events(){this.close_button.addEventListener("click",e=>{e.preventDefault(),this.close()}),this.dialog_container.addEventListener("close",e=>{e.preventDefault(),this.close()}),this.dialog_container.classList.add("closable"),this.dialog_container.addEventListener("pointerdown",e=>{e.target===this.dialog_container&&this.close()}),this.dialog_container.addEventListener("cancel",e=>{e.target===this.dialog_container&&(e.preventDefault(),this.close())})}build(){this.dialog_container=f('<dialog class="alchemy-dialog-container"></dialog>'),this.dialog=f('<div class="alchemy-dialog"></div>'),this.dialog_body=f('<div class="alchemy-dialog-body"></div>'),this.dialog_header=f('<div class="alchemy-dialog-header"></div>'),this.dialog_title=f('<div class="alchemy-dialog-title"></div>'),this.close_button=f('<button class="alchemy-dialog-close"><alchemy-icon name="close"></alchemy-icon></button>'),this.dialog_title.textContent=this.options.title,this.dialog_header.append(this.dialog_title),this.dialog_header.append(this.close_button),this.dialog.append(this.dialog_header),this.dialog.append(this.dialog_body),this.dialog_container.append(this.dialog),this.options.modal&&this.dialog.classList.add("modal"),this.options.padding&&this.dialog_body.classList.add("padded"),document.body.append(this.dialog_container)}resize(){const{width:e,height:t}=this.getSize();this.dialog.style.width=`${e}px`,this.dialog.style.minHeight=`${t}px`,this.dialog.style.overflow=this.options.overflow,"hidden"===this.options.overflow?(this.dialog_body.style.height=`${t}px`,this.dialog_body.style.overflow="auto"):(this.dialog_body.style.minHeight=`${t}px`,this.dialog_body.style.overflow="visible")}getSize(){const e=this.options.padding?16:0,t=window.innerWidth,s=window.innerHeight;let i=this.width,n=this.height;return i>=t&&(i=t-e),n>=s&&(n=s-e-_.header_height),{width:i,height:n}}}function C(){const{length:e}=L;if(0!==e)return L[e-1]}function x(e){const t=C();if(null!=t)return t.options.closed=e,t.close()}function A(e,t){if(!e)throw"No url given! Please provide an url.";new S(e,t).open()}function T(e){const t=document.getElementById("fixed-elements"),s=`fixed-element-${e}`;t.querySelector(`sl-tab[panel="${s}"]`).remove(),t.querySelector(`sl-tab-panel[name="${s}"]`).remove(),t.show("main-content-elements")}var I=Object.freeze({__proto__:null,createTab:function(e,t){const s=document.getElementById("fixed-elements"),i=`fixed-element-${e}`,n=`<sl-tab slot="nav" panel="${i}">${t}</sl-tab>`,l=`<sl-tab-panel name="${i}" style="--padding: 0" />`;s.innerHTML+=n+l,window.requestAnimationFrame(function(){s.show(i)})},removeTab:T});function F(e,t="notice"){!function(e,t){const s=document.getElementById("flash_notices"),i=f(`\n <alchemy-message type="${t}" dismissable>\n ${e}\n </alchemy-message>\n `);s.append(i)}(e,t)}function q(e=!0){document.querySelector("alchemy-overlay").show=!!e}function $(e){return!(!e.target.matches("input, textarea")&&"?"===String.fromCharCode(e.which))||(A("/admin/help",{title:Alchemy.t("help"),size:"500x400"}),!1)}function M(e){const t=document.getElementById(e);if(t)return JSON.parse(t.textContent)}const B=function e({collection:t={},member:s={}}={}){const i={...t};return Object.entries(s).forEach(([t,s])=>{i[t]="string"==typeof s?e=>s.replace(/1/,e):e({member:s})}),i}(M("alchemy_routes")),D=/#[\w.~-]+$/;class H extends HTMLIFrameElement{#o;#r;#a;handleEvent(e){"load"===e.type&&(this.#c(),this.#d(),this.#o?.call(this,e))}#h=e=>{"Alchemy.previewReady"===e.data.message&&(this.#c(),this.#d())};connectedCallback(){let e=this.url;this.addEventListener("load",this),this.#u(),window.addEventListener("message",this.#h),window.localStorage.getItem("alchemy-preview-url")&&(e=window.localStorage.getItem("alchemy-preview-url"),this.previewUrlSelect.value=e),this.refresh(e)}disconnectedCallback(){this.removeEventListener("load",this),key.unbind("alt+r"),window.removeEventListener("message",this.#h)}postMessage(e){this.contentWindow.postMessage(e,"*")}resize(e){this.style.width=`${e}px`}refresh(e){return this.#m(),this.src=e||this.url,this.#c(),this.#a=setTimeout(()=>{this.#d(),F(y("Preview failed to load"),"warning")},this.loadTimeout),new Promise(e=>{this.#o=e})}set isDragged(e){this.style.transitionProperty=e?"none":null,this.style.pointerEvents=e?"none":null}#u(){this.reloadButton?.addEventListener("click",e=>{e.preventDefault(),this.refresh()}),key("alt+r",()=>this.refresh()),this.sizeSelect.addEventListener("change",e=>{const t=e.target.value;""===t?this.style.width=null:this.resize(t)}),this.previewUrlSelect?.addEventListener("change",e=>{const t=e.target.value;window.localStorage.setItem("alchemy-preview-url",t),this.refresh(t)})}#m(){this.reloadButton.innerHTML.includes("alchemy-spinner")||(this.#r=this.reloadButton.innerHTML),this.reloadButton.innerHTML='<alchemy-spinner size="small"></alchemy-spinner>'}#d(){this.reloadButton.innerHTML=this.#r}#c(){this.#a&&(clearTimeout(this.#a),this.#a=null)}get url(){return this.getAttribute("url")}get loadTimeout(){const e=parseInt(this.getAttribute("load-timeout"),10);return 1e3*(Number.isNaN(e)?5:e)}get sizeSelect(){return document.querySelector("select#preview_size")}get previewUrlSelect(){return document.querySelector("select#preview_url")}get reloadButton(){return document.querySelector("#reload_preview_button")}}function z(){document.getElementById("alchemy_preview_window").refresh()}customElements.define("alchemy-preview-window",H,{extends:"iframe"});class P{constructor(e,t={}){this.message=e,this.options={...{size:"300x100",title:y("Please confirm"),ok_label:y("Yes"),cancel_label:y("No"),on_ok(){}},...t},this.#p(),this.#g()}open(){requestAnimationFrame(()=>{this.dialog.show()})}#p(){const e=this.options.size.split("x")[0];this.dialog=f(`\n <sl-dialog label="${this.options.title}" style="--width: ${e}px">\n ${this.message}\n <button slot="footer" type="reset" class="secondary mx-1 my-0" autofocus>\n ${this.options.cancel_label}\n </button>\n <button slot="footer" type="submit" class="mx-1 my-0">\n ${this.options.ok_label}\n </button>\n </sl-dialog>\n `);(C()?.dialog_container??document.body).append(this.dialog)}#g(){this.cancelButton.addEventListener("click",e=>{e.preventDefault(),this.options.on_cancel(),this.dialog.hide()}),this.okButton.addEventListener("click",e=>{e.preventDefault(),this.options.on_ok(),this.dialog.hide()}),this.dialog.addEventListener("sl-request-close",e=>{"overlay"===e.detail.source&&(this.options.on_cancel(),e.preventDefault())}),this.dialog.addEventListener("sl-after-hide",()=>{this.dialog.remove()})}get cancelButton(){return this.dialog.querySelector("button[type=reset]")}get okButton(){return this.dialog.querySelector("button[type=submit]")}}function O(e,t={}){return new Promise(s=>{new P(e,{...t,on_ok(){s(!0)},on_cancel(){s(!1)}}).open()})}class N{static updateIcon(e,t=!1){const s=document.querySelector(`[data-ingredient-id="${e}"]`);if(s){s.querySelector(".edit-ingredient-anchor-link alchemy-icon").setAttribute("icon-style",t?"fill":"line")}}}e.StreamActions.dialog_visit=function(){const t=this.getAttribute("url");x(()=>e.visit(t))||e.visit(t)},e.StreamActions.assign_picture=function(){const[e]=this.targetElements;e&&(e.value=this.getAttribute("picture-id"),e.setAttribute("data-image-file-width",this.getAttribute("image-file-width")),e.setAttribute("data-image-file-height",this.getAttribute("image-file-height")),x(()=>{e.closest("alchemy-element-editor")?.setDirty()}))},e.StreamActions.assign_attachment=function(){const[e]=this.targetElements;if(!e)return;const t=e.parentElement;e.value=this.getAttribute("attachment-id"),t.querySelector(":scope > .file_name").textContent=this.getAttribute("attachment-name"),t.querySelector(":scope > .file_icon").replaceChildren(this.templateContent),t.querySelector(":scope > .remove_file_link").classList.remove("hidden"),x(()=>{e.closest("alchemy-element-editor")?.setDirty(e)})},e.StreamActions.close_current_dialog=function(){x()},e.StreamActions.reload_preview=function(){z()},e.StreamActions.remove_fixed_element=function(){T(this.getAttribute("element-id"))},e.StreamActions.update_anchor_icon=function(){N.updateIcon(this.getAttribute("ingredient-id"),"true"===this.getAttribute("active"))},e.StreamActions.hide_please_wait_overlay=function(){q(!1)};class U extends HTMLElement{static get observedAttributes(){return["name","size","icon-style"]}constructor(){super(),this.spriteUrl=document.querySelector('link[rel="preload"][as="image"]')?.getAttribute("href")??""}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}render(){const e=this.size?` icon--${this.size}`:"";this.innerHTML=`<svg class="icon${e}"><use href="${this.spriteUrl}#ri-${this.iconName}${this.style}" /></svg>`}set name(e){this.setAttribute("name",e)}get iconName(){return this.getAttribute("name")}get size(){return this.getAttribute("size")}get style(){const e=this.getAttribute("icon-style");switch(e){case"none":return"";case null:return"-line";default:return`-${e}`}}}customElements.get("alchemy-icon")||customElements.define("alchemy-icon",U);const R=e=>(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");function W(e,t){e?e.focus():t()}function j(e){e?.close(!1),e?.destroy()}function V(){const e=document.createElement("div");e.className="ts-dropdown-mask";let t=()=>{};return{async onDropdownOpen(){const a={minWidth:`${this.control.offsetWidth}px`};this.control.closest(".alchemy-dialog-body, .alchemy-popover")&&(a.zIndex="101"),Object.assign(this.dropdown.style,a);const c=this.control.closest("dialog")||document.body;c.append(e),c.append(this.dropdown);t=s(this.control,this.dropdown,async()=>{const{x:e,y:t}=await i(this.control,this.dropdown,{placement:"bottom-start",middleware:[n(2),l(),o({padding:16}),r({padding:16,apply({availableWidth:e,availableHeight:t,elements:s}){Object.assign(s.floating.style,{maxWidth:`max(${s.reference.offsetWidth}px, min(${e}px, var(--select-dropdown-max-width, 480px)))`}),Object.assign(s.floating.querySelector(".ts-dropdown-content").style,{maxHeight:`${Math.max(120,t-16)}px`})}})]});Object.assign(this.dropdown.style,{left:`${e}px`,top:`${t}px`})})},onDropdownClose(){this.control_input.classList.remove("has-value"),this.control_input.blur(),this.dropdown.remove(),e.remove(),t()}}}function J(){return{title:y("Remove"),html(e){const t=document.createElement("button");return t.type="button",t.className=e.className,t.title=e.title,t.setAttribute("aria-label",e.title),t.tabIndex=-1,t.innerHTML='<alchemy-icon name="close" size="sm"></alchemy-icon>',t}}}const X={option_create:(e,t)=>`<div class="create">\n ${y("Add")} <strong>${t(e.input)}</strong>&hellip;\n </div>`,loading(){if(!(Object.keys(this.options).length>0))return`<div class="loading-results">${y("Please wait, loading")}&hellip;</div>`},no_results:()=>`<div class="no-results">${y("No results found")}</div>`,loading_more:()=>`<div class="loading-more">${y("Loading more results")}&hellip;</div>`,no_more_results:()=>`<div class="no-more-results">${y("No more results")}</div>`};function K(e,t){const s=R(e);return t?s.replace(new RegExp(String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi"),e=>`<em>${e}</em>`):s}function Q(e,t){return Object.keys(e).map(s=>{const i=e[s],n=t?`${t}[${s}]`:s;return null==i?"":Array.isArray(i)?i.map(e=>`${encodeURIComponent(`${n}[]`)}=${encodeURIComponent(e)}`).join("&"):"object"==typeof i?Q(i,n):`${encodeURIComponent(n)}=${encodeURIComponent(i)}`}).filter(e=>""!==e).join("&")}class Y extends HTMLElement{#y=null;#v=null;#b=new Map;connectedCallback(){const e=this.input;if(e.classList.add("alchemy_selectbox"),e instanceof HTMLInputElement){const s=e.value;e.value="",this.#y=new t(e,this.tomSelectConfig),e.value=s}else this.#y=new t(e,this.tomSelectConfig);this.#y.control.append(document.createElement("sl-spinner")),this.#y.control.addEventListener("click",this.#y.open.bind(this.#y))}disconnectedCallback(){j(this.#y),this.#y=null}focus(){W(this.#y,()=>super.focus())}onChange(e){this.multiple?(e.added&&this.#b.set(String(e.added.id),e.added),e.removed&&this.#b.delete(String(e.removed.id)),this.setAttribute("selection",JSON.stringify([...this.#b.values()]))):e.added&&this.setAttribute("selection",JSON.stringify(e.added)),this.dispatchCustomEvent("RemoteSelect.Change",{removed:e.removed,added:e.added})}onOpen(){}dispatchCustomEvent(e,t={}){this.dispatchEvent(new CustomEvent(`Alchemy.${e}`,{bubbles:!0,detail:t}))}get allowClear(){return this.hasAttribute("allow-clear")}get multiple(){return this.hasAttribute("multiple")}get selection(){return this.getAttribute("selection")}get placeholder(){return this.getAttribute("placeholder")??""}get queryParams(){return this.getAttribute("query-params")??"{}"}get url(){return this.getAttribute("url")??""}get input(){return this.querySelector("input, select")}get tomSelectConfig(){const e=this,t=this.ajaxConfig,s={virtual_scroll:{}};this.multiple&&(s.remove_button={}),this.allowClear&&(s.clear_button={html:()=>`<button type="button" class="clear-button" aria-label="${y("Clear selection")}">\n <alchemy-icon name="close" size="1x"></alchemy-icon>\n </button>`});const{onDropdownOpen:i,onDropdownClose:n}=V();return{plugins:s,valueField:"id",maxItems:this.multiple?null:1,closeAfterSelect:!this.multiple,maxOptions:null,searchField:[],loadThrottle:t.quietMillis,refreshThrottle:0,placeholder:this.placeholder,openOnFocus:!1,shouldLoad:()=>!0,firstUrl:e=>this.#f(e,1),load:(e,t)=>this.#E(e,t),onInitialize(){if(e.selection)if(e.multiple){const t=JSON.parse(e.selection);e.#b=new Map(t.map(e=>[String(e.id),e])),t.forEach(e=>{this.addOption({...e,$preselection:!0}),this.addItem(e.id,!0)})}else{const t=JSON.parse(e.selection);e.#v=t,this.addOption({...t,$preselection:!0}),this.addItem(t.id,!0)}},onChange(t){e.#w(t,this)},onType(e){this.control_input.classList.toggle("has-value",e.length>0)},onDropdownOpen(){i.call(this),this.loading||this.load(this.lastValue??""),e.onOpen()},onDropdownClose:n,render:{option(t,s){return t.$preselection?`<div>${e._renderResult(t)}</div>`:e._renderListEntry(t,this.lastValue)},item:(t,s)=>`<div>${e._renderResult(t)}</div>`,...X}}}get ajaxConfig(){return{url:this.url,datatype:"json",quietMillis:300,data:(e,t)=>this._searchQuery(e,t),results:e=>this._parseResponse(e)}}#f(e,t){const s=Q(this.ajaxConfig.data(e,t)),i=this.url.includes("?")?"&":"?";return s?`${this.url}${i}${s}`:this.url}async#E(e,t){const s=this.ajaxConfig,i=this.#y.getUrl(e),n=Number(new URL(i,window.location.origin).searchParams.get("page"));try{const l=await fetch(i,{headers:{Accept:"application/json",...s.params?.headers??{}}});if(!l.ok)throw new Error(`${l.status} ${l.statusText}`);const{results:o,more:r}=s.results(await l.json());r&&this.#y.setNextUrl(e,this.#f(e,n+1)),t(o)}catch(e){F(e.message||e,"error"),console.error(`[alchemy] Loading ${i} failed`,e),t()}}#w(e,t){if(this.multiple)return void this.#k(e,t);const s=this.#v;if(""===e||null==e){if(!s)return;this.#v=null,this.onChange({added:null,removed:s})}else if(!s||String(s.id)!==String(e)){const i=this.#L(t.options[e]);this.#v=i,this.onChange({added:i,removed:s})}}#k(e,t){const s=(e??[]).map(String),i=new Set(this.#b.keys()),n=new Set(s);i.forEach(e=>{n.has(e)||this.onChange({added:null,removed:this.#b.get(e)})}),s.forEach(e=>{i.has(e)||this.onChange({added:this.#L(t.options[e]),removed:null})})}#L(e){return e?Object.fromEntries(Object.entries(e).filter(([e])=>!e.startsWith("$"))):null}_searchQuery(e,t){return{q:{name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_parseResponse(e){const t=e.meta;return{results:e.data,more:t.page*t.per_page<t.total_count}}_renderListEntry(e,t){return this.#_(this._entry(e,t))}_renderResult(e){return this.#S(this._selectedEntry(e))}_entry(){throw new Error("You need to define an _entry function on your sub class!")}_selectedEntry(){throw new Error("You need to define a _selectedEntry function on your sub class!")}#_(e){return`\n <div class="remote-select--entry">\n ${this.#C(e)}\n ${this.#x("remote-select--primary",e.primary,{raw:!0})}\n ${this.#x("remote-select--aside",e.aside)}\n ${this.#x("remote-select--secondary",e.secondary)}\n ${this.#x("remote-select--secondary-aside",e.secondaryAside)}\n </div>\n `}#S(e){return`\n <div class="remote-select--selection">\n ${this.#C(e)}\n ${this.#x("remote-select--selection-name",e.primary,{raw:!0})}\n ${this.#x("remote-select--selection-aside",e.secondary)}\n </div>\n `}#C(e){return e.icon?`<alchemy-icon class="remote-select--icon" name="${R(e.icon)}"></alchemy-icon>`:e.media?`<img class="remote-select--media" src="${R(e.media)}" alt="">`:""}#x(e,t,{raw:s=!1}={}){if(null==t||""===t)return"";if("object"==typeof t){if(null!=t.badge&&""!==t.badge)return`<span class="${e} remote-select--badge">${R(t.badge)}</span>`;if(null==t.text||""===t.text)return"";const i=s?t.text:R(t.text);return"head"===t.truncate?`<span class="${e} remote-select--truncate-head"><bdi>${i}</bdi></span>`:`<span class="${e}">${i}</span>`}return`<span class="${e}">${s?t:R(t)}</span>`}_hightlightTerm(e,t){return K(e,t)}}class G extends Y{_entry(e,t){return{icon:e.icon_css_class,primary:this._hightlightTerm(e.name,t)}}_selectedEntry(e){return{icon:e.icon_css_class,primary:e.name}}}customElements.define("alchemy-attachment-select",G);class Z extends HTMLElement{connectedCallback(){this.addEventListener("change",this.#w)}disconnectedCallback(){this.removeEventListener("change",this.#w)}#w=e=>{const t=new Event("submit",{bubbles:!0,cancelable:!0});return e.target.form.dispatchEvent(t),!1}}customElements.define("alchemy-auto-submit",Z);class ee extends HTMLButtonElement{connectedCallback(){this.form?(this.form.addEventListener("submit",this),this.form.addEventListener("turbo:submit-end",this)):console.warn("No form for button found!",this)}handleEvent(e){switch(e.type){case"submit":"disabled"===this.getAttribute("disabled")?(e.preventDefault(),e.stopPropagation()):this.disable();break;case"turbo:submit-end":this.enable()}}disable(){const e=new E("small"),t=this.getBoundingClientRect();this.dataset.initialButtonText=this.innerHTML,this.setAttribute("disabled","disabled"),this.setAttribute("tabindex","-1"),this.classList.add("disabled"),this.style.width=`${t.width}px`,this.style.height=`${t.height}px`,this.innerHTML="&nbsp;",e.spin(this)}enable(){this.classList.remove("disabled"),this.removeAttribute("disabled"),this.removeAttribute("tabindex"),this.style.width=null,this.style.height=null,this.innerHTML=this.dataset.initialButtonText}}customElements.define("alchemy-button",ee,{extends:"button"});class te extends HTMLElement{connectedCallback(){this.translation=y("allowed_chars",this.maxChars),this.formField=this.getFormField(),this.formField&&(this.createDisplayElement(),this.countCharacters(),this.formField.addEventListener("keyup",this))}disconnectedCallback(){this.formField?.removeEventListener("keyup",this)}handleEvent(e){"keyup"===e.type&&this.countCharacters()}getFormField(){const e=this.querySelectorAll("input, textarea");return e.length>0?e[0]:void 0}createDisplayElement(){this.display=this.querySelector(":scope > .alchemy-char-counter"),this.display||(this.display=document.createElement("small"),this.display.className="alchemy-char-counter",this.formField.after(this.display))}countCharacters(){const e=this.formField.value.length;this.display.textContent=`${e} ${this.translation}`,this.display.classList.toggle("too-long",e>this.maxChars)}get maxChars(){return this.getAttribute("max-chars")??60}}customElements.define("alchemy-char-counter",te);class se extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(){this.form?.querySelectorAll('input[type="datetime-local"]').forEach(e=>{e.value=""})}}customElements.define("alchemy-clear-schedule-button",se,{extends:"button"});class ie extends HTMLElement{connectedCallback(){this.innerHTML='<alchemy-icon name="clipboard"></alchemy-icon>',this.clipboard=new ClipboardJS(this,{text:()=>this.getAttribute("content")}),this.clipboard.on("success",()=>{F(this.getAttribute("success-text"))})}disconnectedCallback(){this.clipboard.destroy()}}customElements.define("alchemy-clipboard-button",ie);class ne extends HTMLSelectElement{#y=null;connectedCallback(){this.classList.add("alchemy_selectbox"),this.#A()}disconnectedCallback(){this.#T()}enable(){this.removeAttribute("disabled"),this.#y?.enable()}disable(){this.setAttribute("disabled","disabled"),this.#y?.disable()}focus(){W(this.#y,()=>super.focus())}setOptions(e,t=void 0){const s=this.value;this.#T(),this.innerHTML="",t&&this.add(new Option(t,"")),e.forEach(e=>{this.add(new Option(e.text,e.id,!1,e.id===s))}),this.#A()}get allowClear(){return this.dataset.hasOwnProperty("allowClear")||this.multiple}get placeholder(){return this.getAttribute("placeholder")}get renderers(){return{}}#A(){const e={},s=!!this.placeholder,i=!!this.querySelector("option[selected]"),{onDropdownOpen:n,onDropdownClose:l}=V();this.multiple&&(e.remove_button=J()),this.allowClear&&(e.clear_button={html:()=>`<button type="button" class="clear-button" aria-label="${y("Clear selection")}">\n <alchemy-icon name="close" size="1x"></alchemy-icon>\n </button>`});const o={plugins:e,closeAfterSelect:!this.multiple,onInitialize:function(){this.input.autofocus&&this.focus(),s&&!i&&this.clear()},onType(e){this.control_input.classList.toggle("has-value",e.length>0)},refreshThrottle:0,onDropdownOpen:n,onDropdownClose:l,allowEmptyOption:!0,openOnFocus:!1,sortField:"$order",maxOptions:null,render:{...X,...this.renderers}};this.#y=new t(this,o),this.#y.control.addEventListener("click",this.#y.open.bind(this.#y))}#T(){j(this.#y),this.#y=null}}customElements.define("alchemy-select",ne,{extends:"select"});const le=(e,t)=>{const s=e.swatch||e.value;return`\n <div class="select-color-option">\n ${"custom_color"===e.value?'<alchemy-icon name="palette"></alchemy-icon>':`<span class="color-indicator" style="--color: ${t(s)}"></span>`}\n <span>${t(e.text)}</span>\n </div>`};customElements.define("alchemy-color-select",class extends ne{connectedCallback(){super.connectedCallback(),this.addEventListener("change",this.#w)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("change",this.#w)}get renderers(){return{item:le,option:le}}#w=()=>{const e=this.parentElement?.querySelector("input[type='color']");e&&(e.disabled="custom_color"!==this.value)}},{extends:"select"});class oe extends HTMLElement{connectedCallback(){this.colorInput?.addEventListener("input",this),this.textInput?.addEventListener("input",this),this.colorInput&&(this.colorInput.disabled=!1)}handleEvent(e){switch(e.target){case this.colorInput:this.textInput.value=this.colorInput.value;break;case this.textInput:this.colorInput.value=this.textInput.value}}disconnectedCallback(){this.colorInput?.removeEventListener("input",this),this.textInput?.removeEventListener("input",this)}get colorInput(){return this.querySelector("input[type='color']")}get textInput(){return this.querySelector("input[type='text']")}}customElements.define("alchemy-color-input",oe);class re extends HTMLElement{connectedCallback(){this.control?.addEventListener("change",this),this.toggle()}disconnectedCallback(){this.control?.removeEventListener("change",this)}handleEvent(e){"change"===e.type&&this.toggle()}toggle(){const e=!!this.control?.checked&&!this.control.disabled;this.hidden=!e,this.fields.forEach(t=>{"function"==typeof t.disable?e?t.enable():t.disable():t.disabled=!e})}get control(){return document.getElementById(this.getAttribute("control"))}get fields(){return this.querySelectorAll("input, select, textarea")}}customElements.define("alchemy-conditional-field",re);const ae=g();class ce extends HTMLElement{async connectedCallback(){"en"!==ae&&await import(`flatpickr/${ae}.js`),this.isConnected&&(this.flatpickr=a(this.inputField,this.flatpickrOptions))}disconnectedCallback(){this.flatpickr?.destroy()}get flatpickrOptions(){const e=/time/.test(this.inputType),t={locale:ae.slice(0,2),altInput:!0,altFormat:y(`formats.${this.inputType}`),altInputClass:"flatpickr-input",enableTime:e,noCalendar:"time"===this.inputType,time_24hr:y("formats.time_24hr"),onValueUpdate(e,t,s){s.element.closest("alchemy-element-editor")?.setDirty(this.inputField)}};return e&&(t.dateFormat="Z"),t}get inputField(){return this.querySelector("input")}get inputType(){return this.getAttribute("input-type")||"date"}}customElements.define("alchemy-datepicker",ce);class de extends HTMLAnchorElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(e){this.disabled||this.openDialog(),e.preventDefault()}openDialog(){this.dialog=new S(this.getAttribute("href"),this.dialogOptions),this.dialog.open()}get dialogOptions(){return this.dataset.dialogOptions?JSON.parse(this.dataset.dialogOptions):{}}get disabled(){return this.classList.contains("disabled")}}customElements.define("alchemy-dialog-link",de,{extends:"a"});let he=!1;class ue extends HTMLElement{connectedCallback(){this.addEventListener("submit",this.#I,!0)}disconnectedCallback(){this.removeEventListener("submit",this.#I,!0)}#I=e=>{if(he||!me())return;e.preventDefault(),e.stopPropagation();const t=e.target;pe().then(e=>{e&&(q(),t.requestSubmit())})}}function me(){return document.querySelectorAll("alchemy-element-editor.dirty").length>0}async function pe(){const e=await O(y("page_dirty_notice"),{title:y("warning"),ok_label:y("ok"),cancel_label:y("cancel")});return e&&(he=!0,window.onbeforeunload=void 0),e}document.addEventListener("turbo:before-visit",t=>{!he&&me()&&(t.preventDefault(),pe().then(s=>{s&&e.visit(t.detail.url)}))}),document.addEventListener("turbo:load",()=>{he=!1}),customElements.define("alchemy-dirty-guard",ue);const ge="application/json";function ye(e){return"get"===e.toLowerCase()}function ve(e,t,s){const i=function(e){return{"Content-Type":"application/json; charset=utf-8",Accept:e,"X-Requested-With":"XMLHttpRequest","X-CSRF-Token":be()}}(s),n={method:e,headers:i};return t&&!ye(e)&&(n.body=JSON.stringify(t)),n}function be(){return document.querySelector('meta[name="csrf-token"]').attributes.content.textContent}function fe(e,t){return ke("GET",e,t)}function Ee(e,t,s){return ke("PATCH",e,t,s)}function we(e,t,s=ge){return ke("POST",e,t,s)}async function ke(e,t,s,i=ge){const n=await fetch(function(e,t,s){const i=new URL(window.location.origin+e);return t&&ye(s)&&new URLSearchParams(t).forEach((e,t)=>{i.searchParams.set(t,e)}),i.toString()}(t,s,e),ve(e,s,i)),l=n.headers.get("content-type"),o=l?.includes(ge),r=l?.includes("text/vnd.turbo-stream.html");let a=null;if(o?a=await n.json():r&&(a=await n.text(),"undefined"!=typeof Turbo&&Turbo.renderStreamMessage(a)),n.ok)return{data:a,status:n.status};if(401===n.status&&a?.redirect_url)return Turbo.visit(a.redirect_url),new Promise(()=>{});throw a||new Error("An error occurred during the transaction")}class Le extends HTMLElement{dataItem(e){return{id:`#${e}`,text:`#${e}`}}get selectElement(){return this.querySelector('select[is="alchemy-select"]')}}customElements.define("alchemy-dom-id-api-select",class extends Le{#F=void 0;connectedCallback(){this.page=this.getAttribute("page")}async#q(){try{const e=(await fe(B.api_ingredients_path,{page_id:this.#F})).data.ingredients.filter(e=>e.data?.dom_id).map(e=>this.dataItem(e.data.dom_id)),t=e.length>0?y("None"):y("No anchors found");this.selectElement.setOptions(e,t),this.selectElement.enable()}catch(e){F(e.message||e,"error"),console.error(e)}}#$(){requestAnimationFrame(()=>{this.selectElement.disable(),this.selectElement.setOptions([],y("Select a page first"))})}set page(e){this.#F=e,e?this.#q():this.#$()}}),customElements.define("alchemy-dom-id-preview-select",class extends Le{connectedCallback(){requestAnimationFrame(()=>{const e=document.getElementById("alchemy_preview_window"),t=e.contentDocument?.querySelectorAll("[id]")||[];if(t.length>0){const e=Array.from(t).map(e=>this.dataItem(e.id));this.selectElement.setOptions(e,y("None"))}})}});class _e extends HTMLElement{#M;connectedCallback(){this.#M=this.scheduleButton.getAttribute("variant"),this.publishButton.addEventListener("click",this),this.dropdown.addEventListener("sl-show",this),this.dropdown.addEventListener("sl-hide",this)}disconnectedCallback(){this.publishButton.removeEventListener("click",this),this.dropdown.removeEventListener("sl-show",this),this.dropdown.removeEventListener("sl-hide",this)}handleEvent(e){switch(e.type){case"click":this.publishButton.loading=!0;break;case"sl-show":this.scheduleButton.setAttribute("variant","primary");break;case"sl-hide":this.scheduleButton.setAttribute("variant",this.#M)}}get publishButton(){return this.querySelector("sl-button[type='submit']")}get dropdown(){return this.querySelector("sl-dropdown")}get scheduleButton(){return this.querySelector("sl-button[slot='trigger']")}}function Se(e){document.dispatchEvent(new CustomEvent("alchemy:page-dirty",{detail:{tooltip:e.publishButtonTooltip}}))}customElements.define("alchemy-publish-element-button",_e);class Ce extends HTMLElement{connectedCallback(){this.button?.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}async handleEvent(){if(await O(this.message))try{const e=await ke("DELETE",this.url);this.#B(e.data)}catch(e){F(e.message||e,"error"),console.error(e)}}#B(e){const t=this.closest("alchemy-element-editor");t.addEventListener("transitionend",()=>{t.fixed&&T(t.elementId),t.remove()}),t.classList.add("dismiss"),F(e.message),e.pageHasUnpublishedChanges&&Se(e),z()}get url(){return this.getAttribute("href")}get message(){return this.getAttribute("message")}get button(){return this.querySelector("button")}}customElements.define("alchemy-delete-element-button",Ce);class xe extends HTMLElement{#D=null;#H=null;#z=null;connectedCallback(){this.classList.contains("ui-sortable-placeholder")||(this.addEventListener("click",this),this.addEventListener("alchemy:element-update-title",this),this.#D=this.form,this.#D&&(this.#D.addEventListener("change",this.onChange),this.#D.addEventListener("turbo:submit-start",this),this.#D.addEventListener("turbo:submit-end",this)),this.#H=this.header,this.#H?.addEventListener("dblclick",this.#P),this.#z=this.toggleButton,this.#z?.addEventListener("click",this.#O),this.hasAttribute("created")&&(this.focusElement(),this.previewWindow?.refresh().then(()=>{this.focusElementPreview()}),this.removeAttribute("created")))}disconnectedCallback(){this.removeEventListener("click",this),this.removeEventListener("alchemy:element-update-title",this),this.#D&&(this.#D.removeEventListener("change",this.onChange),this.#D.removeEventListener("turbo:submit-start",this),this.#D.removeEventListener("turbo:submit-end",this),this.#D=null),this.#H?.removeEventListener("dblclick",this.#P),this.#H=null,this.#z?.removeEventListener("click",this.#O),this.#z=null}handleEvent(e){switch(e.type){case"click":e.target.closest("alchemy-element-editor")===this&&this.onClickElement();break;case"turbo:submit-start":this.setClean();break;case"turbo:submit-end":this.onSaveElement(e.detail.success);break;case"alchemy:element-update-title":this.hasEditors||e.target!=this.firstChild||this.setTitle(e.detail.title)}}onChange=e=>{const t=e.target;if(!t.classList.contains("nested-elements"))return this.setDirty(t),e.stopPropagation(),!1};async focusElement(){document.querySelector("#fixed-elements")&&await this.selectTabForElement(),await this.expand(),this.selectElement(!0)}focusElementPreview(){this.previewWindow?.postMessage({message:"Alchemy.focusElement",element_id:this.elementId})}onClickElement(){this.selectElement(),this.focusElementPreview()}onSaveElement(e){e?this.previewWindow?.refresh().then(()=>{this.focusElementPreview()}):this.elementErrors.classList.remove("hidden")}scrollToElement(){setTimeout(()=>{this.scrollIntoView({behavior:"smooth"})},50)}selectElement(e=!1){document.querySelectorAll("alchemy-element-editor.selected").forEach(e=>{e.classList.remove("selected")}),window.requestAnimationFrame(()=>{this.classList.add("selected")}),e&&this.scrollToElement()}selectTabForElement(){return new Promise((e,t)=>{const s=document.querySelector("#fixed-elements"),i=this.closest("sl-tab-panel");s&&i?(s.show(i.getAttribute("name")),e()):t(new Error("No tabs present"))})}setClean(){this.dirty=!1,window.onbeforeunload=null,this.elementErrors.classList.add("hidden"),this.hasEditors&&this.body.querySelectorAll(".ingredient-editor").forEach(e=>{e.classList.remove("dirty","validation_failed"),e.querySelectorAll("small.error").forEach(e=>e.remove())})}setDirty(e){this.hasEditors&&(this.dirty=!0,window.onbeforeunload||(window.onbeforeunload=e=>e.preventDefault()),e?.closest(".ingredient-editor")?.classList.add("dirty"))}setTitle(e){const t=this.querySelector(".element-header .preview_text_quote");t&&(t.textContent=e)}async toggle(){this.collapsed?await this.expand():await this.collapse()}collapse(){if(this.collapsed||this.compact||this.fixed)return Promise.resolve("Element is already collapsed.");const e=new Alchemy.Spinner("small");return e.spin(this.toggleButton),this.toggleIcon?.classList?.add("hidden"),we(B.collapse_admin_element_path(this.elementId)).then(e=>{const t=e.data;if(this.collapsed=!0,this.toggleButton?.setAttribute("title",t.title),t.nestedElementIds.length){const e=t.nestedElementIds.map(e=>`#element_${e}`).join(", ");this.querySelectorAll(e).forEach(e=>{e.collapsed=!0,e.toggleButton?.setAttribute("title",t.title)})}}).catch(e=>{F(e.message,"error"),console.error(e)}).finally(()=>{this.toggleIcon?.classList?.remove("hidden"),e.stop()})}expand(){if(this.expanded&&!this.compact)return Promise.resolve("Element is already expanded.");if(this.compact&&this.parentElementEditor)return this.parentElementEditor.expand();{const e=new Alchemy.Spinner("small");return e.spin(this.toggleButton),this.toggleIcon?.classList.add("hidden"),new Promise((t,s)=>{we(B.expand_admin_element_path(this.elementId)).then(e=>{const s=e.data;if(s.parentElementIds.length){const e=s.parentElementIds.map(e=>`#element_${e}`).join(", ");document.querySelectorAll(e).forEach(e=>{e.collapsed=!1,e.toggleButton?.setAttribute("title",s.title)})}this.collapsed=!1,this.toggleButton?.setAttribute("title",s.title),t()}).catch(e=>{F(e.message,"error"),console.error(e),s(e)}).finally(()=>{this.toggleIcon?.classList?.remove("hidden"),e.stop()})})}}updateTitle(e){this.setTitle(e),this.dispatchEvent(new CustomEvent("alchemy:element-update-title",{bubbles:!0,detail:{title:e}}))}set published(e){e?this.classList.remove("element-hidden"):this.classList.add("element-hidden")}get published(){return!this.classList.contains("hidden")}get compact(){return null!==this.getAttribute("compact")}get fixed(){return null!==this.getAttribute("fixed")}set collapsed(e){this.classList.toggle("folded",e),this.classList.toggle("expanded",!e),this.toggleIcon&&(this.toggleIcon.name=e?"arrow-left-s":"arrow-down-s")}get collapsed(){return this.classList.contains("folded")}get expanded(){return!this.collapsed}set dirty(e){this.classList.toggle("dirty",e)}get dirty(){return this.classList.contains("dirty")}get header(){return this.querySelector(".element-header")}get body(){return this.querySelector(this.bodySelector)}get bodySelector(){return`#${this.id} > .element-body`}get footer(){return this.querySelector(`#${this.id} > .element-footer`)}get toggleButton(){return this.querySelector(".element-toggle")}get toggleIcon(){return this.toggleButton?.querySelector("alchemy-icon")}get elementErrors(){return this.body.querySelector(".element_errors")}get elementId(){return this.dataset.elementId}get elementName(){return this.dataset.elementName}get hasEditors(){return!!this.body?.querySelector(".element-ingredient-editors")}get hasChildren(){return!!this.querySelector(".nested-elements")}get firstChild(){return this.querySelector("alchemy-element-editor")}get form(){return this.querySelector(`#${this.id} > form.element-body`)}get parentElementEditor(){return this.parentElement?.closest("alchemy-element-editor")}get previewWindow(){return document.getElementById("alchemy_preview_window")}#P=()=>{this.toggle()};#O=e=>{e.target.closest("alchemy-element-editor")===this&&this.toggle()}}customElements.define("alchemy-element-editor",xe);const Ae=(e,t)=>`\n <div class="element-select-name">\n ${e}<span>${t}</span>\n </div>\n`;class Te extends ne{get renderers(){return{item:(e,t)=>Ae(e.icon,t(e.text)),option:(e,t)=>{const s=e.hint?`<div class="element-select-description">${t(e.hint)}</div>`:"";return`\n <div class="element-select-item">\n ${Ae(e.icon,t(e.text))}\n ${s}\n </div>\n `}}}}customElements.define("alchemy-element-select",Te,{extends:"select"});class Ie extends HTMLElement{#N=!0;#U=null;connectedCallback(){this.toggleButton?.addEventListener("click",this.#O),this.collapseButton?.addEventListener("click",this.#R),window.addEventListener("message",this.#W),document.body.addEventListener("click",this.#j),window.location.hash&&this.focusElementEditor(window.location.hash),this.resize()}disconnectedCallback(){this.toggleButton?.removeEventListener("click",this.#O),this.collapseButton?.removeEventListener("click",this.#R),window.removeEventListener("message",this.#W),document.body.removeEventListener("click",this.#j)}#O=e=>{e.preventDefault(),this.toggle()};#R=()=>{this.collapseAllElements()};#W=e=>{const t=e.data;if("Alchemy.focusElementEditor"==t?.message){const e=document.getElementById(`element_${t.element_id}`);this.show(),e?.focusElement()}};#j=e=>{e.target.closest("alchemy-element-editor")||(this.querySelectorAll("alchemy-element-editor").forEach(e=>{e.classList.remove("selected")}),this.previewWindow?.postMessage({message:"Alchemy.blurElements"}))};collapseAllElements(){this.querySelectorAll("alchemy-element-editor:not([compact]):not([fixed])").forEach(e=>e.collapse())}toggle(){this.#N?this.hide():this.show()}show(){document.body.classList.add("elements-window-visible"),this.#N=!0,this.toggleButton.closest("sl-tooltip").content=Alchemy.t("Hide elements"),this.toggleButton.querySelector("alchemy-icon").setAttribute("name","menu-unfold"),this.resize()}hide(){document.body.classList.remove("elements-window-visible"),document.body.style.removeProperty("--elements-window-width"),this.#N=!1,this.toggleButton.closest("sl-tooltip").content=Alchemy.t("Show elements"),this.toggleButton.querySelector("alchemy-icon").setAttribute("name","menu-fold")}resize(e){void 0===e&&(e=this.widthFromCookie),e&&(document.body.style.setProperty("--elements-window-width",`${e}px`),document.cookie=`alchemy-elements-window-width=${e}; SameSite=Lax; Path=/;`)}focusElementEditor(e){const t=document.querySelector(e);t instanceof xe&&t.focusElement()&&t.focusElementPreview()}get collapseButton(){return this.querySelector("#collapse-all-elements-button")}get toggleButton(){return document.querySelector("#element_window_button")}get previewWindow(){return document.getElementById("alchemy_preview_window")}get turboFrame(){return this.#U||(this.#U=this.closest("turbo-frame")),this.#U}get widthFromCookie(){return document.cookie.split("; ").find(e=>e.startsWith("alchemy-elements-window-width="))?.split("=")[1]}set isDragged(e){this.turboFrame.style.transitionProperty=e?"none":null,this.turboFrame.style.pointerEvents=e?"none":null}}customElements.define("alchemy-elements-window",Ie);class Fe extends HTMLElement{#V=!1;#J=null;#X=null;#K=400;#Q=1e3;connectedCallback(){this.addEventListener("mousedown",this),window.addEventListener("mousemove",this),window.addEventListener("mouseup",this)}disconnectedCallback(){this.removeEventListener("mousedown",this),window.removeEventListener("mousemove",this),window.removeEventListener("mouseup",this)}handleEvent(e){switch(e.type){case"mousedown":e.stopPropagation(),this.onMouseDown();break;case"mouseup":this.onMouseUp();break;case"mousemove":this.#V&&this.onDrag(e.pageX)}}onMouseDown(){this.#V=!0;const e=getComputedStyle(this.elementsWindow);this.#K=parseFloat(e.minWidth)||400,this.#Q="none"===e.maxWidth?1e3:parseFloat(e.maxWidth),this.elementsWindow.isDragged=!0,this.previewWindow.isDragged=!0,this.classList.add("is-dragged")}onMouseUp(){this.#V=!1,this.elementsWindow.isDragged=!1,this.previewWindow.isDragged=!1,this.classList.remove("is-dragged")}onDrag(e){const t=window.innerWidth-e,s=Math.min(Math.max(t,this.#K),this.#Q);this.elementsWindow.resize(s)}get elementsWindow(){return this.#J||(this.#J=document.querySelector("alchemy-elements-window")),this.#J}get previewWindow(){return this.#X||(this.#X=document.getElementById("alchemy_preview_window")),this.#X}}customElements.define("alchemy-elements-window-handle",Fe);class qe extends HTMLElement{connectedCallback(){this.deleteLink=this.querySelector(".remove_file_link"),this.fileIcon=this.querySelector(".file_icon"),this.fileName=this.querySelector(".file_name"),this.formFieldId=this.deleteLink?.dataset.formFieldId,this.formField=this.querySelector(`#${this.formFieldId}`),this.deleteLink?.addEventListener("click",this)}disconnectedCallback(){this.deleteLink?.removeEventListener("click",this)}handleEvent(e){"click"===e.type&&this.removeFile(),e.stopPropagation()}removeFile(){this.formField.value="",this.fileIcon.innerHTML="",this.fileName.innerHTML="",this.deleteLink?.classList.add("hidden"),this.closest("alchemy-element-editor").setDirty(this.formField)}}customElements.define("alchemy-file-editor",qe);class $e extends HTMLElement{#Y;#G=null;#Z=null;connectedCallback(){this.hotkey&&key(this.hotkey,this.#ee),this.#G=this.filterField,this.#G.addEventListener("keyup",this.#te),this.#G.addEventListener("focus",this.#se),this.#Z=this.clearButton,this.#Z.addEventListener("click",this.#ie),key("esc","list_filter",this.#ne)}disconnectedCallback(){clearTimeout(this.#Y),this.#G?.removeEventListener("keyup",this.#te),this.#G?.removeEventListener("focus",this.#se),this.#G=null,this.#Z?.removeEventListener("click",this.#ie),this.#Z=null,this.hotkey&&key.unbind(this.hotkey),key.unbind("esc","list_filter")}filter(e){""===e&&(this.clearButton.style.visibility="hidden");const t=[],s=new Set,i=e.toLowerCase();this.items.forEach(e=>{const n=e.getAttribute(this.nameAttribute)?.toLowerCase();if(-1!==n.indexOf(i)){t.push(e),s.add(e);let i=e.parentElement?.closest(this.itemsSelector);for(;i;)s.add(i),i=i.parentElement?.closest(this.itemsSelector)}}),this.items.forEach(e=>{e.classList.toggle("hidden",!s.has(e))}),1===t.length&&t[0].scrollIntoView({behavior:"smooth",block:"nearest"})}clear(){this.filterField.value="",this.clearButton.style.visibility="hidden",this.items.forEach(e=>e.classList.remove("hidden"))}get nameAttribute(){return this.getAttribute("name-attribute")||"name"}get clearButton(){return this.querySelector('button[type="button"]')}get filterField(){return this.querySelector('input[type="text"]')}get items(){return document.querySelectorAll(this.itemsSelector)}get itemsSelector(){return this.getAttribute("items-selector")}get debounceTime(){return parseInt(this.getAttribute("debounce-time"))||150}get hotkey(){return this.getAttribute("hotkey")}#ee=()=>(this.filterField.focus(),!1);#te=()=>{clearTimeout(this.#Y),this.#Y=setTimeout(()=>{const e=this.filterField.value;this.clearButton.style.visibility=e?"visible":"hidden",this.filter(e)},this.debounceTime)};#se=()=>key.setScope("list_filter");#ie=e=>{e.preventDefault(),this.clear()};#ne=()=>{this.clear(),this.filterField.blur()}}customElements.define("alchemy-list-filter",$e);class Me extends HTMLElement{#le=null;#oe=null;connectedCallback(){this.addEventListener("mouseenter",this.#re),this.addEventListener("mouseleave",this.#ae)}disconnectedCallback(){this.removeEventListener("mouseenter",this.#re),this.removeEventListener("mouseleave",this.#ae),this.#ae()}#re=()=>{const e=this.#ce();e&&(this.#le=e,this.#oe=s(this,e,()=>{i(this,e,{strategy:"fixed",placement:"right-start",middleware:[l({fallbackPlacements:["right-end"],padding:8})]}).then(({x:t,y:s})=>{Object.assign(e.style,{position:"fixed",left:`${Math.round(t)}px`,top:`${Math.round(s)}px`})})}))};#ae=()=>{this.#oe?.(),this.#oe=null,this.#le&&(this.#le.style.position="",this.#le.style.left="",this.#le.style.top="",this.#le=null)};#ce(){const e=this.querySelector(".sub_navigation")||this.querySelector("label");return e&&"static"!==getComputedStyle(e).position?e:null}}customElements.define("alchemy-main-navi-entry",Me);class Be extends HTMLElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(e){e.target.closest("alchemy-node-folder")===this.folder&&this.toggleFolded(e)}async toggleFolded(e){e.preventDefault();try{await Ee(B.node.toggle_folded_api_path(this.nodeId)),this.folded=!this.folded}catch(e){F(e.message||e,"error")}}updateFolder(){this.folder.hidden=!(this.hasChildren||this.folded)}get folded(){return this.hasAttribute("folded")}set folded(e){this.toggleAttribute("folded",e),this.folder.toggleAttribute("folded",e),this.childrenList.classList.toggle("folded",e)}get hasChildren(){return this.childrenList.querySelectorAll(":scope > alchemy-menu-node").length>0}get nodeId(){return this.getAttribute("node-id")}get folder(){return this.querySelector(":scope > li > .sitemap_node alchemy-node-folder")}get childrenList(){return this.querySelector(":scope > li > ul.children")}}customElements.define("alchemy-menu-node",Be);class De extends HTMLElement{#de=null;handleEvent(e){"click"===e.type&&this.dismiss()}connectedCallback(){if(!this.querySelector(":scope > alchemy-icon")){const e=this.dismissable&&"error"===this.type?'<alchemy-icon name="close"></alchemy-icon>':"";this.insertAdjacentHTML("afterbegin",`<alchemy-icon name="${this.iconName}"></alchemy-icon>${e}`)}(this.dismissable||"error"===this.type)&&this.addEventListener("click",this),this.dismissable&&"error"!==this.type&&(this.#de=setTimeout(()=>{this.dismiss()},this.dismissDelay))}disconnectedCallback(){null!==this.#de&&(clearTimeout(this.#de),this.#de=null)}dismiss(){this.addEventListener("transitionend",()=>this.remove()),this.classList.add("dismissed")}get dismissable(){return this.hasAttribute("dismissable")}get icon(){return this.getAttribute("icon")}get type(){return this.getAttribute("type")||"notice"}get dismissDelay(){return parseInt(this.noticesWrapper?.dataset.autoDismissDelay||5e3)}get iconName(){switch(this.icon||this.type){case"warning":case"warn":case"alert":return"alert";case"notice":return"check";case"info":case"hint":return"information";case"error":return"bug";default:return this.type}}get noticesWrapper(){return this.closest("#flash_notices")}}customElements.define("alchemy-message",De);class He extends HTMLElement{connectedCallback(){F(this.message,this.getAttribute("type")||"notice"),this.remove()}get message(){return this.getAttribute("message")||this.innerHTML}}customElements.define("alchemy-growl",He);class ze extends HTMLElement{#he=null;#ue=null;#me=null;connectedCallback(){this.image=this.querySelector("img"),this.form=this.querySelector("form"),this.#ue=document.getElementById(this.getAttribute("crop-from-field-id")),this.#me=document.getElementById(this.getAttribute("crop-size-field-id")),this.elementEditor=document.querySelector(`[data-element-id='${this.getAttribute("element-id")}']`),this.form.addEventListener("submit",this.#pe),this.form.addEventListener("reset",this.#ge),this.#he=new c(this.image,this.cropperOptions)}disconnectedCallback(){this.#he?.destroy()}get cropperOptions(){return{aspectRatio:this.aspectRatio,viewMode:1,zoomable:!1,checkCrossOrigin:!1,checkOrientation:!1,data:this.box}}get aspectRatio(){const e=this.getAttribute("ratio");return e?parseFloat(e):NaN}get cropFrom(){if(this.#ue?.value)return this.#ue.value.split("x").map(e=>parseInt(e))}get cropSize(){if(this.#me?.value)return this.#me.value.split("x").map(e=>parseInt(e))}get box(){return this.cropFrom&&this.cropSize?{x:this.cropFrom[0],y:this.cropFrom[1],width:this.cropSize[0],height:this.cropSize[1]}:this.defaultBox}get defaultBox(){const e=JSON.parse(this.getAttribute("default-box"));return{x:e[0],y:e[1],width:e[2],height:e[3]}}update(e){this.#ue.value=`${e.x}x${e.y}`,this.#ue.dispatchEvent(new Event("change")),this.#me.value=`${e.width}x${e.height}`,this.#me.dispatchEvent(new Event("change"))}reset(){const e=this.#he;e.setData(this.defaultBox);const t=e.getCanvasData(),s=t.width/t.naturalWidth;e.setCropBoxData({left:t.left+this.defaultBox.x*s,top:t.top+this.defaultBox.y*s}),this.update(this.defaultBox)}#pe=e=>{e.preventDefault(),this.update(this.#he.getData(!0)),this.elementEditor?.setDirty(),C()?.close()};#ge=e=>{e.preventDefault(),this.reset()}}customElements.define("alchemy-image-cropper",ze);class Pe extends S{#ye=e=>{if(e.target.closest(".picture-overlay-handle"))return e.preventDefault(),void this.dialog.classList.toggle("hide-form");if(e.target.closest(".zoomed-picture-background")){if(e.stopPropagation(),"IMG"===e.target.nodeName)return;this.close()}};#ve=e=>{if("INPUT"!==e.target.nodeName&&"TEXTAREA"!==e.target.nodeName)switch(e.key){case"ArrowLeft":this.previous(),e.preventDefault();break;case"ArrowRight":this.next(),e.preventDefault()}};resize(){}init(){this.dialog_body.removeEventListener("click",this.#ye),this.dialog_body.addEventListener("click",this.#ye),this.#be(),super.init()}previous(){this.dialog_body.querySelector(".previous-picture")?.click()}next(){this.dialog_body.querySelector(".next-picture")?.click()}close(){return document.removeEventListener("keydown",this.#ve),super.close()}build(){this.dialog_container=f('<dialog class="alchemy-image-overlay-container"></dialog>'),this.dialog=f('<div class="alchemy-image-overlay-dialog"></div>'),this.dialog_body=f('<div class="alchemy-image-overlay-body"></div>'),this.close_button=f('<a class="alchemy-image-overlay-close">\n <alchemy-icon name="close" size="xl"></alchemy-icon>\n </a>'),this.dialog.append(this.close_button),this.dialog.append(this.dialog_body),this.dialog_container.append(this.dialog),document.body.append(this.dialog_container)}#be(){document.removeEventListener("keydown",this.#ve),document.addEventListener("keydown",this.#ve)}}customElements.define("alchemy-image-overlay-link",class extends de{openDialog(){this.dialog=new Pe(this.href,{padding:!1}),this.dialog.open()}},{extends:"a"});class Oe extends HTMLDetailsElement{#fe="Alchemy.expanded_ingredient_groups";connectedCallback(){this.addEventListener("toggle",this),this.isInLocalStorage&&(this.open=!0)}disconnectedCallback(){this.removeEventListener("toggle",this)}handleEvent(){let e=this.localStorageItem;this.open?(this.toggleIcon.name="arrow-down-s",this.isInLocalStorage||e.push(this.id)):(this.toggleIcon.name="arrow-right-s",e=e.filter(e=>e!==this.id)),localStorage.setItem(this.#fe,JSON.stringify(e))}get isInLocalStorage(){return this.localStorageItem.includes(this.id)}get localStorageItem(){const e=localStorage.getItem(this.#fe);if(!e)return[];try{return JSON.parse(e)}catch(e){return console.error(e),[]}}get toggleIcon(){return this.querySelector("alchemy-icon")}}customElements.define("alchemy-ingredient-group",Oe,{extends:"details"});class Ne extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this),this.classList.add("icon_button"),this.setAttribute("type","button"),this.innerHTML='<alchemy-icon name="link" icon-style="m"></alchemy-icon>'}handleEvent(e){new Alchemy.LinkDialog({url:this.linkUrl,title:this.linkTitle,target:this.linkTarget,type:this.linkClass}).open().then(e=>this.setLink(e)),e.preventDefault()}setLink(e){""===e.url?(this.classList.remove("linked"),this.dispatchEvent(new CustomEvent("alchemy:unlink",{bubbles:!0}))):(this.classList.add("linked"),this.dispatchEvent(new CustomEvent("alchemy:link",{bubbles:!0,detail:e})))}get linkUrl(){return this.linkButtons.linkUrlField.value}get linkTitle(){return this.linkButtons.linkTitleField.value}get linkTarget(){return this.linkButtons.linkTargetField.value}get linkClass(){return this.linkButtons.linkClassField.value}get linkButtons(){return this.closest("alchemy-link-buttons")}}customElements.define("alchemy-link-button",Ne,{extends:"button"});class Ue extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this),this.classList.add("icon_button"),this.setAttribute("type","button"),this.linked=this.linked,this.innerHTML='<alchemy-icon name="link-unlink" icon-style="m"></alchemy-icon>'}handleEvent(e){this.linked&&(this.linked=!1,this.blur(),this.dispatchEvent(new CustomEvent("alchemy:unlink",{bubbles:!0}))),e.preventDefault()}set linked(e){e?(this.classList.replace("disabled","linked"),this.removeAttribute("tabindex")):(this.classList.replace("linked","disabled"),this.setAttribute("tabindex","-1"))}get linked(){return this.classList.contains("linked")}}customElements.define("alchemy-unlink-button",Ue,{extends:"button"});class Re extends HTMLElement{connectedCallback(){this.addEventListener("alchemy:link",this),this.addEventListener("alchemy:unlink",this)}disconnectedCallback(){this.removeEventListener("alchemy:link",this),this.removeEventListener("alchemy:unlink",this)}handleEvent(e){switch(e.type){case"alchemy:link":this.setLink(e.detail);break;case"alchemy:unlink":this.removeLink()}e.stopPropagation()}setLink(e){this.linkUrlField.value=e.url,this.linkUrlField.dispatchEvent(new Event("change")),this.linkTitleField.value=e.title,this.linkClassField.value=e.type,this.linkTargetField.value=e.target,this.unlinkButton.linked=!0,this.setElementDirty()}removeLink(){this.linkUrlField.value="",this.linkUrlField.dispatchEvent(new Event("change")),this.linkTitleField.value="",this.linkClassField.value="",this.linkTargetField.value="",this.linkButton.classList.remove("linked"),this.unlinkButton.linked=!1,this.setElementDirty()}setElementDirty(){this.elementEditor.setDirty(this)}get linkButton(){return this.querySelector('[is="alchemy-link-button"]')}get unlinkButton(){return this.querySelector('[is="alchemy-unlink-button"]')}get ingredientEditor(){const e=this.dataset.ingredientId;return this.parentElement.closest(`[data-ingredient-id='${e}']`)}get elementEditor(){return this.closest("alchemy-element-editor")}get linkUrlField(){return this.ingredientEditor.querySelector("[data-link-value]")}get linkTitleField(){return this.ingredientEditor.querySelector("[data-link-title]")}get linkTargetField(){return this.ingredientEditor.querySelector("[data-link-target]")}get linkClassField(){return this.ingredientEditor.querySelector("[data-link-class]")}}customElements.define("alchemy-link-buttons",Re);class We extends HTMLElement{connectedCallback(){this.track=this.querySelector(".news-reader--track"),this.slides=Array.from(this.querySelectorAll(".news-reader--item")),!this.track||this.slides.length<2||(this.currentIndex=0,this.createDots(),this.setActive(0),this.startRotation(),this.addEventListener("mouseenter",this),this.addEventListener("mouseleave",this),this.track.addEventListener("scroll",this,{passive:!0}))}disconnectedCallback(){this.stopRotation()}handleEvent(e){switch(e.type){case"mouseenter":this.stopRotation();break;case"mouseleave":this.startRotation();break;case"scroll":this.syncActiveToScroll()}}createDots(){this.dotList=document.createElement("div"),this.dotList.className="news-reader--dots",this.dots=this.slides.map((e,t)=>{const s=document.createElement("button");return s.type="button",s.className="news-reader--dot",s.setAttribute("aria-label",`${t+1}`),s.addEventListener("click",()=>{this.goTo(t),this.startRotation()}),this.dotList.append(s),s}),this.append(this.dotList)}goTo(e){this.currentIndex=e,this.slides[e].scrollIntoView({behavior:"smooth",inline:"start",block:"nearest"}),this.setActive(e)}next(){this.goTo((this.currentIndex+1)%this.slides.length)}syncActiveToScroll(){const e=this.track.clientWidth;if(!e)return;const t=Math.round(this.track.scrollLeft/e);t!==this.currentIndex&&this.slides[t]&&(this.currentIndex=t,this.setActive(t))}setActive(e){this.dots.forEach((t,s)=>{t.classList.toggle("is-active",s===e)})}startRotation(){this.stopRotation(),this.timer=window.setInterval(()=>this.next(),this.interval)}stopRotation(){this.timer&&window.clearInterval(this.timer),this.timer=null}get interval(){return parseInt(this.getAttribute("interval"),10)||8e3}}customElements.define("alchemy-news-reader",We);class je extends HTMLElement{static get observedAttributes(){return["folded"]}connectedCallback(){this.innerHTML=`\n <button class="node_folder icon_button">\n <alchemy-icon name="${this.iconName}"></alchemy-icon>\n </button>\n `}attributeChangedCallback(){this.icon?.setAttribute("name",this.iconName)}get icon(){return this.querySelector("alchemy-icon")}get iconName(){return this.folded?"arrow-right-s":"arrow-down-s"}get folded(){return this.hasAttribute("folded")}}customElements.define("alchemy-node-folder",je);class Ve extends HTMLElement{connectedCallback(){this.addEventListener("Alchemy.RemoteSelect.Change",this.#Ee)}disconnectedCallback(){this.removeEventListener("Alchemy.RemoteSelect.Change",this.#Ee)}#Ee=e=>{const t=e.detail.added;t?(this.nameField.setAttribute("placeholder",t.name),this.urlField.value=t.url_path,this.urlField.setAttribute("disabled","disabled")):(this.nameField.removeAttribute("placeholder"),this.urlField.value="",this.urlField.removeAttribute("disabled"))};get nameField(){return this.querySelector("#node_name")}get urlField(){return this.querySelector("#node_url")}}customElements.define("alchemy-node-form",Ve);customElements.define("alchemy-node-select",class extends Y{_searchQuery(e,t){return{filter:{name_or_page_name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_entry(e,t){return{icon:"menu-2",primary:this.#we(e)+this._hightlightTerm(e.name,t),secondary:{text:e.url,truncate:"head"}}}_selectedEntry(e){return{icon:"menu-2",primary:this.#we(e)+R(e.name)}}#we(e){const t=e.ancestors.map(e=>e.name);if(0===t.length)return"";const s='<alchemy-icon name="arrow-right-s" class="node-select--separator"></alchemy-icon>';return`<span class="node-select--ancestors">${t.map(R).join(s)}</span>${s}`}});class Je extends HTMLElement{connectedCallback(){this.querySelectorAll("ul.children").forEach(e=>{new d(e,{group:"nodes",animation:150,fallbackOnBody:!0,swapThreshold:.65,handle:".node_name",invertSwap:!0,draggable:"alchemy-menu-node",onEnd:e=>this.handleSort(e)})})}async handleSort(e){if(e.from===e.to&&e.oldIndex===e.newIndex)return;const t=B.node.move_api_path(e.item.nodeId),s={target_parent_id:e.to.dataset.recordId,new_position:e.newIndex};try{await Ee(t,s),this.updateFolders(e.from,e.to),F(y("Successfully moved menu item"))}catch(e){F(e.message||e,"error")}}updateFolders(e,t){e.closest("alchemy-menu-node")?.updateFolder(),e!==t&&t.closest("alchemy-menu-node")?.updateFolder()}}function Xe(e){let t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return t>3&&(t=3),(e/Math.pow(1024,t)).toFixed(2)+" "+["B","kB","MB","GB"][t]}customElements.define("alchemy-node-tree",Je);class Ke extends HTMLElement{file=null;request=null;progressEventLoaded=0;progressEventTotal=0;#ke=!0;#Le=0;#_e=void 0;#Se="";connectedCallback(){if(this.innerHTML=`\n <sl-progress-bar value="${this.value}"></sl-progress-bar>\n <div class="description">\n <span class="file-name">${this.file?.name}</span>\n <span class="loaded-size">${this.loadedSize}</span>\n <span class="error-message">${this.errorMessage}</span>\n </div>\n <sl-tooltip content="${y("Abort upload")}">\n <button class="icon_button" aria-label="${y("Abort upload")}">\n <alchemy-icon name="close"></alchemy-icon>\n </button>\n </sl-tooltip>\n `,this.querySelector("button").addEventListener("click",()=>this.cancel()),this.file?.type.includes("image")){const e=new FileReader;e.readAsDataURL(this.file),e.addEventListener("load",()=>{const t=new Image;t.src=e.result,this.prepend(t)})}}initialize(e,t){this.file=e,this.request=t,this.progressEventTotal=e?e.size:0,this.status="in-progress",this.#Ce(),this.#xe()}cancel(){this.finished||(this.status="canceled",this.request?.abort(),this.dispatchCustomEvent("FileUpload.Change"))}dispatchCustomEvent(e){this.dispatchEvent(new CustomEvent(`Alchemy.${e}`,{bubbles:!0}))}#Ce(){const e=M("alchemy_uploader_defaults"),t=e.file_size_limit*Math.pow(1024,2);let s;this.file?.size>t&&(s=y("Uploaded bytes exceed file size"));const i=this.file?.type.includes("image")?e.allowed_filetypes.alchemy_pictures:e.allowed_filetypes.alchemy_attachments,n=this.file?.name.match(/\.([^.]+)$/)?.[1].toLowerCase();i.includes("*")||i.some(e=>e.toLowerCase()===n)||(s=y("File type not allowed")),s&&(this.valid=!1,this.errorMessage=s)}#xe(){this.request&&(this.request.upload.onprogress=e=>{this.progressEvent=e},this.request.onload=()=>{this.request.status<400?(this.status="successful",F(this.responseMessage)):(this.status="failed",this.errorMessage=this.responseMessage),this.dispatchCustomEvent("FileUpload.Change")},this.request.onerror=()=>{this.errorMessage=y("An error occurred during the transaction")})}get active(){return this.valid&&"canceled"!==this.status}get errorMessage(){return this.#Se||""}set errorMessage(e){this.#Se=e;const t=this.querySelector(".error-message");t&&(t.textContent=e),F(e,"error")}get finished(){return["canceled","successful","failed"].includes(this.status)}get loadedSize(){return`${Xe(this.progressEventLoaded)} / ${Xe(this.progressEventTotal)}`}get progressElement(){return this.querySelector("sl-progress-bar")}set progressEvent(e){this.progressEventLoaded=e.loaded,this.progressEventTotal=e.total,this.value=Math.round(e.loaded/e.total*100),this.querySelector(".loaded-size").textContent=this.loadedSize}get responseMessage(){try{return JSON.parse(this.request.responseText).message}catch(e){return`${this.request.status}: ${this.request.statusText}`}}get status(){return this.#_e}set status(e){this.#_e=e,this.className=e,this.progressElement?.toggleAttribute("indeterminate","upload-finished"===e)}get valid(){return this.#ke}set valid(e){this.#ke=e,this.classList.toggle("invalid",!e)}get value(){return this.#Le}set value(e){this.#Le=e,this.progressElement&&(this.progressElement.value=e),100===e&&(this.status="upload-finished"),this.dispatchCustomEvent("FileUpload.Change")}}customElements.define("alchemy-file-upload",Ke);class Qe extends HTMLElement{fileCount=0;#Ae=[];#Te=y("Cancel all uploads");#Ie=null;#N=!1;#Fe=()=>this.#qe();connectedCallback(){var e,t;this.innerHTML=(e=this.#Te,t=this.fileCount,`\n <sl-progress-bar value="0"></sl-progress-bar>\n <div class="overall-progress-value">\n <span class="value-text"></span>\n\n <sl-tooltip content="${e}">\n <button class="icon_button" aria-label="${e}">\n <alchemy-icon name="close"></alchemy-icon>\n </button>\n </sl-tooltip>\n </div>\n <div class="single-uploads" style="--progress-columns: ${t>3?3:t}"></div>\n <div class="overall-upload-value value-text"></div>\n`),this.visible=!0,this.#Ie=this.querySelector("button"),this.#Ie.addEventListener("click",()=>{this.finished?this.onComplete(this.status):this.cancel()}),this.#Ae.forEach(e=>{this.querySelector(".single-uploads").append(e)}),this.#qe(),this.addEventListener("Alchemy.FileUpload.Change",this.#Fe)}disconnectedCallback(){this.removeEventListener("Alchemy.FileUpload.Change",this.#Fe)}initialize(e=[]){this.#Ae=e,this.fileCount=e.length}cancel(){this.#$e().forEach(e=>{e.cancel()}),this.#Me()}onComplete(e){}#$e(){return this.#Ae.filter(e=>e.active)}#Me(){this.#Te=y("Close"),this.#Ie.ariaLabel=this.#Te,this.#Ie.parentElement.content=this.#Te}#Be(e){return this.#$e().reduce((t,s)=>s[e]+t,0)}#qe(){const e=this.status;this.className=e,this.progressElement.value=this.totalProgress,this.progressElement.toggleAttribute("indeterminate","upload-finished"===e),this.querySelector(".overall-progress-value > span").textContent=this.overallProgressValue,this.querySelector(".overall-upload-value").textContent=this.overallUploadSize,this.finished?(this.#Me(),this.onComplete(e)):this.visible=!0}get finished(){return this.#$e().every(e=>e.finished)}get overallUploadSize(){this.#$e().filter(e=>e.value>=100).length;return this.totalProgress,this.#$e().length,`${Xe(this.#Be("progressEventLoaded"))} / ${Xe(this.#Be("progressEventTotal"))}`}get overallProgressValue(){const e=this.#$e().filter(e=>e.value>=100).length;return`${this.totalProgress}% (${e} / ${this.#$e().length})`}get progressElement(){return this.querySelector("sl-progress-bar")}get status(){const e=this.#$e().map(e=>e.className);return e.includes("failed")?"failed":0===e.length?"canceled":e.every(t=>t===e[0])?e[0]:"in-progress"}get totalProgress(){const e=this.#$e().reduce((e,t)=>e+t.file.size,0);let t=Math.ceil(this.#$e().reduce((t,s)=>{const i=s.file.size/e;return s.value*i+t},0));return t>100&&(t=100),t}get visible(){return this.#N}set visible(e){this.classList.toggle("visible",e),this.#N=e}}customElements.define("alchemy-upload-progress",Qe);class Ye extends HTMLElement{#De=null;#He=!1;connectedCallback(){this.fileInput.addEventListener("change",this.#ze),this.dropzone&&this.#Pe(),this.addEventListener("Alchemy.upload.successful",this)}disconnectedCallback(){this.fileInput?.removeEventListener("change",this.#ze),this.#De&&(this.#De.removeEventListener("dragleave",this.#Oe),this.#De.removeEventListener("drop",this.#Ne),this.#De.removeEventListener("dragover",this.#Ue),this.#De=null)}handleEvent(e){if("Alchemy.upload.successful"===e.type)this.#Re()}#ze=e=>{this.uploadFiles(Array.from(e.target.files))};#We=e=>{this.#He!==e&&(this.#He=e,this.#De.classList.toggle("dragover"))};#Oe=()=>this.#We(!1);#Ne=async e=>{e.preventDefault(),this.#We(!1);const t=[...e.dataTransfer.items].map(e=>e.getAsFile());this.uploadFiles(t)};#Ue=e=>{e.preventDefault(),this.#We(!0)};#Re(){setTimeout(()=>{const e=this.redirectUrl,t=this.closest("turbo-frame");this.uploadProgress.visible=!1,e&&(t?(t.setAttribute("src",e),t.reload()):Turbo.visit(e))},750)}#Pe(){this.#De=document.querySelector(this.dropzone),this.#De&&(this.#De.addEventListener("dragleave",this.#Oe),this.#De.addEventListener("drop",this.#Ne),this.#De.addEventListener("dragover",this.#Ue))}uploadFiles(e){let t=0;const s=M("alchemy_uploader_defaults"),i=e.map(e=>{const i=new XMLHttpRequest,n=new Ke;return n.initialize(e,i),s.upload_limit-1<t?(n.valid=!1,n.errorMessage=y("Maximum number of files exceeded")):n.valid&&(t++,this.#je(i,e)),n});this.#Ve(i)}#je(e,t){const s=this.querySelector("form"),i=new FormData(s);i.set(this.fileInput.name,t),e.open("POST",s.action),e.setRequestHeader("X-CSRF-Token",be()),e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e.setRequestHeader("Accept","application/json"),e.send(i)}#Ve(e){this.uploadProgress&&(this.uploadProgress.cancel(),this.uploadProgress.remove()),this.uploadProgress=new Qe,this.uploadProgress.initialize(e),this.uploadProgress.setAttribute("layout",this.layout),this.uploadProgress.onComplete=e=>{this.dispatchEvent(new CustomEvent(`Alchemy.upload.${e}`,{bubbles:!0}))},this.#Je.append(this.uploadProgress)}get#Je(){return this.#De??document.body}get dropzone(){return this.getAttribute("dropzone")}get layout(){return this.getAttribute("layout")||"row"}get fileInput(){return this.querySelector("input[type='file']")}get redirectUrl(){return this.getAttribute("redirect-url")}}customElements.define("alchemy-uploader",Ye);class Ge extends HTMLElement{connectedCallback(){this.innerHTML=`\n <alchemy-spinner></alchemy-spinner>\n <div id="overlay_text_box">\n <span id="overlay_text">${this.getAttribute("text")??""}</span>\n </div>\n `}set show(e){this.classList.toggle("visible",e)}}customElements.define("alchemy-overlay",Ge);const Ze="BUTTON";class et extends HTMLElement{connectedCallback(){this.pageId=this.getAttribute("page-id"),this.folded=this.hasAttribute("folded"),this.folderButton?.addEventListener("click",this)}disconnectedCallback(){this.folderButton?.removeEventListener("click",this)}async handleEvent(e){"click"===e.type&&await this.handleFolderClick(e)}async handleFolderClick(e){e.preventDefault(),e.stopPropagation();const t=e.currentTarget;t.innerHTML="";const s=new E("small");s.spin(t);try{await Ee(B.fold_admin_page_path(this.pageId),null,"text/vnd.turbo-stream.html"),this.folded=!this.folded,this.toggleAttribute("folded",this.folded),this.toggleChildren(),this.updateFolderIcon()}catch(e){F(e.message||e,"error"),this.updateFolderIcon()}finally{s.stop()}}toggleChildren(){const e=this.querySelector(`#page_${this.pageId}_children`);e&&e.classList.toggle("hidden",this.folded)}updateFolderIcon(){if(this.folderButton){const e=this.folded?"arrow-right-s":"arrow-down-s";this.folderButton.innerHTML=`<alchemy-icon name="${e}"></alchemy-icon>`}}updateFolderButton(){const e=this.querySelector(".page_folder");if(!e)return;const t=this.hasChildren||this.folded;if(t&&"SPAN"===e.tagName){const t=this.folded?"arrow-right-s":"arrow-down-s";e.outerHTML=`<button class="page_folder icon_button">\n <alchemy-icon name="${t}"></alchemy-icon>\n </button>`,this.folderButton?.addEventListener("click",this)}else t||e.tagName!==Ze?t&&e.tagName===Ze&&this.updateFolderIcon():e.outerHTML='<span class="page_folder"></span>'}get hasChildren(){const e=this.querySelector(`#page_${this.pageId}_children`);return!!e&&e.querySelectorAll(":scope > alchemy-page-node").length>0}get folderButton(){return this.querySelector("button.page_folder")}}customElements.define("alchemy-page-node",et);class tt extends HTMLElement{connectedCallback(){this.publicField?.addEventListener("click",this.#Xe)}disconnectedCallback(){this.publicField?.removeEventListener("click",this.#Xe)}#Xe=e=>{const t=e.target,s=new Date,i=new Date(s.getTime()-6e4*s.getTimezoneOffset()).toISOString();t.checked?(this.publicationDateFields.classList.remove("hidden"),this.publicOnPicker.value=i.substring(0,i.indexOf("T")+6)):(this.publicationDateFields.classList.add("hidden"),this.publicOnPicker.value=""),this.publicUntilPicker.value=""};get publicField(){return this.querySelector("#page_public")}get publicOnPicker(){return this.querySelector("input#page_public_on")}get publicUntilPicker(){return this.querySelector("input#page_public_until")}get publicationDateFields(){return this.querySelector(".page-publication-date-fields")}}customElements.define("alchemy-page-publication-fields",tt);class st extends Y{get pageId(){return this.selection?JSON.parse(this.selection).id:void 0}_searchQuery(e,t){return{q:{name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_parseResponse(e){const t=e.meta;return{results:e.pages,more:t.page*t.per_page<t.total_count}}_entry(e,t){return{icon:"file-3",primary:this._hightlightTerm(e.name,t),aside:e.site?.name,secondary:{text:e.url_path,truncate:"head"},secondaryAside:{badge:e.language_code}}}_selectedEntry(e){return{icon:"file-3",primary:e.text||e.name,secondary:{text:e.url_path,truncate:"head"}}}}customElements.define("alchemy-page-select",st);class it extends HTMLElement{#Ke;connectedCallback(){this.addEventListener("change",this.#Qe),this.addEventListener("click",this.#Ye),this.#Ke=document.querySelector("#select_all_pictures"),this.#Ke?.addEventListener("click",this.#Ge)}disconnectedCallback(){this.removeEventListener("change",this.#Qe),this.removeEventListener("click",this.#Ye),this.#Ke?.removeEventListener("click",this.#Ge)}#Ge=e=>{e.preventDefault(),this.#Ke.classList.toggle("active");const t=this.#Ke.classList.contains("active");this.#Ze(t),this.selectedItemTools.classList.toggle("hidden",!t)};#Qe=e=>{const t=e.target.closest(".picture_tool.select input");t&&(this.selectedItemTools.classList.toggle("hidden",0===this.checkedInputs.length),t.parentElement.classList.toggle("visible",t.checked))};#Ye=e=>{const t=e.target.closest("a#edit_multiple_pictures");t&&(e.preventDefault(),A(this.#et(t.href),{title:t.title,size:"500x242"}))};#Ze(e){this.querySelectorAll(".picture_tool.select input[type='checkbox']").forEach(t=>{t.checked=e,t.closest(".picture_thumbnail").classList.toggle("active",e)})}#et(e){const t=new URL(e);return this.checkedInputs.forEach(e=>t.searchParams.append(e.name,e.value)),t.toString()}get checkedInputs(){return this.querySelectorAll("input:checked")}get selectedItemTools(){return this.querySelector(".selected_item_tools")}}customElements.define("alchemy-picture-archive",it);class nt extends HTMLElement{connectedCallback(){this.addEventListener("change",this)}disconnectedCallback(){this.removeEventListener("change",this)}handleEvent(e){if("change"===e.type)this.onChange()}onChange(){const e=new URL(this.getAttribute("url")),t=this.querySelector("select");e.searchParams.set("language_id",t.value),Turbo.visit(e,{frame:"picture_descriptions"})}}customElements.define("alchemy-picture-description-select",nt);class lt extends HTMLElement{connectedCallback(){this.cropFromField=this.querySelector("[data-crop-from]"),this.cropSizeField=this.querySelector("[data-crop-size]"),this.pictureIdField=this.querySelector("[data-picture-id]"),this.targetSizeField=this.querySelector("[data-target-size]"),this.imageCropperField=this.querySelector("[data-image-cropper]"),this.image=this.querySelector("img"),this.pictureThumbnail=this.querySelector("alchemy-picture-thumbnail"),this.deleteButton=this.querySelector(".picture_tool.delete"),this.cropLink=this.querySelector(".crop_link"),this.targetSize=this.targetSizeField.dataset.targetSize,this.pictureId=this.pictureIdField.value,this.update=function(e,t){let s;return function(...i){const n=this;clearTimeout(s),s=setTimeout(()=>e.apply(n,i),t)}}(()=>{this.updateImage(),this.updateCropLink()},125),this.deleteButton?.addEventListener("click",this.removeImage),this.observer=new MutationObserver(this.mutationCallback),this.observer.observe(this.cropFromField,{attributes:!0}),this.observer.observe(this.cropSizeField,{attributes:!0}),this.observer.observe(this.pictureIdField,{attributes:!0})}disconnectedCallback(){this.observer.disconnect()}mutationCallback=e=>{for(const t of e)"pictureId"in t.target.dataset&&(this.cropFromField.value="",this.cropSizeField.value="",this.pictureId=t.target.value),this.update()};updateImage(){this.pictureId&&(this.pictureThumbnail.loading=!0,fe(B.url_admin_picture_path(this.pictureId),{crop:this.imageCropperEnabled,crop_from:this.cropFrom,crop_size:this.cropSize,flatten:!0,size:"160x120"}).then(({data:e})=>{this.pictureThumbnail.src=e.url,this.pictureThumbnail.image.alt=e.alt,this.pictureThumbnail.image.title=e.title,this.setElementDirty()}).catch(e=>{console.error(e.message||e),F(e.message||e,"error")}))}removeImage=()=>{this.pictureThumbnail.innerHTML='<alchemy-icon name="image" size="xl"></alchemy-icon>',this.pictureIdField.value="",this.image=null,this.cropLink.classList.add("disabled"),this.setElementDirty()};setElementDirty(){this.closest(".element-editor").setDirty(this)}updateCropLink(){this.pictureId&&this.imageCropperEnabled&&(this.cropLink.classList.remove("disabled"),this.cropLink.href.match(/(picture_id=)\d+/)?this.cropLink.href=this.cropLink.href.replace(/(picture_id=)\d+/,"$1"+this.pictureId):this.cropLink.href=this.cropLink.href+`&picture_id=${this.pictureId}`)}get cropFrom(){return""===this.cropFromField.value?this.defaultCropFrom.join("x"):this.cropFromField.value}get cropSize(){return""===this.cropSizeField.value?this.defaultCropSize.join("x"):this.cropSizeField.value}get defaultCropSize(){if(!this.imageCropperEnabled)return[];const e=this.targetSize.split("x").map(e=>parseInt(e)),t=(s=e[0]/this.imageFileWidth,i=e[1]/this.imageFileHeight,s>=i?s:i);var s,i;return[Math.round(e[0]/t),Math.round(e[1]/t)]}get defaultCropFrom(){if(!this.imageCropperEnabled)return[];const e=this.defaultCropSize;return[Math.round((this.imageFileWidth-e[0])/2),Math.round((this.imageFileHeight-e[1])/2)]}get imageFileWidth(){return parseInt(this.pictureIdField.dataset.imageFileWidth)}get imageFileHeight(){return parseInt(this.pictureIdField.dataset.imageFileHeight)}get imageCropperEnabled(){return"true"===this.targetSizeField.dataset.imageCropper}}customElements.define("alchemy-picture-editor",lt);class ot extends HTMLElement{constructor(){super(),this.spinner=new E("small")}handleEvent(e){switch(e.type){case"load":this.#tt();break;case"error":this.#st(e)}}connectedCallback(){this.classList.add("thumbnail_background"),this.src&&!this.image&&this.start(),this.#it()}disconnectedCallback(){this.image?.removeEventListener("load",this),this.image?.removeEventListener("error",this),this.stop()}createImage(e=this.src,t=this.name){this.image=new Image,this.image.src=e,t&&(this.image.alt=t)}start(e){this.createImage(e),this.image.addEventListener("load",this),this.image.addEventListener("error",this),this.load()}load(){this.image?.complete||(this.setAttribute("loading","loading"),this.innerHTML="",this.spinner.spin(this))}stop(){this.classList.remove("loading"),this.spinner.stop()}#tt(){this.spinner.stop(),this.removeAttribute("loading")}#st(e){const t=`Could not load ${this.image.src}`,s=this.closest(".ingredient-editor");this.spinner.stop(),this.innerHTML=`\n <sl-tooltip content="${t}" ${s?"hoist":""}>\n <alchemy-icon name="alert" class="error"></alchemy-icon>\n </sl-tooltip>\n `,console.error(t,e)}#it(){this.image?.complete?this.replaceChildren(this.image):this.image&&this.append(this.image)}set loading(e){e?this.load():this.stop()}set src(e){this.start(e),this.#it()}get name(){return this.getAttribute("name")}get src(){return this.getAttribute("src")}}customElements.define("alchemy-picture-thumbnail",ot);class rt extends HTMLElement{connectedCallback(){this.addEventListener("submit",this),document.addEventListener("alchemy:page-dirty",this)}disconnectedCallback(){this.removeEventListener("submit",this),document.removeEventListener("alchemy:page-dirty",this)}handleEvent(e){switch(e.type){case"alchemy:page-dirty":this.markDirty(e.detail);break;case"submit":this.button.loading=!0}}markDirty(e){this.button.variant="primary",this.button.disabled=!1,this.tooltip.content=e.tooltip}get button(){return this.querySelector("sl-button")}get tooltip(){return this.querySelector("sl-tooltip")}}customElements.define("alchemy-publish-page-button",rt);class at extends HTMLElement{connectedCallback(){this.searchInput=document.querySelector(".search_input_field"),this.clearButton=document.querySelector("#search_field_clear"),this.resultCounter=document.querySelector("#page_filter_result"),this.setupSearch(),requestAnimationFrame(()=>{this.setupSortables()}),this.observer=new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE&&(e.classList?.contains("children")&&this.setupSortable(e),e.querySelectorAll(".children").forEach(e=>this.setupSortable(e)))})})}),this.observer.observe(this,{childList:!0,subtree:!0})}disconnectedCallback(){this.teardownSearch(),this.observer?.disconnect()}setupSearch(){this.searchInput?.addEventListener("input",this),this.clearButton?.addEventListener("click",this)}teardownSearch(){this.searchInput?.removeEventListener("input",this),this.clearButton?.removeEventListener("click",this)}handleEvent(e){"input"===e.type&&e.target===this.searchInput?this.handleSearch(e):"click"===e.type&&e.target===this.clearButton&&this.handleClearSearch(e)}handleSearch(e){const t=e.target.value.toLowerCase().trim();""!==t?this.filterPages(t):this.clearFilter()}filterPages(e){const t=this.querySelectorAll(".sitemap_page");let s=0,i=null;t.forEach(t=>{(t.getAttribute("name")||"").toLowerCase().includes(e)?(t.classList.add("highlight"),t.classList.remove("no-match"),s++,i||(i=t)):(t.classList.remove("highlight"),t.classList.add("no-match"))}),1===s?(this.resultCounter.textContent=`1 ${y("page_found")}`,this.resultCounter.style.display="block"):s>1?(this.resultCounter.textContent=`${s} ${y("pages_found")}`,this.resultCounter.style.display="block"):this.resultCounter.style.display="none",i&&i.scrollIntoView({behavior:"smooth",block:"center"})}clearFilter(){this.querySelectorAll(".sitemap_page").forEach(e=>{e.classList.remove("highlight","no-match")}),this.resultCounter.style.display="none"}handleClearSearch(e){e.preventDefault(),this.searchInput.value="",this.clearFilter()}setupSortable(e){new d(e,{group:"pages",animation:150,fallbackOnBody:!0,swapThreshold:.65,handle:".page-icon.handle",draggable:"alchemy-page-node",onEnd:e=>this.handleSort(e)})}setupSortables(){this.querySelectorAll(".children").forEach(e=>this.setupSortable(e))}async handleSort(e){if(e.from===e.to&&e.oldIndex===e.newIndex)return;const t=e.item,s=t.pageId,i=B.move_admin_page_path(s),n={target_parent_id:e.to.dataset.parentId,new_position:e.newIndex};q(!0);try{const l=await Ee(i,n),o=await l.data,r=t.querySelector(`#page_${s}`);if(r){const e=r.querySelector(".sitemap_url");e&&o.url_path&&(e.textContent=o.url_path)}this.updateFolderIcons(e.from,e.to),F(y("Successfully moved page"))}catch(e){F(e.message||e,"error"),window.location.reload()}finally{q(!1)}}updateFolderIcons(e,t){const s=e.closest("alchemy-page-node");if(s?.updateFolderButton(),e!==t){const e=t.closest("alchemy-page-node");e?.updateFolderButton()}}}customElements.define("alchemy-sitemap",at);const ct={draggable:".element-editor",handle:".element-handle.draggable",ghostClass:"dragged",animation:150,swapThreshold:.65,easing:"cubic-bezier(1, 0, 0, 1)"};function dt(e){const t=e.item.dataset.elementName;document.querySelectorAll(`[data-droppable-elements~="${t}"]`).forEach(e=>e.classList.add("droppable-elements"))}function ht(e){const t=e.item,s=e.to.parentElement.closest(".element-editor"),i={element_id:t.dataset.elementId,position:e.newIndex+1};s&&(i.parent_element_id=s.dataset.elementId),e.target===e.to&&we(B.order_admin_elements_path,i).then(e=>{const s=e.data;F(s.message),s.pageHasUnpublishedChanges&&Se(s),z(),t.updateTitle(s.preview_text)})}function ut(){document.querySelectorAll("[data-droppable-elements]").forEach(e=>e.classList.remove("droppable-elements"))}class mt extends HTMLElement{connectedCallback(){const e={name:this.dataset.elementName,put:(e,t,s)=>e.el.dataset.droppableElements.split(" ").includes(s.dataset.elementName)};new d(this,{...ct,onStart:dt,onSort:ht,onEnd:ut,group:e})}}customElements.define("alchemy-sortable-elements",mt);class pt extends HTMLElement{connectedCallback(){this.className=`spinner spinner--${this.size}`,this.innerHTML=`\n <svg width="100%" viewBox="0 0 28 28" style="--spinner-color: ${this.color}">\n <path\n class="hex1"\n d="M5.938,18.07l-5.878-5.9l2.154-8.058l8.024-2.161l5.87,5.9l-2.144,8.058L5.938,18.07z"\n />\n <path\n class="hex2"\n d="M19.686,20.785l-4.731-4.754l1.725-6.487l6.468-1.742l4.733,4.754l-1.734,6.487L19.686,20.785z"\n />\n <path\n class="hex3"\n d="M11.708,26.294l-3.47-3.485l1.276-4.758l4.74-1.276l3.468,3.485l-1.265,4.758L11.708,26.294z"\n />\n </svg>\n `}get size(){return this.getAttribute("size")||"medium"}get color(){return this.getAttribute("color")||"currentColor"}}customElements.define("alchemy-spinner",pt);class gt extends HTMLElement{#y=null;connectedCallback(){this.classList.add("autocomplete_tag_list"),this.input.classList.add("alchemy_selectbox"),this.#y=new t(this.input,this.settings)}disconnectedCallback(){j(this.#y),this.#y=null}focus(){W(this.#y,()=>super.focus())}get input(){return this.getElementsByTagName("input")[0]}get settings(){return{plugins:{remove_button:J()},valueField:"id",delimiter:",",create:!0,createFilter(e){return!this.loading&&(this.settings.duplicates||!this.options[e])},persist:!1,clearAfterSelect:!0,maxOptions:null,openOnFocus:!1,placeholder:this.getAttribute("placeholder"),load:(e,t)=>{fe(this.getAttribute("url"),{term:e}).then(e=>t(e.data)).catch(e=>{F(e.message||e,"error"),t()})},...V(),render:{...X}}}}customElements.define("alchemy-tags-autocomplete",gt);const yt="alchemy-dark",vt="alchemy";class bt extends HTMLElement{#nt=null;connectedCallback(){this.className="tinymce_container",this.querySelector(":scope > alchemy-spinner")||this.insertAdjacentHTML("beforeend",'<alchemy-spinner size="small"></alchemy-spinner>'),this.style.minHeight=`${this.minHeight}px`,this.editor.style.display="none";const e={root:document.getElementById("element_area"),rootMargin:"0px",threshold:[.05]};this.tinymceIntersectionObserver=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.intersectionRatio>0&&(this._initTinymceEditor(),t.unobserve(e.target))})},e),this.tinymceIntersectionObserver.observe(this),this._setupThemeChangeListener()}disconnectedCallback(){this.tinymceIntersectionObserver?.disconnect(),this._removeThemeChangeListener(),tinymce.get(this.editorId)?.remove(this.editorId)}_initTinymceEditor(){tinymce.init(this.configuration).then(e=>{e.forEach(e=>this._setupEditor(e))})}_setupEditor(e){e.show();const t=this.getElementsByTagName("alchemy-spinner")[0];t&&t.remove(),this.elementEditor&&(e.on("dirty",e=>{this.elementEditor.setDirty(e.target.editorContainer)}),e.on("click",()=>this.elementEditor.onClickElement(!1)))}_setupThemeChangeListener(){this.darkModeMediaQuery=window.matchMedia("(prefers-color-scheme: dark)"),this.themeChangeHandler=e=>this._handleThemeChange(e),this.darkModeMediaQuery.addEventListener("change",this.themeChangeHandler)}_removeThemeChangeListener(){this.darkModeMediaQuery&&this.themeChangeHandler&&this.darkModeMediaQuery.removeEventListener("change",this.themeChangeHandler)}_handleThemeChange(e){const t=tinymce.get(this.editorId);if(t){const s=e.matches?yt:vt,i=e.matches?yt:vt;t.remove(),tinymce.init({content_css:i,...this.configuration,skin:s}).then(e=>{e.forEach(e=>this._setupEditor(e))})}}get configuration(){const e={};this.getAttributeNames().forEach(t=>{if(!["class","id","is","name","style"].includes(t)){const s=this.getAttribute(t),i=t.replaceAll("-","_");if(s===t||""===s)e[i]=!0;else try{e[i]=JSON.parse(s)}catch(t){e[i]=s}}});const t={content_css:this.preferredTheme,...M("alchemy_tinymce_defaults"),...e,language:g(),selector:`#${this.editorId}`,skin:this.preferredTheme};return t.height=t.min_height,t}get preferredTheme(){return window.matchMedia("(prefers-color-scheme: dark)").matches?yt:vt}get editorId(){return this.editor.id}get editor(){return this.getElementsByTagName("textarea")[0]}get elementEditor(){return document.getElementById(this.editorId).closest("alchemy-element-editor")}get minHeight(){return this.#nt||this.configuration.min_height}set minHeight(e){this.#nt=e}}customElements.define("alchemy-tinymce",bt);class ft extends HTMLElement{async connectedCallback(){const e=new E("small");e.spin(this);try{const e=await fetch(this.url,{credentials:"include"}),t=await e.json();e.ok?this.showStatus(t):this.showError(e)}catch(e){this.showError(e)}finally{e.stop()}}get url(){return this.getAttribute("url")}showStatus(e){"true"==e.status?this.querySelector(".update_available").classList.remove("hidden"):this.querySelector(".up_to_date").classList.remove("hidden")}showError(e){this.querySelector(".error").classList.remove("hidden"),console.error("[alchemy] Error fetching update status",e)}}customElements.define("alchemy-update-check",ft),h("tooltip.show",{keyframes:[{transform:"translateY(10px)",opacity:"0"},{transform:"translateY(0)",opacity:"1"}],options:{duration:100}}),h("tooltip.hide",{keyframes:[{transform:"translateY(0)",opacity:"1"},{transform:"translateY(10px)",opacity:"0"}],options:{duration:100}}),h("dialog.show",{keyframes:[{transform:"scale(0.98)",opacity:"0"},{transform:"scale(1)",opacity:"1"}],options:{duration:150}}),h("dialog.hide",{keyframes:[{transform:"scale(1)",opacity:"1"},{transform:"scale(0.98)",opacity:"0"}],options:{duration:150}});const Et=document.querySelector('link[rel="preload"][as="image"]').getAttribute("href"),wt={"x-lg":"close",caret:"arrow-down-s"},kt={resolver:e=>`${Et}#ri-${wt[e]||e}-line`,mutator:e=>{e.setAttribute("fill","currentColor"),e.setAttribute("viewBox","0 0 24 24")},spriteSheet:!0};u("default",kt),u("system",kt),void 0===window.Alchemy&&(window.Alchemy={}),Object.assign(Alchemy,{closeCurrentDialog:x,currentDialog:C,t:y,FixedElements:I,growl:F,LinkDialog:class extends S{#lt;constructor(e){const t=new URL(B.link_admin_pages_path,window.location),s={url:e.url,selected_tab:e.type,link_title:e.title,link_target:e.target};Object.keys(s).forEach(e=>{s[e]&&t.searchParams.set(e,s[e])}),super(t.href,{size:"600x320",title:y("Link")})}replace(e){super.replace(e),this.#u()}open(){return super.open(),new Promise(e=>this.#lt=e)}#u(){const e=document.querySelector('[data-link-form-type="internal"]'),t=document.querySelector('[data-link-form-type="file"] alchemy-attachment-select');e.addEventListener("Alchemy.RemoteSelect.Change",e=>{this.#ot(e.detail.added)}),t.addEventListener("Alchemy.RemoteSelect.Change",e=>{const t=e.detail.added;document.getElementById("file_link").value=t?t.url:""}),document.querySelectorAll("[data-link-form-type]").forEach(e=>{e.addEventListener("submit",e=>{e.preventDefault(),this.#rt(e.target.dataset.linkFormType)})})}#ot(e=null){const t=document.getElementById("internal_link"),s=document.querySelector('[data-link-form-type="internal"] alchemy-dom-id-api-select');t.value=e?e.url_path:"",s.page=e?e.id:void 0}#rt(e){const t=document.getElementById("element_anchor");let s=document.getElementById(`${e}_link`).value;if("internal"===e&&""!==t.value)s=s.replace(D,"")+t.value;else if("external"===e&&!function(e){const t=document.getElementById("external_link")?.dataset.linkUrlRegexp;if(!t)return!0;const s=t.lastIndexOf("/");return new RegExp(t.slice(1,s),t.slice(s+1)).test(e)}(s))return void this.#at();this.#lt({url:s.trim(),title:document.getElementById(`${e}_link_title`).value,target:document.getElementById(`${e}_link_target`)?.value,type:e}),this.close()}#at(){const e=document.getElementById("errors");e.querySelector("ul").innerHTML=`<li>${Alchemy.t("url_validation_failed")}</li>`,e.style.display="block"}},pleaseWaitOverlay:q,Spinner:E,reloadPreview:z}),e.config.forms.confirm=O,document.addEventListener("turbo:load",function(){document.documentElement.classList.remove("no-js"),b(),document.removeEventListener("keypress",$),document.addEventListener("keypress",$),document.querySelectorAll(".please_wait").forEach(e=>{e.addEventListener("click",q)}),document.querySelectorAll("a.button").forEach(e=>{e.setAttribute("tabindex",0)}),key.filter=function(e){let t=(e.target||e.srcElement).tagName;return key.isPressed("esc")||!("INPUT"===t||"SELECT"===t||"TEXTAREA"===t)}});export{G as AttachmentSelect,Te as ElementSelect,st as PageSelect,Y as RemoteSelect,gt as TagsAutocomplete,bt as Tinymce,k as on};
1
+ import"@ungap/custom-elements";import{Turbo as e}from"@hotwired/turbo-rails";import"keymaster";import t from"tom-select";import{autoUpdate as s,computePosition as i,offset as n,flip as l,shift as o,size as r}from"@floating-ui/dom";import"clipboard";import a from"flatpickr";import c from"cropperjs";import d from"sortablejs";import"tinymce";import{setDefaultAnimation as h,registerIconLibrary as u}from"shoelace";const m=/\./;function p(e){const t=g(),s=window.Alchemy?.translations;return s?m.test(e)?function(e,t){const s=t.split(m),i=e[s[0]];return i&&i[s[1]]||t}(s,e):s[e]||e:(console.warn(`Translations for locale ${t} not found!`),e)}function g(){return document.documentElement.lang?document.documentElement.lang:"en"}function y(e,t=void 0){let s=p(e);return t?s.replace(/%\{.+\}/,t):s}const v=[];function b(e=document){e===document&&v.forEach(e=>key.unbind(e));const t=e.querySelectorAll(".search_input_field"),s=e.querySelectorAll(".search_field_clear, .js_filter_field_clear");key("alt+f",function(){return key.setScope("search"),t.forEach(e=>e.focus({focusVisible:!0})),!1}),v.push("alt+f"),key("esc","search",function(){s.forEach(e=>e.click()),t.forEach(e=>e.blur())}),v.push("esc"),e.querySelectorAll("[data-alchemy-hotkey]").forEach(function(e){const t=e.dataset.alchemyHotkey;key(t,()=>e.click()),v.push(t)})}function f(e){const t=document.createElement("template");return t.innerHTML=e,t.content.children[0]}let E=class{constructor(e,t="currentColor"){this.size=e,this.color=t,this.spinner=void 0}get el(){return this.spinner}spin(e){return void 0===e&&(e=document.body),this.spinner=f(`<alchemy-spinner size="${this.size}" color="${this.color}"></alchemy-spinner>`),e.append(this.spinner),this}stop(){this.spinner&&(this.spinner.remove(),this.spinner=void 0)}};function w(e,t,s={}){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:s}))}function k(e,t,s,i){document.querySelectorAll(t).forEach(t=>{t.addEventListener(e,e=>{const n=Array.from(t.querySelectorAll(s));let l=e.target;for(;l!==t;){if(n.includes(l))return void i.call(l,e);l=l.parentElement}})})}const L=[],_={header_height:36,size:"400x300",padding:!0,title:"",modal:!0,overflow:"visible",ready:()=>{},closed:()=>{}};class S{#e=null;#t=!1;constructor(e,t={}){this.url=e,this.options={..._,...t};const s=this.options.size.split("x");this.width=parseInt(s[0],10),this.height=parseInt(s[1],10),this.build(),this.resize()}open(){w(this.dialog,"Alchemy.DialogOpen"),this.bind_close_events(),this.options.modal?(this.dialog_container.showModal(),this.#s()):this.dialog_container.show(),window.requestAnimationFrame(()=>{this.dialog_container.classList.add("open")}),document.body.classList.add("prevent-scrolling"),L.push(this),this.load()}close(){return this.#t||(this.#t=!0,w(this.dialog,"DialogClose.Alchemy"),this.dialog_container.classList.remove("open"),this.dialog_container.addEventListener("transitionend",()=>{this.#i(),this.dialog_container.close(),this.dialog_container.remove(),L.pop(),0===L.length&&document.body.classList.remove("prevent-scrolling"),null!=this.options.closed&&this.options.closed()},{once:!0})),!0}#s(){const e=document.getElementById("flash_notices");e&&(this.#e=e.parentElement,this.dialog_container.append(e),this.#n(e))}#i(){const e=document.getElementById("flash_notices");e&&this.#e&&this.#e.append(e)}#n(e){e.querySelectorAll('alchemy-message[dismissable]:not([type="error"])').forEach(e=>e.remove())}load(){this.show_spinner(),fetch(this.url,{headers:{"Turbo-Frame":"alchemy_dialog_frame"}}).then(async t=>{const s=await t.text();t.headers.get("content-type")?.includes("text/vnd.turbo-stream.html")?e.renderStreamMessage(s):t.ok?this.replace(s):this.show_error({status:t.status,statusText:t.statusText,responseText:s})}).catch(()=>{this.show_error({status:0})})}reload(){this.dialog_body.innerHTML="",this.load()}replace(e){this.remove_spinner(),this.dialog_body.style.display="none",this.dialog_body.innerHTML=e,this.init(),w(this.dialog,"DialogReady.Alchemy",{body:this.dialog_body}),null!=this.options.ready&&this.options.ready(this.dialog_body),this.dialog_body.style.display=""}show_spinner(){this.spinner=new E("medium"),this.spinner.spin(this.dialog_body)}remove_spinner(){this.spinner.stop()}init(){b(this.dialog_body),window.requestAnimationFrame(()=>this.#l())}#l(e=0){const t=this.dialog_body.querySelector("[autofocus]")??this.dialog_body.querySelector("form [type='submit']");t?.focus(),document.activeElement===this.close_button&&e<20&&window.requestAnimationFrame(()=>this.#l(e+1))}show_error(e,t){if(422===e.status)return this.dialog_body.innerHTML=e.responseText,void this.init();const{error_body:s,error_header:i,error_type:n}=this.error_messages(e,t);this.dialog_body.innerHTML=`<alchemy-message type="${n}">\n <h1>${i}</h1>\n <p>${s}</p>\n </alchemy-message>`}error_messages(e,t){let s,i,n="warning";switch(e.status){case 0:i="The server does not respond.",s="Please check server and try again.";break;case 403:i="You are not authorized!",s="Please close this window.";break;default:n="error",t?(i=t,console.error(e.responseText)):i=`${e.statusText} (${e.status})`,s="Please check log and try again."}return{error_header:i,error_body:s,error_type:n}}bind_close_events(){this.close_button.addEventListener("click",e=>{e.preventDefault(),this.close()}),this.dialog_container.addEventListener("close",e=>{e.preventDefault(),this.close()}),this.dialog_container.classList.add("closable"),this.dialog_container.addEventListener("pointerdown",e=>{e.target===this.dialog_container&&this.close()}),this.dialog_container.addEventListener("cancel",e=>{e.target===this.dialog_container&&(e.preventDefault(),this.close())})}build(){this.dialog_container=f('<dialog class="alchemy-dialog-container"></dialog>'),this.dialog=f('<div class="alchemy-dialog"></div>'),this.dialog_body=f('<div class="alchemy-dialog-body"></div>'),this.dialog_header=f('<div class="alchemy-dialog-header"></div>'),this.dialog_title=f('<div class="alchemy-dialog-title"></div>'),this.close_button=f('<button class="alchemy-dialog-close"><alchemy-icon name="close"></alchemy-icon></button>'),this.dialog_title.textContent=this.options.title,this.dialog_header.append(this.dialog_title),this.dialog_header.append(this.close_button),this.dialog.append(this.dialog_header),this.dialog.append(this.dialog_body),this.dialog_container.append(this.dialog),this.options.modal&&this.dialog.classList.add("modal"),this.options.padding&&this.dialog_body.classList.add("padded"),document.body.append(this.dialog_container)}resize(){const{width:e,height:t}=this.getSize();this.dialog.style.width=`${e}px`,this.dialog.style.minHeight=`${t}px`,this.dialog.style.overflow=this.options.overflow,"hidden"===this.options.overflow?(this.dialog_body.style.height=`${t}px`,this.dialog_body.style.overflow="auto"):(this.dialog_body.style.minHeight=`${t}px`,this.dialog_body.style.overflow="visible")}getSize(){const e=this.options.padding?16:0,t=window.innerWidth,s=window.innerHeight;let i=this.width,n=this.height;return i>=t&&(i=t-e),n>=s&&(n=s-e-_.header_height),{width:i,height:n}}}function C(){const{length:e}=L;if(0!==e)return L[e-1]}function x(e){const t=C();if(null!=t)return t.options.closed=e,t.close()}function A(e,t){if(!e)throw"No url given! Please provide an url.";new S(e,t).open()}function T(e){const t=document.getElementById("fixed-elements"),s=`fixed-element-${e}`;t.querySelector(`sl-tab[panel="${s}"]`).remove(),t.querySelector(`sl-tab-panel[name="${s}"]`).remove(),t.show("main-content-elements")}var I=Object.freeze({__proto__:null,createTab:function(e,t){const s=document.getElementById("fixed-elements"),i=`fixed-element-${e}`,n=`<sl-tab slot="nav" panel="${i}">${t}</sl-tab>`,l=`<sl-tab-panel name="${i}" style="--padding: 0" />`;s.innerHTML+=n+l,window.requestAnimationFrame(function(){s.show(i)})},removeTab:T});function F(e,t="notice"){!function(e,t){const s=document.getElementById("flash_notices"),i=f(`\n <alchemy-message type="${t}" dismissable>\n ${e}\n </alchemy-message>\n `);s.append(i)}(e,t)}function q(e=!0){document.querySelector("alchemy-overlay").show=!!e}function $(e){return!(!e.target.matches("input, textarea")&&"?"===String.fromCharCode(e.which))||(A("/admin/help",{title:Alchemy.t("help"),size:"500x400"}),!1)}function M(e){const t=document.getElementById(e);if(t)return JSON.parse(t.textContent)}const B=function e({collection:t={},member:s={}}={}){const i={...t};return Object.entries(s).forEach(([t,s])=>{i[t]="string"==typeof s?e=>s.replace(/1/,e):e({member:s})}),i}(M("alchemy_routes")),D=/#[\w.~-]+$/;class H extends HTMLIFrameElement{#o;#r;#a;#c=null;handleEvent(e){"load"===e.type&&(this.#d(),this.#h(),this.#o?.call(this,e))}#u=e=>{e.source===this.contentWindow&&"Alchemy.previewReady"===e.data.message&&(this.#c=e.origin,this.#d(),this.#h())};connectedCallback(){let e=this.url;this.addEventListener("load",this),this.#m(),window.addEventListener("message",this.#u),window.localStorage.getItem("alchemy-preview-url")&&(e=window.localStorage.getItem("alchemy-preview-url"),this.previewUrlSelect.value=e),this.refresh(e)}disconnectedCallback(){this.removeEventListener("load",this),key.unbind("alt+r"),window.removeEventListener("message",this.#u)}postMessage(e){this.#c&&this.contentWindow.postMessage(e,this.#c)}resize(e){this.style.width=`${e}px`}refresh(e){return this.#c=null,this.#p(),this.src=e||this.url,this.#d(),this.#a=setTimeout(()=>{this.#h(),F(y("Preview failed to load"),"warning")},this.loadTimeout),new Promise(e=>{this.#o=e})}set isDragged(e){this.style.transitionProperty=e?"none":null,this.style.pointerEvents=e?"none":null}#m(){this.reloadButton?.addEventListener("click",e=>{e.preventDefault(),this.refresh()}),key("alt+r",()=>this.refresh()),this.sizeSelect.addEventListener("change",e=>{const t=e.target.value;""===t?this.style.width=null:this.resize(t)}),this.previewUrlSelect?.addEventListener("change",e=>{const t=e.target.value;window.localStorage.setItem("alchemy-preview-url",t),this.refresh(t)})}#p(){this.reloadButton.innerHTML.includes("alchemy-spinner")||(this.#r=this.reloadButton.innerHTML),this.reloadButton.innerHTML='<alchemy-spinner size="small"></alchemy-spinner>'}#h(){this.reloadButton.innerHTML=this.#r}#d(){this.#a&&(clearTimeout(this.#a),this.#a=null)}get url(){return this.getAttribute("url")}get loadTimeout(){const e=parseInt(this.getAttribute("load-timeout"),10);return 1e3*(Number.isNaN(e)?5:e)}get sizeSelect(){return document.querySelector("select#preview_size")}get previewUrlSelect(){return document.querySelector("select#preview_url")}get reloadButton(){return document.querySelector("#reload_preview_button")}}function z(){document.getElementById("alchemy_preview_window").refresh()}customElements.define("alchemy-preview-window",H,{extends:"iframe"});class P{constructor(e,t={}){this.message=e,this.options={...{size:"300x100",title:y("Please confirm"),ok_label:y("Yes"),cancel_label:y("No"),on_ok(){}},...t},this.#g(),this.#y()}open(){requestAnimationFrame(()=>{this.dialog.show()})}#g(){const e=this.options.size.split("x")[0];this.dialog=f(`\n <sl-dialog label="${this.options.title}" style="--width: ${e}px">\n ${this.message}\n <button slot="footer" type="reset" class="secondary mx-1 my-0" autofocus>\n ${this.options.cancel_label}\n </button>\n <button slot="footer" type="submit" class="mx-1 my-0">\n ${this.options.ok_label}\n </button>\n </sl-dialog>\n `);(C()?.dialog_container??document.body).append(this.dialog)}#y(){this.cancelButton.addEventListener("click",e=>{e.preventDefault(),this.options.on_cancel(),this.dialog.hide()}),this.okButton.addEventListener("click",e=>{e.preventDefault(),this.options.on_ok(),this.dialog.hide()}),this.dialog.addEventListener("sl-request-close",e=>{"overlay"===e.detail.source&&(this.options.on_cancel(),e.preventDefault())}),this.dialog.addEventListener("sl-after-hide",()=>{this.dialog.remove()})}get cancelButton(){return this.dialog.querySelector("button[type=reset]")}get okButton(){return this.dialog.querySelector("button[type=submit]")}}function O(e,t={}){return new Promise(s=>{new P(e,{...t,on_ok(){s(!0)},on_cancel(){s(!1)}}).open()})}class N{static updateIcon(e,t=!1){const s=document.querySelector(`[data-ingredient-id="${e}"]`);if(s){s.querySelector(".edit-ingredient-anchor-link alchemy-icon").setAttribute("icon-style",t?"fill":"line")}}}e.StreamActions.dialog_visit=function(){const t=this.getAttribute("url");x(()=>e.visit(t))||e.visit(t)},e.StreamActions.assign_picture=function(){const[e]=this.targetElements;e&&(e.value=this.getAttribute("picture-id"),e.setAttribute("data-image-file-width",this.getAttribute("image-file-width")),e.setAttribute("data-image-file-height",this.getAttribute("image-file-height")),x(()=>{e.closest("alchemy-element-editor")?.setDirty()}))},e.StreamActions.assign_attachment=function(){const[e]=this.targetElements;if(!e)return;const t=e.parentElement;e.value=this.getAttribute("attachment-id"),t.querySelector(":scope > .file_name").textContent=this.getAttribute("attachment-name"),t.querySelector(":scope > .file_icon").replaceChildren(this.templateContent),t.querySelector(":scope > .remove_file_link").classList.remove("hidden"),x(()=>{e.closest("alchemy-element-editor")?.setDirty(e)})},e.StreamActions.close_current_dialog=function(){x()},e.StreamActions.reload_preview=function(){z()},e.StreamActions.remove_fixed_element=function(){T(this.getAttribute("element-id"))},e.StreamActions.update_anchor_icon=function(){N.updateIcon(this.getAttribute("ingredient-id"),"true"===this.getAttribute("active"))},e.StreamActions.hide_please_wait_overlay=function(){q(!1)};class U extends HTMLElement{static get observedAttributes(){return["name","size","icon-style"]}constructor(){super(),this.spriteUrl=document.querySelector('link[rel="preload"][as="image"]')?.getAttribute("href")??""}connectedCallback(){this.render()}attributeChangedCallback(){this.render()}render(){const e=this.size?` icon--${this.size}`:"";this.innerHTML=`<svg class="icon${e}"><use href="${this.spriteUrl}#ri-${this.iconName}${this.style}" /></svg>`}set name(e){this.setAttribute("name",e)}get iconName(){return this.getAttribute("name")}get size(){return this.getAttribute("size")}get style(){const e=this.getAttribute("icon-style");switch(e){case"none":return"";case null:return"-line";default:return`-${e}`}}}customElements.get("alchemy-icon")||customElements.define("alchemy-icon",U);const R=e=>(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");function W(e,t){e?e.focus():t()}function j(e){e?.close(!1),e?.destroy()}function V(){const e=document.createElement("div");e.className="ts-dropdown-mask";let t=()=>{};return{async onDropdownOpen(){const a={minWidth:`${this.control.offsetWidth}px`};this.control.closest(".alchemy-dialog-body, .alchemy-popover")&&(a.zIndex="101"),Object.assign(this.dropdown.style,a);const c=this.control.closest("dialog")||document.body;c.append(e),c.append(this.dropdown);t=s(this.control,this.dropdown,async()=>{const{x:e,y:t}=await i(this.control,this.dropdown,{placement:"bottom-start",middleware:[n(2),l(),o({padding:16}),r({padding:16,apply({availableWidth:e,availableHeight:t,elements:s}){Object.assign(s.floating.style,{maxWidth:`max(${s.reference.offsetWidth}px, min(${e}px, var(--select-dropdown-max-width, 480px)))`}),Object.assign(s.floating.querySelector(".ts-dropdown-content").style,{maxHeight:`${Math.max(120,t-16)}px`})}})]});Object.assign(this.dropdown.style,{left:`${e}px`,top:`${t}px`})})},onDropdownClose(){this.control_input.classList.remove("has-value"),this.control_input.blur(),this.dropdown.remove(),e.remove(),t()}}}function J(){return{title:y("Remove"),html(e){const t=document.createElement("button");return t.type="button",t.className=e.className,t.title=e.title,t.setAttribute("aria-label",e.title),t.tabIndex=-1,t.innerHTML='<alchemy-icon name="close" size="sm"></alchemy-icon>',t}}}const X={option_create:(e,t)=>`<div class="create">\n ${y("Add")} <strong>${t(e.input)}</strong>&hellip;\n </div>`,loading(){if(!(Object.keys(this.options).length>0))return`<div class="loading-results">${y("Please wait, loading")}&hellip;</div>`},no_results:()=>`<div class="no-results">${y("No results found")}</div>`,loading_more:()=>`<div class="loading-more">${y("Loading more results")}&hellip;</div>`,no_more_results:()=>`<div class="no-more-results">${y("No more results")}</div>`};function K(e,t){const s=R(e);return t?s.replace(new RegExp(String(t).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi"),e=>`<em>${e}</em>`):s}function Q(e,t){return Object.keys(e).map(s=>{const i=e[s],n=t?`${t}[${s}]`:s;return null==i?"":Array.isArray(i)?i.map(e=>`${encodeURIComponent(`${n}[]`)}=${encodeURIComponent(e)}`).join("&"):"object"==typeof i?Q(i,n):`${encodeURIComponent(n)}=${encodeURIComponent(i)}`}).filter(e=>""!==e).join("&")}class Y extends HTMLElement{#v=null;#b=null;#f=new Map;connectedCallback(){const e=this.input;if(e.classList.add("alchemy_selectbox"),e instanceof HTMLInputElement){const s=e.value;e.value="",this.#v=new t(e,this.tomSelectConfig),e.value=s}else this.#v=new t(e,this.tomSelectConfig);this.#v.control.append(document.createElement("sl-spinner")),this.#v.control.addEventListener("click",this.#v.open.bind(this.#v))}disconnectedCallback(){j(this.#v),this.#v=null}focus(){W(this.#v,()=>super.focus())}onChange(e){this.multiple?(e.added&&this.#f.set(String(e.added.id),e.added),e.removed&&this.#f.delete(String(e.removed.id)),this.setAttribute("selection",JSON.stringify([...this.#f.values()]))):e.added&&this.setAttribute("selection",JSON.stringify(e.added)),this.dispatchCustomEvent("RemoteSelect.Change",{removed:e.removed,added:e.added})}onOpen(){}dispatchCustomEvent(e,t={}){this.dispatchEvent(new CustomEvent(`Alchemy.${e}`,{bubbles:!0,detail:t}))}get allowClear(){return this.hasAttribute("allow-clear")}get multiple(){return this.hasAttribute("multiple")}get selection(){return this.getAttribute("selection")}get placeholder(){return this.getAttribute("placeholder")??""}get queryParams(){return this.getAttribute("query-params")??"{}"}get url(){return this.getAttribute("url")??""}get input(){return this.querySelector("input, select")}get tomSelectConfig(){const e=this,t=this.ajaxConfig,s={virtual_scroll:{}};this.multiple&&(s.remove_button={}),this.allowClear&&(s.clear_button={html:()=>`<button type="button" class="clear-button" aria-label="${y("Clear selection")}">\n <alchemy-icon name="close" size="1x"></alchemy-icon>\n </button>`});const{onDropdownOpen:i,onDropdownClose:n}=V();return{plugins:s,valueField:"id",maxItems:this.multiple?null:1,closeAfterSelect:!this.multiple,maxOptions:null,searchField:[],loadThrottle:t.quietMillis,refreshThrottle:0,placeholder:this.placeholder,openOnFocus:!1,shouldLoad:()=>!0,firstUrl:e=>this.#E(e,1),load:(e,t)=>this.#w(e,t),onInitialize(){if(e.selection)if(e.multiple){const t=JSON.parse(e.selection);e.#f=new Map(t.map(e=>[String(e.id),e])),t.forEach(e=>{this.addOption({...e,$preselection:!0}),this.addItem(e.id,!0)})}else{const t=JSON.parse(e.selection);e.#b=t,this.addOption({...t,$preselection:!0}),this.addItem(t.id,!0)}},onChange(t){e.#k(t,this)},onType(e){this.control_input.classList.toggle("has-value",e.length>0)},onDropdownOpen(){i.call(this),this.loading||this.load(this.lastValue??""),e.onOpen()},onDropdownClose:n,render:{option(t,s){return t.$preselection?`<div>${e._renderResult(t)}</div>`:e._renderListEntry(t,this.lastValue)},item:(t,s)=>`<div>${e._renderResult(t)}</div>`,...X}}}get ajaxConfig(){return{url:this.url,datatype:"json",quietMillis:300,data:(e,t)=>this._searchQuery(e,t),results:e=>this._parseResponse(e)}}#E(e,t){const s=Q(this.ajaxConfig.data(e,t)),i=this.url.includes("?")?"&":"?";return s?`${this.url}${i}${s}`:this.url}async#w(e,t){const s=this.ajaxConfig,i=this.#v.getUrl(e),n=Number(new URL(i,window.location.origin).searchParams.get("page"));try{const l=await fetch(i,{headers:{Accept:"application/json",...s.params?.headers??{}}});if(!l.ok)throw new Error(`${l.status} ${l.statusText}`);const{results:o,more:r}=s.results(await l.json());r&&this.#v.setNextUrl(e,this.#E(e,n+1)),t(o)}catch(e){F(e.message||e,"error"),console.error(`[alchemy] Loading ${i} failed`,e),t()}}#k(e,t){if(this.multiple)return void this.#L(e,t);const s=this.#b;if(""===e||null==e){if(!s)return;this.#b=null,this.onChange({added:null,removed:s})}else if(!s||String(s.id)!==String(e)){const i=this.#_(t.options[e]);this.#b=i,this.onChange({added:i,removed:s})}}#L(e,t){const s=(e??[]).map(String),i=new Set(this.#f.keys()),n=new Set(s);i.forEach(e=>{n.has(e)||this.onChange({added:null,removed:this.#f.get(e)})}),s.forEach(e=>{i.has(e)||this.onChange({added:this.#_(t.options[e]),removed:null})})}#_(e){return e?Object.fromEntries(Object.entries(e).filter(([e])=>!e.startsWith("$"))):null}_searchQuery(e,t){return{q:{name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_parseResponse(e){const t=e.meta;return{results:e.data,more:t.page*t.per_page<t.total_count}}_renderListEntry(e,t){return this.#S(this._entry(e,t))}_renderResult(e){return this.#C(this._selectedEntry(e))}_entry(){throw new Error("You need to define an _entry function on your sub class!")}_selectedEntry(){throw new Error("You need to define a _selectedEntry function on your sub class!")}#S(e){return`\n <div class="remote-select--entry">\n ${this.#x(e)}\n ${this.#A("remote-select--primary",e.primary,{raw:!0})}\n ${this.#A("remote-select--aside",e.aside)}\n ${this.#A("remote-select--secondary",e.secondary)}\n ${this.#A("remote-select--secondary-aside",e.secondaryAside)}\n </div>\n `}#C(e){return`\n <div class="remote-select--selection">\n ${this.#x(e)}\n ${this.#A("remote-select--selection-name",e.primary,{raw:!0})}\n ${this.#A("remote-select--selection-aside",e.secondary)}\n </div>\n `}#x(e){return e.icon?`<alchemy-icon class="remote-select--icon" name="${R(e.icon)}"></alchemy-icon>`:e.media?`<img class="remote-select--media" src="${R(e.media)}" alt="">`:""}#A(e,t,{raw:s=!1}={}){if(null==t||""===t)return"";if("object"==typeof t){if(null!=t.badge&&""!==t.badge)return`<span class="${e} remote-select--badge">${R(t.badge)}</span>`;if(null==t.text||""===t.text)return"";const i=s?t.text:R(t.text);return"head"===t.truncate?`<span class="${e} remote-select--truncate-head"><bdi>${i}</bdi></span>`:`<span class="${e}">${i}</span>`}return`<span class="${e}">${s?t:R(t)}</span>`}_hightlightTerm(e,t){return K(e,t)}}class G extends Y{_entry(e,t){return{icon:e.icon_css_class,primary:this._hightlightTerm(e.name,t)}}_selectedEntry(e){return{icon:e.icon_css_class,primary:e.name}}}customElements.define("alchemy-attachment-select",G);class Z extends HTMLElement{connectedCallback(){this.addEventListener("change",this.#k)}disconnectedCallback(){this.removeEventListener("change",this.#k)}#k=e=>{const t=new Event("submit",{bubbles:!0,cancelable:!0});return e.target.form.dispatchEvent(t),!1}}customElements.define("alchemy-auto-submit",Z);class ee extends HTMLButtonElement{connectedCallback(){this.form?(this.form.addEventListener("submit",this),this.form.addEventListener("turbo:submit-end",this)):console.warn("No form for button found!",this)}handleEvent(e){switch(e.type){case"submit":"disabled"===this.getAttribute("disabled")?(e.preventDefault(),e.stopPropagation()):this.disable();break;case"turbo:submit-end":this.enable()}}disable(){const e=new E("small"),t=this.getBoundingClientRect();this.dataset.initialButtonText=this.innerHTML,this.setAttribute("disabled","disabled"),this.setAttribute("tabindex","-1"),this.classList.add("disabled"),this.style.width=`${t.width}px`,this.style.height=`${t.height}px`,this.innerHTML="&nbsp;",e.spin(this)}enable(){this.classList.remove("disabled"),this.removeAttribute("disabled"),this.removeAttribute("tabindex"),this.style.width=null,this.style.height=null,this.innerHTML=this.dataset.initialButtonText}}customElements.define("alchemy-button",ee,{extends:"button"});class te extends HTMLElement{connectedCallback(){this.translation=y("allowed_chars",this.maxChars),this.formField=this.getFormField(),this.formField&&(this.createDisplayElement(),this.countCharacters(),this.formField.addEventListener("keyup",this))}disconnectedCallback(){this.formField?.removeEventListener("keyup",this)}handleEvent(e){"keyup"===e.type&&this.countCharacters()}getFormField(){const e=this.querySelectorAll("input, textarea");return e.length>0?e[0]:void 0}createDisplayElement(){this.display=this.querySelector(":scope > .alchemy-char-counter"),this.display||(this.display=document.createElement("small"),this.display.className="alchemy-char-counter",this.formField.after(this.display))}countCharacters(){const e=this.formField.value.length;this.display.textContent=`${e} ${this.translation}`,this.display.classList.toggle("too-long",e>this.maxChars)}get maxChars(){return this.getAttribute("max-chars")??60}}customElements.define("alchemy-char-counter",te);class se extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(){this.form?.querySelectorAll('input[type="datetime-local"]').forEach(e=>{e.value=""})}}customElements.define("alchemy-clear-schedule-button",se,{extends:"button"});class ie extends HTMLElement{connectedCallback(){this.innerHTML='<alchemy-icon name="clipboard"></alchemy-icon>',this.clipboard=new ClipboardJS(this,{text:()=>this.getAttribute("content")}),this.clipboard.on("success",()=>{F(this.getAttribute("success-text"))})}disconnectedCallback(){this.clipboard.destroy()}}customElements.define("alchemy-clipboard-button",ie);class ne extends HTMLSelectElement{#v=null;connectedCallback(){this.classList.add("alchemy_selectbox"),this.#T()}disconnectedCallback(){this.#I()}enable(){this.removeAttribute("disabled"),this.#v?.enable()}disable(){this.setAttribute("disabled","disabled"),this.#v?.disable()}focus(){W(this.#v,()=>super.focus())}setOptions(e,t=void 0){const s=this.value;this.#I(),this.innerHTML="",t&&this.add(new Option(t,"")),e.forEach(e=>{this.add(new Option(e.text,e.id,!1,e.id===s))}),this.#T()}get allowClear(){return this.dataset.hasOwnProperty("allowClear")||this.multiple}get placeholder(){return this.getAttribute("placeholder")}get renderers(){return{}}#T(){const e={},s=!!this.placeholder,i=!!this.querySelector("option[selected]"),{onDropdownOpen:n,onDropdownClose:l}=V();this.multiple&&(e.remove_button=J()),this.allowClear&&(e.clear_button={html:()=>`<button type="button" class="clear-button" aria-label="${y("Clear selection")}">\n <alchemy-icon name="close" size="1x"></alchemy-icon>\n </button>`});const o={plugins:e,closeAfterSelect:!this.multiple,onInitialize:function(){this.input.autofocus&&this.focus(),s&&!i&&this.clear()},onType(e){this.control_input.classList.toggle("has-value",e.length>0)},refreshThrottle:0,onDropdownOpen:n,onDropdownClose:l,allowEmptyOption:!0,openOnFocus:!1,sortField:"$order",maxOptions:null,render:{...X,...this.renderers}};this.#v=new t(this,o),this.#v.control.addEventListener("click",this.#v.open.bind(this.#v))}#I(){j(this.#v),this.#v=null}}customElements.define("alchemy-select",ne,{extends:"select"});const le=(e,t)=>{const s=e.swatch||e.value;return`\n <div class="select-color-option">\n ${"custom_color"===e.value?'<alchemy-icon name="palette"></alchemy-icon>':`<span class="color-indicator" style="--color: ${t(s)}"></span>`}\n <span>${t(e.text)}</span>\n </div>`};customElements.define("alchemy-color-select",class extends ne{connectedCallback(){super.connectedCallback(),this.addEventListener("change",this.#k)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("change",this.#k)}get renderers(){return{item:le,option:le}}#k=()=>{const e=this.parentElement?.querySelector("input[type='color']");e&&(e.disabled="custom_color"!==this.value)}},{extends:"select"});class oe extends HTMLElement{connectedCallback(){this.colorInput?.addEventListener("input",this),this.textInput?.addEventListener("input",this),this.colorInput&&(this.colorInput.disabled=!1)}handleEvent(e){switch(e.target){case this.colorInput:this.textInput.value=this.colorInput.value;break;case this.textInput:this.colorInput.value=this.textInput.value}}disconnectedCallback(){this.colorInput?.removeEventListener("input",this),this.textInput?.removeEventListener("input",this)}get colorInput(){return this.querySelector("input[type='color']")}get textInput(){return this.querySelector("input[type='text']")}}customElements.define("alchemy-color-input",oe);class re extends HTMLElement{connectedCallback(){this.control?.addEventListener("change",this),this.toggle()}disconnectedCallback(){this.control?.removeEventListener("change",this)}handleEvent(e){"change"===e.type&&this.toggle()}toggle(){const e=!!this.control?.checked&&!this.control.disabled;this.hidden=!e,this.fields.forEach(t=>{"function"==typeof t.disable?e?t.enable():t.disable():t.disabled=!e})}get control(){return document.getElementById(this.getAttribute("control"))}get fields(){return this.querySelectorAll("input, select, textarea")}}customElements.define("alchemy-conditional-field",re);const ae=g();class ce extends HTMLElement{async connectedCallback(){"en"!==ae&&await import(`flatpickr/${ae}.js`),this.isConnected&&(this.flatpickr=a(this.inputField,this.flatpickrOptions))}disconnectedCallback(){this.flatpickr?.destroy()}get flatpickrOptions(){const e=/time/.test(this.inputType),t={locale:ae.slice(0,2),altInput:!0,altFormat:y(`formats.${this.inputType}`),altInputClass:"flatpickr-input",enableTime:e,noCalendar:"time"===this.inputType,time_24hr:y("formats.time_24hr"),onValueUpdate(e,t,s){s.element.closest("alchemy-element-editor")?.setDirty(this.inputField)}};return e&&(t.dateFormat="Z"),t}get inputField(){return this.querySelector("input")}get inputType(){return this.getAttribute("input-type")||"date"}}customElements.define("alchemy-datepicker",ce);class de extends HTMLAnchorElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(e){this.disabled||this.openDialog(),e.preventDefault()}openDialog(){this.dialog=new S(this.getAttribute("href"),this.dialogOptions),this.dialog.open()}get dialogOptions(){return this.dataset.dialogOptions?JSON.parse(this.dataset.dialogOptions):{}}get disabled(){return this.classList.contains("disabled")}}customElements.define("alchemy-dialog-link",de,{extends:"a"});let he=!1;class ue extends HTMLElement{connectedCallback(){this.addEventListener("submit",this.#F,!0)}disconnectedCallback(){this.removeEventListener("submit",this.#F,!0)}#F=e=>{if(he||!me())return;e.preventDefault(),e.stopPropagation();const t=e.target;pe().then(e=>{e&&(q(),t.requestSubmit())})}}function me(){return document.querySelectorAll("alchemy-element-editor.dirty").length>0}async function pe(){const e=await O(y("page_dirty_notice"),{title:y("warning"),ok_label:y("ok"),cancel_label:y("cancel")});return e&&(he=!0,window.onbeforeunload=void 0),e}document.addEventListener("turbo:before-visit",t=>{!he&&me()&&(t.preventDefault(),pe().then(s=>{s&&e.visit(t.detail.url)}))}),document.addEventListener("turbo:load",()=>{he=!1}),customElements.define("alchemy-dirty-guard",ue);const ge="application/json";function ye(e){return"get"===e.toLowerCase()}function ve(e,t,s){const i=function(e){return{"Content-Type":"application/json; charset=utf-8",Accept:e,"X-Requested-With":"XMLHttpRequest","X-CSRF-Token":be()}}(s),n={method:e,headers:i};return t&&!ye(e)&&(n.body=JSON.stringify(t)),n}function be(){return document.querySelector('meta[name="csrf-token"]').attributes.content.textContent}function fe(e,t){return ke("GET",e,t)}function Ee(e,t,s){return ke("PATCH",e,t,s)}function we(e,t,s=ge){return ke("POST",e,t,s)}async function ke(e,t,s,i=ge){const n=await fetch(function(e,t,s){const i=new URL(window.location.origin+e);return t&&ye(s)&&new URLSearchParams(t).forEach((e,t)=>{i.searchParams.set(t,e)}),i.toString()}(t,s,e),ve(e,s,i)),l=n.headers.get("content-type"),o=l?.includes(ge),r=l?.includes("text/vnd.turbo-stream.html");let a=null;if(o?a=await n.json():r&&(a=await n.text(),"undefined"!=typeof Turbo&&Turbo.renderStreamMessage(a)),n.ok)return{data:a,status:n.status};if(401===n.status&&a?.redirect_url)return Turbo.visit(a.redirect_url),new Promise(()=>{});throw a||new Error("An error occurred during the transaction")}class Le extends HTMLElement{dataItem(e){return{id:`#${e}`,text:`#${e}`}}get selectElement(){return this.querySelector('select[is="alchemy-select"]')}}customElements.define("alchemy-dom-id-api-select",class extends Le{#q=void 0;connectedCallback(){this.page=this.getAttribute("page")}async#$(){try{const e=(await fe(B.api_ingredients_path,{page_id:this.#q})).data.ingredients.filter(e=>e.data?.dom_id).map(e=>this.dataItem(e.data.dom_id)),t=e.length>0?y("None"):y("No anchors found");this.selectElement.setOptions(e,t),this.selectElement.enable()}catch(e){F(e.message||e,"error"),console.error(e)}}#M(){requestAnimationFrame(()=>{this.selectElement.disable(),this.selectElement.setOptions([],y("Select a page first"))})}set page(e){this.#q=e,e?this.#$():this.#M()}}),customElements.define("alchemy-dom-id-preview-select",class extends Le{connectedCallback(){requestAnimationFrame(()=>{const e=document.getElementById("alchemy_preview_window"),t=e.contentDocument?.querySelectorAll("[id]")||[];if(t.length>0){const e=Array.from(t).map(e=>this.dataItem(e.id));this.selectElement.setOptions(e,y("None"))}})}});class _e extends HTMLElement{#B;connectedCallback(){this.#B=this.scheduleButton.getAttribute("variant"),this.publishButton.addEventListener("click",this),this.dropdown.addEventListener("sl-show",this),this.dropdown.addEventListener("sl-hide",this)}disconnectedCallback(){this.publishButton.removeEventListener("click",this),this.dropdown.removeEventListener("sl-show",this),this.dropdown.removeEventListener("sl-hide",this)}handleEvent(e){switch(e.type){case"click":this.publishButton.loading=!0;break;case"sl-show":this.scheduleButton.setAttribute("variant","primary");break;case"sl-hide":this.scheduleButton.setAttribute("variant",this.#B)}}get publishButton(){return this.querySelector("sl-button[type='submit']")}get dropdown(){return this.querySelector("sl-dropdown")}get scheduleButton(){return this.querySelector("sl-button[slot='trigger']")}}function Se(e){document.dispatchEvent(new CustomEvent("alchemy:page-dirty",{detail:{tooltip:e.publishButtonTooltip}}))}customElements.define("alchemy-publish-element-button",_e);class Ce extends HTMLElement{connectedCallback(){this.button?.addEventListener("click",this)}disconnectedCallback(){this.button?.removeEventListener("click",this)}async handleEvent(){if(await O(this.message))try{const e=await ke("DELETE",this.url);this.#D(e.data)}catch(e){F(e.message||e,"error"),console.error(e)}}#D(e){const t=this.closest("alchemy-element-editor");t.addEventListener("transitionend",()=>{t.fixed&&T(t.elementId),t.remove()}),t.classList.add("dismiss"),F(e.message),e.pageHasUnpublishedChanges&&Se(e),z()}get url(){return this.getAttribute("href")}get message(){return this.getAttribute("message")}get button(){return this.querySelector("button")}}customElements.define("alchemy-delete-element-button",Ce);class xe extends HTMLElement{#H=null;#z=null;#P=null;connectedCallback(){this.classList.contains("ui-sortable-placeholder")||(this.addEventListener("click",this),this.addEventListener("alchemy:element-update-title",this),this.#H=this.form,this.#H&&(this.#H.addEventListener("change",this.onChange),this.#H.addEventListener("turbo:submit-start",this),this.#H.addEventListener("turbo:submit-end",this)),this.#z=this.header,this.#z?.addEventListener("dblclick",this.#O),this.#P=this.toggleButton,this.#P?.addEventListener("click",this.#N),this.hasAttribute("created")&&(this.focusElement(),this.previewWindow?.refresh().then(()=>{this.focusElementPreview()}),this.removeAttribute("created")))}disconnectedCallback(){this.removeEventListener("click",this),this.removeEventListener("alchemy:element-update-title",this),this.#H&&(this.#H.removeEventListener("change",this.onChange),this.#H.removeEventListener("turbo:submit-start",this),this.#H.removeEventListener("turbo:submit-end",this),this.#H=null),this.#z?.removeEventListener("dblclick",this.#O),this.#z=null,this.#P?.removeEventListener("click",this.#N),this.#P=null}handleEvent(e){switch(e.type){case"click":e.target.closest("alchemy-element-editor")===this&&this.onClickElement();break;case"turbo:submit-start":this.setClean();break;case"turbo:submit-end":this.onSaveElement(e.detail.success);break;case"alchemy:element-update-title":this.hasEditors||e.target!=this.firstChild||this.setTitle(e.detail.title)}}onChange=e=>{const t=e.target;if(!t.classList.contains("nested-elements"))return this.setDirty(t),e.stopPropagation(),!1};async focusElement(){document.querySelector("#fixed-elements")&&await this.selectTabForElement(),await this.expand(),this.selectElement(!0)}focusElementPreview(){this.previewWindow?.postMessage({message:"Alchemy.focusElement",element_id:this.elementId})}onClickElement(){this.selectElement(),this.focusElementPreview()}onSaveElement(e){e?this.previewWindow?.refresh().then(()=>{this.focusElementPreview()}):this.elementErrors.classList.remove("hidden")}scrollToElement(){setTimeout(()=>{this.scrollIntoView({behavior:"smooth"})},50)}selectElement(e=!1){document.querySelectorAll("alchemy-element-editor.selected").forEach(e=>{e.classList.remove("selected")}),window.requestAnimationFrame(()=>{this.classList.add("selected")}),e&&this.scrollToElement()}selectTabForElement(){return new Promise((e,t)=>{const s=document.querySelector("#fixed-elements"),i=this.closest("sl-tab-panel");s&&i?(s.show(i.getAttribute("name")),e()):t(new Error("No tabs present"))})}setClean(){this.dirty=!1,window.onbeforeunload=null,this.elementErrors.classList.add("hidden"),this.hasEditors&&this.body.querySelectorAll(".ingredient-editor").forEach(e=>{e.classList.remove("dirty","validation_failed"),e.querySelectorAll("small.error").forEach(e=>e.remove())})}setDirty(e){this.hasEditors&&(this.dirty=!0,window.onbeforeunload||(window.onbeforeunload=e=>e.preventDefault()),e?.closest(".ingredient-editor")?.classList.add("dirty"))}setTitle(e){const t=this.querySelector(".element-header .preview_text_quote");t&&(t.textContent=e)}async toggle(){this.collapsed?await this.expand():await this.collapse()}collapse(){if(this.collapsed||this.compact||this.fixed)return Promise.resolve("Element is already collapsed.");const e=new Alchemy.Spinner("small");return e.spin(this.toggleButton),this.toggleIcon?.classList?.add("hidden"),we(B.collapse_admin_element_path(this.elementId)).then(e=>{const t=e.data;if(this.collapsed=!0,this.toggleButton?.setAttribute("title",t.title),t.nestedElementIds.length){const e=t.nestedElementIds.map(e=>`#element_${e}`).join(", ");this.querySelectorAll(e).forEach(e=>{e.collapsed=!0,e.toggleButton?.setAttribute("title",t.title)})}}).catch(e=>{F(e.message,"error"),console.error(e)}).finally(()=>{this.toggleIcon?.classList?.remove("hidden"),e.stop()})}expand(){if(this.expanded&&!this.compact)return Promise.resolve("Element is already expanded.");if(this.compact&&this.parentElementEditor)return this.parentElementEditor.expand();{const e=new Alchemy.Spinner("small");return e.spin(this.toggleButton),this.toggleIcon?.classList.add("hidden"),new Promise((t,s)=>{we(B.expand_admin_element_path(this.elementId)).then(e=>{const s=e.data;if(s.parentElementIds.length){const e=s.parentElementIds.map(e=>`#element_${e}`).join(", ");document.querySelectorAll(e).forEach(e=>{e.collapsed=!1,e.toggleButton?.setAttribute("title",s.title)})}this.collapsed=!1,this.toggleButton?.setAttribute("title",s.title),t()}).catch(e=>{F(e.message,"error"),console.error(e),s(e)}).finally(()=>{this.toggleIcon?.classList?.remove("hidden"),e.stop()})})}}updateTitle(e){this.setTitle(e),this.dispatchEvent(new CustomEvent("alchemy:element-update-title",{bubbles:!0,detail:{title:e}}))}set published(e){e?this.classList.remove("element-hidden"):this.classList.add("element-hidden")}get published(){return!this.classList.contains("hidden")}get compact(){return null!==this.getAttribute("compact")}get fixed(){return null!==this.getAttribute("fixed")}set collapsed(e){this.classList.toggle("folded",e),this.classList.toggle("expanded",!e),this.toggleIcon&&(this.toggleIcon.name=e?"arrow-left-s":"arrow-down-s")}get collapsed(){return this.classList.contains("folded")}get expanded(){return!this.collapsed}set dirty(e){this.classList.toggle("dirty",e)}get dirty(){return this.classList.contains("dirty")}get header(){return this.querySelector(".element-header")}get body(){return this.querySelector(this.bodySelector)}get bodySelector(){return`#${this.id} > .element-body`}get footer(){return this.querySelector(`#${this.id} > .element-footer`)}get toggleButton(){return this.querySelector(".element-toggle")}get toggleIcon(){return this.toggleButton?.querySelector("alchemy-icon")}get elementErrors(){return this.body.querySelector(".element_errors")}get elementId(){return this.dataset.elementId}get elementName(){return this.dataset.elementName}get hasEditors(){return!!this.body?.querySelector(".element-ingredient-editors")}get hasChildren(){return!!this.querySelector(".nested-elements")}get firstChild(){return this.querySelector("alchemy-element-editor")}get form(){return this.querySelector(`#${this.id} > form.element-body`)}get parentElementEditor(){return this.parentElement?.closest("alchemy-element-editor")}get previewWindow(){return document.getElementById("alchemy_preview_window")}#O=()=>{this.toggle()};#N=e=>{e.target.closest("alchemy-element-editor")===this&&this.toggle()}}customElements.define("alchemy-element-editor",xe);const Ae=(e,t)=>`\n <div class="element-select-name">\n ${e}<span>${t}</span>\n </div>\n`;class Te extends ne{get renderers(){return{item:(e,t)=>Ae(e.icon,t(e.text)),option:(e,t)=>{const s=e.hint?`<div class="element-select-description">${t(e.hint)}</div>`:"";return`\n <div class="element-select-item">\n ${Ae(e.icon,t(e.text))}\n ${s}\n </div>\n `}}}}customElements.define("alchemy-element-select",Te,{extends:"select"});class Ie extends HTMLElement{#U=!0;#R=null;connectedCallback(){this.toggleButton?.addEventListener("click",this.#N),this.collapseButton?.addEventListener("click",this.#W),window.addEventListener("message",this.#j),document.body.addEventListener("click",this.#V),window.location.hash&&this.focusElementEditor(window.location.hash),this.resize()}disconnectedCallback(){this.toggleButton?.removeEventListener("click",this.#N),this.collapseButton?.removeEventListener("click",this.#W),window.removeEventListener("message",this.#j),document.body.removeEventListener("click",this.#V)}#N=e=>{e.preventDefault(),this.toggle()};#W=()=>{this.collapseAllElements()};#j=e=>{if(e.source!==this.previewWindow?.contentWindow)return;const t=e.data;if("Alchemy.focusElementEditor"==t?.message){const e=document.getElementById(`element_${t.element_id}`);this.show(),e?.focusElement()}};#V=e=>{e.target.closest("alchemy-element-editor")||(this.querySelectorAll("alchemy-element-editor").forEach(e=>{e.classList.remove("selected")}),this.previewWindow?.postMessage({message:"Alchemy.blurElements"}))};collapseAllElements(){this.querySelectorAll("alchemy-element-editor:not([compact]):not([fixed])").forEach(e=>e.collapse())}toggle(){this.#U?this.hide():this.show()}show(){document.body.classList.add("elements-window-visible"),this.#U=!0,this.toggleButton.closest("sl-tooltip").content=Alchemy.t("Hide elements"),this.toggleButton.querySelector("alchemy-icon").setAttribute("name","menu-unfold"),this.resize()}hide(){document.body.classList.remove("elements-window-visible"),document.body.style.removeProperty("--elements-window-width"),this.#U=!1,this.toggleButton.closest("sl-tooltip").content=Alchemy.t("Show elements"),this.toggleButton.querySelector("alchemy-icon").setAttribute("name","menu-fold")}resize(e){void 0===e&&(e=this.widthFromCookie),e&&(document.body.style.setProperty("--elements-window-width",`${e}px`),document.cookie=`alchemy-elements-window-width=${e}; SameSite=Lax; Path=/;`)}focusElementEditor(e){const t=document.querySelector(e);t instanceof xe&&t.focusElement()&&t.focusElementPreview()}get collapseButton(){return this.querySelector("#collapse-all-elements-button")}get toggleButton(){return document.querySelector("#element_window_button")}get previewWindow(){return document.getElementById("alchemy_preview_window")}get turboFrame(){return this.#R||(this.#R=this.closest("turbo-frame")),this.#R}get widthFromCookie(){return document.cookie.split("; ").find(e=>e.startsWith("alchemy-elements-window-width="))?.split("=")[1]}set isDragged(e){this.turboFrame.style.transitionProperty=e?"none":null,this.turboFrame.style.pointerEvents=e?"none":null}}customElements.define("alchemy-elements-window",Ie);class Fe extends HTMLElement{#J=!1;#X=null;#K=null;#Q=400;#Y=1e3;connectedCallback(){this.addEventListener("mousedown",this),window.addEventListener("mousemove",this),window.addEventListener("mouseup",this)}disconnectedCallback(){this.removeEventListener("mousedown",this),window.removeEventListener("mousemove",this),window.removeEventListener("mouseup",this)}handleEvent(e){switch(e.type){case"mousedown":e.stopPropagation(),this.onMouseDown();break;case"mouseup":this.onMouseUp();break;case"mousemove":this.#J&&this.onDrag(e.pageX)}}onMouseDown(){this.#J=!0;const e=getComputedStyle(this.elementsWindow);this.#Q=parseFloat(e.minWidth)||400,this.#Y="none"===e.maxWidth?1e3:parseFloat(e.maxWidth),this.elementsWindow.isDragged=!0,this.previewWindow.isDragged=!0,this.classList.add("is-dragged")}onMouseUp(){this.#J=!1,this.elementsWindow.isDragged=!1,this.previewWindow.isDragged=!1,this.classList.remove("is-dragged")}onDrag(e){const t=window.innerWidth-e,s=Math.min(Math.max(t,this.#Q),this.#Y);this.elementsWindow.resize(s)}get elementsWindow(){return this.#X||(this.#X=document.querySelector("alchemy-elements-window")),this.#X}get previewWindow(){return this.#K||(this.#K=document.getElementById("alchemy_preview_window")),this.#K}}customElements.define("alchemy-elements-window-handle",Fe);class qe extends HTMLElement{connectedCallback(){this.deleteLink=this.querySelector(".remove_file_link"),this.fileIcon=this.querySelector(".file_icon"),this.fileName=this.querySelector(".file_name"),this.formFieldId=this.deleteLink?.dataset.formFieldId,this.formField=this.querySelector(`#${this.formFieldId}`),this.deleteLink?.addEventListener("click",this)}disconnectedCallback(){this.deleteLink?.removeEventListener("click",this)}handleEvent(e){"click"===e.type&&this.removeFile(),e.stopPropagation()}removeFile(){this.formField.value="",this.fileIcon.innerHTML="",this.fileName.innerHTML="",this.deleteLink?.classList.add("hidden"),this.closest("alchemy-element-editor").setDirty(this.formField)}}customElements.define("alchemy-file-editor",qe);class $e extends HTMLElement{#G;#Z=null;#ee=null;connectedCallback(){this.hotkey&&key(this.hotkey,this.#te),this.#Z=this.filterField,this.#Z.addEventListener("keyup",this.#se),this.#Z.addEventListener("focus",this.#ie),this.#ee=this.clearButton,this.#ee.addEventListener("click",this.#ne),key("esc","list_filter",this.#le)}disconnectedCallback(){clearTimeout(this.#G),this.#Z?.removeEventListener("keyup",this.#se),this.#Z?.removeEventListener("focus",this.#ie),this.#Z=null,this.#ee?.removeEventListener("click",this.#ne),this.#ee=null,this.hotkey&&key.unbind(this.hotkey),key.unbind("esc","list_filter")}filter(e){""===e&&(this.clearButton.style.visibility="hidden");const t=[],s=new Set,i=e.toLowerCase();this.items.forEach(e=>{const n=e.getAttribute(this.nameAttribute)?.toLowerCase();if(-1!==n.indexOf(i)){t.push(e),s.add(e);let i=e.parentElement?.closest(this.itemsSelector);for(;i;)s.add(i),i=i.parentElement?.closest(this.itemsSelector)}}),this.items.forEach(e=>{e.classList.toggle("hidden",!s.has(e))}),1===t.length&&t[0].scrollIntoView({behavior:"smooth",block:"nearest"})}clear(){this.filterField.value="",this.clearButton.style.visibility="hidden",this.items.forEach(e=>e.classList.remove("hidden"))}get nameAttribute(){return this.getAttribute("name-attribute")||"name"}get clearButton(){return this.querySelector('button[type="button"]')}get filterField(){return this.querySelector('input[type="text"]')}get items(){return document.querySelectorAll(this.itemsSelector)}get itemsSelector(){return this.getAttribute("items-selector")}get debounceTime(){return parseInt(this.getAttribute("debounce-time"))||150}get hotkey(){return this.getAttribute("hotkey")}#te=()=>(this.filterField.focus(),!1);#se=()=>{clearTimeout(this.#G),this.#G=setTimeout(()=>{const e=this.filterField.value;this.clearButton.style.visibility=e?"visible":"hidden",this.filter(e)},this.debounceTime)};#ie=()=>key.setScope("list_filter");#ne=e=>{e.preventDefault(),this.clear()};#le=()=>{this.clear(),this.filterField.blur()}}customElements.define("alchemy-list-filter",$e);class Me extends HTMLElement{#oe=null;#re=null;connectedCallback(){this.addEventListener("mouseenter",this.#ae),this.addEventListener("mouseleave",this.#ce)}disconnectedCallback(){this.removeEventListener("mouseenter",this.#ae),this.removeEventListener("mouseleave",this.#ce),this.#ce()}#ae=()=>{const e=this.#de();e&&(this.#oe=e,this.#re=s(this,e,()=>{i(this,e,{strategy:"fixed",placement:"right-start",middleware:[l({fallbackPlacements:["right-end"],padding:8})]}).then(({x:t,y:s})=>{Object.assign(e.style,{position:"fixed",left:`${Math.round(t)}px`,top:`${Math.round(s)}px`})})}))};#ce=()=>{this.#re?.(),this.#re=null,this.#oe&&(this.#oe.style.position="",this.#oe.style.left="",this.#oe.style.top="",this.#oe=null)};#de(){const e=this.querySelector(".sub_navigation")||this.querySelector("label");return e&&"static"!==getComputedStyle(e).position?e:null}}customElements.define("alchemy-main-navi-entry",Me);class Be extends HTMLElement{connectedCallback(){this.addEventListener("click",this)}disconnectedCallback(){this.removeEventListener("click",this)}handleEvent(e){e.target.closest("alchemy-node-folder")===this.folder&&this.toggleFolded(e)}async toggleFolded(e){e.preventDefault();try{await Ee(B.node.toggle_folded_api_path(this.nodeId)),this.folded=!this.folded}catch(e){F(e.message||e,"error")}}updateFolder(){this.folder.hidden=!(this.hasChildren||this.folded)}get folded(){return this.hasAttribute("folded")}set folded(e){this.toggleAttribute("folded",e),this.folder.toggleAttribute("folded",e),this.childrenList.classList.toggle("folded",e)}get hasChildren(){return this.childrenList.querySelectorAll(":scope > alchemy-menu-node").length>0}get nodeId(){return this.getAttribute("node-id")}get folder(){return this.querySelector(":scope > li > .sitemap_node alchemy-node-folder")}get childrenList(){return this.querySelector(":scope > li > ul.children")}}customElements.define("alchemy-menu-node",Be);class De extends HTMLElement{#he=null;handleEvent(e){"click"===e.type&&this.dismiss()}connectedCallback(){if(!this.querySelector(":scope > alchemy-icon")){const e=this.dismissable&&"error"===this.type?'<alchemy-icon name="close"></alchemy-icon>':"";this.insertAdjacentHTML("afterbegin",`<alchemy-icon name="${this.iconName}"></alchemy-icon>${e}`)}(this.dismissable||"error"===this.type)&&this.addEventListener("click",this),this.dismissable&&"error"!==this.type&&(this.#he=setTimeout(()=>{this.dismiss()},this.dismissDelay))}disconnectedCallback(){null!==this.#he&&(clearTimeout(this.#he),this.#he=null)}dismiss(){this.addEventListener("transitionend",()=>this.remove()),this.classList.add("dismissed")}get dismissable(){return this.hasAttribute("dismissable")}get icon(){return this.getAttribute("icon")}get type(){return this.getAttribute("type")||"notice"}get dismissDelay(){return parseInt(this.noticesWrapper?.dataset.autoDismissDelay||5e3)}get iconName(){switch(this.icon||this.type){case"warning":case"warn":case"alert":return"alert";case"notice":return"check";case"info":case"hint":return"information";case"error":return"bug";default:return this.type}}get noticesWrapper(){return this.closest("#flash_notices")}}customElements.define("alchemy-message",De);class He extends HTMLElement{connectedCallback(){F(this.message,this.getAttribute("type")||"notice"),this.remove()}get message(){return this.getAttribute("message")||this.innerHTML}}customElements.define("alchemy-growl",He);class ze extends HTMLElement{#ue=null;#me=null;#pe=null;connectedCallback(){this.image=this.querySelector("img"),this.form=this.querySelector("form"),this.#me=document.getElementById(this.getAttribute("crop-from-field-id")),this.#pe=document.getElementById(this.getAttribute("crop-size-field-id")),this.elementEditor=document.querySelector(`[data-element-id='${this.getAttribute("element-id")}']`),this.form.addEventListener("submit",this.#ge),this.form.addEventListener("reset",this.#ye),this.#ue=new c(this.image,this.cropperOptions)}disconnectedCallback(){this.#ue?.destroy()}get cropperOptions(){return{aspectRatio:this.aspectRatio,viewMode:1,zoomable:!1,checkCrossOrigin:!1,checkOrientation:!1,data:this.box}}get aspectRatio(){const e=this.getAttribute("ratio");return e?parseFloat(e):NaN}get cropFrom(){if(this.#me?.value)return this.#me.value.split("x").map(e=>parseInt(e))}get cropSize(){if(this.#pe?.value)return this.#pe.value.split("x").map(e=>parseInt(e))}get box(){return this.cropFrom&&this.cropSize?{x:this.cropFrom[0],y:this.cropFrom[1],width:this.cropSize[0],height:this.cropSize[1]}:this.defaultBox}get defaultBox(){const e=JSON.parse(this.getAttribute("default-box"));return{x:e[0],y:e[1],width:e[2],height:e[3]}}update(e){this.#me.value=`${e.x}x${e.y}`,this.#me.dispatchEvent(new Event("change")),this.#pe.value=`${e.width}x${e.height}`,this.#pe.dispatchEvent(new Event("change"))}reset(){const e=this.#ue;e.setData(this.defaultBox);const t=e.getCanvasData(),s=t.width/t.naturalWidth;e.setCropBoxData({left:t.left+this.defaultBox.x*s,top:t.top+this.defaultBox.y*s}),this.update(this.defaultBox)}#ge=e=>{e.preventDefault(),this.update(this.#ue.getData(!0)),this.elementEditor?.setDirty(),C()?.close()};#ye=e=>{e.preventDefault(),this.reset()}}customElements.define("alchemy-image-cropper",ze);class Pe extends S{#ve=e=>{if(e.target.closest(".picture-overlay-handle"))return e.preventDefault(),void this.dialog.classList.toggle("hide-form");if(e.target.closest(".zoomed-picture-background")){if(e.stopPropagation(),"IMG"===e.target.nodeName)return;this.close()}};#be=e=>{if("INPUT"!==e.target.nodeName&&"TEXTAREA"!==e.target.nodeName)switch(e.key){case"ArrowLeft":this.previous(),e.preventDefault();break;case"ArrowRight":this.next(),e.preventDefault()}};resize(){}init(){this.dialog_body.removeEventListener("click",this.#ve),this.dialog_body.addEventListener("click",this.#ve),this.#fe(),super.init()}previous(){this.dialog_body.querySelector(".previous-picture")?.click()}next(){this.dialog_body.querySelector(".next-picture")?.click()}close(){return document.removeEventListener("keydown",this.#be),super.close()}build(){this.dialog_container=f('<dialog class="alchemy-image-overlay-container"></dialog>'),this.dialog=f('<div class="alchemy-image-overlay-dialog"></div>'),this.dialog_body=f('<div class="alchemy-image-overlay-body"></div>'),this.close_button=f('<a class="alchemy-image-overlay-close">\n <alchemy-icon name="close" size="xl"></alchemy-icon>\n </a>'),this.dialog.append(this.close_button),this.dialog.append(this.dialog_body),this.dialog_container.append(this.dialog),document.body.append(this.dialog_container)}#fe(){document.removeEventListener("keydown",this.#be),document.addEventListener("keydown",this.#be)}}customElements.define("alchemy-image-overlay-link",class extends de{openDialog(){this.dialog=new Pe(this.href,{padding:!1}),this.dialog.open()}},{extends:"a"});class Oe extends HTMLDetailsElement{#Ee="Alchemy.expanded_ingredient_groups";connectedCallback(){this.addEventListener("toggle",this),this.isInLocalStorage&&(this.open=!0)}disconnectedCallback(){this.removeEventListener("toggle",this)}handleEvent(){let e=this.localStorageItem;this.open?(this.toggleIcon.name="arrow-down-s",this.isInLocalStorage||e.push(this.id)):(this.toggleIcon.name="arrow-right-s",e=e.filter(e=>e!==this.id)),localStorage.setItem(this.#Ee,JSON.stringify(e))}get isInLocalStorage(){return this.localStorageItem.includes(this.id)}get localStorageItem(){const e=localStorage.getItem(this.#Ee);if(!e)return[];try{return JSON.parse(e)}catch(e){return console.error(e),[]}}get toggleIcon(){return this.querySelector("alchemy-icon")}}customElements.define("alchemy-ingredient-group",Oe,{extends:"details"});class Ne extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this),this.classList.add("icon_button"),this.setAttribute("type","button"),this.innerHTML='<alchemy-icon name="link" icon-style="m"></alchemy-icon>'}handleEvent(e){new Alchemy.LinkDialog({url:this.linkUrl,title:this.linkTitle,target:this.linkTarget,type:this.linkClass}).open().then(e=>this.setLink(e)),e.preventDefault()}setLink(e){""===e.url?(this.classList.remove("linked"),this.dispatchEvent(new CustomEvent("alchemy:unlink",{bubbles:!0}))):(this.classList.add("linked"),this.dispatchEvent(new CustomEvent("alchemy:link",{bubbles:!0,detail:e})))}get linkUrl(){return this.linkButtons.linkUrlField.value}get linkTitle(){return this.linkButtons.linkTitleField.value}get linkTarget(){return this.linkButtons.linkTargetField.value}get linkClass(){return this.linkButtons.linkClassField.value}get linkButtons(){return this.closest("alchemy-link-buttons")}}customElements.define("alchemy-link-button",Ne,{extends:"button"});class Ue extends HTMLButtonElement{connectedCallback(){this.addEventListener("click",this),this.classList.add("icon_button"),this.setAttribute("type","button"),this.linked=this.linked,this.innerHTML='<alchemy-icon name="link-unlink" icon-style="m"></alchemy-icon>'}handleEvent(e){this.linked&&(this.linked=!1,this.blur(),this.dispatchEvent(new CustomEvent("alchemy:unlink",{bubbles:!0}))),e.preventDefault()}set linked(e){e?(this.classList.replace("disabled","linked"),this.removeAttribute("tabindex")):(this.classList.replace("linked","disabled"),this.setAttribute("tabindex","-1"))}get linked(){return this.classList.contains("linked")}}customElements.define("alchemy-unlink-button",Ue,{extends:"button"});class Re extends HTMLElement{connectedCallback(){this.addEventListener("alchemy:link",this),this.addEventListener("alchemy:unlink",this)}disconnectedCallback(){this.removeEventListener("alchemy:link",this),this.removeEventListener("alchemy:unlink",this)}handleEvent(e){switch(e.type){case"alchemy:link":this.setLink(e.detail);break;case"alchemy:unlink":this.removeLink()}e.stopPropagation()}setLink(e){this.linkUrlField.value=e.url,this.linkUrlField.dispatchEvent(new Event("change")),this.linkTitleField.value=e.title,this.linkClassField.value=e.type,this.linkTargetField.value=e.target,this.unlinkButton.linked=!0,this.setElementDirty()}removeLink(){this.linkUrlField.value="",this.linkUrlField.dispatchEvent(new Event("change")),this.linkTitleField.value="",this.linkClassField.value="",this.linkTargetField.value="",this.linkButton.classList.remove("linked"),this.unlinkButton.linked=!1,this.setElementDirty()}setElementDirty(){this.elementEditor.setDirty(this)}get linkButton(){return this.querySelector('[is="alchemy-link-button"]')}get unlinkButton(){return this.querySelector('[is="alchemy-unlink-button"]')}get ingredientEditor(){const e=this.dataset.ingredientId;return this.parentElement.closest(`[data-ingredient-id='${e}']`)}get elementEditor(){return this.closest("alchemy-element-editor")}get linkUrlField(){return this.ingredientEditor.querySelector("[data-link-value]")}get linkTitleField(){return this.ingredientEditor.querySelector("[data-link-title]")}get linkTargetField(){return this.ingredientEditor.querySelector("[data-link-target]")}get linkClassField(){return this.ingredientEditor.querySelector("[data-link-class]")}}customElements.define("alchemy-link-buttons",Re);class We extends HTMLElement{connectedCallback(){this.track=this.querySelector(".news-reader--track"),this.slides=Array.from(this.querySelectorAll(".news-reader--item")),!this.track||this.slides.length<2||(this.currentIndex=0,this.createDots(),this.setActive(0),this.startRotation(),this.addEventListener("mouseenter",this),this.addEventListener("mouseleave",this),this.track.addEventListener("scroll",this,{passive:!0}))}disconnectedCallback(){this.stopRotation()}handleEvent(e){switch(e.type){case"mouseenter":this.stopRotation();break;case"mouseleave":this.startRotation();break;case"scroll":this.syncActiveToScroll()}}createDots(){this.dotList=document.createElement("div"),this.dotList.className="news-reader--dots",this.dots=this.slides.map((e,t)=>{const s=document.createElement("button");return s.type="button",s.className="news-reader--dot",s.setAttribute("aria-label",`${t+1}`),s.addEventListener("click",()=>{this.goTo(t),this.startRotation()}),this.dotList.append(s),s}),this.append(this.dotList)}goTo(e){this.currentIndex=e,this.slides[e].scrollIntoView({behavior:"smooth",inline:"start",block:"nearest"}),this.setActive(e)}next(){this.goTo((this.currentIndex+1)%this.slides.length)}syncActiveToScroll(){const e=this.track.clientWidth;if(!e)return;const t=Math.round(this.track.scrollLeft/e);t!==this.currentIndex&&this.slides[t]&&(this.currentIndex=t,this.setActive(t))}setActive(e){this.dots.forEach((t,s)=>{t.classList.toggle("is-active",s===e)})}startRotation(){this.stopRotation(),this.timer=window.setInterval(()=>this.next(),this.interval)}stopRotation(){this.timer&&window.clearInterval(this.timer),this.timer=null}get interval(){return parseInt(this.getAttribute("interval"),10)||8e3}}customElements.define("alchemy-news-reader",We);class je extends HTMLElement{static get observedAttributes(){return["folded"]}connectedCallback(){this.innerHTML=`\n <button class="node_folder icon_button">\n <alchemy-icon name="${this.iconName}"></alchemy-icon>\n </button>\n `}attributeChangedCallback(){this.icon?.setAttribute("name",this.iconName)}get icon(){return this.querySelector("alchemy-icon")}get iconName(){return this.folded?"arrow-right-s":"arrow-down-s"}get folded(){return this.hasAttribute("folded")}}customElements.define("alchemy-node-folder",je);class Ve extends HTMLElement{connectedCallback(){this.addEventListener("Alchemy.RemoteSelect.Change",this.#we)}disconnectedCallback(){this.removeEventListener("Alchemy.RemoteSelect.Change",this.#we)}#we=e=>{const t=e.detail.added;t?(this.nameField.setAttribute("placeholder",t.name),this.urlField.value=t.url_path,this.urlField.setAttribute("disabled","disabled")):(this.nameField.removeAttribute("placeholder"),this.urlField.value="",this.urlField.removeAttribute("disabled"))};get nameField(){return this.querySelector("#node_name")}get urlField(){return this.querySelector("#node_url")}}customElements.define("alchemy-node-form",Ve);customElements.define("alchemy-node-select",class extends Y{_searchQuery(e,t){return{filter:{name_or_page_name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_entry(e,t){return{icon:"menu-2",primary:this.#ke(e)+this._hightlightTerm(e.name,t),secondary:{text:e.url,truncate:"head"}}}_selectedEntry(e){return{icon:"menu-2",primary:this.#ke(e)+R(e.name)}}#ke(e){const t=e.ancestors.map(e=>e.name);if(0===t.length)return"";const s='<alchemy-icon name="arrow-right-s" class="node-select--separator"></alchemy-icon>';return`<span class="node-select--ancestors">${t.map(R).join(s)}</span>${s}`}});class Je extends HTMLElement{connectedCallback(){this.querySelectorAll("ul.children").forEach(e=>{new d(e,{group:"nodes",animation:150,fallbackOnBody:!0,swapThreshold:.65,handle:".node_name",invertSwap:!0,draggable:"alchemy-menu-node",onEnd:e=>this.handleSort(e)})})}async handleSort(e){if(e.from===e.to&&e.oldIndex===e.newIndex)return;const t=B.node.move_api_path(e.item.nodeId),s={target_parent_id:e.to.dataset.recordId,new_position:e.newIndex};try{await Ee(t,s),this.updateFolders(e.from,e.to),F(y("Successfully moved menu item"))}catch(e){F(e.message||e,"error")}}updateFolders(e,t){e.closest("alchemy-menu-node")?.updateFolder(),e!==t&&t.closest("alchemy-menu-node")?.updateFolder()}}function Xe(e){let t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return t>3&&(t=3),(e/Math.pow(1024,t)).toFixed(2)+" "+["B","kB","MB","GB"][t]}customElements.define("alchemy-node-tree",Je);class Ke extends HTMLElement{file=null;request=null;progressEventLoaded=0;progressEventTotal=0;#Le=!0;#_e=0;#Se=void 0;#Ce="";connectedCallback(){if(this.innerHTML=`\n <sl-progress-bar value="${this.value}"></sl-progress-bar>\n <div class="description">\n <span class="file-name">${this.file?.name}</span>\n <span class="loaded-size">${this.loadedSize}</span>\n <span class="error-message">${this.errorMessage}</span>\n </div>\n <sl-tooltip content="${y("Abort upload")}">\n <button class="icon_button" aria-label="${y("Abort upload")}">\n <alchemy-icon name="close"></alchemy-icon>\n </button>\n </sl-tooltip>\n `,this.querySelector("button").addEventListener("click",()=>this.cancel()),this.file?.type.includes("image")){const e=new FileReader;e.readAsDataURL(this.file),e.addEventListener("load",()=>{const t=new Image;t.src=e.result,this.prepend(t)})}}initialize(e,t){this.file=e,this.request=t,this.progressEventTotal=e?e.size:0,this.status="in-progress",this.#xe(),this.#Ae()}cancel(){this.finished||(this.status="canceled",this.request?.abort(),this.dispatchCustomEvent("FileUpload.Change"))}dispatchCustomEvent(e){this.dispatchEvent(new CustomEvent(`Alchemy.${e}`,{bubbles:!0}))}#xe(){const e=M("alchemy_uploader_defaults"),t=e.file_size_limit*Math.pow(1024,2);let s;this.file?.size>t&&(s=y("Uploaded bytes exceed file size"));const i=this.file?.type.includes("image")?e.allowed_filetypes.alchemy_pictures:e.allowed_filetypes.alchemy_attachments,n=this.file?.name.match(/\.([^.]+)$/)?.[1].toLowerCase();i.includes("*")||i.some(e=>e.toLowerCase()===n)||(s=y("File type not allowed")),s&&(this.valid=!1,this.errorMessage=s)}#Ae(){this.request&&(this.request.upload.onprogress=e=>{this.progressEvent=e},this.request.onload=()=>{this.request.status<400?(this.status="successful",F(this.responseMessage)):(this.status="failed",this.errorMessage=this.responseMessage),this.dispatchCustomEvent("FileUpload.Change")},this.request.onerror=()=>{this.errorMessage=y("An error occurred during the transaction")})}get active(){return this.valid&&"canceled"!==this.status}get errorMessage(){return this.#Ce||""}set errorMessage(e){this.#Ce=e;const t=this.querySelector(".error-message");t&&(t.textContent=e),F(e,"error")}get finished(){return["canceled","successful","failed"].includes(this.status)}get loadedSize(){return`${Xe(this.progressEventLoaded)} / ${Xe(this.progressEventTotal)}`}get progressElement(){return this.querySelector("sl-progress-bar")}set progressEvent(e){this.progressEventLoaded=e.loaded,this.progressEventTotal=e.total,this.value=Math.round(e.loaded/e.total*100),this.querySelector(".loaded-size").textContent=this.loadedSize}get responseMessage(){try{return JSON.parse(this.request.responseText).message}catch(e){return`${this.request.status}: ${this.request.statusText}`}}get status(){return this.#Se}set status(e){this.#Se=e,this.className=e,this.progressElement?.toggleAttribute("indeterminate","upload-finished"===e)}get valid(){return this.#Le}set valid(e){this.#Le=e,this.classList.toggle("invalid",!e)}get value(){return this.#_e}set value(e){this.#_e=e,this.progressElement&&(this.progressElement.value=e),100===e&&(this.status="upload-finished"),this.dispatchCustomEvent("FileUpload.Change")}}customElements.define("alchemy-file-upload",Ke);class Qe extends HTMLElement{fileCount=0;#Te=[];#Ie=y("Cancel all uploads");#Fe=null;#U=!1;#qe=()=>this.#$e();connectedCallback(){var e,t;this.innerHTML=(e=this.#Ie,t=this.fileCount,`\n <sl-progress-bar value="0"></sl-progress-bar>\n <div class="overall-progress-value">\n <span class="value-text"></span>\n\n <sl-tooltip content="${e}">\n <button class="icon_button" aria-label="${e}">\n <alchemy-icon name="close"></alchemy-icon>\n </button>\n </sl-tooltip>\n </div>\n <div class="single-uploads" style="--progress-columns: ${t>3?3:t}"></div>\n <div class="overall-upload-value value-text"></div>\n`),this.visible=!0,this.#Fe=this.querySelector("button"),this.#Fe.addEventListener("click",()=>{this.finished?this.onComplete(this.status):this.cancel()}),this.#Te.forEach(e=>{this.querySelector(".single-uploads").append(e)}),this.#$e(),this.addEventListener("Alchemy.FileUpload.Change",this.#qe)}disconnectedCallback(){this.removeEventListener("Alchemy.FileUpload.Change",this.#qe)}initialize(e=[]){this.#Te=e,this.fileCount=e.length}cancel(){this.#Me().forEach(e=>{e.cancel()}),this.#Be()}onComplete(e){}#Me(){return this.#Te.filter(e=>e.active)}#Be(){this.#Ie=y("Close"),this.#Fe.ariaLabel=this.#Ie,this.#Fe.parentElement.content=this.#Ie}#De(e){return this.#Me().reduce((t,s)=>s[e]+t,0)}#$e(){const e=this.status;this.className=e,this.progressElement.value=this.totalProgress,this.progressElement.toggleAttribute("indeterminate","upload-finished"===e),this.querySelector(".overall-progress-value > span").textContent=this.overallProgressValue,this.querySelector(".overall-upload-value").textContent=this.overallUploadSize,this.finished?(this.#Be(),this.onComplete(e)):this.visible=!0}get finished(){return this.#Me().every(e=>e.finished)}get overallUploadSize(){this.#Me().filter(e=>e.value>=100).length;return this.totalProgress,this.#Me().length,`${Xe(this.#De("progressEventLoaded"))} / ${Xe(this.#De("progressEventTotal"))}`}get overallProgressValue(){const e=this.#Me().filter(e=>e.value>=100).length;return`${this.totalProgress}% (${e} / ${this.#Me().length})`}get progressElement(){return this.querySelector("sl-progress-bar")}get status(){const e=this.#Me().map(e=>e.className);return e.includes("failed")?"failed":0===e.length?"canceled":e.every(t=>t===e[0])?e[0]:"in-progress"}get totalProgress(){const e=this.#Me().reduce((e,t)=>e+t.file.size,0);let t=Math.ceil(this.#Me().reduce((t,s)=>{const i=s.file.size/e;return s.value*i+t},0));return t>100&&(t=100),t}get visible(){return this.#U}set visible(e){this.classList.toggle("visible",e),this.#U=e}}customElements.define("alchemy-upload-progress",Qe);class Ye extends HTMLElement{#He=null;#ze=!1;connectedCallback(){this.fileInput.addEventListener("change",this.#Pe),this.dropzone&&this.#Oe(),this.addEventListener("Alchemy.upload.successful",this)}disconnectedCallback(){this.fileInput?.removeEventListener("change",this.#Pe),this.#He&&(this.#He.removeEventListener("dragleave",this.#Ne),this.#He.removeEventListener("drop",this.#Ue),this.#He.removeEventListener("dragover",this.#Re),this.#He=null)}handleEvent(e){if("Alchemy.upload.successful"===e.type)this.#We()}#Pe=e=>{this.uploadFiles(Array.from(e.target.files))};#je=e=>{this.#ze!==e&&(this.#ze=e,this.#He.classList.toggle("dragover"))};#Ne=()=>this.#je(!1);#Ue=async e=>{e.preventDefault(),this.#je(!1);const t=[...e.dataTransfer.items].map(e=>e.getAsFile());this.uploadFiles(t)};#Re=e=>{e.preventDefault(),this.#je(!0)};#We(){setTimeout(()=>{const e=this.redirectUrl,t=this.closest("turbo-frame");this.uploadProgress.visible=!1,e&&(t?(t.setAttribute("src",e),t.reload()):Turbo.visit(e))},750)}#Oe(){this.#He=document.querySelector(this.dropzone),this.#He&&(this.#He.addEventListener("dragleave",this.#Ne),this.#He.addEventListener("drop",this.#Ue),this.#He.addEventListener("dragover",this.#Re))}uploadFiles(e){let t=0;const s=M("alchemy_uploader_defaults"),i=e.map(e=>{const i=new XMLHttpRequest,n=new Ke;return n.initialize(e,i),s.upload_limit-1<t?(n.valid=!1,n.errorMessage=y("Maximum number of files exceeded")):n.valid&&(t++,this.#Ve(i,e)),n});this.#Je(i)}#Ve(e,t){const s=this.querySelector("form"),i=new FormData(s);i.set(this.fileInput.name,t),e.open("POST",s.action),e.setRequestHeader("X-CSRF-Token",be()),e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e.setRequestHeader("Accept","application/json"),e.send(i)}#Je(e){this.uploadProgress&&(this.uploadProgress.cancel(),this.uploadProgress.remove()),this.uploadProgress=new Qe,this.uploadProgress.initialize(e),this.uploadProgress.setAttribute("layout",this.layout),this.uploadProgress.onComplete=e=>{this.dispatchEvent(new CustomEvent(`Alchemy.upload.${e}`,{bubbles:!0}))},this.#Xe.append(this.uploadProgress)}get#Xe(){return this.#He??document.body}get dropzone(){return this.getAttribute("dropzone")}get layout(){return this.getAttribute("layout")||"row"}get fileInput(){return this.querySelector("input[type='file']")}get redirectUrl(){return this.getAttribute("redirect-url")}}customElements.define("alchemy-uploader",Ye);class Ge extends HTMLElement{connectedCallback(){this.innerHTML=`\n <alchemy-spinner></alchemy-spinner>\n <div id="overlay_text_box">\n <span id="overlay_text">${this.getAttribute("text")??""}</span>\n </div>\n `}set show(e){this.classList.toggle("visible",e)}}customElements.define("alchemy-overlay",Ge);const Ze="BUTTON";class et extends HTMLElement{connectedCallback(){this.pageId=this.getAttribute("page-id"),this.folded=this.hasAttribute("folded"),this.folderButton?.addEventListener("click",this)}disconnectedCallback(){this.folderButton?.removeEventListener("click",this)}async handleEvent(e){"click"===e.type&&await this.handleFolderClick(e)}async handleFolderClick(e){e.preventDefault(),e.stopPropagation();const t=e.currentTarget;t.innerHTML="";const s=new E("small");s.spin(t);try{await Ee(B.fold_admin_page_path(this.pageId),null,"text/vnd.turbo-stream.html"),this.folded=!this.folded,this.toggleAttribute("folded",this.folded),this.toggleChildren(),this.updateFolderIcon()}catch(e){F(e.message||e,"error"),this.updateFolderIcon()}finally{s.stop()}}toggleChildren(){const e=this.querySelector(`#page_${this.pageId}_children`);e&&e.classList.toggle("hidden",this.folded)}updateFolderIcon(){if(this.folderButton){const e=this.folded?"arrow-right-s":"arrow-down-s";this.folderButton.innerHTML=`<alchemy-icon name="${e}"></alchemy-icon>`}}updateFolderButton(){const e=this.querySelector(".page_folder");if(!e)return;const t=this.hasChildren||this.folded;if(t&&"SPAN"===e.tagName){const t=this.folded?"arrow-right-s":"arrow-down-s";e.outerHTML=`<button class="page_folder icon_button">\n <alchemy-icon name="${t}"></alchemy-icon>\n </button>`,this.folderButton?.addEventListener("click",this)}else t||e.tagName!==Ze?t&&e.tagName===Ze&&this.updateFolderIcon():e.outerHTML='<span class="page_folder"></span>'}get hasChildren(){const e=this.querySelector(`#page_${this.pageId}_children`);return!!e&&e.querySelectorAll(":scope > alchemy-page-node").length>0}get folderButton(){return this.querySelector("button.page_folder")}}customElements.define("alchemy-page-node",et);class tt extends HTMLElement{connectedCallback(){this.publicField?.addEventListener("click",this.#Ke)}disconnectedCallback(){this.publicField?.removeEventListener("click",this.#Ke)}#Ke=e=>{const t=e.target,s=new Date,i=new Date(s.getTime()-6e4*s.getTimezoneOffset()).toISOString();t.checked?(this.publicationDateFields.classList.remove("hidden"),this.publicOnPicker.value=i.substring(0,i.indexOf("T")+6)):(this.publicationDateFields.classList.add("hidden"),this.publicOnPicker.value=""),this.publicUntilPicker.value=""};get publicField(){return this.querySelector("#page_public")}get publicOnPicker(){return this.querySelector("input#page_public_on")}get publicUntilPicker(){return this.querySelector("input#page_public_until")}get publicationDateFields(){return this.querySelector(".page-publication-date-fields")}}customElements.define("alchemy-page-publication-fields",tt);class st extends Y{get pageId(){return this.selection?JSON.parse(this.selection).id:void 0}_searchQuery(e,t){return{q:{name_i_cont:e,...JSON.parse(this.queryParams)},page:t}}_parseResponse(e){const t=e.meta;return{results:e.pages,more:t.page*t.per_page<t.total_count}}_entry(e,t){return{icon:"file-3",primary:this._hightlightTerm(e.name,t),aside:e.site?.name,secondary:{text:e.url_path,truncate:"head"},secondaryAside:{badge:e.language_code}}}_selectedEntry(e){return{icon:"file-3",primary:e.text||e.name,secondary:{text:e.url_path,truncate:"head"}}}}customElements.define("alchemy-page-select",st);class it extends HTMLElement{#Qe;connectedCallback(){this.addEventListener("change",this.#Ye),this.addEventListener("click",this.#Ge),this.#Qe=document.querySelector("#select_all_pictures"),this.#Qe?.addEventListener("click",this.#Ze)}disconnectedCallback(){this.removeEventListener("change",this.#Ye),this.removeEventListener("click",this.#Ge),this.#Qe?.removeEventListener("click",this.#Ze)}#Ze=e=>{e.preventDefault(),this.#Qe.classList.toggle("active");const t=this.#Qe.classList.contains("active");this.#et(t),this.selectedItemTools.classList.toggle("hidden",!t)};#Ye=e=>{const t=e.target.closest(".picture_tool.select input");t&&(this.selectedItemTools.classList.toggle("hidden",0===this.checkedInputs.length),t.parentElement.classList.toggle("visible",t.checked))};#Ge=e=>{const t=e.target.closest("a#edit_multiple_pictures");t&&(e.preventDefault(),A(this.#tt(t.href),{title:t.title,size:"500x242"}))};#et(e){this.querySelectorAll(".picture_tool.select input[type='checkbox']").forEach(t=>{t.checked=e,t.closest(".picture_thumbnail").classList.toggle("active",e)})}#tt(e){const t=new URL(e);return this.checkedInputs.forEach(e=>t.searchParams.append(e.name,e.value)),t.toString()}get checkedInputs(){return this.querySelectorAll("input:checked")}get selectedItemTools(){return this.querySelector(".selected_item_tools")}}customElements.define("alchemy-picture-archive",it);class nt extends HTMLElement{connectedCallback(){this.addEventListener("change",this)}disconnectedCallback(){this.removeEventListener("change",this)}handleEvent(e){if("change"===e.type)this.onChange()}onChange(){const e=new URL(this.getAttribute("url")),t=this.querySelector("select");e.searchParams.set("language_id",t.value),Turbo.visit(e,{frame:"picture_descriptions"})}}customElements.define("alchemy-picture-description-select",nt);class lt extends HTMLElement{connectedCallback(){this.cropFromField=this.querySelector("[data-crop-from]"),this.cropSizeField=this.querySelector("[data-crop-size]"),this.pictureIdField=this.querySelector("[data-picture-id]"),this.targetSizeField=this.querySelector("[data-target-size]"),this.imageCropperField=this.querySelector("[data-image-cropper]"),this.image=this.querySelector("img"),this.pictureThumbnail=this.querySelector("alchemy-picture-thumbnail"),this.deleteButton=this.querySelector(".picture_tool.delete"),this.cropLink=this.querySelector(".crop_link"),this.targetSize=this.targetSizeField.dataset.targetSize,this.pictureId=this.pictureIdField.value,this.update=function(e,t){let s;return function(...i){const n=this;clearTimeout(s),s=setTimeout(()=>e.apply(n,i),t)}}(()=>{this.updateImage(),this.updateCropLink()},125),this.deleteButton?.addEventListener("click",this.removeImage),this.observer=new MutationObserver(this.mutationCallback),this.observer.observe(this.cropFromField,{attributes:!0}),this.observer.observe(this.cropSizeField,{attributes:!0}),this.observer.observe(this.pictureIdField,{attributes:!0})}disconnectedCallback(){this.observer.disconnect()}mutationCallback=e=>{for(const t of e)"pictureId"in t.target.dataset&&(this.cropFromField.value="",this.cropSizeField.value="",this.pictureId=t.target.value),this.update()};updateImage(){this.pictureId&&(this.pictureThumbnail.loading=!0,fe(B.url_admin_picture_path(this.pictureId),{crop:this.imageCropperEnabled,crop_from:this.cropFrom,crop_size:this.cropSize,flatten:!0,size:"160x120"}).then(({data:e})=>{this.pictureThumbnail.src=e.url,this.pictureThumbnail.image.alt=e.alt,this.pictureThumbnail.image.title=e.title,this.setElementDirty()}).catch(e=>{console.error(e.message||e),F(e.message||e,"error")}))}removeImage=()=>{this.pictureThumbnail.innerHTML='<alchemy-icon name="image" size="xl"></alchemy-icon>',this.pictureIdField.value="",this.image=null,this.cropLink.classList.add("disabled"),this.setElementDirty()};setElementDirty(){this.closest(".element-editor").setDirty(this)}updateCropLink(){this.pictureId&&this.imageCropperEnabled&&(this.cropLink.classList.remove("disabled"),this.cropLink.href.match(/(picture_id=)\d+/)?this.cropLink.href=this.cropLink.href.replace(/(picture_id=)\d+/,"$1"+this.pictureId):this.cropLink.href=this.cropLink.href+`&picture_id=${this.pictureId}`)}get cropFrom(){return""===this.cropFromField.value?this.defaultCropFrom.join("x"):this.cropFromField.value}get cropSize(){return""===this.cropSizeField.value?this.defaultCropSize.join("x"):this.cropSizeField.value}get defaultCropSize(){if(!this.imageCropperEnabled)return[];const e=this.targetSize.split("x").map(e=>parseInt(e)),t=(s=e[0]/this.imageFileWidth,i=e[1]/this.imageFileHeight,s>=i?s:i);var s,i;return[Math.round(e[0]/t),Math.round(e[1]/t)]}get defaultCropFrom(){if(!this.imageCropperEnabled)return[];const e=this.defaultCropSize;return[Math.round((this.imageFileWidth-e[0])/2),Math.round((this.imageFileHeight-e[1])/2)]}get imageFileWidth(){return parseInt(this.pictureIdField.dataset.imageFileWidth)}get imageFileHeight(){return parseInt(this.pictureIdField.dataset.imageFileHeight)}get imageCropperEnabled(){return"true"===this.targetSizeField.dataset.imageCropper}}customElements.define("alchemy-picture-editor",lt);class ot extends HTMLElement{constructor(){super(),this.spinner=new E("small")}handleEvent(e){switch(e.type){case"load":this.#st();break;case"error":this.#it(e)}}connectedCallback(){this.classList.add("thumbnail_background"),this.src&&!this.image&&this.start(),this.#nt()}disconnectedCallback(){this.image?.removeEventListener("load",this),this.image?.removeEventListener("error",this),this.stop()}createImage(e=this.src,t=this.name){this.image=new Image,this.image.src=e,t&&(this.image.alt=t)}start(e){this.createImage(e),this.image.addEventListener("load",this),this.image.addEventListener("error",this),this.load()}load(){this.image?.complete||(this.setAttribute("loading","loading"),this.innerHTML="",this.spinner.spin(this))}stop(){this.classList.remove("loading"),this.spinner.stop()}#st(){this.spinner.stop(),this.removeAttribute("loading")}#it(e){const t=`Could not load ${this.image.src}`,s=this.closest(".ingredient-editor");this.spinner.stop(),this.innerHTML=`\n <sl-tooltip content="${t}" ${s?"hoist":""}>\n <alchemy-icon name="alert" class="error"></alchemy-icon>\n </sl-tooltip>\n `,console.error(t,e)}#nt(){this.image?.complete?this.replaceChildren(this.image):this.image&&this.append(this.image)}set loading(e){e?this.load():this.stop()}set src(e){this.start(e),this.#nt()}get name(){return this.getAttribute("name")}get src(){return this.getAttribute("src")}}customElements.define("alchemy-picture-thumbnail",ot);class rt extends HTMLElement{connectedCallback(){this.addEventListener("submit",this),document.addEventListener("alchemy:page-dirty",this)}disconnectedCallback(){this.removeEventListener("submit",this),document.removeEventListener("alchemy:page-dirty",this)}handleEvent(e){switch(e.type){case"alchemy:page-dirty":this.markDirty(e.detail);break;case"submit":this.button.loading=!0}}markDirty(e){this.button.variant="primary",this.button.disabled=!1,this.tooltip.content=e.tooltip}get button(){return this.querySelector("sl-button")}get tooltip(){return this.querySelector("sl-tooltip")}}customElements.define("alchemy-publish-page-button",rt);class at extends HTMLElement{connectedCallback(){this.searchInput=document.querySelector(".search_input_field"),this.clearButton=document.querySelector("#search_field_clear"),this.resultCounter=document.querySelector("#page_filter_result"),this.setupSearch(),requestAnimationFrame(()=>{this.setupSortables()}),this.observer=new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE&&(e.classList?.contains("children")&&this.setupSortable(e),e.querySelectorAll(".children").forEach(e=>this.setupSortable(e)))})})}),this.observer.observe(this,{childList:!0,subtree:!0})}disconnectedCallback(){this.teardownSearch(),this.observer?.disconnect()}setupSearch(){this.searchInput?.addEventListener("input",this),this.clearButton?.addEventListener("click",this)}teardownSearch(){this.searchInput?.removeEventListener("input",this),this.clearButton?.removeEventListener("click",this)}handleEvent(e){"input"===e.type&&e.target===this.searchInput?this.handleSearch(e):"click"===e.type&&e.target===this.clearButton&&this.handleClearSearch(e)}handleSearch(e){const t=e.target.value.toLowerCase().trim();""!==t?this.filterPages(t):this.clearFilter()}filterPages(e){const t=this.querySelectorAll(".sitemap_page");let s=0,i=null;t.forEach(t=>{(t.getAttribute("name")||"").toLowerCase().includes(e)?(t.classList.add("highlight"),t.classList.remove("no-match"),s++,i||(i=t)):(t.classList.remove("highlight"),t.classList.add("no-match"))}),1===s?(this.resultCounter.textContent=`1 ${y("page_found")}`,this.resultCounter.style.display="block"):s>1?(this.resultCounter.textContent=`${s} ${y("pages_found")}`,this.resultCounter.style.display="block"):this.resultCounter.style.display="none",i&&i.scrollIntoView({behavior:"smooth",block:"center"})}clearFilter(){this.querySelectorAll(".sitemap_page").forEach(e=>{e.classList.remove("highlight","no-match")}),this.resultCounter.style.display="none"}handleClearSearch(e){e.preventDefault(),this.searchInput.value="",this.clearFilter()}setupSortable(e){new d(e,{group:"pages",animation:150,fallbackOnBody:!0,swapThreshold:.65,handle:".page-icon.handle",draggable:"alchemy-page-node",onEnd:e=>this.handleSort(e)})}setupSortables(){this.querySelectorAll(".children").forEach(e=>this.setupSortable(e))}async handleSort(e){if(e.from===e.to&&e.oldIndex===e.newIndex)return;const t=e.item,s=t.pageId,i=B.move_admin_page_path(s),n={target_parent_id:e.to.dataset.parentId,new_position:e.newIndex};q(!0);try{const l=await Ee(i,n),o=await l.data,r=t.querySelector(`#page_${s}`);if(r){const e=r.querySelector(".sitemap_url");e&&o.url_path&&(e.textContent=o.url_path)}this.updateFolderIcons(e.from,e.to),F(y("Successfully moved page"))}catch(e){F(e.message||e,"error"),window.location.reload()}finally{q(!1)}}updateFolderIcons(e,t){const s=e.closest("alchemy-page-node");if(s?.updateFolderButton(),e!==t){const e=t.closest("alchemy-page-node");e?.updateFolderButton()}}}customElements.define("alchemy-sitemap",at);const ct={draggable:".element-editor",handle:".element-handle.draggable",ghostClass:"dragged",animation:150,swapThreshold:.65,easing:"cubic-bezier(1, 0, 0, 1)"};function dt(e){const t=e.item.dataset.elementName;document.querySelectorAll(`[data-droppable-elements~="${t}"]`).forEach(e=>e.classList.add("droppable-elements"))}function ht(e){const t=e.item,s=e.to.parentElement.closest(".element-editor"),i={element_id:t.dataset.elementId,position:e.newIndex+1};s&&(i.parent_element_id=s.dataset.elementId),e.target===e.to&&we(B.order_admin_elements_path,i).then(e=>{const s=e.data;F(s.message),s.pageHasUnpublishedChanges&&Se(s),z(),t.updateTitle(s.preview_text)})}function ut(){document.querySelectorAll("[data-droppable-elements]").forEach(e=>e.classList.remove("droppable-elements"))}class mt extends HTMLElement{connectedCallback(){const e={name:this.dataset.elementName,put:(e,t,s)=>e.el.dataset.droppableElements.split(" ").includes(s.dataset.elementName)};new d(this,{...ct,onStart:dt,onSort:ht,onEnd:ut,group:e})}}customElements.define("alchemy-sortable-elements",mt);class pt extends HTMLElement{connectedCallback(){this.className=`spinner spinner--${this.size}`,this.innerHTML=`\n <svg width="100%" viewBox="0 0 28 28" style="--spinner-color: ${this.color}">\n <path\n class="hex1"\n d="M5.938,18.07l-5.878-5.9l2.154-8.058l8.024-2.161l5.87,5.9l-2.144,8.058L5.938,18.07z"\n />\n <path\n class="hex2"\n d="M19.686,20.785l-4.731-4.754l1.725-6.487l6.468-1.742l4.733,4.754l-1.734,6.487L19.686,20.785z"\n />\n <path\n class="hex3"\n d="M11.708,26.294l-3.47-3.485l1.276-4.758l4.74-1.276l3.468,3.485l-1.265,4.758L11.708,26.294z"\n />\n </svg>\n `}get size(){return this.getAttribute("size")||"medium"}get color(){return this.getAttribute("color")||"currentColor"}}customElements.define("alchemy-spinner",pt);class gt extends HTMLElement{#v=null;connectedCallback(){this.classList.add("autocomplete_tag_list"),this.input.classList.add("alchemy_selectbox"),this.#v=new t(this.input,this.settings)}disconnectedCallback(){j(this.#v),this.#v=null}focus(){W(this.#v,()=>super.focus())}get input(){return this.getElementsByTagName("input")[0]}get settings(){return{plugins:{remove_button:J()},valueField:"id",delimiter:",",create:!0,createFilter(e){return!this.loading&&(this.settings.duplicates||!this.options[e])},persist:!1,clearAfterSelect:!0,maxOptions:null,openOnFocus:!1,placeholder:this.getAttribute("placeholder"),load:(e,t)=>{fe(this.getAttribute("url"),{term:e}).then(e=>t(e.data)).catch(e=>{F(e.message||e,"error"),t()})},...V(),render:{...X}}}}customElements.define("alchemy-tags-autocomplete",gt);const yt="alchemy-dark",vt="alchemy";class bt extends HTMLElement{#lt=null;connectedCallback(){this.className="tinymce_container",this.querySelector(":scope > alchemy-spinner")||this.insertAdjacentHTML("beforeend",'<alchemy-spinner size="small"></alchemy-spinner>'),this.style.minHeight=`${this.minHeight}px`,this.editor.style.display="none";const e={root:document.getElementById("element_area"),rootMargin:"0px",threshold:[.05]};this.tinymceIntersectionObserver=new IntersectionObserver((e,t)=>{e.forEach(e=>{e.intersectionRatio>0&&(this._initTinymceEditor(),t.unobserve(e.target))})},e),this.tinymceIntersectionObserver.observe(this),this._setupThemeChangeListener()}disconnectedCallback(){this.tinymceIntersectionObserver?.disconnect(),this._removeThemeChangeListener(),tinymce.get(this.editorId)?.remove(this.editorId)}_initTinymceEditor(){tinymce.init(this.configuration).then(e=>{e.forEach(e=>this._setupEditor(e))})}_setupEditor(e){e.show();const t=this.getElementsByTagName("alchemy-spinner")[0];t&&t.remove(),this.elementEditor&&(e.on("dirty",e=>{this.elementEditor.setDirty(e.target.editorContainer)}),e.on("click",()=>this.elementEditor.onClickElement(!1)))}_setupThemeChangeListener(){this.darkModeMediaQuery=window.matchMedia("(prefers-color-scheme: dark)"),this.themeChangeHandler=e=>this._handleThemeChange(e),this.darkModeMediaQuery.addEventListener("change",this.themeChangeHandler)}_removeThemeChangeListener(){this.darkModeMediaQuery&&this.themeChangeHandler&&this.darkModeMediaQuery.removeEventListener("change",this.themeChangeHandler)}_handleThemeChange(e){const t=tinymce.get(this.editorId);if(t){const s=e.matches?yt:vt,i=e.matches?yt:vt;t.remove(),tinymce.init({content_css:i,...this.configuration,skin:s}).then(e=>{e.forEach(e=>this._setupEditor(e))})}}get configuration(){const e={};this.getAttributeNames().forEach(t=>{if(!["class","id","is","name","style"].includes(t)){const s=this.getAttribute(t),i=t.replaceAll("-","_");if(s===t||""===s)e[i]=!0;else try{e[i]=JSON.parse(s)}catch(t){e[i]=s}}});const t={content_css:this.preferredTheme,...M("alchemy_tinymce_defaults"),...e,language:g(),selector:`#${this.editorId}`,skin:this.preferredTheme};return t.height=t.min_height,t}get preferredTheme(){return window.matchMedia("(prefers-color-scheme: dark)").matches?yt:vt}get editorId(){return this.editor.id}get editor(){return this.getElementsByTagName("textarea")[0]}get elementEditor(){return document.getElementById(this.editorId).closest("alchemy-element-editor")}get minHeight(){return this.#lt||this.configuration.min_height}set minHeight(e){this.#lt=e}}customElements.define("alchemy-tinymce",bt);class ft extends HTMLElement{async connectedCallback(){const e=new E("small");e.spin(this);try{const e=await fetch(this.url,{credentials:"include"}),t=await e.json();e.ok?this.showStatus(t):this.showError(e)}catch(e){this.showError(e)}finally{e.stop()}}get url(){return this.getAttribute("url")}showStatus(e){"true"==e.status?this.querySelector(".update_available").classList.remove("hidden"):this.querySelector(".up_to_date").classList.remove("hidden")}showError(e){this.querySelector(".error").classList.remove("hidden"),console.error("[alchemy] Error fetching update status",e)}}customElements.define("alchemy-update-check",ft),h("tooltip.show",{keyframes:[{transform:"translateY(10px)",opacity:"0"},{transform:"translateY(0)",opacity:"1"}],options:{duration:100}}),h("tooltip.hide",{keyframes:[{transform:"translateY(0)",opacity:"1"},{transform:"translateY(10px)",opacity:"0"}],options:{duration:100}}),h("dialog.show",{keyframes:[{transform:"scale(0.98)",opacity:"0"},{transform:"scale(1)",opacity:"1"}],options:{duration:150}}),h("dialog.hide",{keyframes:[{transform:"scale(1)",opacity:"1"},{transform:"scale(0.98)",opacity:"0"}],options:{duration:150}});const Et=document.querySelector('link[rel="preload"][as="image"]').getAttribute("href"),wt={"x-lg":"close",caret:"arrow-down-s"},kt={resolver:e=>`${Et}#ri-${wt[e]||e}-line`,mutator:e=>{e.setAttribute("fill","currentColor"),e.setAttribute("viewBox","0 0 24 24")},spriteSheet:!0};u("default",kt),u("system",kt),void 0===window.Alchemy&&(window.Alchemy={}),Object.assign(Alchemy,{closeCurrentDialog:x,currentDialog:C,t:y,FixedElements:I,growl:F,LinkDialog:class extends S{#ot;constructor(e){const t=new URL(B.link_admin_pages_path,window.location),s={url:e.url,selected_tab:e.type,link_title:e.title,link_target:e.target};Object.keys(s).forEach(e=>{s[e]&&t.searchParams.set(e,s[e])}),super(t.href,{size:"600x320",title:y("Link")})}replace(e){super.replace(e),this.#m()}open(){return super.open(),new Promise(e=>this.#ot=e)}#m(){const e=document.querySelector('[data-link-form-type="internal"]'),t=document.querySelector('[data-link-form-type="file"] alchemy-attachment-select');e.addEventListener("Alchemy.RemoteSelect.Change",e=>{this.#rt(e.detail.added)}),t.addEventListener("Alchemy.RemoteSelect.Change",e=>{const t=e.detail.added;document.getElementById("file_link").value=t?t.url:""}),document.querySelectorAll("[data-link-form-type]").forEach(e=>{e.addEventListener("submit",e=>{e.preventDefault(),this.#at(e.target.dataset.linkFormType)})})}#rt(e=null){const t=document.getElementById("internal_link"),s=document.querySelector('[data-link-form-type="internal"] alchemy-dom-id-api-select');t.value=e?e.url_path:"",s.page=e?e.id:void 0}#at(e){const t=document.getElementById("element_anchor");let s=document.getElementById(`${e}_link`).value;if("internal"===e&&""!==t.value)s=s.replace(D,"")+t.value;else if("external"===e&&!function(e){const t=document.getElementById("external_link")?.dataset.linkUrlRegexp;if(!t)return!0;const s=t.lastIndexOf("/");return new RegExp(t.slice(1,s),t.slice(s+1)).test(e)}(s))return void this.#ct();this.#ot({url:s.trim(),title:document.getElementById(`${e}_link_title`).value,target:document.getElementById(`${e}_link_target`)?.value,type:e}),this.close()}#ct(){const e=document.getElementById("errors");e.querySelector("ul").innerHTML=`<li>${Alchemy.t("url_validation_failed")}</li>`,e.style.display="block"}},pleaseWaitOverlay:q,Spinner:E,reloadPreview:z}),e.config.forms.confirm=O,document.addEventListener("turbo:load",function(){document.documentElement.classList.remove("no-js"),b(),document.removeEventListener("keypress",$),document.addEventListener("keypress",$),document.querySelectorAll(".please_wait").forEach(e=>{e.addEventListener("click",q)}),document.querySelectorAll("a.button").forEach(e=>{e.setAttribute("tabindex",0)}),key.filter=function(e){let t=(e.target||e.srcElement).tagName;return key.isPressed("esc")||!("INPUT"===t||"SELECT"===t||"TEXTAREA"===t)}});export{G as AttachmentSelect,Te as ElementSelect,st as PageSelect,Y as RemoteSelect,gt as TagsAutocomplete,bt as Tinymce,k as on};
2
2
  //# sourceMappingURL=alchemy_admin.min.js.map