diff --git a/assets/js/hooks/monaco_editor.js b/assets/js/hooks/monaco_editor.js index e70b0bb..0d09a0e 100644 --- a/assets/js/hooks/monaco_editor.js +++ b/assets/js/hooks/monaco_editor.js @@ -34,6 +34,20 @@ export const webKitTextAreaArrowCommand = (event) => { return event.shiftKey ? `${command}Select` : command; }; +// Applying a remote value via setValue resets the cursor to the buffer start, +// which then makes follow-up actions (like link inserts targeting the current +// selection) land at position 1,1. Capture and restore the selection so the +// cursor survives server-driven reconciles; Monaco clamps out-of-range +// positions to the new content. +export const applyRemoteEditorValue = (editor, value) => { + const selections = editor.getSelections ? editor.getSelections() : null; + editor.setValue(value); + + if (selections && selections.length > 0 && editor.setSelections) { + editor.setSelections(selections); + } +}; + export const bridgeWebKitTextAreaArrowKey = (editor, event) => { if (!editor || !isMonacoInputArea(event.target)) { return false; @@ -92,8 +106,12 @@ export const MonacoEditor = { if (this.editor.getValue() !== value) { this.isApplyingRemoteUpdate = true; - this.editor.setValue(value); - this.isApplyingRemoteUpdate = false; + + try { + applyRemoteEditorValue(this.editor, value); + } finally { + this.isApplyingRemoteUpdate = false; + } } this.lastKnownValue = value; diff --git a/lib/bds/desktop/shell_live/overlay_manager.ex b/lib/bds/desktop/shell_live/overlay_manager.ex index ef70130..073bb5a 100644 --- a/lib/bds/desktop/shell_live/overlay_manager.ex +++ b/lib/bds/desktop/shell_live/overlay_manager.ex @@ -155,7 +155,7 @@ defmodule BDS.Desktop.ShellLive.OverlayManager do ShellOverlayComponents.markdown_link(result.title, result.canonical_url)} ) - socket + assign(socket, :shell_overlay, nil) end {%{kind: :insert_media}, %{type: :post, id: post_id}} -> @@ -172,7 +172,7 @@ defmodule BDS.Desktop.ShellLive.OverlayManager do end Notify.parent({:post_editor_insert_content, post_id, syntax}) - socket + assign(socket, :shell_overlay, nil) end _other -> @@ -197,10 +197,11 @@ defmodule BDS.Desktop.ShellLive.OverlayManager do if details do Notify.parent({:post_editor_insert_content, post_id, details}) + assign(socket, :shell_overlay, nil) + else + socket end - socket - _other -> socket end diff --git a/lib/bds/desktop/shell_live/post_editor.ex b/lib/bds/desktop/shell_live/post_editor.ex index feb45aa..9ee9d8f 100644 --- a/lib/bds/desktop/shell_live/post_editor.ex +++ b/lib/bds/desktop/shell_live/post_editor.ex @@ -117,7 +117,6 @@ defmodule BDS.Desktop.ShellLive.PostEditor do id: socket.assigns.post_id, content: content }) - |> assign(:shell_overlay, nil) {:ok, socket} end @@ -316,18 +315,6 @@ defmodule BDS.Desktop.ShellLive.PostEditor do {:noreply, do_remove_list_value(socket, :categories, category)} end - def handle_event("insert_content", %{"content" => content}, socket) do - socket = - socket - |> Phoenix.LiveView.push_event("post-editor-insert-content", %{ - id: socket.assigns.post_id, - content: content - }) - |> assign(:shell_overlay, nil) - - {:noreply, socket} - end - def handle_event("close_quick_actions", _params, socket) do socket = socket @@ -892,7 +879,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor do end) if map_size(attrs) == 0 do - assign(socket, :shell_overlay, nil) + socket else case Posts.update_post(post_id, attrs) do {:ok, updated_post} -> @@ -910,7 +897,6 @@ defmodule BDS.Desktop.ShellLive.PostEditor do ) |> assign(:save_state, :dirty) |> assign(:dirty?, true) - |> assign(:shell_overlay, nil) |> build_data() Notify.dirty(:post, post_id, true) diff --git a/priv/static/assets/app.js b/priv/static/assets/app.js index d8f8e24..d0ba49c 100644 --- a/priv/static/assets/app.js +++ b/priv/static/assets/app.js @@ -21,8 +21,8 @@ removing illegal node: "${(s.outerHTML||s.nodeValue).trim()}" let liveSocket = new LiveSocket("/live", Socket, {...}) `);this.socket=new t(e,i),this.bindingPrefix=i.bindingPrefix||jn,this.opts=i,this.params=ze(i.params||{}),this.viewLogger=i.viewLogger,this.metadataCallbacks=i.metadata||{},this.defaults=Object.assign(bt(Vn),i.defaults||{}),this.prevActive=null,this.silenced=!1,this.main=null,this.outgoingMainEl=null,this.clickStartedAtTarget=null,this.linkRef=1,this.roots={},this.href=window.location.href,this.pendingLink=null,this.currentLocation=bt(window.location),this.hooks=i.hooks||{},this.uploaders=i.uploaders||{},this.loaderTimeout=i.loaderTimeout||$n,this.disconnectedTimeout=i.disconnectedTimeout||Un,this.reloadWithJitterTimer=null,this.maxReloads=i.maxReloads||An,this.reloadJitterMin=i.reloadJitterMin||kn,this.reloadJitterMax=i.reloadJitterMax||Tn,this.failsafeJitter=i.failsafeJitter||Cn,this.localStorage=i.localStorage||window.localStorage,this.sessionStorage=i.sessionStorage||window.sessionStorage,this.boundTopLevelEvents=!1,this.boundEventNames=new Set,this.blockPhxChangeWhileComposing=i.blockPhxChangeWhileComposing||!1,this.serverCloseRef=null,this.domCallbacks=Object.assign({jsQuerySelectorAll:null,onPatchStart:ze(),onPatchEnd:ze(),onNodeAdded:ze(),onBeforeElUpdated:ze()},i.dom||{}),this.transitions=new kr,this.currentHistoryPosition=parseInt(this.sessionStorage.getItem(ct))||0,window.addEventListener("pagehide",s=>{this.unloaded=!0}),this.socket.onOpen(()=>{this.isUnloaded()&&window.location.reload()})}version(){return"1.1.28"}isProfileEnabled(){return this.sessionStorage.getItem(Ft)==="true"}isDebugEnabled(){return this.sessionStorage.getItem(ht)==="true"}isDebugDisabled(){return this.sessionStorage.getItem(ht)==="false"}enableDebug(){this.sessionStorage.setItem(ht,"true")}enableProfiling(){this.sessionStorage.setItem(Ft,"true")}disableDebug(){this.sessionStorage.setItem(ht,"false")}disableProfiling(){this.sessionStorage.removeItem(Ft)}enableLatencySim(e){this.enableDebug(),console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable"),this.sessionStorage.setItem(Ut,e)}disableLatencySim(){this.sessionStorage.removeItem(Ut)}getLatencySim(){let e=this.sessionStorage.getItem(Ut);return e?parseInt(e):null}getSocket(){return this.socket}connect(){window.location.hostname==="localhost"&&!this.isDebugDisabled()&&this.enableDebug();let e=()=>{this.resetReloadStatus(),this.joinRootViews()?(this.bindTopLevelEvents(),this.socket.connect()):this.main?this.socket.connect():this.bindTopLevelEvents({dead:!0}),this.joinDeadView()};["complete","loaded","interactive"].indexOf(document.readyState)>=0?e():document.addEventListener("DOMContentLoaded",()=>e())}disconnect(e){clearTimeout(this.reloadWithJitterTimer),this.serverCloseRef&&(this.socket.off(this.serverCloseRef),this.serverCloseRef=null),this.socket.disconnect(e)}replaceTransport(e){clearTimeout(this.reloadWithJitterTimer),this.socket.replaceTransport(e),this.connect()}execJS(e,t,i=null){let s=new CustomEvent("phx:exec",{detail:{sourceElement:e}});this.owner(e,n=>P.exec(s,i,t,n,e))}js(){return hs(this,"js")}unload(){this.unloaded||(this.main&&this.isConnected()&&this.log(this.main,"socket",()=>["disconnect for page nav"]),this.unloaded=!0,this.destroyAllViews(),this.disconnect())}triggerDOM(e,t){this.domCallbacks[e](...t)}time(e,t){if(!this.isProfileEnabled()||!console.time)return t();console.time(e);let i=t();return console.timeEnd(e),i}log(e,t,i){if(this.viewLogger){let[s,n]=i();this.viewLogger(e,t,s,n)}else if(this.isDebugEnabled()){let[s,n]=i();Jn(e,t,s,n)}}requestDOMUpdate(e){this.transitions.after(e)}asyncTransition(e){this.transitions.addAsyncTransition(e)}transition(e,t,i=function(){}){this.transitions.addTransition(e,t,i)}onChannel(e,t,i){e.on(t,s=>{let n=this.getLatencySim();n?setTimeout(()=>i(s),n):i(s)})}reloadWithJitter(e,t){clearTimeout(this.reloadWithJitterTimer),this.disconnect();let i=this.reloadJitterMin,s=this.reloadJitterMax,n=Math.floor(Math.random()*(s-i+1))+i,r=B.updateLocal(this.localStorage,window.location.pathname,ts,0,o=>o+1);r>=this.maxReloads&&(n=this.failsafeJitter),this.reloadWithJitterTimer=setTimeout(()=>{e.isDestroyed()||e.isConnected()||(e.destroy(),t?t():this.log(e,"join",()=>[`encountered ${r} consecutive reloads`]),r>=this.maxReloads&&this.log(e,"join",()=>[`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]),this.hasPendingLink()?window.location=this.pendingLink:window.location.reload())},n)}getHookDefinition(e){if(e)return this.maybeInternalHook(e)||this.hooks[e]||this.maybeRuntimeHook(e)}maybeInternalHook(e){return e&&e.startsWith("Phoenix.")&&ir[e.split(".")[1]]}maybeRuntimeHook(e){let t=document.querySelector(`script[${vt}="${CSS.escape(e)}"]`);if(!t)return;let i=window[`phx_hook_${e}`];if(!i||typeof i!="function"){I("a runtime hook must be a function",t);return}let s=i();if(s&&(typeof s=="object"||typeof s=="function"))return s;I("runtime hook must return an object with hook callbacks or an instance of ViewHook",t)}isUnloaded(){return this.unloaded}isConnected(){return this.socket.isConnected()}getBindingPrefix(){return this.bindingPrefix}binding(e){return`${this.getBindingPrefix()}${e}`}channel(e,t){return this.socket.channel(e,t)}joinDeadView(){let e=document.body;if(e&&!this.isPhxView(e)&&!this.isPhxView(document.firstElementChild)){let t=this.newRootView(e);t.setHref(this.getHref()),t.joinDead(),this.main||(this.main=t),window.requestAnimationFrame(()=>{t.execNewMounted(),this.maybeScroll(history.state?.scroll)})}}joinRootViews(){let e=!1;return c.all(document,`${Ze}:not([${Ae}])`,t=>{if(!this.getRootById(t.id)){let i=this.newRootView(t);c.isPhxSticky(t)||i.setHref(this.getHref()),i.join(),t.hasAttribute(Qt)&&(this.main=i)}e=!0}),e}redirect(e,t,i){i&&B.setCookie(Mi,i,60),this.unload(),B.redirect(e,t)}replaceMain(e,t,i=null,s=this.setPendingLink(e)){let n=this.currentLocation.href;this.outgoingMainEl=this.outgoingMainEl||this.main.el;let r=c.findPhxSticky(document)||[],o=c.all(this.outgoingMainEl,`[${this.binding("remove")}]`).filter(l=>!c.isChildOfAny(l,r)),a=c.cloneNode(this.outgoingMainEl,"");this.main.showLoader(this.loaderTimeout),this.main.destroy(),this.main=this.newRootView(a,t,n),this.main.setRedirect(e),this.transitionRemoves(o),this.main.join((l,h)=>{l===1&&this.commitPendingLink(s)&&this.requestDOMUpdate(()=>{o.forEach(d=>d.remove()),r.forEach(d=>a.appendChild(d)),this.outgoingMainEl.replaceWith(a),this.outgoingMainEl=null,i&&i(s),h()})})}transitionRemoves(e,t){let i=this.binding("remove"),s=n=>{n.preventDefault(),n.stopImmediatePropagation()};e.forEach(n=>{for(let r of this.boundEventNames)n.addEventListener(r,s,!0);this.execJS(n,n.getAttribute(i),"remove")}),this.requestDOMUpdate(()=>{e.forEach(n=>{for(let r of this.boundEventNames)n.removeEventListener(r,s,!0)}),t&&t()})}isPhxView(e){return e.getAttribute&&e.getAttribute(te)!==null}newRootView(e,t,i){let s=new Sr(e,this,null,t,i);return this.roots[s.id]=s,s}owner(e,t){let i,s=c.closestViewEl(e);if(s)i=this.getViewByEl(s);else{if(!e.isConnected)return null;i=this.main}return i&&t?t(i):i}withinOwners(e,t){this.owner(e,i=>t(i,e))}getViewByEl(e){let t=e.getAttribute(ae);return Me(this.getRootById(t),i=>i.getDescendentByEl(e))}getRootById(e){return this.roots[e]}destroyAllViews(){for(let e in this.roots)this.roots[e].destroy(),delete this.roots[e];this.main=null}destroyViewByEl(e){let t=this.getRootById(e.getAttribute(ae));t&&t.id===e.id?(t.destroy(),delete this.roots[t.id]):t&&t.destroyDescendent(e.id)}getActiveElement(){return document.activeElement}dropActiveElement(e){this.prevActive&&e.ownsElement(this.prevActive)&&(this.prevActive=null)}restorePreviouslyActiveFocus(){this.prevActive&&this.prevActive!==document.body&&this.prevActive instanceof HTMLElement&&this.prevActive.focus()}blurActiveElement(){this.prevActive=this.getActiveElement(),this.prevActive!==document.body&&this.prevActive instanceof HTMLElement&&this.prevActive.blur()}bindTopLevelEvents({dead:e}={}){this.boundTopLevelEvents||(this.boundTopLevelEvents=!0,this.serverCloseRef=this.socket.onClose(t=>{if(t&&t.code===1e3&&this.main)return this.reloadWithJitter(this.main)}),document.body.addEventListener("click",function(){}),window.addEventListener("pageshow",t=>{t.persisted&&(this.getSocket().disconnect(),this.withPageLoading({to:window.location.href,kind:"redirect"}),window.location.reload())},!0),e||this.bindNav(),this.bindClicks(),e||this.bindForms(),this.bind({keyup:"keyup",keydown:"keydown"},(t,i,s,n,r,o)=>{let a=n.getAttribute(this.binding(Hn)),l=t.key&&t.key.toLowerCase();if(a&&a.toLowerCase()!==l)return;let h={key:t.key,...this.eventMeta(i,t,n)};P.exec(t,i,r,s,n,["push",{data:h}])}),this.bind({blur:"focusout",focus:"focusin"},(t,i,s,n,r,o)=>{if(!o){let a={key:t.key,...this.eventMeta(i,t,n)};P.exec(t,i,r,s,n,["push",{data:a}])}}),this.bind({blur:"blur",focus:"focus"},(t,i,s,n,r,o)=>{if(o==="window"){let a=this.eventMeta(i,t,n);P.exec(t,i,r,s,n,["push",{data:a}])}}),this.on("dragover",t=>t.preventDefault()),this.on("dragenter",t=>{let i=Ee(t.target,this.binding(lt));!i||!(i instanceof HTMLElement)||Gn(t)&&this.js().addClass(i,Nt)}),this.on("dragleave",t=>{let i=Ee(t.target,this.binding(lt));if(!i||!(i instanceof HTMLElement))return;let s=i.getBoundingClientRect();(t.clientX<=s.left||t.clientX>=s.right||t.clientY<=s.top||t.clientY>=s.bottom)&&this.js().removeClass(i,Nt)}),this.on("drop",t=>{t.preventDefault();let i=Ee(t.target,this.binding(lt));if(!i||!(i instanceof HTMLElement))return;this.js().removeClass(i,Nt);let s=i.getAttribute(this.binding(lt)),n=s&&document.getElementById(s),r=Array.from(t.dataTransfer.files||[]);!n||!(n instanceof HTMLInputElement)||n.disabled||r.length===0||!(n.files instanceof FileList)||(N.trackFiles(n,r,t.dataTransfer),n.dispatchEvent(new Event("input",{bubbles:!0})))}),this.on(ss,t=>{let i=t.target;if(!c.isUploadInput(i))return;let s=Array.from(t.detail.files||[]).filter(n=>n instanceof File||n instanceof Blob);N.trackFiles(i,s),i.dispatchEvent(new Event("input",{bubbles:!0}))}))}eventMeta(e,t,i){let s=this.metadataCallbacks[e];return s?s(t,i):{}}setPendingLink(e){return this.linkRef++,this.pendingLink=e,this.resetReloadStatus(),this.linkRef}resetReloadStatus(){B.deleteCookie(Mi)}commitPendingLink(e){return this.linkRef!==e?!1:(this.href=this.pendingLink,this.pendingLink=null,!0)}getHref(){return this.href}hasPendingLink(){return!!this.pendingLink}bind(e,t){for(let i in e){let s=e[i];this.on(s,n=>{let r=this.binding(i),o=this.binding(`window-${i}`),a=n.target.getAttribute&&n.target.getAttribute(r);a?this.debounce(n.target,n,s,()=>{this.withinOwners(n.target,l=>{t(n,i,l,n.target,a,null)})}):c.all(document,`[${o}]`,l=>{let h=l.getAttribute(o);this.debounce(l,n,s,()=>{this.withinOwners(l,d=>{t(n,i,d,l,h,"window")})})})})}}bindClicks(){this.on("mousedown",e=>this.clickStartedAtTarget=e.target),this.bindClick("click","click")}bindClick(e,t){let i=this.binding(t);window.addEventListener(e,s=>{let n=null;s.detail===0&&(this.clickStartedAtTarget=s.target);let r=this.clickStartedAtTarget||s.target;n=Ee(s.target,i),this.dispatchClickAway(s,r),this.clickStartedAtTarget=null;let o=n&&n.getAttribute(i);if(!o){c.isNewPageClick(s,window.location)&&this.unload();return}n.getAttribute("href")==="#"&&s.preventDefault(),!n.hasAttribute(J)&&this.debounce(n,s,"click",()=>{this.withinOwners(n,a=>{P.exec(s,"click",o,a,n,["push",{data:this.eventMeta("click",s,n)}])})})},!1)}dispatchClickAway(e,t){let i=this.binding("click-away"),s=t.closest(`[${me}]`),n=s&&c.byId(s.getAttribute(me));c.all(document,`[${i}]`,r=>{let o=t;s&&!s.contains(r)&&(o=n),r.isSameNode(o)||r.contains(o)||!P.isVisible(t)||this.withinOwners(r,a=>{let l=r.getAttribute(i);P.isVisible(r)&&P.isInViewport(r)&&P.exec(e,"click",l,a,r,["push",{data:this.eventMeta("click",e,e.target)}])})})}bindNav(){if(!B.canPushState())return;history.scrollRestoration&&(history.scrollRestoration="manual");let e=null;window.addEventListener("scroll",t=>{clearTimeout(e),e=setTimeout(()=>{B.updateCurrentState(i=>Object.assign(i,{scroll:window.scrollY}))},100)}),window.addEventListener("popstate",t=>{if(!this.registerNewLocation(window.location))return;let{type:i,backType:s,id:n,scroll:r,position:o}=t.state||{},a=window.location.href,l=o>this.currentHistoryPosition,h=l?i:s||i;this.currentHistoryPosition=o||0,this.sessionStorage.setItem(ct,this.currentHistoryPosition.toString()),c.dispatchEvent(window,"phx:navigate",{detail:{href:a,patch:h==="patch",pop:!0,direction:l?"forward":"backward"}}),this.requestDOMUpdate(()=>{let d=()=>{this.maybeScroll(r)};this.main.isConnected()&&h==="patch"&&n===this.main.id?this.main.pushLinkPatch(t,a,null,d):this.replaceMain(a,null,d)})},!1),window.addEventListener("click",t=>{let i=Ee(t.target,$t),s=i&&i.getAttribute($t);if(!s||!this.isConnected()||!this.main||c.wantsNewTab(t))return;let n=i.href instanceof SVGAnimatedString?i.href.baseVal:i.href,r=i.getAttribute(xn);t.preventDefault(),t.stopImmediatePropagation(),this.pendingLink!==n&&this.requestDOMUpdate(()=>{if(s==="patch")this.pushHistoryPatch(t,n,r,i);else if(s==="redirect")this.historyRedirect(t,n,r,null,i);else throw new Error(`expected ${$t} to be "patch" or "redirect", got: ${s}`);let o=i.getAttribute(this.binding("click"));o&&this.requestDOMUpdate(()=>this.execJS(i,o,"click"))})},!1)}maybeScroll(e){typeof e=="number"&&requestAnimationFrame(()=>{window.scrollTo(0,e)})}dispatchEvent(e,t={}){c.dispatchEvent(window,`phx:${e}`,{detail:t})}dispatchEvents(e){e.forEach(([t,i])=>this.dispatchEvent(t,i))}withPageLoading(e,t){c.dispatchEvent(window,"phx:page-loading-start",{detail:e});let i=()=>c.dispatchEvent(window,"phx:page-loading-stop",{detail:e});return t?t(i):i}pushHistoryPatch(e,t,i,s){if(!this.isConnected()||!this.main.isMain())return B.redirect(t);this.withPageLoading({to:t,kind:"patch"},n=>{this.main.pushLinkPatch(e,t,s,r=>{this.historyPatch(t,i,r),n()})})}historyPatch(e,t,i=this.setPendingLink(e)){this.commitPendingLink(i)&&(this.currentHistoryPosition++,this.sessionStorage.setItem(ct,this.currentHistoryPosition.toString()),B.updateCurrentState(s=>({...s,backType:"patch"})),B.pushState(t,{type:"patch",id:this.main.id,position:this.currentHistoryPosition},e),c.dispatchEvent(window,"phx:navigate",{detail:{patch:!0,href:e,pop:!1,direction:"forward"}}),this.registerNewLocation(window.location))}historyRedirect(e,t,i,s,n){let r=n&&e.isTrusted&&e.type!=="popstate";if(r&&n.classList.add("phx-click-loading"),!this.isConnected()||!this.main.isMain())return B.redirect(t,s);if(/^\/$|^\/[^\/]+.*$/.test(t)){let{protocol:a,host:l}=window.location;t=`${a}//${l}${t}`}let o=window.scrollY;this.withPageLoading({to:t,kind:"redirect"},a=>{this.replaceMain(t,s,l=>{l===this.linkRef&&(this.currentHistoryPosition++,this.sessionStorage.setItem(ct,this.currentHistoryPosition.toString()),B.updateCurrentState(h=>({...h,backType:"redirect"})),B.pushState(i,{type:"redirect",id:this.main.id,scroll:o,position:this.currentHistoryPosition},t),c.dispatchEvent(window,"phx:navigate",{detail:{href:t,patch:!1,pop:!1,direction:"forward"}}),this.registerNewLocation(window.location)),r&&n.classList.remove("phx-click-loading"),a()})})}registerNewLocation(e){let{pathname:t,search:i}=this.currentLocation;return t+i===e.pathname+e.search?!1:(this.currentLocation=bt(e),!0)}bindForms(){let e=0,t=!1;this.on("submit",i=>{let s=i.target.getAttribute(this.binding("submit")),n=i.target.getAttribute(this.binding("change"));!t&&n&&!s&&(t=!0,i.preventDefault(),this.withinOwners(i.target,r=>{r.disableForm(i.target),window.requestAnimationFrame(()=>{c.isUnloadableFormSubmit(i)&&this.unload(),i.target.submit()})}))}),this.on("submit",i=>{let s=i.target.getAttribute(this.binding("submit"));if(!s){c.isUnloadableFormSubmit(i)&&this.unload();return}i.preventDefault(),i.target.disabled=!0,this.withinOwners(i.target,n=>{P.exec(i,"submit",s,n,i.target,["push",{submitter:i.submitter}])})});for(let i of["change","input"])this.on(i,s=>{if(s instanceof CustomEvent&&(s.target instanceof HTMLInputElement||s.target instanceof HTMLSelectElement||s.target instanceof HTMLTextAreaElement)&&s.target.form===void 0){if(s.detail&&s.detail.dispatcher)throw new Error(`dispatching a custom ${i} event is only supported on input elements inside a form`);return}let n=this.binding("change"),r=s.target;if(this.blockPhxChangeWhileComposing&&s.isComposing){let g=`composition-listener-${i}`;c.private(r,g)||(c.putPrivate(r,g,!0),r.addEventListener("compositionend",()=>{r.dispatchEvent(new Event(i,{bubbles:!0})),c.deletePrivate(r,g)},{once:!0}));return}let o=r.getAttribute(n),a=r.form&&r.form.getAttribute(n),l=o||a;if(!l||r.type==="number"&&r.validity&&r.validity.badInput)return;let h=o?r:r.form,d=e;e++;let{at:p,type:m}=c.private(r,"prev-iteration")||{};p===d-1&&i==="change"&&m==="input"||(c.putPrivate(r,"prev-iteration",{at:d,type:i}),this.debounce(r,s,i,()=>{this.withinOwners(h,g=>{c.putPrivate(r,yt,!0),P.exec(s,"change",l,g,r,["push",{_target:s.target.name,dispatcher:h}])})}))});this.on("reset",i=>{let s=i.target;c.resetForm(s);let n=Array.from(s.elements).find(r=>r.type==="reset");n&&window.requestAnimationFrame(()=>{n.dispatchEvent(new Event("input",{bubbles:!0,cancelable:!1}))})})}debounce(e,t,i,s){if(i==="blur"||i==="focusout")return s();let n=this.binding(Dn),r=this.binding(On),o=this.defaults.debounce.toString(),a=this.defaults.throttle.toString();this.withinOwners(e,l=>{let h=()=>!l.isDestroyed()&&document.body.contains(e);c.debounce(e,t,n,o,r,a,h,()=>{s()})})}silenceEvents(e){this.silenced=!0,e(),this.silenced=!1}on(e,t){this.boundEventNames.add(e),window.addEventListener(e,i=>{this.silenced||t(i)})}jsQuerySelectorAll(e,t,i){let s=this.domCallbacks.jsQuerySelectorAll;return s?s(e,t,i):i()}},kr=class{constructor(){this.transitions=new Set,this.promises=new Set,this.pendingOps=[]}reset(){this.transitions.forEach(e=>{clearTimeout(e),this.transitions.delete(e)}),this.promises.clear(),this.flushPendingOps()}after(e){this.size()===0?e():this.pushPendingOp(e)}addTransition(e,t,i){t();let s=setTimeout(()=>{this.transitions.delete(s),i(),this.flushPendingOps()},e);this.transitions.add(s)}addAsyncTransition(e){this.promises.add(e),e.then(()=>{this.promises.delete(e),this.flushPendingOps()})}pushPendingOp(e){this.pendingOps.push(e)}size(){return this.transitions.size+this.promises.size}flushPendingOps(){if(this.size()>0)return;let e=this.pendingOps.shift();e&&(e(),this.flushPendingOps())}},us=Ar;(function(){var e=t();function t(){if(typeof window.CustomEvent=="function")return window.CustomEvent;function n(r,o){o=o||{bubbles:!1,cancelable:!1,detail:void 0};var a=document.createEvent("CustomEvent");return a.initCustomEvent(r,o.bubbles,o.cancelable,o.detail),a}return n.prototype=window.Event.prototype,n}function i(n,r){var o=document.createElement("input");return o.type="hidden",o.name=n,o.value=r,o}function s(n,r){var o=n.getAttribute("data-to"),a=i("_method",n.getAttribute("data-method")),l=i("_csrf_token",n.getAttribute("data-csrf")),h=document.createElement("form"),d=document.createElement("input"),p=n.getAttribute("target");h.method=n.getAttribute("data-method")==="get"?"get":"post",h.action=o,h.style.display="none",p?h.target=p:r&&(h.target="_blank"),h.appendChild(l),h.appendChild(a),document.body.appendChild(h),d.type="submit",h.appendChild(d),d.click()}window.addEventListener("click",function(n){var r=n.target;if(!n.defaultPrevented)for(;r&&r.getAttribute;){var o=new e("phoenix.link.click",{bubbles:!0,cancelable:!0});if(!r.dispatchEvent(o))return n.preventDefault(),n.stopImmediatePropagation(),!1;if(r.getAttribute("data-method")&&r.getAttribute("data-to"))return s(r,n.metaKey||n.shiftKey),n.preventDefault(),!1;r=r.parentNode}},!1),window.addEventListener("phoenix.link.click",function(n){var r=n.target.getAttribute("data-confirm");r&&!window.confirm(r)&&n.preventDefault()},!1)})();var St="bds-panel-sidebar",At="bds-panel-assistant-sidebar",si="bds-ui-language",fs="bds-workbench-";var he=(e,t,i)=>Math.max(t,Math.min(e,i)),ps=e=>{if(!e)return null;try{let t=JSON.parse(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}},kt=(e,t)=>{let i=e?.closest(".media-thumbnail");i&&(t?i.classList.add("is-loaded"):i.classList.remove("is-loaded"))},ni=e=>{e.querySelectorAll(".media-thumbnail-image").forEach(t=>{kt(t,!!(t.complete&&t.naturalWidth>0))})};var Tt=e=>{let t=document.querySelector(e);if(!t)return 0;let i=Number.parseInt(t.style.width||"0",10);return Number.isNaN(i)?Math.round(t.getBoundingClientRect().width):i},ms=(e,t)=>{let i=document.querySelector(e);i&&(i.style.width=`${t}px`,i.classList.remove("is-hidden"))},ri=(e,t)=>{let i=e==="assistant"?At:St;window.localStorage.setItem(i,String(t))},oi=(e,t,i,s)=>{let n=window.localStorage.getItem(e);if(!n)return t;let r=Number.parseInt(n,10);return Number.isNaN(r)?t:he(r,i,s)};var Ct=e=>String(e||"").toLowerCase(),gs=e=>{let t=e.target?.tagName||null;return e.target?.isContentEditable||["INPUT","TEXTAREA","SELECT"].includes(t)},vs=(e,t)=>{let i=t.metaKey||t.ctrlKey;return Ct(t.key)===Ct(e.key)&&i===!!e.primary&&t.shiftKey===!!e.shift&&t.altKey===!!e.alt},bs=e=>{if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}};var ys=()=>{let e=document.documentElement.style,t=(o,a)=>{e.setProperty("--bds-titlebar-overlay-left",`${o}px`),e.setProperty("--bds-titlebar-overlay-right",`${a}px`)},i=navigator.windowControlsOverlay;if(!i)return t(0,0),()=>{};let s=()=>{if(!i.visible){t(0,0);return}let o=i.getTitlebarAreaRect(),a=window.innerWidth||document.documentElement.clientWidth||o.right,l=Math.max(0,Math.round(o.left)),h=Math.max(0,Math.round(a-o.right));t(l,h)},n=()=>s(),r=()=>s();return s(),i.addEventListener("geometrychange",n),window.addEventListener("resize",r),()=>{i.removeEventListener("geometrychange",n),window.removeEventListener("resize",r)}};var X=(e,t)=>window.getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,Tr=e=>{if(!e)return null;let t=e.match(/^#([0-9a-f]{6})$/i);if(t)return{r:Number.parseInt(t[1].slice(0,2),16),g:Number.parseInt(t[1].slice(2,4),16),b:Number.parseInt(t[1].slice(4,6),16)};let i=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)/i);return i?{r:Number.parseInt(i[1],10),g:Number.parseInt(i[2],10),b:Number.parseInt(i[3],10)}:null},ie=(e,t)=>{let i=Tr(e);return i?`#${[i.r,i.g,i.b].map(s=>he(s,0,255).toString(16).padStart(2,"0")).join("")}`:t};var ws=null,ce=e=>{let t=ie(X("--vscode-editor-background",X("--vscode-input-background","#1e1e1e")),"#1e1e1e"),i=ie(X("--vscode-editor-foreground","#d4d4d4"),"#d4d4d4"),s=ie(X("--vscode-editorLineNumber-foreground","#858585"),"#858585"),n=ie(X("--vscode-editorLineNumber-activeForeground",i),i),r=ie(X("--vscode-editor-selectionBackground","#264f78"),"#264f78"),o=ie(X("--vscode-editor-inactiveSelectionBackground","#3a3d41"),"#3a3d41"),a=ie(X("--vscode-editorCursor-foreground",i),i),l=ie(X("--vscode-panel-border","#3c3c3c"),"#3c3c3c"),h=ie(X("--vscode-editor-lineHighlightBackground",t),t),d=[t,i,s,n,r,o,a,l].join("|");if(d===ws){e.editor.setTheme("bds-theme");return}e.editor.defineTheme("bds-theme",{base:"vs-dark",inherit:!0,rules:[{token:"keyword.macro",foreground:"C586C0",fontStyle:"bold"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"}],colors:{"editor.background":t,"editor.foreground":i,"editor.lineHighlightBackground":h,"editorCursor.foreground":a,"editor.selectionBackground":r,"editor.inactiveSelectionBackground":o,"editorLineNumber.foreground":s,"editorLineNumber.activeForeground":n,"editorIndentGuide.background1":l,"editorIndentGuide.activeBackground1":i,"editorWidget.border":l,"editorGutter.background":t,focusBorder:l,"input.border":l}}),ws=d,e.editor.setTheme("bds-theme")};var Es=!1,Ss=!1,ai=e=>{Es||(e.languages.register({id:"liquid"}),e.languages.setLanguageConfiguration("liquid",{comments:{blockComment:["{% comment %}","{% endcomment %}"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]}),e.languages.setMonarchTokensProvider("liquid",{defaultToken:"",tokenizer:{root:[[/\{\{-?/,{token:"delimiter.output",next:"@liquidOutput"}],[/\{%-?\s*comment\b[^%]*-?%\}/,{token:"comment.block",next:"@liquidComment"}],[/\{%-?/,{token:"delimiter.tag",next:"@liquidTag"}],[/<=!]=?|\.|:/,"operator"],[/[a-zA-Z_][\w.-]*/,"identifier"],[/[,:()[\]]/,"delimiter"]],liquidComment:[[/\{%-?\s*endcomment\s*-?%\}/,{token:"comment.block",next:"@pop"}],[/./,"comment.block"]],htmlComment:[[/-->/,{token:"comment",next:"@pop"}],[/./,"comment"]],htmlTag:[[/\/>/,{token:"delimiter.html",next:"@pop"}],[/>/,{token:"delimiter.html",next:"@pop"}],[/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,"attribute.value"],[/[\w:-]+/,"attribute.name"],[/=/,"delimiter"]],scriptTag:[[/>/,{token:"delimiter.html",next:"@pop"}],[/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,"attribute.value"],[/[\w:-]+/,"attribute.name"],[/=/,"delimiter"]],styleTag:[[/>/,{token:"delimiter.html",next:"@pop"}],[/"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'/,"attribute.value"],[/[\w:-]+/,"attribute.name"],[/=/,"delimiter"]]}}),Es=!0)},li=e=>{Ss||(e.languages.register({id:"markdown-with-macros"}),e.languages.setMonarchTokensProvider("markdown-with-macros",{defaultToken:"",tokenPostfix:".md",tokenizer:{root:[[/\[\[[a-zA-Z][\w-]*/,{token:"keyword.macro",next:"@macroParams"}],[/^#{1,6}\s.*$/,"keyword.header"],[/^\s*>+/,"string.quote"],[/^\s*[-+*]\s/,"keyword"],[/^\s*\d+\.\s/,"keyword"],[/^\s*```\w*/,{token:"string.code",next:"@codeblock"}],[/\*\*[^*]+\*\*/,"strong"],[/\*[^*]+\*/,"emphasis"],[/__[^_]+__/,"strong"],[/_[^_]+_/,"emphasis"],[/`[^`]+`/,"variable"],[/!?\[[^\]]*\]\([^)]*\)/,"string.link"],[/!?\[[^\]]*\]\[[^\]]*\]/,"string.link"]],macroParams:[[/\]\]/,{token:"keyword.macro",next:"@root"}],[/[a-zA-Z][\w-]*(?=\s*=)/,"attribute.name"],[/=/,"delimiter"],[/"[^"]*"/,"string"],[/\s+/,"white"],[/[^\]"=\s]+/,"attribute.value"]],codeblock:[[/^\s*```\s*$/,{token:"string.code",next:"@root"}],[/.*$/,"variable.source"]]}}),Ss=!0)};var Qe,hi=new Map,Cr={editor:"/assets/monaco/editor.worker.js",css:"/assets/monaco/css.worker.js",html:"/assets/monaco/html.worker.js",json:"/assets/monaco/json.worker.js",ts:"/assets/monaco/ts.worker.js"},_r=e=>{switch(e){case"css":case"scss":case"less":return"css";case"html":case"handlebars":case"razor":return"html";case"json":return"json";case"typescript":case"javascript":return"ts";default:return"editor"}},xr=()=>{globalThis.MonacoEnvironment?.getWorker||(globalThis.MonacoEnvironment={...globalThis.MonacoEnvironment,getWorker(e,t){let i=_r(t);return new Worker(Cr[i],{name:t,type:"module"})}})},$e=()=>(xr(),window.monaco?.editor?(ce(window.monaco),ai(window.monaco),li(window.monaco),Promise.resolve(window.monaco)):Qe||(Qe=import("/assets/monaco.js").then(e=>{if(window.monaco=e,!e.editor)throw new Error("Monaco loaded but monaco.editor is missing");return ce(e),ai(e),li(e),e}).catch(e=>{throw console.error("Monaco load failed:",e),Qe=null,e}),Qe)),As=(e,t)=>{e&&hi.set(e,t)},ks=e=>{e&&hi.delete(e)},Ts=()=>{for(let e of hi.values())if(typeof e?.hasTextFocus=="function"&&e.hasTextFocus())return e;return null},se=(e,t,i=t)=>{if(!e)return!1;let s=typeof e.getAction=="function"?e.getAction(t):null;return s&&typeof s.run=="function"?(s.run(),!0):typeof e.trigger=="function"?(e.trigger("bds-menu",i,null),!0):!1},ci=(e,t)=>{let i=String(e||"working-tree").replace(/^\/+/,"");return`inmemory://model/git-diff/${t}/${i}`};var _t=e=>{let t=he(Math.round(e*100)/100,.5,2);window.__bdsAppZoom=t,document.documentElement.style.zoom=String(t)},ge=e=>{if(typeof document.execCommand!="function")return!1;try{return document.execCommand(e)}catch{return!1}};var Cs=e=>{let t=Ts();switch(e){case"undo":return t?se(t,"undo"):ge("undo");case"redo":return t?se(t,"redo"):ge("redo");case"cut":return t?se(t,"editor.action.clipboardCutAction"):ge("cut");case"copy":return t?se(t,"editor.action.clipboardCopyAction"):ge("copy");case"paste":return t?se(t,"editor.action.clipboardPasteAction"):ge("paste");case"delete":return t?se(t,"deleteLeft"):ge("delete");case"select_all":return t?se(t,"editor.action.selectAll"):ge("selectAll");case"find":return t?se(t,"actions.find"):!1;case"replace":return t?se(t,"editor.action.startFindReplaceAction"):!1;case"reload":case"force_reload":return window.location.reload(),!0;case"reset_zoom":return _t(1),!0;case"zoom_in":return _t((window.__bdsAppZoom||1)+.1),!0;case"zoom_out":return _t((window.__bdsAppZoom||1)-.1),!0;case"toggle_full_screen":return document.fullscreenElement?document.exitFullscreen?.():document.documentElement.requestFullscreen?.(),!0;default:return!1}};var _s={mounted(){this.shortcuts=bs(this.el.dataset.shortcuts),this.currentProjectId=this.el.dataset.projectId||"",this.syncStoredLayout(),this.syncStoredUiLanguage(),this.destroyOverlaySync=ys(),this.workbenchStorageKey=e=>e?`${fs}${e}`:null,this.restoreStoredWorkbenchSession=()=>{let e=this.el.dataset.projectId||"",t=this.workbenchStorageKey(e);if(!t)return!1;let i=ps(window.localStorage.getItem(t));return i?(this.pushEvent("restore_workbench_session",{session:i}),!0):!1},this.persistWorkbenchSession=()=>{let e=this.el.dataset.projectId||"",t=this.workbenchStorageKey(e),i=this.el.dataset.workbenchSession;!t||!i||window.localStorage.setItem(t,i)},this.handleMouseDown=e=>{let t=e.target.closest("[data-role='resize-handle']");if(!t||!this.el.contains(t))return;e.preventDefault();let i=t.dataset.resize,s=e.clientX,n=i==="assistant"?Tt("[data-testid='assistant-shell']"):Tt("[data-testid='sidebar-shell']"),r=i==="assistant"?280:200,o=i==="assistant"?640:500,a=i==="assistant",l=d=>{let p=a?s-d.clientX:d.clientX-s,m=he(n+p,r,o);ms(i==="assistant"?"[data-testid='assistant-shell']":"[data-testid='sidebar-shell']",m),ri(i,m)},h=d=>{let p=a?s-d.clientX:d.clientX-s,m=he(n+p,r,o);ri(i,m),this.pushEvent("resize_panel",{target:i,width:m}),window.removeEventListener("mousemove",l),window.removeEventListener("mouseup",h)};window.addEventListener("mousemove",l),window.addEventListener("mouseup",h)},this.el.addEventListener("mousedown",this.handleMouseDown),this.handleNativeMenuAction=e=>{let t=e.detail?.action,i=e.detail?.ackId;t&&this.pushEvent("native_menu_action",{action:t},()=>{i&&window.dispatchEvent(new CustomEvent("bds:native-menu-action-ack",{detail:{ackId:i}}))})},this.handleChange=e=>{let t=e.target.closest(".status-bar-language-select");t&&this.el.contains(t)&&window.localStorage.setItem(si,t.value)},this.handleShortcutKeyDown=e=>{gs(e)||!this.shortcuts.find(i=>vs(i,e))||(e.preventDefault(),e.stopPropagation(),this.pushEvent("shortcut",{key:Ct(e.key),meta:e.metaKey,ctrl:e.ctrlKey,alt:e.altKey,shift:e.shiftKey,tag:e.target?.tagName||null,contentEditable:e.target?.isContentEditable||!1}))},this.handleThumbnailLoad=e=>{e.target instanceof HTMLImageElement&&e.target.classList.contains("media-thumbnail-image")&&kt(e.target,!0)},this.handleThumbnailError=e=>{e.target instanceof HTMLImageElement&&e.target.classList.contains("media-thumbnail-image")&&kt(e.target,!1)},this.handleEvent("menu-runtime-command",({action:e})=>{e&&Cs(String(e))}),this.handleEvent("url-state",({path:e})=>{e&&window.location.pathname+window.location.search!==e&&window.history.replaceState({},"",e)}),window.addEventListener("bds:native-menu-action",this.handleNativeMenuAction),window.addEventListener("keydown",this.handleShortcutKeyDown,!0),this.el.addEventListener("load",this.handleThumbnailLoad,!0),this.el.addEventListener("error",this.handleThumbnailError,!0),this.el.addEventListener("change",this.handleChange),ni(this.el),this.restoreStoredWorkbenchSession(),this.pushEvent("shell_ready",{})},updated(){let e=this.el.dataset.projectId||"";e!==this.currentProjectId&&(this.currentProjectId=e,this.restoreStoredWorkbenchSession())||(ni(this.el),this.persistWorkbenchSession())},destroyed(){this.el.removeEventListener("mousedown",this.handleMouseDown),this.el.removeEventListener("load",this.handleThumbnailLoad,!0),this.el.removeEventListener("error",this.handleThumbnailError,!0),this.el.removeEventListener("change",this.handleChange),window.removeEventListener("bds:native-menu-action",this.handleNativeMenuAction),window.removeEventListener("keydown",this.handleShortcutKeyDown,!0),this.destroyOverlaySync&&this.destroyOverlaySync()},syncStoredLayout(){this.pushEvent("sync_layout",{sidebar_width:oi(St,Tt("[data-testid='sidebar-shell']"),200,500),assistant_sidebar_width:oi(At,360,280,640)})},syncStoredUiLanguage(){let e=window.localStorage.getItem(si);e&&this.pushEvent("sync_ui_language",{language:e})}};var xs={mounted(){this.handleDblClick=e=>{let t=e.target.closest("[data-testid='sidebar-open-item']");!t||!this.el.contains(t)||this.pushEvent("pin_sidebar_item",{route:t.dataset.route,id:t.dataset.itemId,title:t.dataset.openTitle||"",subtitle:t.dataset.openSubtitle||""})},this.el.addEventListener("dblclick",this.handleDblClick)},destroyed(){this.el.removeEventListener("dblclick",this.handleDblClick)}};var Ps=e=>({mounted(){this.lastTargetId=null,this.scrollToSelectedSection()},updated(){this.scrollToSelectedSection()},scrollToSelectedSection(){let t=this.el.dataset[e];!t||t===this.lastTargetId||(this.lastTargetId=t,window.requestAnimationFrame(()=>{let i=document.getElementById(t);i&&this.el.contains(i)&&i.scrollIntoView({block:"start",behavior:"smooth"})}))}}),Rs=Ps("settingsScrollTarget"),Ls=Ps("tagsScrollTarget");var Is={mounted(){this.stickToBottom=!0,this.scrollContainer=null,this._enterKeyHandled=!1,this._prevInputValue="",this.autoResize=()=>{let e=this.el.querySelector(".chat-input");if(!e)return;let t=getComputedStyle(e),i=parseFloat(t.getPropertyValue("--chat-input-min-height"))||20,s=parseFloat(t.getPropertyValue("--chat-input-max-height"))||160;if(e.rows=1,e.style.minHeight=`${i}px`,e.value.trim()===""){e.style.height=`${i}px`,e.style.maxHeight=`${i}px`,e.style.overflowY="hidden";return}e.style.maxHeight=`${s}px`,e.style.height="0px";let n=Math.min(Math.max(e.scrollHeight,i),s);e.style.height=`${n}px`,e.style.overflowY=n>=s?"auto":"hidden"},this.syncScrollContainer=()=>{let e=this.el.querySelector(".chat-messages");e!==this.scrollContainer&&(this.scrollContainer&&this.scrollContainer.removeEventListener("scroll",this.handleScroll),this.scrollContainer=e,this.scrollContainer&&this.scrollContainer.addEventListener("scroll",this.handleScroll))},this.scrollToBottom=(e=!1)=>{this.scrollContainer&&(e||this.stickToBottom)&&(this.scrollContainer.scrollTop=this.scrollContainer.scrollHeight)},this.syncExpandedSurfaces=()=>{this.el.querySelectorAll(".chat-inline-surface[data-expanded='true']").forEach(e=>{e.open=!0})},this.surfaceObserver=new MutationObserver(()=>{this.syncExpandedSurfaces()}),this.handleScroll=()=>{if(!this.scrollContainer){this.stickToBottom=!0;return}let e=this.scrollContainer.scrollHeight-this.scrollContainer.scrollTop-this.scrollContainer.clientHeight;this.stickToBottom=e<48},this._submitChat=()=>{let e=this.el.querySelector(".chat-input-wrapper");if(e&&typeof e.requestSubmit=="function")e.requestSubmit();else{let t=this.el.querySelector("[data-testid='chat-send-button']");t&&t.click()}},this.handleInput=e=>{if(!e.target.closest(".chat-input"))return;let t=e.target;if(!this._enterKeyHandled&&t.value.includes(` `)&&!this._prevInputValue.includes(` -`)){t.value=t.value.replace(/\n/g,""),this._prevInputValue=t.value,this.stickToBottom=!0,this.autoResize(),this._submitChat();return}this._enterKeyHandled=!1,this._prevInputValue=t.value,this.stickToBottom=!0,this.autoResize()},this.handleKeyDown=e=>{e.target.closest(".chat-input")&&e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),this._enterKeyHandled=!0,this._submitChat())},this.el.addEventListener("input",this.handleInput),this.el.addEventListener("keydown",this.handleKeyDown),this.syncScrollContainer(),this.syncExpandedSurfaces(),this.surfaceObserver.observe(this.el,{childList:!0,subtree:!0}),this.autoResize(),window.requestAnimationFrame(()=>this.scrollToBottom(!0))},updated(){this.syncScrollContainer(),this.syncExpandedSurfaces(),this.autoResize(),window.requestAnimationFrame(()=>this.scrollToBottom())},destroyed(){this.surfaceObserver.disconnect(),this.el.removeEventListener("input",this.handleInput),this.el.removeEventListener("keydown",this.handleKeyDown),this.scrollContainer&&this.scrollContainer.removeEventListener("scroll",this.handleScroll)}};var Ds={mounted(){this._onClickAway=e=>{this.el.contains(e.target)||this.el.querySelector(".colour-picker-popover")?.classList.add("hidden")},document.addEventListener("mousedown",this._onClickAway),this._setupCustomInput()},updated(){this._setupCustomInput()},destroyed(){document.removeEventListener("mousedown",this._onClickAway)},_setupCustomInput(){let e=this.el.querySelector(".colour-picker-custom input");if(!e||e._cpBound)return;e._cpBound=!0;let t=()=>{let i=e.value.trim();if(i&&!i.startsWith("#")&&(i="#"+i),/^#[0-9a-fA-F]{6}$/.test(i)){let s=this.el.dataset.pickEvent;this.pushEventTo(this.el.dataset.target,s,{color:i}),this.el.querySelector(".colour-picker-popover")?.classList.add("hidden")}};e.addEventListener("keydown",i=>{i.key==="Enter"&&(i.preventDefault(),t())}),e.addEventListener("blur",t)}};var Os={mounted(){this.dragItemId=null,this.dragSourceEl=null,this.dropTargetEl=null,this.dropPosition=null,this.clearDropTarget=()=>{this.dropTargetEl&&this.dropTargetEl.classList.remove("is-drop-before","is-drop-after","is-drop-inside"),this.dropTargetEl=null,this.dropPosition=null},this.setDropTarget=(e,t)=>{this.dropTargetEl===e&&this.dropPosition===t||(this.clearDropTarget(),this.dropTargetEl=e,this.dropPosition=t,e.classList.add(`is-drop-${t}`))},this.handleDragStart=e=>{let t=e.target.closest("[data-menu-drag-handle='true']"),i=e.target.closest("[data-menu-item-id]");!t||!i||!this.el.contains(i)||(this.dragItemId=i.dataset.menuItemId||null,this.dragSourceEl=i,i.classList.add("is-dragging"),e.dataTransfer&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",this.dragItemId||"")))},this.handleDragOver=e=>{let t=e.target.closest("[data-menu-item-id]");if(!this.dragItemId||!t||!this.el.contains(t)){this.clearDropTarget();return}let i=t.dataset.menuItemId||"";if(!i||i===this.dragItemId){this.clearDropTarget();return}e.preventDefault();let s=t.getBoundingClientRect(),n=e.clientY-s.top,r=t.dataset.menuCanDropInside==="true",o=s.height*.3,a=s.height*.7,l=r&&n>=o&&n<=a?"inside":n{let t=e.target.closest("[data-menu-item-id]");if(!this.dragItemId||!t||!this.el.contains(t)||!this.dropPosition){this.clearDropTarget();return}e.preventDefault(),this.pushEvent("menu_editor_drop_item",{drag_item_id:this.dragItemId,target_item_id:t.dataset.menuItemId,position:this.dropPosition}),this.clearDropTarget()},this.handleDragLeave=e=>{let t=e.relatedTarget;this.dropTargetEl&&(!t||!this.dropTargetEl.contains(t))&&this.clearDropTarget()},this.handleDragEnd=()=>{this.dragSourceEl&&this.dragSourceEl.classList.remove("is-dragging"),this.dragItemId=null,this.dragSourceEl=null,this.clearDropTarget()},this.el.addEventListener("dragstart",this.handleDragStart),this.el.addEventListener("dragover",this.handleDragOver),this.el.addEventListener("drop",this.handleDrop),this.el.addEventListener("dragleave",this.handleDragLeave),this.el.addEventListener("dragend",this.handleDragEnd)},destroyed(){this.el.removeEventListener("dragstart",this.handleDragStart),this.el.removeEventListener("dragover",this.handleDragOver),this.el.removeEventListener("drop",this.handleDrop),this.el.removeEventListener("dragleave",this.handleDragLeave),this.el.removeEventListener("dragend",this.handleDragEnd)}};var Pr={ArrowLeft:"cursorLeft",ArrowRight:"cursorRight",ArrowUp:"cursorUp",ArrowDown:"cursorDown"},Rr=()=>{let e=globalThis.navigator?.userAgent||"";return e.includes("AppleWebKit")&&!e.includes("Chrome")&&!e.includes("Chromium")},Lr=e=>e instanceof HTMLTextAreaElement&&e.classList.contains("inputarea"),Ir=e=>{if(e?.altKey||e?.ctrlKey||e?.metaKey)return null;let t=Pr[e?.key];return t?e.shiftKey?`${t}Select`:t:null},Dr=(e,t)=>{if(!e||!Lr(t.target))return!1;let i=Ir(t);return i?(t.preventDefault(),t.stopPropagation(),e.trigger("keyboard",i,{source:"keyboard"}),!0):!1},Ms={mounted(){this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),this.host=this.el.querySelector(".monaco-editor-instance"),this.language=this.el.dataset.monacoLanguage||"plaintext",this.wordWrap=this.el.dataset.monacoWordWrap||"off",this.editorId=this.el.dataset.monacoEditorId||"",this.insertEvent=this.el.dataset.monacoInsertEvent||"",this.syncTimer=null,this.isApplyingRemoteUpdate=!1,this.lastKnownValue=this.textarea?.value||"",this.handleWebKitTextAreaArrowKey=e=>{Dr(this.editor,e)},this.syncEditorFromTextarea=()=>{if(this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),!this.textarea||!this.editor)return;let e=this.textarea.value||"";e!==this.lastKnownValue&&(this.editor.hasTextFocus()||(this.editor.getValue()!==e&&(this.isApplyingRemoteUpdate=!0,this.editor.setValue(e),this.isApplyingRemoteUpdate=!1),this.lastKnownValue=e))},this.layoutEditorSoon=()=>{window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{this.editor&&this.editor.layout()})})},this.waitForMonacoVisibleSize=()=>new Promise(e=>{let t=!1,i=0,s=()=>{let o=this.host?.getBoundingClientRect();return!!(o&&o.width>0&&o.height>0)},n=()=>{t||(t=!0,this.visibleSizeObserver?.disconnect(),this.visibleSizeObserver=null,e())},r=()=>{if(s()||i>=20){n();return}i+=1,window.requestAnimationFrame(r)};if(s()){n();return}window.ResizeObserver&&this.host&&(this.visibleSizeObserver=new ResizeObserver(()=>{s()&&n()}),this.visibleSizeObserver.observe(this.host)),window.requestAnimationFrame(r)}),this.queueSync=()=>{!this.textarea||!this.editor||(window.clearTimeout(this.syncTimer),this.syncTimer=window.setTimeout(()=>{if(!this.textarea||!this.editor)return;let e=this.editor.getValue();this.textarea.value!==e&&(this.lastKnownValue=e,this.textarea.value=e,this.textarea.dispatchEvent(new Event("input",{bubbles:!0})))},120))},this.dropEvent=this.el.dataset.monacoDropEvent||"",this.dropPostId=this.el.dataset.monacoDropPostId||"",this.handleDragOver=e=>{e.dataTransfer&&Array.from(e.dataTransfer.types||[]).includes("Files")&&(e.preventDefault(),e.dataTransfer.dropEffect="copy")},this.handleDrop=e=>{if(!this.dropEvent||!e.dataTransfer)return;let i=Array.from(e.dataTransfer.files||[]).filter(s=>(s.type||"").startsWith("image/")&&s.path);i.length!==0&&(e.preventDefault(),e.stopPropagation(),i.forEach(s=>{this.pushEvent(this.dropEvent,{"post-id":this.dropPostId,path:s.path})}))},this.handleInsert=({id:e,content:t})=>{if(!this.editor||!t||String(e)!==String(this.editorId))return;let i=this.editor.getModel(),s=this.editor.getSelection();if(!i||!s)return;let n=this.editor.getValue(),r=i.getOffsetAt(s.getStartPosition()),o=i.getOffsetAt(s.getEndPosition()),a=n.slice(0,r),l=n.slice(o),h=a!==""&&!a.endsWith(` +`)){t.value=t.value.replace(/\n/g,""),this._prevInputValue=t.value,this.stickToBottom=!0,this.autoResize(),this._submitChat();return}this._enterKeyHandled=!1,this._prevInputValue=t.value,this.stickToBottom=!0,this.autoResize()},this.handleKeyDown=e=>{e.target.closest(".chat-input")&&e.key==="Enter"&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),this._enterKeyHandled=!0,this._submitChat())},this.el.addEventListener("input",this.handleInput),this.el.addEventListener("keydown",this.handleKeyDown),this.syncScrollContainer(),this.syncExpandedSurfaces(),this.surfaceObserver.observe(this.el,{childList:!0,subtree:!0}),this.autoResize(),window.requestAnimationFrame(()=>this.scrollToBottom(!0))},updated(){this.syncScrollContainer(),this.syncExpandedSurfaces(),this.autoResize(),window.requestAnimationFrame(()=>this.scrollToBottom())},destroyed(){this.surfaceObserver.disconnect(),this.el.removeEventListener("input",this.handleInput),this.el.removeEventListener("keydown",this.handleKeyDown),this.scrollContainer&&this.scrollContainer.removeEventListener("scroll",this.handleScroll)}};var Ds={mounted(){this._onClickAway=e=>{this.el.contains(e.target)||this.el.querySelector(".colour-picker-popover")?.classList.add("hidden")},document.addEventListener("mousedown",this._onClickAway),this._setupCustomInput()},updated(){this._setupCustomInput()},destroyed(){document.removeEventListener("mousedown",this._onClickAway)},_setupCustomInput(){let e=this.el.querySelector(".colour-picker-custom input");if(!e||e._cpBound)return;e._cpBound=!0;let t=()=>{let i=e.value.trim();if(i&&!i.startsWith("#")&&(i="#"+i),/^#[0-9a-fA-F]{6}$/.test(i)){let s=this.el.dataset.pickEvent;this.pushEventTo(this.el.dataset.target,s,{color:i}),this.el.querySelector(".colour-picker-popover")?.classList.add("hidden")}};e.addEventListener("keydown",i=>{i.key==="Enter"&&(i.preventDefault(),t())}),e.addEventListener("blur",t)}};var Os={mounted(){this.dragItemId=null,this.dragSourceEl=null,this.dropTargetEl=null,this.dropPosition=null,this.clearDropTarget=()=>{this.dropTargetEl&&this.dropTargetEl.classList.remove("is-drop-before","is-drop-after","is-drop-inside"),this.dropTargetEl=null,this.dropPosition=null},this.setDropTarget=(e,t)=>{this.dropTargetEl===e&&this.dropPosition===t||(this.clearDropTarget(),this.dropTargetEl=e,this.dropPosition=t,e.classList.add(`is-drop-${t}`))},this.handleDragStart=e=>{let t=e.target.closest("[data-menu-drag-handle='true']"),i=e.target.closest("[data-menu-item-id]");!t||!i||!this.el.contains(i)||(this.dragItemId=i.dataset.menuItemId||null,this.dragSourceEl=i,i.classList.add("is-dragging"),e.dataTransfer&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",this.dragItemId||"")))},this.handleDragOver=e=>{let t=e.target.closest("[data-menu-item-id]");if(!this.dragItemId||!t||!this.el.contains(t)){this.clearDropTarget();return}let i=t.dataset.menuItemId||"";if(!i||i===this.dragItemId){this.clearDropTarget();return}e.preventDefault();let s=t.getBoundingClientRect(),n=e.clientY-s.top,r=t.dataset.menuCanDropInside==="true",o=s.height*.3,a=s.height*.7,l=r&&n>=o&&n<=a?"inside":n{let t=e.target.closest("[data-menu-item-id]");if(!this.dragItemId||!t||!this.el.contains(t)||!this.dropPosition){this.clearDropTarget();return}e.preventDefault(),this.pushEvent("menu_editor_drop_item",{drag_item_id:this.dragItemId,target_item_id:t.dataset.menuItemId,position:this.dropPosition}),this.clearDropTarget()},this.handleDragLeave=e=>{let t=e.relatedTarget;this.dropTargetEl&&(!t||!this.dropTargetEl.contains(t))&&this.clearDropTarget()},this.handleDragEnd=()=>{this.dragSourceEl&&this.dragSourceEl.classList.remove("is-dragging"),this.dragItemId=null,this.dragSourceEl=null,this.clearDropTarget()},this.el.addEventListener("dragstart",this.handleDragStart),this.el.addEventListener("dragover",this.handleDragOver),this.el.addEventListener("drop",this.handleDrop),this.el.addEventListener("dragleave",this.handleDragLeave),this.el.addEventListener("dragend",this.handleDragEnd)},destroyed(){this.el.removeEventListener("dragstart",this.handleDragStart),this.el.removeEventListener("dragover",this.handleDragOver),this.el.removeEventListener("drop",this.handleDrop),this.el.removeEventListener("dragleave",this.handleDragLeave),this.el.removeEventListener("dragend",this.handleDragEnd)}};var Pr={ArrowLeft:"cursorLeft",ArrowRight:"cursorRight",ArrowUp:"cursorUp",ArrowDown:"cursorDown"},Rr=()=>{let e=globalThis.navigator?.userAgent||"";return e.includes("AppleWebKit")&&!e.includes("Chrome")&&!e.includes("Chromium")},Lr=e=>e instanceof HTMLTextAreaElement&&e.classList.contains("inputarea"),Ir=e=>{if(e?.altKey||e?.ctrlKey||e?.metaKey)return null;let t=Pr[e?.key];return t?e.shiftKey?`${t}Select`:t:null},Dr=(e,t)=>{let i=e.getSelections?e.getSelections():null;e.setValue(t),i&&i.length>0&&e.setSelections&&e.setSelections(i)},Or=(e,t)=>{if(!e||!Lr(t.target))return!1;let i=Ir(t);return i?(t.preventDefault(),t.stopPropagation(),e.trigger("keyboard",i,{source:"keyboard"}),!0):!1},Ms={mounted(){this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),this.host=this.el.querySelector(".monaco-editor-instance"),this.language=this.el.dataset.monacoLanguage||"plaintext",this.wordWrap=this.el.dataset.monacoWordWrap||"off",this.editorId=this.el.dataset.monacoEditorId||"",this.insertEvent=this.el.dataset.monacoInsertEvent||"",this.syncTimer=null,this.isApplyingRemoteUpdate=!1,this.lastKnownValue=this.textarea?.value||"",this.handleWebKitTextAreaArrowKey=e=>{Or(this.editor,e)},this.syncEditorFromTextarea=()=>{if(this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),!this.textarea||!this.editor)return;let e=this.textarea.value||"";if(e!==this.lastKnownValue&&!this.editor.hasTextFocus()){if(this.editor.getValue()!==e){this.isApplyingRemoteUpdate=!0;try{Dr(this.editor,e)}finally{this.isApplyingRemoteUpdate=!1}}this.lastKnownValue=e}},this.layoutEditorSoon=()=>{window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{this.editor&&this.editor.layout()})})},this.waitForMonacoVisibleSize=()=>new Promise(e=>{let t=!1,i=0,s=()=>{let o=this.host?.getBoundingClientRect();return!!(o&&o.width>0&&o.height>0)},n=()=>{t||(t=!0,this.visibleSizeObserver?.disconnect(),this.visibleSizeObserver=null,e())},r=()=>{if(s()||i>=20){n();return}i+=1,window.requestAnimationFrame(r)};if(s()){n();return}window.ResizeObserver&&this.host&&(this.visibleSizeObserver=new ResizeObserver(()=>{s()&&n()}),this.visibleSizeObserver.observe(this.host)),window.requestAnimationFrame(r)}),this.queueSync=()=>{!this.textarea||!this.editor||(window.clearTimeout(this.syncTimer),this.syncTimer=window.setTimeout(()=>{if(!this.textarea||!this.editor)return;let e=this.editor.getValue();this.textarea.value!==e&&(this.lastKnownValue=e,this.textarea.value=e,this.textarea.dispatchEvent(new Event("input",{bubbles:!0})))},120))},this.dropEvent=this.el.dataset.monacoDropEvent||"",this.dropPostId=this.el.dataset.monacoDropPostId||"",this.handleDragOver=e=>{e.dataTransfer&&Array.from(e.dataTransfer.types||[]).includes("Files")&&(e.preventDefault(),e.dataTransfer.dropEffect="copy")},this.handleDrop=e=>{if(!this.dropEvent||!e.dataTransfer)return;let i=Array.from(e.dataTransfer.files||[]).filter(s=>(s.type||"").startsWith("image/")&&s.path);i.length!==0&&(e.preventDefault(),e.stopPropagation(),i.forEach(s=>{this.pushEvent(this.dropEvent,{"post-id":this.dropPostId,path:s.path})}))},this.handleInsert=({id:e,content:t})=>{if(!this.editor||!t||String(e)!==String(this.editorId))return;let i=this.editor.getModel(),s=this.editor.getSelection();if(!i||!s)return;let n=this.editor.getValue(),r=i.getOffsetAt(s.getStartPosition()),o=i.getOffsetAt(s.getEndPosition()),a=n.slice(0,r),l=n.slice(o),h=a!==""&&!a.endsWith(` `)?` `:"",d=l!==""&&!t.endsWith(` `)?` -`:"",p=`${h}${t}${d}`;this.editor.executeEdits("bds-insert-content",[{range:s,text:p,forceMoveMarkers:!0}]),this.editor.focus()},$e().then(async e=>{!this.host||!this.textarea||(await this.waitForMonacoVisibleSize(),ce(e),this.editor=e.editor.create(this.host,{value:this.textarea.value||"",language:this.language,theme:"bds-theme",automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:this.wordWrap,lineNumbers:"on",lineNumbersMinChars:3,fontSize:14,fontFamily:"'Cascadia Code', 'Consolas', 'Courier New', monospace",padding:{top:12,bottom:12},roundedSelection:!1,renderLineHighlight:"line",formatOnPaste:!0,cursorStyle:"line",cursorBlinking:"smooth",quickSuggestions:this.language!=="markdown-with-macros",tabSize:2,insertSpaces:!0}),As(this.editorId||this.el.id,this.editor),e.editor.setTheme("bds-theme"),this.syncEditorFromTextarea(),this.layoutEditorSoon(),this.changeSubscription=this.editor.onDidChangeModelContent(()=>{this.isApplyingRemoteUpdate||this.queueSync()}),this.insertEvent&&this.handleEvent(this.insertEvent,this.handleInsert),this.dropEvent&&(this.el.addEventListener("dragover",this.handleDragOver),this.el.addEventListener("drop",this.handleDrop)),Rr()&&this.host.addEventListener("keydown",this.handleWebKitTextAreaArrowKey,!0))}).catch(e=>{console.error("Failed to load Monaco editor",e)})},updated(){this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),this.host=this.el.querySelector(".monaco-editor-instance"),this.language=this.el.dataset.monacoLanguage||this.language||"plaintext",this.wordWrap=this.el.dataset.monacoWordWrap||this.wordWrap||"off",!(!this.editor||!this.textarea)&&($e().then(e=>{ce(e),e.editor.setTheme("bds-theme"),this.editor.getModel()?.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.editor.getModel(),this.language),this.editor.updateOptions({wordWrap:this.wordWrap})}),this.syncEditorFromTextarea(),this.layoutEditorSoon())},destroyed(){window.clearTimeout(this.syncTimer),this.visibleSizeObserver?.disconnect(),this.changeSubscription?.dispose(),this.dropEvent&&(this.el.removeEventListener("dragover",this.handleDragOver),this.el.removeEventListener("drop",this.handleDrop)),this.host?.removeEventListener("keydown",this.handleWebKitTextAreaArrowKey,!0),ks(this.editorId||this.el.id),this.editor?.dispose()}};var Hs={mounted(){this.host=this.el.querySelector(".monaco-diff-editor-instance"),this.originalInput=this.el.querySelector(".monaco-diff-original"),this.modifiedInput=this.el.querySelector(".monaco-diff-modified"),this.filePath=this.el.dataset.monacoDiffFilePath||"working-tree",this.language=this.el.dataset.monacoDiffLanguage||"plaintext",this.viewStyle=this.el.dataset.monacoDiffViewStyle||"inline",this.wordWrap=this.el.dataset.monacoDiffWordWrap||"off",this.hideUnchanged=this.el.dataset.monacoDiffHideUnchanged==="true",this.readValues=()=>({original:this.originalInput?.value||"",modified:this.modifiedInput?.value||""}),this.applyDataset=()=>{this.filePath=this.el.dataset.monacoDiffFilePath||"working-tree",this.language=this.el.dataset.monacoDiffLanguage||"plaintext",this.viewStyle=this.el.dataset.monacoDiffViewStyle||"inline",this.wordWrap=this.el.dataset.monacoDiffWordWrap||"off",this.hideUnchanged=this.el.dataset.monacoDiffHideUnchanged==="true"},this.setModels=e=>{let t=this.readValues();this.originalModel?.dispose(),this.modifiedModel?.dispose(),this.originalModel=e.editor.createModel(t.original,this.language,e.Uri.parse(ci(this.filePath,"original"))),this.modifiedModel=e.editor.createModel(t.modified,this.language,e.Uri.parse(ci(this.filePath,"modified"))),this.editor.setModel({original:this.originalModel,modified:this.modifiedModel}),this.lastFilePath=this.filePath},$e().then(e=>{this.host&&(ce(e),this.editor=e.editor.createDiffEditor(this.host,{theme:"bds-theme",automaticLayout:!0,readOnly:!0,renderSideBySide:this.viewStyle==="side-by-side",minimap:{enabled:!1},scrollBeyondLastLine:!1,lineNumbers:"on",diffCodeLens:!1,originalEditable:!1,wordWrap:this.wordWrap,hideUnchangedRegions:{enabled:this.hideUnchanged},ignoreTrimWhitespace:!1}),this.setModels(e))}).catch(e=>{console.error("Failed to load Monaco diff editor",e)})},updated(){this.host=this.el.querySelector(".monaco-diff-editor-instance"),this.originalInput=this.el.querySelector(".monaco-diff-original"),this.modifiedInput=this.el.querySelector(".monaco-diff-modified"),this.applyDataset(),this.editor&&$e().then(e=>{if(ce(e),e.editor.setTheme("bds-theme"),this.editor.updateOptions({renderSideBySide:this.viewStyle==="side-by-side",wordWrap:this.wordWrap,hideUnchangedRegions:{enabled:this.hideUnchanged}}),this.lastFilePath!==this.filePath){this.setModels(e);return}let t=this.readValues();this.originalModel&&this.originalModel.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.originalModel,this.language),this.modifiedModel&&this.modifiedModel.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.modifiedModel,this.language),this.originalModel&&this.originalModel.getValue()!==t.original&&this.originalModel.setValue(t.original),this.modifiedModel&&this.modifiedModel.getValue()!==t.modified&&this.modifiedModel.setValue(t.modified)})},destroyed(){this.originalModel?.dispose(),this.modifiedModel?.dispose(),this.editor?.dispose()}};function Or(e,t){e.indexOf(t)===-1&&e.push(t)}var qs=(e,t,i)=>Math.min(Math.max(i,e),t),z={duration:.3,delay:0,endDelay:0,repeat:0,easing:"ease"},Pt=e=>typeof e=="number",Ue=e=>Array.isArray(e)&&!Pt(e[0]),Mr=(e,t,i)=>{let s=t-e;return((i-e)%s+s)%s+e};function Hr(e,t){return Ue(e)?e[Mr(0,e.length,t)]:e}var Ks=(e,t,i)=>-i*e+i*t+e,Js=()=>{},ve=e=>e,wi=(e,t,i)=>t-e===0?1:(i-e)/(t-e);function zs(e,t){let i=e[e.length-1];for(let s=1;s<=t;s++){let n=wi(0,t,s);e.push(Ks(i,1,n))}}function Nr(e){let t=[0];return zs(t,e-1),t}function $r(e,t=Nr(e.length),i=ve){let s=e.length,n=s-t.length;return n>0&&zs(t,n),r=>{let o=0;for(;oArray.isArray(e)&&Pt(e[0]),mi=e=>typeof e=="object"&&!!e.createAnimation,je=e=>typeof e=="function",Fr=e=>typeof e=="string",tt={ms:e=>e*1e3,s:e=>e/1e3},Gs=(e,t,i)=>(((1-3*i+3*t)*e+(3*i-6*t))*e+3*t)*e,Ur=1e-7,jr=12;function Br(e,t,i,s,n){let r,o,a=0;do o=t+(i-t)/2,r=Gs(o,s,n)-e,r>0?i=o:t=o;while(Math.abs(r)>Ur&&++aBr(r,0,1,e,i);return r=>r===0||r===1?r:Gs(n(r),t,s)}var Vr=(e,t="end")=>i=>{i=t==="end"?Math.min(i,.999):Math.max(i,.001);let s=i*e,n=t==="end"?Math.floor(s):Math.ceil(s);return qs(0,1,n/e)},Ns={ease:et(.25,.1,.25,1),"ease-in":et(.42,0,1,1),"ease-in-out":et(.42,0,.58,1),"ease-out":et(0,0,.58,1)},Wr=/\((.*?)\)/;function $s(e){if(je(e))return e;if(Xs(e))return et(...e);if(Ns[e])return Ns[e];if(e.startsWith("steps")){let t=Wr.exec(e);if(t){let i=t[1].split(",");return Vr(parseFloat(i[0]),i[1].trim())}}return ve}var Ys=class{constructor(e,t=[0,1],{easing:i,duration:s=z.duration,delay:n=z.delay,endDelay:r=z.endDelay,repeat:o=z.repeat,offset:a,direction:l="normal",autoplay:h=!0}={}){if(this.startTime=null,this.rate=1,this.t=0,this.cancelTimestamp=null,this.easing=ve,this.duration=0,this.totalDuration=0,this.repeat=0,this.playState="idle",this.finished=new Promise((p,m)=>{this.resolve=p,this.reject=m}),i=i||z.easing,mi(i)){let p=i.createAnimation(t);i=p.easing,t=p.keyframes||t,s=p.duration||s}this.repeat=o,this.easing=Ue(i)?ve:$s(i),this.updateDuration(s);let d=$r(t,a,Ue(i)?i.map($s):ve);this.tick=p=>{var m;n=n;let g=0;this.pauseTime!==void 0?g=this.pauseTime:g=(p-this.startTime)*this.rate,this.t=g,g/=1e3,g=Math.max(g-n,0),this.playState==="finished"&&this.pauseTime===void 0&&(g=this.totalDuration);let u=g/this.duration,v=Math.floor(u),y=u%1;!y&&u>=1&&(y=1),y===1&&v--;let L=v%2;(l==="reverse"||l==="alternate"&&L||l==="alternate-reverse"&&!L)&&(y=1-y);let $=g>=this.totalDuration?1:Math.min(y,1),w=d(this.easing($));e(w),this.pauseTime===void 0&&(this.playState==="finished"||g>=this.totalDuration+r)?(this.playState="finished",(m=this.resolve)===null||m===void 0||m.call(this,w)):this.playState!=="idle"&&(this.frameRequestId=requestAnimationFrame(this.tick))},h&&this.play()}play(){let e=performance.now();this.playState="running",this.pauseTime!==void 0?this.startTime=e-this.pauseTime:this.startTime||(this.startTime=e),this.cancelTimestamp=this.startTime,this.pauseTime=void 0,this.frameRequestId=requestAnimationFrame(this.tick)}pause(){this.playState="paused",this.pauseTime=this.t}finish(){this.playState="finished",this.tick(0)}stop(){var e;this.playState="idle",this.frameRequestId!==void 0&&cancelAnimationFrame(this.frameRequestId),(e=this.reject)===null||e===void 0||e.call(this,!1)}cancel(){this.stop(),this.tick(this.cancelTimestamp)}reverse(){this.rate*=-1}commitStyles(){}updateDuration(e){this.duration=e,this.totalDuration=e*(this.repeat+1)}get currentTime(){return this.t}set currentTime(e){this.pauseTime!==void 0||this.rate===0?this.pauseTime=e:this.startTime=performance.now()-e/this.rate}get playbackRate(){return this.rate}set playbackRate(e){this.rate=e}},qr=function(){},gi=function(){};qr=function(e,t){!e&&typeof console<"u"&&console.warn(t)},gi=function(e,t){if(!e)throw new Error(t)};var Kr=class{setAnimation(e){this.animation=e,e?.finished.then(()=>this.clearAnimation()).catch(()=>{})}clearAnimation(){this.animation=this.generator=void 0}},di=new WeakMap;function Zs(e){return di.has(e)||di.set(e,{transforms:[],values:new Map}),di.get(e)}function Jr(e,t){return e.has(t)||e.set(t,new Kr),e.get(t)}var zr=["","X","Y","Z"],Xr=["translate","scale","rotate","skew"],Rt={x:"translateX",y:"translateY",z:"translateZ"},Fs={syntax:"",initialValue:"0deg",toDefaultUnit:e=>e+"deg"},Gr={translate:{syntax:"",initialValue:"0px",toDefaultUnit:e=>e+"px"},rotate:Fs,scale:{syntax:"",initialValue:1,toDefaultUnit:ve},skew:Fs},it=new Map,Ei=e=>`--motion-${e}`,Lt=["x","y","z"];Xr.forEach(e=>{zr.forEach(t=>{Lt.push(e+t),it.set(Ei(e+t),Gr[e])})});var Yr=(e,t)=>Lt.indexOf(e)-Lt.indexOf(t),Zr=new Set(Lt),Qs=e=>Zr.has(e),Qr=(e,t)=>{Rt[t]&&(t=Rt[t]);let{transforms:i}=Zs(e);Or(i,t),e.style.transform=eo(i)},eo=e=>e.sort(Yr).reduce(to,"").trim(),to=(e,t)=>`${e} ${t}(var(${Ei(t)}))`,vi=e=>e.startsWith("--"),Us=new Set;function io(e){if(!Us.has(e)){Us.add(e);try{let{syntax:t,initialValue:i}=it.has(e)?it.get(e):{};CSS.registerProperty({name:e,inherits:!1,syntax:t,initialValue:i})}catch{}}}var ui=(e,t)=>document.createElement("div").animate(e,t),js={cssRegisterProperty:()=>typeof CSS<"u"&&Object.hasOwnProperty.call(CSS,"registerProperty"),waapi:()=>Object.hasOwnProperty.call(Element.prototype,"animate"),partialKeyframes:()=>{try{ui({opacity:[1]})}catch{return!1}return!0},finished:()=>!!ui({opacity:[0,1]},{duration:.001}).finished,linearEasing:()=>{try{ui({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0}},fi={},Fe={};for(let e in js)Fe[e]=()=>(fi[e]===void 0&&(fi[e]=js[e]()),fi[e]);var so=.015,no=(e,t)=>{let i="",s=Math.round(t/so);for(let n=0;nje(e)?Fe.linearEasing()?`linear(${no(e,t)})`:z.easing:Xs(e)?ro(e):e,ro=([e,t,i,s])=>`cubic-bezier(${e}, ${t}, ${i}, ${s})`;function oo(e,t){for(let i=0;iArray.isArray(e)?e:[e];function bi(e){return Rt[e]&&(e=Rt[e]),Qs(e)?Ei(e):e}var xt={get:(e,t)=>{t=bi(t);let i=vi(t)?e.style.getPropertyValue(t):getComputedStyle(e)[t];if(!i&&i!==0){let s=it.get(t);s&&(i=s.initialValue)}return i},set:(e,t,i)=>{t=bi(t),vi(t)?e.style.setProperty(t,i):e.style[t]=i}};function en(e,t=!0){if(!(!e||e.playState==="finished"))try{e.stop?e.stop():(t&&e.commitStyles(),e.cancel())}catch{}}function lo(e,t){var i;let s=t?.toDefaultUnit||ve,n=e[e.length-1];if(Fr(n)){let r=((i=n.match(/(-?[\d.]+)([a-z%]*)/))===null||i===void 0?void 0:i[2])||"";r&&(s=o=>o+r)}return s}function ho(){return window.__MOTION_DEV_TOOLS_RECORD}function co(e,t,i,s={},n){let r=ho(),o=s.record!==!1&&r,a,{duration:l=z.duration,delay:h=z.delay,endDelay:d=z.endDelay,repeat:p=z.repeat,easing:m=z.easing,persist:g=!1,direction:u,offset:v,allowWebkitAcceleration:y=!1,autoplay:L=!0}=s,$=Zs(e),w=Qs(t),k=Fe.waapi();w&&Qr(e,t);let T=bi(t),H=Jr($.values,T),f=it.get(T);return en(H.animation,!(mi(m)&&H.generator)&&s.record!==!1),()=>{let b=()=>{var E,q;return(q=(E=xt.get(e,T))!==null&&E!==void 0?E:f?.initialValue)!==null&&q!==void 0?q:0},C=oo(ao(i),b),j=lo(C,f);if(mi(m)){let E=m.createAnimation(C,t!=="opacity",b,T,H);m=E.easing,C=E.keyframes||C,l=E.duration||l}if(vi(T)&&(Fe.cssRegisterProperty()?io(T):k=!1),w&&!Fe.linearEasing()&&(je(m)||Ue(m)&&m.some(je))&&(k=!1),k){f&&(C=C.map(_=>Pt(_)?f.toDefaultUnit(_):_)),C.length===1&&(!Fe.partialKeyframes()||o)&&C.unshift(b());let E={delay:tt.ms(h),duration:tt.ms(l),endDelay:tt.ms(d),easing:Ue(m)?void 0:Bs(m,l),direction:u,iterations:p+1,fill:"both"};a=e.animate({[T]:C,offset:v,easing:Ue(m)?m.map(_=>Bs(_,l)):void 0},E),a.finished||(a.finished=new Promise((_,Ce)=>{a.onfinish=_,a.oncancel=Ce}));let q=C[C.length-1];a.finished.then(()=>{g||(xt.set(e,T,q),a.cancel())}).catch(Js),y||(a.playbackRate=1.000001)}else if(n&&w)C=C.map(E=>typeof E=="string"?parseFloat(E):E),C.length===1&&C.unshift(parseFloat(b())),a=new n(E=>{xt.set(e,T,j?j(E):E)},C,Object.assign(Object.assign({},s),{duration:l,easing:m}));else{let E=C[C.length-1];xt.set(e,T,f&&Pt(E)?f.toDefaultUnit(E):E)}return o&&r(e,t,C,{duration:l,delay:h,easing:m,repeat:p,offset:v},"motion-one"),H.setAnimation(a),a&&!L&&a.pause(),a}}var uo=(e,t)=>e[t]?Object.assign(Object.assign({},e),e[t]):Object.assign({},e);function fo(e,t){var i;return typeof e=="string"?t?((i=t[e])!==null&&i!==void 0||(t[e]=document.querySelectorAll(e)),e=t[e]):e=document.querySelectorAll(e):e instanceof Element&&(e=[e]),Array.from(e||[])}var po=e=>e(),tn=(e,t,i=z.duration)=>new Proxy({animations:e.map(po).filter(Boolean),duration:i,options:t},go),mo=e=>e.animations[0],go={get:(e,t)=>{let i=mo(e);switch(t){case"duration":return e.duration;case"currentTime":return tt.s(i?.[t]||0);case"playbackRate":case"playState":return i?.[t];case"finished":return e.finished||(e.finished=Promise.all(e.animations.map(vo)).catch(Js)),e.finished;case"stop":return()=>{e.animations.forEach(s=>en(s))};case"forEachNative":return s=>{e.animations.forEach(n=>s(n,e))};default:return typeof i?.[t]>"u"?void 0:()=>e.animations.forEach(s=>s[t]())}},set:(e,t,i)=>{switch(t){case"currentTime":i=tt.ms(i);case"playbackRate":for(let s=0;se.finished;function bo(e,t,i){return je(e)?e(t,i):e}function yo(e){return function(i,s,n={}){i=fo(i);let r=i.length;gi(!!r,"No valid element provided."),gi(!!s,"No keyframes defined.");let o=[];for(let a=0;a{let i=new Ys(e,[0,1],t);return i.finished.catch(()=>{}),i}],t,t.duration)}function Si(e,t,i){return(je(e)?Eo:wo)(e,t,i)}function Te(e){return e===null?!0:e.offsetParent===null}function So(e){return e.dataset.component==="flash"}function Ao(){let e=0;return Te(document.getElementById("server-error"))||(e+=1),Te(document.getElementById("client-error"))||(e+=1),Te(document.getElementById("flash-info"))||(e+=1),Te(document.getElementById("flash-error"))||(e+=1),e}var sn=5,ko=550,To=!0,yi=15,Vs=[];function pi(e,t,i){let s=[],n=Array.from(document.querySelectorAll('#toast-group [phx-hook="LiveToast"]')).map(r=>Te(r)?null:r).filter(Boolean).reverse();i&&(n=n.filter(r=>r!==i));for(let r=0;ro?0:1-(a.order-o+1);a.order>=o?a.classList.remove("pointer-events-auto"):a.classList.add("pointer-events-auto");let p={y:[`${l}${h}px`],opacity:[d]};if(a.order===0&&Vs.includes(a)===!1){let g=a.offsetHeight+yi,u=l==="-"?"":"-";p.y.unshift(`${u}${g}px`),p.opacity.unshift(0)}a.targetDestination=`${l}${h}px`;let m=ko/1e3;Si(a,p,{duration:m,easing:[.22,1,.36,1]}),a.order+=1,a.style.zIndex=(50-a.order).toString(),window.setTimeout(()=>{a.order>o&&this.pushEventTo("#toast-group","clear",{id:a.id})},e+sn),Vs=s}}async function Ws(){let e=(this.el.order-2)*100+(this.el.order-2)*yi,t="";(this.el.dataset.corner==="bottom_left"||this.el.dataset.corner==="bottom_right")&&(t="-"),await Si(this.el,{y:`${t}${e}%`,opacity:0},{opacity:{duration:.2,easing:"ease-out"},duration:.3,easing:"ease-out"}).finished}function nn(e=6e3,t=3){return{destroyed(){pi.bind(this)(e,t)},updated(){let i={y:[this.el.targetDestination]};Si(this.el,i,{duration:0})},mounted(){if(["server-error","client-error"].includes(this.el.id)&&Te(document.getElementById(this.el.id))||(window.addEventListener("phx:clear-flash",s=>{this.pushEvent("lv:clear-flash",{key:s.detail.key})}),window.addEventListener("flash-leave",async s=>{s.target===this.el&&(pi.bind(this,e,t,this.el)(),await Ws.bind(this)())}),pi.bind(this)(e,t),So(this.el)))return;let i=e;this.el.dataset.duration!==void 0&&(i=Number.parseInt(this.el.dataset.duration)),window.setTimeout(async()=>{await Ws.bind(this)(),this.pushEventTo("#toast-group","clear",{id:this.el.id})},i+sn)}}}var rn={LiveToast:nn(),AppShell:_s,SidebarInteractions:xs,SettingsSectionScroll:Rs,TagsSectionScroll:Ls,ChatSurface:Is,ColourPicker:Ds,MenuEditorTree:Os,MonacoEditor:Ms,MonacoDiffEditor:Hs};document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelector("meta[name='csrf-token']").getAttribute("content"),t=new us("/live",_i,{params:{_csrf_token:e},hooks:rn,metadata:{keydown:i=>({key:i.key,meta:i.metaKey,ctrl:i.ctrlKey,alt:i.altKey,shift:i.shiftKey,tag:i.target?.tagName||null,contentEditable:i.target?.isContentEditable||!1})}});t.connect(),window.liveSocket=t});})(); +`:"",p=`${h}${t}${d}`;this.editor.executeEdits("bds-insert-content",[{range:s,text:p,forceMoveMarkers:!0}]),this.editor.focus()},$e().then(async e=>{!this.host||!this.textarea||(await this.waitForMonacoVisibleSize(),ce(e),this.editor=e.editor.create(this.host,{value:this.textarea.value||"",language:this.language,theme:"bds-theme",automaticLayout:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:this.wordWrap,lineNumbers:"on",lineNumbersMinChars:3,fontSize:14,fontFamily:"'Cascadia Code', 'Consolas', 'Courier New', monospace",padding:{top:12,bottom:12},roundedSelection:!1,renderLineHighlight:"line",formatOnPaste:!0,cursorStyle:"line",cursorBlinking:"smooth",quickSuggestions:this.language!=="markdown-with-macros",tabSize:2,insertSpaces:!0}),As(this.editorId||this.el.id,this.editor),e.editor.setTheme("bds-theme"),this.syncEditorFromTextarea(),this.layoutEditorSoon(),this.changeSubscription=this.editor.onDidChangeModelContent(()=>{this.isApplyingRemoteUpdate||this.queueSync()}),this.insertEvent&&this.handleEvent(this.insertEvent,this.handleInsert),this.dropEvent&&(this.el.addEventListener("dragover",this.handleDragOver),this.el.addEventListener("drop",this.handleDrop)),Rr()&&this.host.addEventListener("keydown",this.handleWebKitTextAreaArrowKey,!0))}).catch(e=>{console.error("Failed to load Monaco editor",e)})},updated(){this.textarea=document.getElementById(this.el.dataset.monacoInputId)||this.el.querySelector("textarea"),this.host=this.el.querySelector(".monaco-editor-instance"),this.language=this.el.dataset.monacoLanguage||this.language||"plaintext",this.wordWrap=this.el.dataset.monacoWordWrap||this.wordWrap||"off",!(!this.editor||!this.textarea)&&($e().then(e=>{ce(e),e.editor.setTheme("bds-theme"),this.editor.getModel()?.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.editor.getModel(),this.language),this.editor.updateOptions({wordWrap:this.wordWrap})}),this.syncEditorFromTextarea(),this.layoutEditorSoon())},destroyed(){window.clearTimeout(this.syncTimer),this.visibleSizeObserver?.disconnect(),this.changeSubscription?.dispose(),this.dropEvent&&(this.el.removeEventListener("dragover",this.handleDragOver),this.el.removeEventListener("drop",this.handleDrop)),this.host?.removeEventListener("keydown",this.handleWebKitTextAreaArrowKey,!0),ks(this.editorId||this.el.id),this.editor?.dispose()}};var Hs={mounted(){this.host=this.el.querySelector(".monaco-diff-editor-instance"),this.originalInput=this.el.querySelector(".monaco-diff-original"),this.modifiedInput=this.el.querySelector(".monaco-diff-modified"),this.filePath=this.el.dataset.monacoDiffFilePath||"working-tree",this.language=this.el.dataset.monacoDiffLanguage||"plaintext",this.viewStyle=this.el.dataset.monacoDiffViewStyle||"inline",this.wordWrap=this.el.dataset.monacoDiffWordWrap||"off",this.hideUnchanged=this.el.dataset.monacoDiffHideUnchanged==="true",this.readValues=()=>({original:this.originalInput?.value||"",modified:this.modifiedInput?.value||""}),this.applyDataset=()=>{this.filePath=this.el.dataset.monacoDiffFilePath||"working-tree",this.language=this.el.dataset.monacoDiffLanguage||"plaintext",this.viewStyle=this.el.dataset.monacoDiffViewStyle||"inline",this.wordWrap=this.el.dataset.monacoDiffWordWrap||"off",this.hideUnchanged=this.el.dataset.monacoDiffHideUnchanged==="true"},this.setModels=e=>{let t=this.readValues();this.originalModel?.dispose(),this.modifiedModel?.dispose(),this.originalModel=e.editor.createModel(t.original,this.language,e.Uri.parse(ci(this.filePath,"original"))),this.modifiedModel=e.editor.createModel(t.modified,this.language,e.Uri.parse(ci(this.filePath,"modified"))),this.editor.setModel({original:this.originalModel,modified:this.modifiedModel}),this.lastFilePath=this.filePath},$e().then(e=>{this.host&&(ce(e),this.editor=e.editor.createDiffEditor(this.host,{theme:"bds-theme",automaticLayout:!0,readOnly:!0,renderSideBySide:this.viewStyle==="side-by-side",minimap:{enabled:!1},scrollBeyondLastLine:!1,lineNumbers:"on",diffCodeLens:!1,originalEditable:!1,wordWrap:this.wordWrap,hideUnchangedRegions:{enabled:this.hideUnchanged},ignoreTrimWhitespace:!1}),this.setModels(e))}).catch(e=>{console.error("Failed to load Monaco diff editor",e)})},updated(){this.host=this.el.querySelector(".monaco-diff-editor-instance"),this.originalInput=this.el.querySelector(".monaco-diff-original"),this.modifiedInput=this.el.querySelector(".monaco-diff-modified"),this.applyDataset(),this.editor&&$e().then(e=>{if(ce(e),e.editor.setTheme("bds-theme"),this.editor.updateOptions({renderSideBySide:this.viewStyle==="side-by-side",wordWrap:this.wordWrap,hideUnchangedRegions:{enabled:this.hideUnchanged}}),this.lastFilePath!==this.filePath){this.setModels(e);return}let t=this.readValues();this.originalModel&&this.originalModel.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.originalModel,this.language),this.modifiedModel&&this.modifiedModel.getLanguageId()!==this.language&&e.editor.setModelLanguage(this.modifiedModel,this.language),this.originalModel&&this.originalModel.getValue()!==t.original&&this.originalModel.setValue(t.original),this.modifiedModel&&this.modifiedModel.getValue()!==t.modified&&this.modifiedModel.setValue(t.modified)})},destroyed(){this.originalModel?.dispose(),this.modifiedModel?.dispose(),this.editor?.dispose()}};function Mr(e,t){e.indexOf(t)===-1&&e.push(t)}var qs=(e,t,i)=>Math.min(Math.max(i,e),t),z={duration:.3,delay:0,endDelay:0,repeat:0,easing:"ease"},Pt=e=>typeof e=="number",Ue=e=>Array.isArray(e)&&!Pt(e[0]),Hr=(e,t,i)=>{let s=t-e;return((i-e)%s+s)%s+e};function Nr(e,t){return Ue(e)?e[Hr(0,e.length,t)]:e}var Ks=(e,t,i)=>-i*e+i*t+e,Js=()=>{},ve=e=>e,wi=(e,t,i)=>t-e===0?1:(i-e)/(t-e);function zs(e,t){let i=e[e.length-1];for(let s=1;s<=t;s++){let n=wi(0,t,s);e.push(Ks(i,1,n))}}function $r(e){let t=[0];return zs(t,e-1),t}function Fr(e,t=$r(e.length),i=ve){let s=e.length,n=s-t.length;return n>0&&zs(t,n),r=>{let o=0;for(;oArray.isArray(e)&&Pt(e[0]),mi=e=>typeof e=="object"&&!!e.createAnimation,je=e=>typeof e=="function",Ur=e=>typeof e=="string",tt={ms:e=>e*1e3,s:e=>e/1e3},Gs=(e,t,i)=>(((1-3*i+3*t)*e+(3*i-6*t))*e+3*t)*e,jr=1e-7,Br=12;function Vr(e,t,i,s,n){let r,o,a=0;do o=t+(i-t)/2,r=Gs(o,s,n)-e,r>0?i=o:t=o;while(Math.abs(r)>jr&&++aVr(r,0,1,e,i);return r=>r===0||r===1?r:Gs(n(r),t,s)}var Wr=(e,t="end")=>i=>{i=t==="end"?Math.min(i,.999):Math.max(i,.001);let s=i*e,n=t==="end"?Math.floor(s):Math.ceil(s);return qs(0,1,n/e)},Ns={ease:et(.25,.1,.25,1),"ease-in":et(.42,0,1,1),"ease-in-out":et(.42,0,.58,1),"ease-out":et(0,0,.58,1)},qr=/\((.*?)\)/;function $s(e){if(je(e))return e;if(Xs(e))return et(...e);if(Ns[e])return Ns[e];if(e.startsWith("steps")){let t=qr.exec(e);if(t){let i=t[1].split(",");return Wr(parseFloat(i[0]),i[1].trim())}}return ve}var Ys=class{constructor(e,t=[0,1],{easing:i,duration:s=z.duration,delay:n=z.delay,endDelay:r=z.endDelay,repeat:o=z.repeat,offset:a,direction:l="normal",autoplay:h=!0}={}){if(this.startTime=null,this.rate=1,this.t=0,this.cancelTimestamp=null,this.easing=ve,this.duration=0,this.totalDuration=0,this.repeat=0,this.playState="idle",this.finished=new Promise((p,m)=>{this.resolve=p,this.reject=m}),i=i||z.easing,mi(i)){let p=i.createAnimation(t);i=p.easing,t=p.keyframes||t,s=p.duration||s}this.repeat=o,this.easing=Ue(i)?ve:$s(i),this.updateDuration(s);let d=Fr(t,a,Ue(i)?i.map($s):ve);this.tick=p=>{var m;n=n;let g=0;this.pauseTime!==void 0?g=this.pauseTime:g=(p-this.startTime)*this.rate,this.t=g,g/=1e3,g=Math.max(g-n,0),this.playState==="finished"&&this.pauseTime===void 0&&(g=this.totalDuration);let u=g/this.duration,v=Math.floor(u),y=u%1;!y&&u>=1&&(y=1),y===1&&v--;let L=v%2;(l==="reverse"||l==="alternate"&&L||l==="alternate-reverse"&&!L)&&(y=1-y);let $=g>=this.totalDuration?1:Math.min(y,1),w=d(this.easing($));e(w),this.pauseTime===void 0&&(this.playState==="finished"||g>=this.totalDuration+r)?(this.playState="finished",(m=this.resolve)===null||m===void 0||m.call(this,w)):this.playState!=="idle"&&(this.frameRequestId=requestAnimationFrame(this.tick))},h&&this.play()}play(){let e=performance.now();this.playState="running",this.pauseTime!==void 0?this.startTime=e-this.pauseTime:this.startTime||(this.startTime=e),this.cancelTimestamp=this.startTime,this.pauseTime=void 0,this.frameRequestId=requestAnimationFrame(this.tick)}pause(){this.playState="paused",this.pauseTime=this.t}finish(){this.playState="finished",this.tick(0)}stop(){var e;this.playState="idle",this.frameRequestId!==void 0&&cancelAnimationFrame(this.frameRequestId),(e=this.reject)===null||e===void 0||e.call(this,!1)}cancel(){this.stop(),this.tick(this.cancelTimestamp)}reverse(){this.rate*=-1}commitStyles(){}updateDuration(e){this.duration=e,this.totalDuration=e*(this.repeat+1)}get currentTime(){return this.t}set currentTime(e){this.pauseTime!==void 0||this.rate===0?this.pauseTime=e:this.startTime=performance.now()-e/this.rate}get playbackRate(){return this.rate}set playbackRate(e){this.rate=e}},Kr=function(){},gi=function(){};Kr=function(e,t){!e&&typeof console<"u"&&console.warn(t)},gi=function(e,t){if(!e)throw new Error(t)};var Jr=class{setAnimation(e){this.animation=e,e?.finished.then(()=>this.clearAnimation()).catch(()=>{})}clearAnimation(){this.animation=this.generator=void 0}},di=new WeakMap;function Zs(e){return di.has(e)||di.set(e,{transforms:[],values:new Map}),di.get(e)}function zr(e,t){return e.has(t)||e.set(t,new Jr),e.get(t)}var Xr=["","X","Y","Z"],Gr=["translate","scale","rotate","skew"],Rt={x:"translateX",y:"translateY",z:"translateZ"},Fs={syntax:"",initialValue:"0deg",toDefaultUnit:e=>e+"deg"},Yr={translate:{syntax:"",initialValue:"0px",toDefaultUnit:e=>e+"px"},rotate:Fs,scale:{syntax:"",initialValue:1,toDefaultUnit:ve},skew:Fs},it=new Map,Ei=e=>`--motion-${e}`,Lt=["x","y","z"];Gr.forEach(e=>{Xr.forEach(t=>{Lt.push(e+t),it.set(Ei(e+t),Yr[e])})});var Zr=(e,t)=>Lt.indexOf(e)-Lt.indexOf(t),Qr=new Set(Lt),Qs=e=>Qr.has(e),eo=(e,t)=>{Rt[t]&&(t=Rt[t]);let{transforms:i}=Zs(e);Mr(i,t),e.style.transform=to(i)},to=e=>e.sort(Zr).reduce(io,"").trim(),io=(e,t)=>`${e} ${t}(var(${Ei(t)}))`,vi=e=>e.startsWith("--"),Us=new Set;function so(e){if(!Us.has(e)){Us.add(e);try{let{syntax:t,initialValue:i}=it.has(e)?it.get(e):{};CSS.registerProperty({name:e,inherits:!1,syntax:t,initialValue:i})}catch{}}}var ui=(e,t)=>document.createElement("div").animate(e,t),js={cssRegisterProperty:()=>typeof CSS<"u"&&Object.hasOwnProperty.call(CSS,"registerProperty"),waapi:()=>Object.hasOwnProperty.call(Element.prototype,"animate"),partialKeyframes:()=>{try{ui({opacity:[1]})}catch{return!1}return!0},finished:()=>!!ui({opacity:[0,1]},{duration:.001}).finished,linearEasing:()=>{try{ui({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0}},fi={},Fe={};for(let e in js)Fe[e]=()=>(fi[e]===void 0&&(fi[e]=js[e]()),fi[e]);var no=.015,ro=(e,t)=>{let i="",s=Math.round(t/no);for(let n=0;nje(e)?Fe.linearEasing()?`linear(${ro(e,t)})`:z.easing:Xs(e)?oo(e):e,oo=([e,t,i,s])=>`cubic-bezier(${e}, ${t}, ${i}, ${s})`;function ao(e,t){for(let i=0;iArray.isArray(e)?e:[e];function bi(e){return Rt[e]&&(e=Rt[e]),Qs(e)?Ei(e):e}var xt={get:(e,t)=>{t=bi(t);let i=vi(t)?e.style.getPropertyValue(t):getComputedStyle(e)[t];if(!i&&i!==0){let s=it.get(t);s&&(i=s.initialValue)}return i},set:(e,t,i)=>{t=bi(t),vi(t)?e.style.setProperty(t,i):e.style[t]=i}};function en(e,t=!0){if(!(!e||e.playState==="finished"))try{e.stop?e.stop():(t&&e.commitStyles(),e.cancel())}catch{}}function ho(e,t){var i;let s=t?.toDefaultUnit||ve,n=e[e.length-1];if(Ur(n)){let r=((i=n.match(/(-?[\d.]+)([a-z%]*)/))===null||i===void 0?void 0:i[2])||"";r&&(s=o=>o+r)}return s}function co(){return window.__MOTION_DEV_TOOLS_RECORD}function uo(e,t,i,s={},n){let r=co(),o=s.record!==!1&&r,a,{duration:l=z.duration,delay:h=z.delay,endDelay:d=z.endDelay,repeat:p=z.repeat,easing:m=z.easing,persist:g=!1,direction:u,offset:v,allowWebkitAcceleration:y=!1,autoplay:L=!0}=s,$=Zs(e),w=Qs(t),k=Fe.waapi();w&&eo(e,t);let T=bi(t),H=zr($.values,T),f=it.get(T);return en(H.animation,!(mi(m)&&H.generator)&&s.record!==!1),()=>{let b=()=>{var E,q;return(q=(E=xt.get(e,T))!==null&&E!==void 0?E:f?.initialValue)!==null&&q!==void 0?q:0},C=ao(lo(i),b),j=ho(C,f);if(mi(m)){let E=m.createAnimation(C,t!=="opacity",b,T,H);m=E.easing,C=E.keyframes||C,l=E.duration||l}if(vi(T)&&(Fe.cssRegisterProperty()?so(T):k=!1),w&&!Fe.linearEasing()&&(je(m)||Ue(m)&&m.some(je))&&(k=!1),k){f&&(C=C.map(_=>Pt(_)?f.toDefaultUnit(_):_)),C.length===1&&(!Fe.partialKeyframes()||o)&&C.unshift(b());let E={delay:tt.ms(h),duration:tt.ms(l),endDelay:tt.ms(d),easing:Ue(m)?void 0:Bs(m,l),direction:u,iterations:p+1,fill:"both"};a=e.animate({[T]:C,offset:v,easing:Ue(m)?m.map(_=>Bs(_,l)):void 0},E),a.finished||(a.finished=new Promise((_,Ce)=>{a.onfinish=_,a.oncancel=Ce}));let q=C[C.length-1];a.finished.then(()=>{g||(xt.set(e,T,q),a.cancel())}).catch(Js),y||(a.playbackRate=1.000001)}else if(n&&w)C=C.map(E=>typeof E=="string"?parseFloat(E):E),C.length===1&&C.unshift(parseFloat(b())),a=new n(E=>{xt.set(e,T,j?j(E):E)},C,Object.assign(Object.assign({},s),{duration:l,easing:m}));else{let E=C[C.length-1];xt.set(e,T,f&&Pt(E)?f.toDefaultUnit(E):E)}return o&&r(e,t,C,{duration:l,delay:h,easing:m,repeat:p,offset:v},"motion-one"),H.setAnimation(a),a&&!L&&a.pause(),a}}var fo=(e,t)=>e[t]?Object.assign(Object.assign({},e),e[t]):Object.assign({},e);function po(e,t){var i;return typeof e=="string"?t?((i=t[e])!==null&&i!==void 0||(t[e]=document.querySelectorAll(e)),e=t[e]):e=document.querySelectorAll(e):e instanceof Element&&(e=[e]),Array.from(e||[])}var mo=e=>e(),tn=(e,t,i=z.duration)=>new Proxy({animations:e.map(mo).filter(Boolean),duration:i,options:t},vo),go=e=>e.animations[0],vo={get:(e,t)=>{let i=go(e);switch(t){case"duration":return e.duration;case"currentTime":return tt.s(i?.[t]||0);case"playbackRate":case"playState":return i?.[t];case"finished":return e.finished||(e.finished=Promise.all(e.animations.map(bo)).catch(Js)),e.finished;case"stop":return()=>{e.animations.forEach(s=>en(s))};case"forEachNative":return s=>{e.animations.forEach(n=>s(n,e))};default:return typeof i?.[t]>"u"?void 0:()=>e.animations.forEach(s=>s[t]())}},set:(e,t,i)=>{switch(t){case"currentTime":i=tt.ms(i);case"playbackRate":for(let s=0;se.finished;function yo(e,t,i){return je(e)?e(t,i):e}function wo(e){return function(i,s,n={}){i=po(i);let r=i.length;gi(!!r,"No valid element provided."),gi(!!s,"No keyframes defined.");let o=[];for(let a=0;a{let i=new Ys(e,[0,1],t);return i.finished.catch(()=>{}),i}],t,t.duration)}function Si(e,t,i){return(je(e)?So:Eo)(e,t,i)}function Te(e){return e===null?!0:e.offsetParent===null}function Ao(e){return e.dataset.component==="flash"}function ko(){let e=0;return Te(document.getElementById("server-error"))||(e+=1),Te(document.getElementById("client-error"))||(e+=1),Te(document.getElementById("flash-info"))||(e+=1),Te(document.getElementById("flash-error"))||(e+=1),e}var sn=5,To=550,Co=!0,yi=15,Vs=[];function pi(e,t,i){let s=[],n=Array.from(document.querySelectorAll('#toast-group [phx-hook="LiveToast"]')).map(r=>Te(r)?null:r).filter(Boolean).reverse();i&&(n=n.filter(r=>r!==i));for(let r=0;ro?0:1-(a.order-o+1);a.order>=o?a.classList.remove("pointer-events-auto"):a.classList.add("pointer-events-auto");let p={y:[`${l}${h}px`],opacity:[d]};if(a.order===0&&Vs.includes(a)===!1){let g=a.offsetHeight+yi,u=l==="-"?"":"-";p.y.unshift(`${u}${g}px`),p.opacity.unshift(0)}a.targetDestination=`${l}${h}px`;let m=To/1e3;Si(a,p,{duration:m,easing:[.22,1,.36,1]}),a.order+=1,a.style.zIndex=(50-a.order).toString(),window.setTimeout(()=>{a.order>o&&this.pushEventTo("#toast-group","clear",{id:a.id})},e+sn),Vs=s}}async function Ws(){let e=(this.el.order-2)*100+(this.el.order-2)*yi,t="";(this.el.dataset.corner==="bottom_left"||this.el.dataset.corner==="bottom_right")&&(t="-"),await Si(this.el,{y:`${t}${e}%`,opacity:0},{opacity:{duration:.2,easing:"ease-out"},duration:.3,easing:"ease-out"}).finished}function nn(e=6e3,t=3){return{destroyed(){pi.bind(this)(e,t)},updated(){let i={y:[this.el.targetDestination]};Si(this.el,i,{duration:0})},mounted(){if(["server-error","client-error"].includes(this.el.id)&&Te(document.getElementById(this.el.id))||(window.addEventListener("phx:clear-flash",s=>{this.pushEvent("lv:clear-flash",{key:s.detail.key})}),window.addEventListener("flash-leave",async s=>{s.target===this.el&&(pi.bind(this,e,t,this.el)(),await Ws.bind(this)())}),pi.bind(this)(e,t),Ao(this.el)))return;let i=e;this.el.dataset.duration!==void 0&&(i=Number.parseInt(this.el.dataset.duration)),window.setTimeout(async()=>{await Ws.bind(this)(),this.pushEventTo("#toast-group","clear",{id:this.el.id})},i+sn)}}}var rn={LiveToast:nn(),AppShell:_s,SidebarInteractions:xs,SettingsSectionScroll:Rs,TagsSectionScroll:Ls,ChatSurface:Is,ColourPicker:Ds,MenuEditorTree:Os,MonacoEditor:Ms,MonacoDiffEditor:Hs};document.addEventListener("DOMContentLoaded",()=>{let e=document.querySelector("meta[name='csrf-token']").getAttribute("content"),t=new us("/live",_i,{params:{_csrf_token:e},hooks:rn,metadata:{keydown:i=>({key:i.key,meta:i.metaKey,ctrl:i.ctrlKey,alt:i.altKey,shift:i.shiftKey,tag:i.target?.tagName||null,contentEditable:i.target?.isContentEditable||!1})}});t.connect(),window.liveSocket=t});})(); diff --git a/test/bds/desktop/shell_live_test.exs b/test/bds/desktop/shell_live_test.exs index 3ea850e..3dab860 100644 --- a/test/bds/desktop/shell_live_test.exs +++ b/test/bds/desktop/shell_live_test.exs @@ -3427,6 +3427,115 @@ defmodule BDS.Desktop.ShellLiveTest do assert output_html =~ "Automatic AI actions stay gated by airplane mode" end + test "selecting an internal insert link result pushes the link and closes the overlay", %{ + project: project + } do + {:ok, target} = + Posts.create_post(%{project_id: project.id, title: "Link Target", content: "Target body"}) + + {:ok, post} = + Posts.create_post(%{project_id: project.id, title: "Editing Post", content: "Body"}) + + {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive) + + render_click(view, "pin_sidebar_item", %{ + "route" => "post", + "id" => post.id, + "title" => post.title, + "subtitle" => "draft" + }) + + html = + view + |> element("[phx-click='open_overlay'][phx-value-kind='insert_link']") + |> render_click() + + assert html =~ "insert-modal" + + render_click(view, "overlay_select_result", %{"id" => target.id}) + assert_push_event(view, "post-editor-insert-content", %{id: _id, content: content}) + assert content =~ "Link Target" + + refute render(view) =~ "insert-modal" + end + + test "inserting an external link pushes the link and closes the overlay", %{project: project} do + {:ok, post} = + Posts.create_post(%{project_id: project.id, title: "Editing Post", content: "Body"}) + + {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive) + + render_click(view, "pin_sidebar_item", %{ + "route" => "post", + "id" => post.id, + "title" => post.title, + "subtitle" => "draft" + }) + + html = + view + |> element("[phx-click='open_overlay'][phx-value-kind='insert_link']") + |> render_click() + + assert html =~ "insert-modal" + + render_click(view, "overlay_set_tab", %{"tab" => "external"}) + + render_change(view, "overlay_update_form", %{ + "overlay" => %{"url" => "https://example.com", "text" => "Example"} + }) + + render_click(view, "overlay_insert_external", %{}) + assert_push_event(view, "post-editor-insert-content", %{content: "[Example](https://example.com)"}) + + refute render(view) =~ "insert-modal" + end + + test "selecting an insert media result pushes the syntax and closes the overlay", %{ + project: project + } do + temp_dir = + Path.join(System.tmp_dir!(), "bds-shell-live-#{System.unique_integer([:positive])}") + + File.mkdir_p!(temp_dir) + media_source_path = Path.join(temp_dir, "insert-media.jpg") + File.write!(media_source_path, "fake image body") + + {:ok, media} = + Media.import_media(%{ + project_id: project.id, + source_path: media_source_path, + title: "Insert Media" + }) + + {:ok, post} = + Posts.create_post(%{project_id: project.id, title: "Editing Post", content: "Body"}) + + {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive) + + render_click(view, "pin_sidebar_item", %{ + "route" => "post", + "id" => post.id, + "title" => post.title, + "subtitle" => "draft" + }) + + html = + view + |> element("[phx-click='open_overlay'][phx-value-kind='insert_media']") + |> render_click() + + assert html =~ "insert-modal" + + render_click(view, "overlay_set_search", %{"overlay" => %{"query" => "Insert"}}) + render_click(view, "overlay_select_result", %{"id" => media.id}) + + assert_push_event(view, "post-editor-insert-content", %{content: content}) + assert content =~ "bds-media://#{media.id}" + + refute render(view) =~ "insert-modal" + end + test "ai suggestions overlay fetches async results for posts when online", %{project: project} do Application.put_env(:bds, :test_pid, self()) diff --git a/test/bds/ui/shell_test.exs b/test/bds/ui/shell_test.exs index 9698e75..f2f20b6 100644 --- a/test/bds/ui/shell_test.exs +++ b/test/bds/ui/shell_test.exs @@ -400,6 +400,50 @@ defmodule BDS.UI.ShellTest do assert status == 0, output end + test "monaco hook preserves cursor and selection when applying a remote value" do + script = """ + import assert from "node:assert/strict"; + class FakeTextArea {} + globalThis.HTMLTextAreaElement = FakeTextArea; + + const { applyRemoteEditorValue } = await import("./assets/js/hooks/monaco_editor.js"); + + const selections = [{ startLineNumber: 3, startColumn: 5, endLineNumber: 3, endColumn: 9 }]; + const calls = []; + const editor = { + getSelections: () => selections, + setValue: (value) => calls.push(["setValue", value]), + setSelections: (restored) => calls.push(["setSelections", restored]) + }; + + applyRemoteEditorValue(editor, "line one\\nline two\\nline three"); + + assert.deepEqual(calls, [ + ["setValue", "line one\\nline two\\nline three"], + ["setSelections", selections] + ]); + + // Editors without selections still get the value applied. + const bareCalls = []; + const bareEditor = { + getSelections: () => null, + setValue: (value) => bareCalls.push(["setValue", value]), + setSelections: () => bareCalls.push(["setSelections"]) + }; + + applyRemoteEditorValue(bareEditor, "fresh"); + assert.deepEqual(bareCalls, [["setValue", "fresh"]]); + """ + + {output, status} = + System.cmd("node", ["--input-type=module", "--eval", script], + cd: "/Users/gb/Projects/bDS2", + stderr_to_stdout: true + ) + + assert status == 0, output + end + test "monaco ESM build config emits served worker bundles" do mix_exs = File.read!("/Users/gb/Projects/bDS2/mix.exs") config = File.read!("/Users/gb/Projects/bDS2/config/config.exs")