@livetemplate/client 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/livetemplate-client.browser.js +4 -4
- package/dist/livetemplate-client.browser.js.map +3 -3
- package/dist/tests/upload-handler.test.js +44 -0
- package/dist/tests/upload-handler.test.js.map +1 -1
- package/dist/upload/types.d.ts +1 -0
- package/dist/upload/types.d.ts.map +1 -1
- package/dist/upload/upload-handler.d.ts +22 -1
- package/dist/upload/upload-handler.d.ts.map +1 -1
- package/dist/upload/upload-handler.js +62 -3
- package/dist/upload/upload-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var LiveTemplateClient=(()=>{var Ne=Object.defineProperty;var wn=Object.getOwnPropertyDescriptor;var An=Object.getOwnPropertyNames;var Sn=Object.prototype.hasOwnProperty;var Tn=(i,e)=>{for(var t in e)Ne(i,t,{get:e[t],enumerable:!0})},Ln=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of An(e))!Sn.call(i,r)&&r!==t&&Ne(i,r,{get:()=>e[r],enumerable:!(n=wn(e,r))||n.enumerable});return i};var kn=i=>Ln(Ne({},"__esModule",{value:!0}),i);var mr={};Tn(mr,{LiveTemplateClient:()=>Ue,compareHTML:()=>En,loadAndApplyUpdate:()=>bn,setupReactiveAttributeListeners:()=>ye});var rt=11;function Mn(i,e){var t=e.attributes,n,r,s,o,a;if(!(e.nodeType===rt||i.nodeType===rt)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,s=n.namespaceURI,o=n.value,s?(r=n.localName||r,a=i.getAttributeNS(s,r),a!==o&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(s,r,o))):(a=i.getAttribute(r),a!==o&&i.setAttribute(r,o));for(var l=i.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,s=n.namespaceURI,s?(r=n.localName||r,e.hasAttributeNS(s,r)||i.removeAttributeNS(s,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var ue,xn="http://www.w3.org/1999/xhtml",N=typeof document=="undefined"?void 0:document,Hn=!!N&&"content"in N.createElement("template"),Rn=!!N&&N.createRange&&"createContextualFragment"in N.createRange();function Cn(i){var e=N.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function Dn(i){ue||(ue=N.createRange(),ue.selectNode(N.body));var e=ue.createContextualFragment(i);return e.childNodes[0]}function In(i){var e=N.createElement("body");return e.innerHTML=i,e.childNodes[0]}function On(i){return i=i.trim(),Hn?Cn(i):Rn?Dn(i):In(i)}function pe(i,e){var t=i.nodeName,n=e.nodeName,r,s;return t===n?!0:(r=t.charCodeAt(0),s=n.charCodeAt(0),r<=90&&s>=97?t===n.toUpperCase():s<=90&&r>=97?n===t.toUpperCase():!1)}function _n(i,e){return!e||e===xn?N.createElement(i):N.createElementNS(e,i)}function Un(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Pe(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var it={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}Pe(i,e,"selected")},INPUT:function(i,e){Pe(i,e,"checked"),Pe(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,s,o;r;)if(o=r.nodeName&&r.nodeName.toUpperCase(),o==="OPTGROUP")s=r,r=s.firstChild,r||(r=s.nextSibling,s=null);else{if(o==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&s&&(r=s.nextSibling,s=null)}i.selectedIndex=t}}},oe=1,st=11,ot=3,at=8;function z(){}function Fn(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function Nn(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var s=n;n=N.createElement("html"),n.innerHTML=s}else n=On(n);else n.nodeType===st&&(n=n.firstElementChild);var o=r.getNodeKey||Fn,a=r.onBeforeNodeAdded||z,c=r.onNodeAdded||z,l=r.onBeforeElUpdated||z,d=r.onElUpdated||z,u=r.onBeforeNodeDiscarded||z,p=r.onNodeDiscarded||z,g=r.onBeforeElChildrenUpdated||z,h=r.skipFromChildren||z,R=r.addChild||function(v,m){return v.appendChild(m)},D=r.childrenOnly===!0,C=Object.create(null),x=[];function A(v){x.push(v)}function P(v,m){if(v.nodeType===oe)for(var L=v.firstChild;L;){var b=void 0;m&&(b=o(L))?A(b):(p(L),L.firstChild&&P(L,m)),L=L.nextSibling}}function f(v,m,L){u(v)!==!1&&(m&&m.removeChild(v),p(v),P(v,L))}function E(v){if(v.nodeType===oe||v.nodeType===st)for(var m=v.firstChild;m;){var L=o(m);L&&(C[L]=m),E(m),m=m.nextSibling}}E(t);function O(v){c(v);for(var m=v.firstChild;m;){var L=m.nextSibling,b=o(m);if(b){var y=C[b];y&&pe(m,y)?(m.parentNode.replaceChild(y,m),W(y,m)):O(m)}else O(m);m=L}}function M(v,m,L){for(;m;){var b=m.nextSibling;(L=o(m))?A(L):f(m,v,!0),m=b}}function W(v,m,L){var b=o(m);if(b&&delete C[b],!L){var y=l(v,m);if(y===!1||(y instanceof HTMLElement&&(v=y,E(v)),i(v,m),d(v),g(v,m)===!1))return}v.nodeName!=="TEXTAREA"?S(v,m):it.TEXTAREA(v,m)}function S(v,m){var L=h(v,m),b=m.firstChild,y=v.firstChild,I,U,K,ee,B;e:for(;b;){for(ee=b.nextSibling,I=o(b);!L&&y;){if(K=y.nextSibling,b.isSameNode&&b.isSameNode(y)){b=ee,y=K;continue e}U=o(y);var V=y.nodeType,j=void 0;if(V===b.nodeType&&(V===oe?(I?I!==U&&((B=C[I])?K===B?j=!1:(v.insertBefore(B,y),U?A(U):f(y,v,!0),y=B,U=o(y)):j=!1):U&&(j=!1),j=j!==!1&&pe(y,b),j&&W(y,b)):(V===ot||V==at)&&(j=!0,y.nodeValue!==b.nodeValue&&(y.nodeValue=b.nodeValue))),j){b=ee,y=K;continue e}U?A(U):f(y,v,!0),y=K}if(I&&(B=C[I])&&pe(B,b))L||R(v,B),W(B,b);else{var Fe=a(b);Fe!==!1&&(Fe&&(b=Fe),b.actualize&&(b=b.actualize(v.ownerDocument||N)),R(v,b),O(b))}b=ee,y=K}M(v,y,U);var nt=it[v.nodeName];nt&&nt(v,m)}var w=t,_=w.nodeType,F=n.nodeType;if(!D){if(_===oe)F===oe?pe(t,n)||(p(t),w=Un(t,_n(n.nodeName,n.namespaceURI))):w=n;else if(_===ot||_===at){if(F===_)return w.nodeValue!==n.nodeValue&&(w.nodeValue=n.nodeValue),w;w=n}}if(w===n)p(t);else{if(n.isSameNode&&n.isSameNode(w))return;if(W(w,n,D),x)for(var T=0,H=x.length;T<H;T++){var k=C[x[T]];k&&f(k,k.parentNode,!1)}}return!D&&w!==t&&t.parentNode&&(w.actualize&&(w=w.actualize(t.ownerDocument||N)),t.parentNode.replaceChild(w,t)),w}}var Pn=Nn(Mn),fe=Pn;var $e=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var ge=class{constructor(e){this.logger=e;this.wrapperElement=null;this.focusableElements=[];this.lastFocusedElement=null;this.lastFocusedSelectionStart=null;this.lastFocusedSelectionEnd=null}attach(e){this.wrapperElement=e,e&&(this.updateFocusableElements(),this.setupFocusTracking())}reset(){this.wrapperElement=null,this.focusableElements=[],this.lastFocusedElement=null,this.lastFocusedSelectionStart=null,this.lastFocusedSelectionEnd=null}updateFocusableElements(){if(!this.wrapperElement)return;let n=`${$e.map(r=>r==="textarea"?"textarea:not([disabled])":`input[type="${r}"]:not([disabled])`).join(", ")}, select:not([disabled]), button:not([disabled]), [contenteditable="true"], [tabindex]:not([tabindex="-1"])`;this.focusableElements=Array.from(this.wrapperElement.querySelectorAll(n))}setupFocusTracking(){if(!this.wrapperElement)return;let e=this.wrapperElement.getAttribute("data-lvt-id"),t=`__lvt_focus_tracker_${e}`,n=`__lvt_blur_tracker_${e}`,r=o=>{var c;let a=o.target;!a||!((c=this.wrapperElement)!=null&&c.contains(a))||(this.isTextualInput(a)||a instanceof HTMLSelectElement)&&(this.lastFocusedElement=a,this.logger.debug("[Focus] Tracked focus on:",a.tagName,a.id||a.getAttribute("name")),this.isTextualInput(a)&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd))},s=o=>{var c;let a=o.target;!a||!((c=this.wrapperElement)!=null&&c.contains(a))||this.isTextualInput(a)&&a===this.lastFocusedElement&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=s,document.addEventListener("focus",r,!0),document.addEventListener("blur",s,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var o,a,c;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(o=this.lastFocusedElement)==null?void 0:o.tagName,((a=this.lastFocusedElement)==null?void 0:a.id)||((c=this.lastFocusedElement)==null?void 0:c.getAttribute("name"))),!this.lastFocusedElement||!this.wrapperElement){this.logger.debug("[Focus] No element to restore");return}let e=this.getElementSelector(this.lastFocusedElement);if(this.logger.debug("[Focus] Selector for last focused:",e),!e){this.logger.debug("[Focus] Could not generate selector");return}let t=null;if(e.startsWith("data-focus-index-")){this.updateFocusableElements();let l=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[l]||null,this.logger.debug("[Focus] Found by index:",l,t==null?void 0:t.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,t==null?void 0:t.tagName);if(!t){this.logger.debug("[Focus] Element not found in updated DOM");return}let n=t.matches(":focus");if(this.logger.debug("[Focus] Already focused:",n),n){this.logger.debug("[Focus] Element retained focus \u2014 skipping restoration");return}let r=this.lastFocusedSelectionStart,s=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&s!==null&&(t.setSelectionRange(r,s),this.logger.debug("[Focus] Restored cursor:",r,"-",s))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?$e.indexOf(e.type)>=0:!1}shouldSkipUpdate(e){return e!==document.activeElement||e.hasAttribute("data-lvt-force-update")?!1:!!(this.isTextualInput(e)||e instanceof HTMLSelectElement)}getLastFocusedElement(){return this.lastFocusedElement}getElementSelector(e){if(e.id)return`#${e.id}`;if(e.name)return`[name="${e.name}"]`;if(e.getAttribute("data-key"))return`[data-key="${e.getAttribute("data-key")}"]`;let t=this.focusableElements.indexOf(e);return t>=0?`data-focus-index-${t}`:null}};var lt=["pending","success","error","done"],We=new Set(lt),he=new Set(["click-away"]),Be={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function $n(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],s=Be[r];if(!s)return null;let o=n[2];if(he.has(o)||!We.has(o)&&!o.includes(":"))return null;let a=o.split(":"),c=a[a.length-1];if(!We.has(c))return null;let l=c,d=a.length>1?a.slice(0,-1).join(":"):void 0;return{action:s,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function G(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function me(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),s=t.substring(n+1);i.setAttribute(r,s)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function Wn(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function Bn(i,e){let t=Object.keys(Be),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let a of t)n.push(`[lvt-el\\:${a}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${a}\\:on\\:${r}\\:${i}]`);let s=n.join(", "),o;try{o=document.querySelectorAll(s)}catch(a){let c=t.map(l=>`[lvt-el\\:${l}\\:on\\:${i}]`);try{o=document.querySelectorAll(c.join(", "))}catch(l){return}}o.forEach(a=>{Array.from(a.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=$n(c.name,c.value);l&&Wn(l,i,e)&&me(G(a),l.action,l.param)})})}function ve(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),s=Be[r];s&&me(G(i),s,t.value)}}function ct(i){return!We.has(i)&&!he.has(i)}function ye(){lt.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;Bn(i,n)},!0)})}var vt=new Set(["pending","success","error","done"]),dt=new WeakSet,be=new WeakMap,Y=new Map;function yt(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function bt(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(o=>o.el.isConnected),s=o=>{var a;for(let c of o.attributes){if(!c.name.startsWith("lvt-fx:"))continue;let l=yt(c.name);if(!l.trigger||vt.has(l.trigger)||he.has(l.trigger))continue;let d=`__lvt_fx_${c.name}`;if(o[d])continue;let u=(a=c.name.match(/^lvt-fx:(\w+)/i))==null?void 0:a[1];if(!u)continue;let p=c.name,g=()=>{if(!o.hasAttribute(p))return;let h=o.getAttribute(p)||"",R=G(o);le(R,u,h)};o.addEventListener(l.trigger,g),o[d]=g,r.push({el:o,event:l.trigger,handler:g,guardKey:d})}};s(i),i.querySelectorAll("*").forEach(s),t[n]=r}function Et(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:s,guardKey:o})=>{n.removeEventListener(r,s),delete n[o]}),delete i[e])}function Kn(i,e,t){let n=r=>{var s;for(let o of r.attributes){if(!o.name.startsWith("lvt-fx:"))continue;let a=yt(o.name);if(!a.trigger||!vt.has(a.trigger)||a.trigger!==e||a.actionName&&a.actionName!==t)continue;let c=(s=o.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];c&&le(r,c,o.value)}};n(i),i.querySelectorAll("*").forEach(n)}function le(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),s=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",o=i.style.backgroundColor,a=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=s,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=o,i.style.transition=a,i.style.length===0&&i.removeAttribute("style"),i.__lvtHighlighting=!1;return}i.style.backgroundColor=o,setTimeout(()=>{i.isConnected&&(i.style.transition=a,i.style.length===0&&i.removeAttribute("style")),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(dt.has(i))break;dt.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),s=t||"fade",o="";switch(s){case"fade":o=`lvt-fade-in ${r}ms ease-out`;break;case"slide":o=`lvt-slide-in ${r}ms ease-out`;break;case"scale":o=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${s}`)}if(!o)break;i.style.animation=o,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),s=qn.has(r)?r:"auto",o=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),a=t||"bottom";switch(a){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:s});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=o&&i.scrollTo({top:i.scrollHeight,behavior:s}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:s});break;case"into-view":{i.dataset.lvtIvDone!=="1"&&(i.scrollIntoView({block:"center",inline:"nearest",behavior:s}),i.dataset.lvtIvDone="1");break}case"preserve":break;default:{if(a.startsWith("reset-on:")){let c=a.slice(9);if(!c){console.warn('lvt-fx:scroll="reset-on:" requires an attribute name');break}let l=i.getAttribute(c);be.has(i)?be.get(i)!==l&&(be.set(i,l),i.scrollLeft=0,i.scrollTop=0):be.set(i,l);break}console.warn(`Unknown lvt-fx:scroll mode: ${a}`)}}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function wt(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let s=o=>{var l;let c=(l=o.detail)==null?void 0:l.action;Kn(i,r,c)};document.addEventListener(`lvt:${r}`,s,!0),t.push({event:`lvt:${r}`,handler:s})}),i.__lvtFxLifecycleListeners=t}function At(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var qn=new Set(["auto","smooth","instant"]);function St(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&le(e,"scroll",t)})}function Tt(){for(let{timer:i}of Y.values())clearTimeout(i);Y.clear()}function Lt(i){if(!(Y.size===0&&i.querySelector("[lvt-fx\\:auto-click]")===null)){for(let[e,t]of Array.from(Y))(!e.isConnected||!e.hasAttribute("lvt-fx:auto-click"))&&(clearTimeout(t.timer),Y.delete(e));i.querySelectorAll("[lvt-fx\\:auto-click]").forEach(e=>{let t=e.getAttribute("lvt-fx:auto-click");if(!t)return;let n=Y.get(e);if(n&&n.spec===t)return;n&&clearTimeout(n.timer);let r=t.indexOf(":"),s=r>0?t.slice(0,r):"",o=/^\d+$/.test(s)?parseInt(s,10):NaN,a=r>0?t.slice(r+1):"";if(!Number.isFinite(o)||o<0||!a||!/^[\w-]+$/.test(a)){console.warn(`lvt-fx:auto-click expects "<delay-ms>:<button-name>", got: ${t}`),Y.delete(e);return}let c=setTimeout(()=>{if(!e.isConnected)return;let l=e.querySelector(`button[name="${a}"]`);l&&l.click()},o);Y.set(e,{timer:c,spec:t})})}}function kt(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&le(e,"highlight",t)})}function Mt(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&le(e,"animate",t)}),Vn()}function Vn(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=`
|
|
1
|
+
"use strict";var LiveTemplateClient=(()=>{var Ne=Object.defineProperty;var wn=Object.getOwnPropertyDescriptor;var An=Object.getOwnPropertyNames;var Sn=Object.prototype.hasOwnProperty;var Tn=(i,e)=>{for(var t in e)Ne(i,t,{get:e[t],enumerable:!0})},Ln=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of An(e))!Sn.call(i,r)&&r!==t&&Ne(i,r,{get:()=>e[r],enumerable:!(n=wn(e,r))||n.enumerable});return i};var kn=i=>Ln(Ne({},"__esModule",{value:!0}),i);var mr={};Tn(mr,{LiveTemplateClient:()=>_e,compareHTML:()=>En,loadAndApplyUpdate:()=>bn,setupReactiveAttributeListeners:()=>ye});var rt=11;function Mn(i,e){var t=e.attributes,n,r,s,o,a;if(!(e.nodeType===rt||i.nodeType===rt)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,s=n.namespaceURI,o=n.value,s?(r=n.localName||r,a=i.getAttributeNS(s,r),a!==o&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(s,r,o))):(a=i.getAttribute(r),a!==o&&i.setAttribute(r,o));for(var l=i.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,s=n.namespaceURI,s?(r=n.localName||r,e.hasAttributeNS(s,r)||i.removeAttributeNS(s,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var ue,xn="http://www.w3.org/1999/xhtml",N=typeof document=="undefined"?void 0:document,Hn=!!N&&"content"in N.createElement("template"),Rn=!!N&&N.createRange&&"createContextualFragment"in N.createRange();function Cn(i){var e=N.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function In(i){ue||(ue=N.createRange(),ue.selectNode(N.body));var e=ue.createContextualFragment(i);return e.childNodes[0]}function Dn(i){var e=N.createElement("body");return e.innerHTML=i,e.childNodes[0]}function On(i){return i=i.trim(),Hn?Cn(i):Rn?In(i):Dn(i)}function pe(i,e){var t=i.nodeName,n=e.nodeName,r,s;return t===n?!0:(r=t.charCodeAt(0),s=n.charCodeAt(0),r<=90&&s>=97?t===n.toUpperCase():s<=90&&r>=97?n===t.toUpperCase():!1)}function Fn(i,e){return!e||e===xn?N.createElement(i):N.createElementNS(e,i)}function _n(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Pe(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var it={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}Pe(i,e,"selected")},INPUT:function(i,e){Pe(i,e,"checked"),Pe(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,s,o;r;)if(o=r.nodeName&&r.nodeName.toUpperCase(),o==="OPTGROUP")s=r,r=s.firstChild,r||(r=s.nextSibling,s=null);else{if(o==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&s&&(r=s.nextSibling,s=null)}i.selectedIndex=t}}},oe=1,st=11,ot=3,at=8;function z(){}function Un(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function Nn(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var s=n;n=N.createElement("html"),n.innerHTML=s}else n=On(n);else n.nodeType===st&&(n=n.firstElementChild);var o=r.getNodeKey||Un,a=r.onBeforeNodeAdded||z,c=r.onNodeAdded||z,l=r.onBeforeElUpdated||z,d=r.onElUpdated||z,u=r.onBeforeNodeDiscarded||z,p=r.onNodeDiscarded||z,g=r.onBeforeElChildrenUpdated||z,h=r.skipFromChildren||z,R=r.addChild||function(v,m){return v.appendChild(m)},I=r.childrenOnly===!0,C=Object.create(null),x=[];function A(v){x.push(v)}function P(v,m){if(v.nodeType===oe)for(var L=v.firstChild;L;){var b=void 0;m&&(b=o(L))?A(b):(p(L),L.firstChild&&P(L,m)),L=L.nextSibling}}function f(v,m,L){u(v)!==!1&&(m&&m.removeChild(v),p(v),P(v,L))}function E(v){if(v.nodeType===oe||v.nodeType===st)for(var m=v.firstChild;m;){var L=o(m);L&&(C[L]=m),E(m),m=m.nextSibling}}E(t);function O(v){c(v);for(var m=v.firstChild;m;){var L=m.nextSibling,b=o(m);if(b){var y=C[b];y&&pe(m,y)?(m.parentNode.replaceChild(y,m),W(y,m)):O(m)}else O(m);m=L}}function M(v,m,L){for(;m;){var b=m.nextSibling;(L=o(m))?A(L):f(m,v,!0),m=b}}function W(v,m,L){var b=o(m);if(b&&delete C[b],!L){var y=l(v,m);if(y===!1||(y instanceof HTMLElement&&(v=y,E(v)),i(v,m),d(v),g(v,m)===!1))return}v.nodeName!=="TEXTAREA"?S(v,m):it.TEXTAREA(v,m)}function S(v,m){var L=h(v,m),b=m.firstChild,y=v.firstChild,D,_,K,ee,B;e:for(;b;){for(ee=b.nextSibling,D=o(b);!L&&y;){if(K=y.nextSibling,b.isSameNode&&b.isSameNode(y)){b=ee,y=K;continue e}_=o(y);var V=y.nodeType,j=void 0;if(V===b.nodeType&&(V===oe?(D?D!==_&&((B=C[D])?K===B?j=!1:(v.insertBefore(B,y),_?A(_):f(y,v,!0),y=B,_=o(y)):j=!1):_&&(j=!1),j=j!==!1&&pe(y,b),j&&W(y,b)):(V===ot||V==at)&&(j=!0,y.nodeValue!==b.nodeValue&&(y.nodeValue=b.nodeValue))),j){b=ee,y=K;continue e}_?A(_):f(y,v,!0),y=K}if(D&&(B=C[D])&&pe(B,b))L||R(v,B),W(B,b);else{var Ue=a(b);Ue!==!1&&(Ue&&(b=Ue),b.actualize&&(b=b.actualize(v.ownerDocument||N)),R(v,b),O(b))}b=ee,y=K}M(v,y,_);var nt=it[v.nodeName];nt&&nt(v,m)}var w=t,F=w.nodeType,U=n.nodeType;if(!I){if(F===oe)U===oe?pe(t,n)||(p(t),w=_n(t,Fn(n.nodeName,n.namespaceURI))):w=n;else if(F===ot||F===at){if(U===F)return w.nodeValue!==n.nodeValue&&(w.nodeValue=n.nodeValue),w;w=n}}if(w===n)p(t);else{if(n.isSameNode&&n.isSameNode(w))return;if(W(w,n,I),x)for(var T=0,H=x.length;T<H;T++){var k=C[x[T]];k&&f(k,k.parentNode,!1)}}return!I&&w!==t&&t.parentNode&&(w.actualize&&(w=w.actualize(t.ownerDocument||N)),t.parentNode.replaceChild(w,t)),w}}var Pn=Nn(Mn),fe=Pn;var $e=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var ge=class{constructor(e){this.logger=e;this.wrapperElement=null;this.focusableElements=[];this.lastFocusedElement=null;this.lastFocusedSelectionStart=null;this.lastFocusedSelectionEnd=null}attach(e){this.wrapperElement=e,e&&(this.updateFocusableElements(),this.setupFocusTracking())}reset(){this.wrapperElement=null,this.focusableElements=[],this.lastFocusedElement=null,this.lastFocusedSelectionStart=null,this.lastFocusedSelectionEnd=null}updateFocusableElements(){if(!this.wrapperElement)return;let n=`${$e.map(r=>r==="textarea"?"textarea:not([disabled])":`input[type="${r}"]:not([disabled])`).join(", ")}, select:not([disabled]), button:not([disabled]), [contenteditable="true"], [tabindex]:not([tabindex="-1"])`;this.focusableElements=Array.from(this.wrapperElement.querySelectorAll(n))}setupFocusTracking(){if(!this.wrapperElement)return;let e=this.wrapperElement.getAttribute("data-lvt-id"),t=`__lvt_focus_tracker_${e}`,n=`__lvt_blur_tracker_${e}`,r=o=>{var c;let a=o.target;!a||!((c=this.wrapperElement)!=null&&c.contains(a))||(this.isTextualInput(a)||a instanceof HTMLSelectElement)&&(this.lastFocusedElement=a,this.logger.debug("[Focus] Tracked focus on:",a.tagName,a.id||a.getAttribute("name")),this.isTextualInput(a)&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd))},s=o=>{var c;let a=o.target;!a||!((c=this.wrapperElement)!=null&&c.contains(a))||this.isTextualInput(a)&&a===this.lastFocusedElement&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=s,document.addEventListener("focus",r,!0),document.addEventListener("blur",s,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var o,a,c;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(o=this.lastFocusedElement)==null?void 0:o.tagName,((a=this.lastFocusedElement)==null?void 0:a.id)||((c=this.lastFocusedElement)==null?void 0:c.getAttribute("name"))),!this.lastFocusedElement||!this.wrapperElement){this.logger.debug("[Focus] No element to restore");return}let e=this.getElementSelector(this.lastFocusedElement);if(this.logger.debug("[Focus] Selector for last focused:",e),!e){this.logger.debug("[Focus] Could not generate selector");return}let t=null;if(e.startsWith("data-focus-index-")){this.updateFocusableElements();let l=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[l]||null,this.logger.debug("[Focus] Found by index:",l,t==null?void 0:t.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,t==null?void 0:t.tagName);if(!t){this.logger.debug("[Focus] Element not found in updated DOM");return}let n=t.matches(":focus");if(this.logger.debug("[Focus] Already focused:",n),n){this.logger.debug("[Focus] Element retained focus \u2014 skipping restoration");return}let r=this.lastFocusedSelectionStart,s=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&s!==null&&(t.setSelectionRange(r,s),this.logger.debug("[Focus] Restored cursor:",r,"-",s))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?$e.indexOf(e.type)>=0:!1}shouldSkipUpdate(e){return e!==document.activeElement||e.hasAttribute("data-lvt-force-update")?!1:!!(this.isTextualInput(e)||e instanceof HTMLSelectElement)}getLastFocusedElement(){return this.lastFocusedElement}getElementSelector(e){if(e.id)return`#${e.id}`;if(e.name)return`[name="${e.name}"]`;if(e.getAttribute("data-key"))return`[data-key="${e.getAttribute("data-key")}"]`;let t=this.focusableElements.indexOf(e);return t>=0?`data-focus-index-${t}`:null}};var lt=["pending","success","error","done"],We=new Set(lt),he=new Set(["click-away"]),Be={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function $n(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],s=Be[r];if(!s)return null;let o=n[2];if(he.has(o)||!We.has(o)&&!o.includes(":"))return null;let a=o.split(":"),c=a[a.length-1];if(!We.has(c))return null;let l=c,d=a.length>1?a.slice(0,-1).join(":"):void 0;return{action:s,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function G(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function me(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),s=t.substring(n+1);i.setAttribute(r,s)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function Wn(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function Bn(i,e){let t=Object.keys(Be),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let a of t)n.push(`[lvt-el\\:${a}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${a}\\:on\\:${r}\\:${i}]`);let s=n.join(", "),o;try{o=document.querySelectorAll(s)}catch(a){let c=t.map(l=>`[lvt-el\\:${l}\\:on\\:${i}]`);try{o=document.querySelectorAll(c.join(", "))}catch(l){return}}o.forEach(a=>{Array.from(a.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=$n(c.name,c.value);l&&Wn(l,i,e)&&me(G(a),l.action,l.param)})})}function ve(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),s=Be[r];s&&me(G(i),s,t.value)}}function ct(i){return!We.has(i)&&!he.has(i)}function ye(){lt.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;Bn(i,n)},!0)})}var vt=new Set(["pending","success","error","done"]),dt=new WeakSet,be=new WeakMap,Y=new Map;function yt(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function bt(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(o=>o.el.isConnected),s=o=>{var a;for(let c of o.attributes){if(!c.name.startsWith("lvt-fx:"))continue;let l=yt(c.name);if(!l.trigger||vt.has(l.trigger)||he.has(l.trigger))continue;let d=`__lvt_fx_${c.name}`;if(o[d])continue;let u=(a=c.name.match(/^lvt-fx:(\w+)/i))==null?void 0:a[1];if(!u)continue;let p=c.name,g=()=>{if(!o.hasAttribute(p))return;let h=o.getAttribute(p)||"",R=G(o);le(R,u,h)};o.addEventListener(l.trigger,g),o[d]=g,r.push({el:o,event:l.trigger,handler:g,guardKey:d})}};s(i),i.querySelectorAll("*").forEach(s),t[n]=r}function Et(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:s,guardKey:o})=>{n.removeEventListener(r,s),delete n[o]}),delete i[e])}function Kn(i,e,t){let n=r=>{var s;for(let o of r.attributes){if(!o.name.startsWith("lvt-fx:"))continue;let a=yt(o.name);if(!a.trigger||!vt.has(a.trigger)||a.trigger!==e||a.actionName&&a.actionName!==t)continue;let c=(s=o.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];c&&le(r,c,o.value)}};n(i),i.querySelectorAll("*").forEach(n)}function le(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),s=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",o=i.style.backgroundColor,a=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=s,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=o,i.style.transition=a,i.style.length===0&&i.removeAttribute("style"),i.__lvtHighlighting=!1;return}i.style.backgroundColor=o,setTimeout(()=>{i.isConnected&&(i.style.transition=a,i.style.length===0&&i.removeAttribute("style")),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(dt.has(i))break;dt.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),s=t||"fade",o="";switch(s){case"fade":o=`lvt-fade-in ${r}ms ease-out`;break;case"slide":o=`lvt-slide-in ${r}ms ease-out`;break;case"scale":o=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${s}`)}if(!o)break;i.style.animation=o,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),s=qn.has(r)?r:"auto",o=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),a=t||"bottom";switch(a){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:s});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=o&&i.scrollTo({top:i.scrollHeight,behavior:s}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:s});break;case"into-view":{i.dataset.lvtIvDone!=="1"&&(i.scrollIntoView({block:"center",inline:"nearest",behavior:s}),i.dataset.lvtIvDone="1");break}case"preserve":break;default:{if(a.startsWith("reset-on:")){let c=a.slice(9);if(!c){console.warn('lvt-fx:scroll="reset-on:" requires an attribute name');break}let l=i.getAttribute(c);be.has(i)?be.get(i)!==l&&(be.set(i,l),i.scrollLeft=0,i.scrollTop=0):be.set(i,l);break}console.warn(`Unknown lvt-fx:scroll mode: ${a}`)}}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function wt(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let s=o=>{var l;let c=(l=o.detail)==null?void 0:l.action;Kn(i,r,c)};document.addEventListener(`lvt:${r}`,s,!0),t.push({event:`lvt:${r}`,handler:s})}),i.__lvtFxLifecycleListeners=t}function At(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var qn=new Set(["auto","smooth","instant"]);function St(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&le(e,"scroll",t)})}function Tt(){for(let{timer:i}of Y.values())clearTimeout(i);Y.clear()}function Lt(i){if(!(Y.size===0&&i.querySelector("[lvt-fx\\:auto-click]")===null)){for(let[e,t]of Array.from(Y))(!e.isConnected||!e.hasAttribute("lvt-fx:auto-click"))&&(clearTimeout(t.timer),Y.delete(e));i.querySelectorAll("[lvt-fx\\:auto-click]").forEach(e=>{let t=e.getAttribute("lvt-fx:auto-click");if(!t)return;let n=Y.get(e);if(n&&n.spec===t)return;n&&clearTimeout(n.timer);let r=t.indexOf(":"),s=r>0?t.slice(0,r):"",o=/^\d+$/.test(s)?parseInt(s,10):NaN,a=r>0?t.slice(r+1):"";if(!Number.isFinite(o)||o<0||!a||!/^[\w-]+$/.test(a)){console.warn(`lvt-fx:auto-click expects "<delay-ms>:<button-name>", got: ${t}`),Y.delete(e);return}let c=setTimeout(()=>{if(!e.isConnected)return;let l=e.querySelector(`button[name="${a}"]`);l&&l.click()},o);Y.set(e,{timer:c,spec:t})})}}function kt(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&le(e,"highlight",t)})}function Mt(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&le(e,"animate",t)}),Vn()}function Vn(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=`
|
|
2
2
|
@keyframes lvt-fade-in {
|
|
3
3
|
from { opacity: 0; }
|
|
4
4
|
to { opacity: 1; }
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
from { opacity: 0; transform: scale(0.95); }
|
|
12
12
|
to { opacity: 1; transform: scale(1); }
|
|
13
13
|
}
|
|
14
|
-
`,document.head.appendChild(i)}}var ut="__lvtPendingProcessed";function xt(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[ut]===t)return;e[ut]=t;let n;try{n=JSON.parse(t)}catch(o){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",s=jn(r);n.forEach(o=>{let a=Gn(o);s.appendChild(a),typeof o.dismissMS=="number"&&o.dismissMS>0&&setTimeout(()=>a.remove(),o.dismissMS)})})}function Ht(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(s=>s.remove())};document[i]=t,document.addEventListener("click",t)}function jn(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),zn(e,i),document.body.appendChild(e)),e}function zn(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function Gn(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}var pt=new WeakMap;function Rt(i){var t;let e=i.querySelectorAll("template[shadowrootmode]");if(e.length!==0)for(let n of e){let r=n.parentElement;if(!r){n.remove();continue}let s=n.getAttribute("shadowrootmode");if(s!=="open"&&s!=="closed"){console.warn(`livetemplate: invalid shadowrootmode=${JSON.stringify(s)}; expected "open" or "closed". Template removed.`,n),n.remove();continue}let o=s,a=(t=r.shadowRoot)!=null?t:pt.get(r);if(a&&a.mode!==s&&console.warn(`livetemplate: shadowrootmode changed from "${a.mode}" to "${s}" on re-render \u2014 mode is fixed at first attach and cannot be changed.`,r),!a)try{a=r.attachShadow({mode:o,delegatesFocus:n.hasAttribute("shadowrootdelegatesfocus"),clonable:n.hasAttribute("shadowrootclonable"),serializable:n.hasAttribute("shadowrootserializable")}),o==="closed"&&pt.set(r,a)}catch(c){if(!(c instanceof DOMException))throw c;console.warn(`livetemplate: attachShadow rejected on <${r.tagName.toLowerCase()}> (${c.name}: ${c.message}). Template removed.`,r),n.remove();continue}a.replaceChildren(n.content),n.remove()}}var ae=new Map,ft=new WeakSet,gt=.02;function Ct(i,e){for(let[n,r]of Array.from(ae))(!n.isConnected||!n.hasAttribute("lvt-fx:area-select"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:area-select]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:area-select");if(!r){console.warn(`lvt-fx:area-select requires an action name, got: ${JSON.stringify(r)}`);continue}let s=ae.get(n);if(s&&s.action===r){s.updateSend(e);continue}s&&s.cleanup(),ae.set(n,Jn(n,r,e))}}function Dt(i){for(let[e,t]of Array.from(ae))i.contains(e)&&t.cleanup()}var J=new Map,te=null;function Ke(i,e){var r;for(let[s,o]of Array.from(J))(!s.isConnected||!s.hasAttribute("lvt-fx:url-hash"))&&o.cleanup();let t=[];i instanceof HTMLElement&&i.hasAttribute("lvt-fx:url-hash")&&t.push(i);let n=(r=i.ownerDocument)==null?void 0:r.body;if(n&&n!==i&&n.hasAttribute("lvt-fx:url-hash")&&!t.includes(n)&&t.push(n),i.querySelectorAll("[lvt-fx\\:url-hash]").forEach(s=>{t.includes(s)||t.push(s)}),t.length!==0)for(let s of t){let o=s.getAttribute("lvt-fx:url-hash");if(!o){console.warn(`lvt-fx:url-hash requires an action name, got: ${JSON.stringify(o)}`);continue}let a=s.getAttribute("data-lvt-url-hash")||"",c=J.get(s);if(c&&c.action===o){c.updateSend(e),ht(c,a);continue}c&&c.cleanup();let l=Xn(s,o,e);J.set(s,l);let d=window.location.hash.replace(/^#/,"");d&&d!==a&&we(d)?(l.currentDataHash=d,e({action:o,data:{hash:d}})):d&&!we(d)?l.currentDataHash=a:ht(l,a)}}function It(i){var t;let e=(t=i.ownerDocument)==null?void 0:t.body;for(let[n,r]of Array.from(J)){if(i.contains(n)){r.cleanup();continue}e&&n===e&&e.contains(i)&&r.cleanup()}}function ht(i,e){if(i.currentDataHash===e)return;let t=window.location.hash.replace(/^#/,"");if(t===e){i.currentDataHash=e;return}if(t!==""&&!we(t)){i.currentDataHash=e;return}Yn(e);let n=e?`#${e}`:window.location.pathname+window.location.search,r=t.split(":")[0],s=e.split(":")[0],o=window.history.state;t!==""&&r!==s?window.history.pushState(o,"",n):window.history.replaceState(o,"",n),i.currentDataHash=e}var mt=new Set;function Yn(i){!i||mt.has(i)||(/[ <>"`#\[\]]/.test(i)||/%(?![0-9A-Fa-f]{2})/.test(i))&&(mt.add(i),console.warn(`lvt-fx:url-hash: data-lvt-url-hash="${i}" contains characters that should be percent-encoded. The directive writes it verbatim into history.pushState/replaceState; malformed URLs result. Server-side FormatHash (or equivalent) should percent-escape path segments and target ids before serialization.`))}function we(i){return i?i.includes(":")||i.includes("/")||i.includes("."):!1}function Xn(i,e,t){let n={action:e,send:t,cleanup:()=>{J.delete(i),J.size===0&&te&&(window.removeEventListener("hashchange",te),te=null)},updateSend:r=>{n.send=r},currentDataHash:""};return te||(te=()=>{let r=window.location.hash.replace(/^#/,"");if(we(r))for(let s of Array.from(J.values()))s.currentDataHash=r,s.send({action:s.action,data:{hash:r}})},window.addEventListener("hashchange",te)),n}function Jn(i,e,t){let n=t,r=null,s=0,o=0,a=-1,c=null,l=null,d=()=>{r&&r.remove(),r=null},u=(f,E)=>{if(a===-1)return;let O=a,M=l;a=-1,c=null,l=null;try{i.releasePointerCapture(O)}catch(L){}if(i.removeEventListener("pointerleave",p),!E||!f||!M){d();return}if(M.width<=0||M.height<=0){d();return}let W=M.left+M.width,S=M.top+M.height,w=Ee(Math.min(s,f.clientX),M.left,W),_=Ee(Math.min(o,f.clientY),M.top,S),F=Ee(Math.max(s,f.clientX),M.left,W),T=Ee(Math.max(o,f.clientY),M.top,S),H=(w-M.left)/M.width,k=(_-M.top)/M.height,v=(F-w)/M.width,m=(T-_)/M.height;d(),!(v<=0||m<=0)&&(v<gt&&m<gt||n({action:e,data:{x:H,y:k,w:v,h:m}}))},p=f=>{f.pointerId===a&&u(null,!1)},g=f=>f.preventDefault(),h=f=>{if(!f.isPrimary||f.button!==0)return;a!==-1&&u(null,!1);let E=i.parentElement;if(!E)return;if(!ft.has(E)){let M=window.getComputedStyle(E).position;M!=="relative"&&M!=="absolute"&&M!=="fixed"&&M!=="sticky"&&(console.warn("lvt-fx:area-select: parentElement has no positioning context; the drag overlay will be mis-positioned. Add position:relative (or absolute/fixed/sticky) to the parent.",E),ft.add(E))}s=f.clientX,o=f.clientY,a=f.pointerId,c=E,l=i.getBoundingClientRect();let O=!1;try{i.setPointerCapture(a),O=!0}catch(M){}O||i.addEventListener("pointerleave",p,{once:!0}),r=document.createElement("div"),r.className="lvt-area-select-overlay",r.setAttribute("aria-hidden","true"),r.style.cssText="position:absolute;pointer-events:none;border:2px solid var(--lvt-area-select-color,#4cc2ff);background:var(--lvt-area-select-fill,rgba(76,194,255,0.18));box-sizing:border-box;z-index:var(--lvt-area-select-z-index,9999);",E.appendChild(r),R(f)},R=f=>{if(!r)return;let E=c;if(!E)return;let O=i.getBoundingClientRect(),M=E.getBoundingClientRect(),W=E.clientLeft,S=E.clientTop,w=E.scrollLeft,_=E.scrollTop,F=V=>V-M.left-W+w,T=V=>V-M.top-S+_,H=F(Math.min(s,f.clientX)),k=T(Math.min(o,f.clientY)),v=Math.abs(f.clientX-s),m=Math.abs(f.clientY-o),L=F(O.left),b=T(O.top),y=L+O.width,I=b+O.height,U=Math.max(L,Math.min(H,y)),K=Math.max(b,Math.min(k,I)),ee=Math.max(L,Math.min(H+v,y)),B=Math.max(b,Math.min(k+m,I));r.style.left=`${U}px`,r.style.top=`${K}px`,r.style.width=`${Math.max(0,ee-U)}px`,r.style.height=`${Math.max(0,B-K)}px`},D=f=>{if(f.pointerId===a){if(!i.isConnected){u(null,!1);return}R(f)}},C=f=>{if(f.pointerId===a){if(!i.isConnected){u(null,!1);return}u(f,!0)}},x=f=>{f.pointerId===a&&u(f,!1)},A=f=>{f.pointerId===a&&u(null,!1)};return i.addEventListener("pointerdown",h),i.addEventListener("pointermove",D),i.addEventListener("pointerup",C),i.addEventListener("pointercancel",x),i.addEventListener("lostpointercapture",A),i.addEventListener("dragstart",g),{action:e,cleanup:()=>{i.removeEventListener("pointerdown",h),i.removeEventListener("pointermove",D),i.removeEventListener("pointerup",C),i.removeEventListener("pointercancel",x),i.removeEventListener("lostpointercapture",A),i.removeEventListener("pointerleave",p),i.removeEventListener("dragstart",g),u(null,!1),ae.delete(i)},updateSend:f=>{n=f}}}function Ee(i,e,t){return!Number.isFinite(i)||i<e?e:i>t?t:i}function ce(i,e){let t=null;return function(...r){let s=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(s,r)},e)}}function qe(i,e){let t=!1;return function(...r){let s=this;t||(i.apply(s,r),t=!0,setTimeout(()=>{t=!1},e))}}var Qn="lvt-redact";function Ot(i,e){return`${Qn}:${i}:${e}`}function _t(i){var n;let e=i!=null?i:typeof document!="undefined"?document:null,t=(n=e==null?void 0:e.querySelector)==null?void 0:n.call(e,"[data-lvt-id]");return(t==null?void 0:t.getAttribute("data-lvt-id"))||"lvt-unknown"}function Ut(i){if(i!=null&&i.storage)return i.storage;try{return typeof localStorage!="undefined"?localStorage:null}catch(e){return null}}function Ft(i){return i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement||i instanceof HTMLSelectElement}function Nt(i){var t;let e=[];return i.hasAttribute("data-lvt-redact")&&e.push(i),(t=i.querySelectorAll)==null||t.call(i,"[data-lvt-redact]").forEach(n=>e.push(n)),e}function Pt(i,e,t){var s;let n=Ut(e),r=n?(s=e==null?void 0:e.scope)!=null?s:_t(i.ownerDocument):null;for(let o of Nt(i)){let a=o.getAttribute("data-lvt-redact");if(!a||!Ft(o))continue;if(n&&r)try{n.setItem(Ot(r,a),o.value)}catch(l){}let c=o.getAttribute("name")||a;t(c,{redacted:!0,field:a})}}function $t(i,e,t){Pt(i,t,(n,r)=>{e[n]=r})}function Wt(i,e,t){Pt(i,t,(n,r)=>{e.set(n,JSON.stringify(r))})}function Bt(i,e){var a,c,l;let t=Ut(e);if(!t)return;let n=(a=e==null?void 0:e.scope)!=null?a:_t(i.ownerDocument),r=new Map,s=d=>{if(r.has(d))return r.get(d);let u=null;try{u=t.getItem(Ot(n,d))}catch(p){u=null}return r.set(d,u),u},o=(l=(c=i.ownerDocument)==null?void 0:c.activeElement)!=null?l:null;for(let d of Nt(i)){if(d===o)continue;let u=d.getAttribute("data-lvt-redact");if(!u)continue;let p=s(u);p!==null&&(Ft(d)?d.value=p:d.textContent=p)}}function Ve(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var Kt=!1;function ne(i,e,t){return i.hasAttribute(e)?!0:i.hasAttribute("lvt-no-intercept")?(Kt||(Kt=!0,t.warn(`lvt-no-intercept is deprecated; use ${e}. The shim will be removed in v0.9.0.`)),!0):!1}var jt={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Zn=Object.keys(jt),er=new Set(["mouseenter","mouseleave","focus","blur"]),qt="application/x-lvt-key",tr=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]),Vt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"],Ae=class{constructor(e,t){this.context=e;this.logger=t;this.warnedEmitSubmitterGETForms=new WeakSet}teardownForWrapper(e){if(e)for(let t of Vt){let n=`__lvt_delegated_${t}_${e}`,r=document[n];r&&(document.removeEventListener(t,r,!1),delete document[n])}}extractButtonData(e,t){e.value&&(t.value=this.context.parseValue(e.value)),Array.from(e.attributes).forEach(n=>{if(n.name.startsWith("data-")&&n.name!=="data-key"){let r=n.name.slice(5);t[r]=this.context.parseValue(n.value)}})}setupEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=Vt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let o=`__lvt_delegated_${s}_${n}`,a=document[o];a&&document.removeEventListener(s,a,!1);let c=l=>{var R,D,C;let d=this.context.getWrapperElement();if(!d)return;let u=l.target;if(this.logger.debug("Event listener triggered:",s,l.target),!u)return;let p=u,g=!1;for(;p;){if(p===d){g=!0;break}p=p.parentElement}if(!g)return;let h=`lvt-on:${s}`;for(p=u;p&&p!==d.parentElement;){let x=p.getAttribute(h),A=p,P=!1;if(!x&&s==="submit"&&p instanceof HTMLFormElement){let f=p.getAttribute("lvt-persist");f&&(x=`persist:${f}`,A=p)}if(!x&&s==="click"){let f=p instanceof HTMLButtonElement?p:null;f&&f.name&&!f.disabled&&f.type!=="reset"&&f.form===null&&!f.hasAttribute("commandfor")&&(x=f.name,A=f,P=!0)}if(!x&&s==="submit"&&p instanceof HTMLFormElement)if(ne(p,"lvt-form:no-intercept",this.logger)){if(p.hasAttribute("lvt-form:emit-submitter")){let f=l.submitter;if(f!=null&&f.name){p.method==="get"&&!this.warnedEmitSubmitterGETForms.has(p)&&(this.logger.warn('lvt-form:emit-submitter on a GET form serializes lvt-submitter into the URL query string, polluting browser history and any shared/bookmarked URLs. Use method="POST" or remove the directive if URL pollution is unacceptable.',p),this.warnedEmitSubmitterGETForms.add(p));let E=p.querySelector('input[type="hidden"][name="lvt-submitter"]');E||(E=document.createElement("input"),E.type="hidden",E.name="lvt-submitter",p.appendChild(E)),E.value=f.name}else(D=p.querySelector('input[type="hidden"][name="lvt-submitter"]'))==null||D.remove()}}else{let f=p.getAttribute("lvt-form:action"),E=l.submitter;f?x=f:E instanceof HTMLButtonElement&&E.name?x=E.name:p.getAttribute("name")?x=p.getAttribute("name"):x="submit",A=p,E&&(p.__lvtSubmitter=E);let O=p.closest("dialog");O&&((R=p.getAttribute("method"))==null?void 0:R.toLowerCase())==="dialog"&&(p.__lvtCloseDialog=O)}if(x!=null&&A){if(s==="submit"&&l.preventDefault(),tr.has(s)){let S=l;if(s==="dragstart"&&S.dataTransfer){let w=A.closest("[data-key]"),_=(C=w==null?void 0:w.getAttribute("data-key"))!=null?C:"";S.dataTransfer.setData(qt,_),S.dataTransfer.effectAllowed="move"}else if(s==="dragover")S.preventDefault(),S.dataTransfer&&(S.dataTransfer.dropEffect="move");else if(s==="drop")S.preventDefault();else if(s==="dragenter"||s==="dragleave"){let w=S.relatedTarget;if(w&&A.contains(w))return}if(x==="")return}if((s==="keydown"||s==="keyup")&&A.hasAttribute("lvt-key")){let S=A.getAttribute("lvt-key");if(S&&l.key!==S){p=p.parentElement;continue}}let f=A,E=()=>{var _,F;this.logger.debug("handleAction called",{action:x,eventType:s,targetElement:f});let S={action:x,data:{}};if(f instanceof HTMLFormElement){this.logger.debug("Processing form element");let T=new FormData(f),H=Array.from(f.querySelectorAll('input[type="checkbox"][name]')),k=new Map;H.forEach(y=>{let I=k.get(y.name)||[];I.push(y),k.set(y.name,I)}),k.forEach((y,I)=>{y.length===1?S.data[I]=y[0].checked:S.data[I]=y.filter(U=>U.checked).map(U=>U.value)});let v=new Set(Array.from(f.querySelectorAll('input[type="password"][name]')).map(y=>y.name)),m=f.__lvtSubmitter,L=m==null?void 0:m.name;T.forEach((y,I)=>{y instanceof File||L&&I===L||k.has(I)||(v.has(I)?S.data[I]=y:S.data[I]=this.context.parseValue(y))});let b=f.__lvtSubmitter;b&&(this.extractButtonData(b,S.data),b.name&&(S.submitter=b.name),delete f.__lvtSubmitter),this.logger.debug("Form data collected:",S.data)}else if(s==="change"||s==="input"||s==="search"){if(f instanceof HTMLInputElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}else if(f instanceof HTMLSelectElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}else if(f instanceof HTMLTextAreaElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}}if(P&&this.extractButtonData(A,S.data),!(f instanceof HTMLFormElement)&&!P&&Array.from(A.attributes).forEach(T=>{if(T.name.startsWith("data-")&&T.name!=="data-key"&&T.name!=="data-lvt-id"){let H=T.name.slice(5);S.data[H]=this.context.parseValue(T.value)}}),s==="drop"){let T=(_=l.dataTransfer)==null?void 0:_.getData(qt);T&&(S.data.dragSourceKey=T);let H=(F=A.closest("[data-key]"))==null?void 0:F.getAttribute("data-key");H&&(S.data.dragTargetKey=H)}let w=null;if(s==="submit"&&f instanceof HTMLFormElement){let T=f.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(T).some(k=>k.files&&k.files.length>0)){let k=l.submitter;w=new FormData(f),k!=null&&k.name&&w.set(k.name,k.value),w.set("lvt-action",x),k!=null&&k.name&&w.set("lvt-submitter",k.name)}}if(s==="submit"&&f instanceof HTMLFormElement){let H=l.submitter,k=null;H&&H.hasAttribute("lvt-form:disable-with")&&(k=H.textContent,H.disabled=!0,H.textContent=H.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(f,H||null,k),f.querySelectorAll('input[type="file"][lvt-upload]').forEach(m=>{let L=m.getAttribute("lvt-upload");L&&(this.logger.debug("Triggering pending uploads for:",L),this.context.triggerPendingUploads(L))}),f.dispatchEvent(new CustomEvent("lvt:pending",{detail:S})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",S),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),w!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),Wt(f,w),this.context.sendHTTPMultipart(f,x,w);return}if($t(f,S.data),this.context.send(S),this.logger.debug("send() called"),f instanceof HTMLFormElement){let T=f.__lvtCloseDialog;T&&(T.close(),delete f.__lvtCloseDialog)}},O=A.getAttribute("lvt-mod:throttle"),M=A.getAttribute("lvt-mod:debounce");if((O||M)&&s!=="search"){r.has(A)||r.set(A,new Map);let S=r.get(A),w=`${s}:${x}`,_=`__lvt_callback_${w}`,F=A;F[_]||(F[_]={current:E}),F[_].current=E;let T=S.get(w);if(!T){let H=()=>F[_].current();if(O){let k=parseInt(O,10);T=qe(H,k)}else if(M){let k=parseInt(M,10);T=ce(H,k)}T&&S.set(w,T)}T&&T()}else E();return}p=p.parentElement}};document[o]=c,document.addEventListener(s,c,!1),this.logger.debug("Registered event listener:",s,"with key:",o)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let o=`__lvt_window_${s}_${n}`,a=window[o];a&&window.removeEventListener(s,a);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let u=`lvt-on:window:${s}`;d.querySelectorAll(Ve(u)).forEach(g=>{let h=g.getAttribute(u);if(!h)return;if((s==="keydown"||s==="keyup")&&g.hasAttribute("lvt-key")){let A=g.getAttribute("lvt-key");if(A&&l.key!==A)return}let R={action:h,data:{}};Array.from(g.attributes).forEach(A=>{if(A.name.startsWith("data-")&&A.name!=="data-key"&&A.name!=="data-lvt-id"){let P=A.name.slice(5);R.data[P]=this.context.parseValue(A.value)}});let D=g.getAttribute("lvt-mod:throttle"),C=g.getAttribute("lvt-mod:debounce"),x=()=>this.context.send(R);if(D||C){r.has(g)||r.set(g,new Map);let A=r.get(g),P=`window-${s}:${h}`,f=A.get(P);if(!f){if(D){let E=parseInt(D,10);f=qe(x,E)}else if(C){let E=parseInt(C,10);f=ce(x,E)}f&&A.set(P,f)}f&&f()}else x()})};window[o]=c,window.addEventListener(s,c)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=o=>{let a=this.context.getWrapperElement();if(!a)return;let c=o.target,l=Zn.map(u=>Ve(`lvt-el:${u}:on:click-away`)).join(", ");a.querySelectorAll(l).forEach(u=>{u.contains(c)||Array.from(u.attributes).forEach(p=>{if(!p.name.includes(":on:click-away"))return;let g=p.name.match(/^lvt-el:(\w+):on:click-away$/);if(!g)return;let h=jt[g[1].toLowerCase()];h&&me(G(u),h,p.value)})})};document[n]=s,document.addEventListener("click",s)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,s=t[r]||new Set,o=`__lvt_el_listeners_${n}`,a=(t[o]||[]).filter(d=>d.el.isConnected),c=e||t,l=d=>{let u=new Set;for(let p of d.attributes){if(!p.name.startsWith("lvt-el:"))continue;let g=p.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!g)continue;let h=g[1].toLowerCase();ct(h)&&u.add(h)}for(let p of u)if(er.has(p)){let g=`__lvt_el_${p}`;if(d[g])continue;let h=()=>ve(d,p);d.addEventListener(p,h),d[g]=h,a.push({el:d,event:p,handler:h,guardKey:g})}else if(!s.has(p)){let g=p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),h=new RegExp(`^lvt-el:\\w+:on:${g}$`,"i"),R=D=>{let C=D.target;for(;C&&C!==t;){let x=!1;for(let A of C.attributes)if(h.test(A.name)){x=!0;break}if(x){ve(C,p);return}C=C.parentElement}C===t&&ve(t,p)};t.addEventListener(p,R),s.add(p),a.push({el:t,event:p,handler:R})}};l(c),c.querySelectorAll("*").forEach(l),t[o]=a,t[r]=s}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:o,event:a,handler:c,guardKey:l})=>{o.removeEventListener(a,c),l&&delete o[l]}),delete e[n]);let s=`__lvt_el_delegated_${t}`;delete e[s]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let s=a=>{let c=["a[href]:not([disabled])","button:not([disabled])","textarea:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])",'[tabindex]:not([tabindex="-1"]):not([disabled])','[contenteditable="true"]'].join(", ");return Array.from(a.querySelectorAll(c)).filter(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",g=u.visibility!=="hidden",h=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||typeof process!="undefined"&&!1;return p&&g&&h})},o=a=>{if(a.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(h=>{h.contains(document.activeElement)&&(!d||h.contains(d))&&(d=h)}),d||l.forEach(h=>{let R=h,D=window.getComputedStyle(R);D.display!=="none"&&D.visibility!=="hidden"&&(d=h)}),!d)return;let u=s(d);if(u.length===0)return;let p=u[0],g=u[u.length-1];a.shiftKey?document.activeElement===p&&(a.preventDefault(),g.focus()):document.activeElement===g&&(a.preventDefault(),p.focus())};document[n]=o,document.addEventListener("keydown",o),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let s=()=>{let a=this.context.getWrapperElement();if(!a)return;a.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",g=u.visibility!=="hidden",h=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,R=p&&g&&h,D=d.getAttribute("data-lvt-autofocused")==="true";R&&!D?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!R&&D&&d.removeAttribute("data-lvt-autofocused")})};s();let o=new MutationObserver(a=>{let c=!1;a.forEach(l=>{l.type==="childList"&&l.addedNodes.length>0&&l.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(c=!0)}),l.type==="attributes"&&(l.target.hasAttribute("lvt-autofocus")||l.attributeName==="hidden"||l.attributeName==="style"||l.attributeName==="class")&&(c=!0)}),c&&s()});o.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=o,this.logger.debug("Autofocus delegation set up")}};function je(i){try{return i.matches(":popover-open")}catch(e){return!1}}var nr=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>je(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function X(i){return nr.find(e=>e.matches(i))}var rr=new Set(["show-modal","show-popover"]);function zt(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let s=document.getElementById(r);if(!s)return;let o=X(s);if(o){if(rr.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!o.isOpen(s)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function Gt(i){let e=i.target;e instanceof Element&&e.id&&X(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function Yt(i){let e=i.target;if(!(e instanceof Element)||!e.id)return;let t=X(e);if(t)if(t.isOpen(e)){if(location.hash==="#"+e.id)return;history.pushState(null,"","#"+e.id)}else{if(location.hash!=="#"+e.id)return;history.replaceState(null,"",location.pathname+location.search)}}function Xt(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=X(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=X(e);t&&!t.isOpen(e)&&t.open(e)}}}function ze(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=X(e);t&&(t.isOpen(e)||t.open(e))}function Jt(i){let e=document.getElementById(i);return e?!!X(e):!1}function Qt(i){let e=document.getElementById(i);if(!e)return;let t=X(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var Se=!1;function Zt(){Se||(Se=!0,document.addEventListener("click",zt),document.addEventListener("close",Gt,!0),document.addEventListener("toggle",Yt,!0),window.addEventListener("popstate",Xt),ze())}function en(){Se&&(Se=!1,document.removeEventListener("click",zt),document.removeEventListener("close",Gt,!0),document.removeEventListener("toggle",Yt,!0),window.removeEventListener("popstate",Xt))}var Te=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null;this.currentHref=window.location.href}teardownForWrapper(e){var r;if((r=this.abortController)==null||r.abort(),this.abortController=null,!e)return;let t=`__lvt_link_intercept_${e}`,n=document[t];n&&(document.removeEventListener("click",n,!1),delete document[t])}setup(e){this.currentHref=window.location.href;let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=o=>{var l;let a=(l=o.target)==null?void 0:l.closest("a[href]");if(!a)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(a))&&!this.shouldSkip(a)){if(a.pathname===window.location.pathname&&a.search===window.location.search&&a.hash){let d=a.hash.slice(1);d&&Jt(d)&&(o.preventDefault(),Qt(d));return}o.preventDefault(),this.navigate(a.href)}};document.addEventListener("click",s),document[n]=s,this.popstateListener||(this.popstateListener=()=>{let o=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,o)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||ne(e,"lvt-nav:no-intercept",this.logger))return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){var a,c,l;let r=new URL(e,window.location.origin),s=new URL(n,window.location.origin);if(r.origin===s.origin&&r.pathname===s.pathname){if(r.search===s.search){(a=this.abortController)==null||a.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&((c=this.abortController)==null||c.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}(l=this.abortController)==null||l.abort(),this.abortController=new AbortController;try{let d=await fetch(e,{credentials:"include",headers:{Accept:"text/html"},signal:this.abortController.signal});if(!d.ok){window.location.href=e;return}let u=await d.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(u,e)}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;window.location.href=e}}};var de=class de{constructor(e,t){this.context=e;this.logger=t;this.infiniteScrollObserver=null;this.mutationObserver=null;this.observedSentinel=null;this.updatedListener=null;this.updatedListenerWrapper=null;this.loadMorePending=!1;this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=e.querySelector("[lvt-scroll-sentinel]");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{let n=t.detail;(n==null?void 0:n.action)==="load_more"&&(this.releaseLoadMore(),this.observedSentinel=null,this.setupInfiniteScrollObserver())},e.addEventListener("lvt:updated",this.updatedListener),this.updatedListenerWrapper=e)}armLoadMoreTimeout(){this.clearLoadMoreTimeout(),this.loadMoreTimeoutId=window.setTimeout(()=>{this.logger.warn(`load_more response not received within ${de.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},de.LOAD_MORE_TIMEOUT_MS)}releaseLoadMore(){this.loadMorePending=!1,this.clearLoadMoreTimeout()}clearLoadMoreTimeout(){this.loadMoreTimeoutId!==null&&(clearTimeout(this.loadMoreTimeoutId),this.loadMoreTimeoutId=null)}setupInfiniteScrollMutationObserver(){let e=this.context.getWrapperElement();e&&(this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver(()=>{this.setupInfiniteScrollObserver()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0}),this.logger.debug("MutationObserver set up successfully"))}teardown(){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=null,this.updatedListenerWrapper=null,this.observedSentinel=null,this.releaseLoadMore()}};de.LOAD_MORE_TIMEOUT_MS=3e4;var Le=de;var ke=class{constructor(){this.bar=null;this.actionTimer=null;this.pendingCount=0;this.pendingHandler=null;this.updatedHandler=null;this.currentDebounceMs=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.className="lvt-loading-bar",e.style.cssText=`
|
|
14
|
+
`,document.head.appendChild(i)}}var ut="__lvtPendingProcessed";function xt(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[ut]===t)return;e[ut]=t;let n;try{n=JSON.parse(t)}catch(o){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",s=jn(r);n.forEach(o=>{let a=Gn(o);s.appendChild(a),typeof o.dismissMS=="number"&&o.dismissMS>0&&setTimeout(()=>a.remove(),o.dismissMS)})})}function Ht(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(s=>s.remove())};document[i]=t,document.addEventListener("click",t)}function jn(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),zn(e,i),document.body.appendChild(e)),e}function zn(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function Gn(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}var pt=new WeakMap;function Rt(i){var t;let e=i.querySelectorAll("template[shadowrootmode]");if(e.length!==0)for(let n of e){let r=n.parentElement;if(!r){n.remove();continue}let s=n.getAttribute("shadowrootmode");if(s!=="open"&&s!=="closed"){console.warn(`livetemplate: invalid shadowrootmode=${JSON.stringify(s)}; expected "open" or "closed". Template removed.`,n),n.remove();continue}let o=s,a=(t=r.shadowRoot)!=null?t:pt.get(r);if(a&&a.mode!==s&&console.warn(`livetemplate: shadowrootmode changed from "${a.mode}" to "${s}" on re-render \u2014 mode is fixed at first attach and cannot be changed.`,r),!a)try{a=r.attachShadow({mode:o,delegatesFocus:n.hasAttribute("shadowrootdelegatesfocus"),clonable:n.hasAttribute("shadowrootclonable"),serializable:n.hasAttribute("shadowrootserializable")}),o==="closed"&&pt.set(r,a)}catch(c){if(!(c instanceof DOMException))throw c;console.warn(`livetemplate: attachShadow rejected on <${r.tagName.toLowerCase()}> (${c.name}: ${c.message}). Template removed.`,r),n.remove();continue}a.replaceChildren(n.content),n.remove()}}var ae=new Map,ft=new WeakSet,gt=.02;function Ct(i,e){for(let[n,r]of Array.from(ae))(!n.isConnected||!n.hasAttribute("lvt-fx:area-select"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:area-select]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:area-select");if(!r){console.warn(`lvt-fx:area-select requires an action name, got: ${JSON.stringify(r)}`);continue}let s=ae.get(n);if(s&&s.action===r){s.updateSend(e);continue}s&&s.cleanup(),ae.set(n,Jn(n,r,e))}}function It(i){for(let[e,t]of Array.from(ae))i.contains(e)&&t.cleanup()}var J=new Map,te=null;function Ke(i,e){var r;for(let[s,o]of Array.from(J))(!s.isConnected||!s.hasAttribute("lvt-fx:url-hash"))&&o.cleanup();let t=[];i instanceof HTMLElement&&i.hasAttribute("lvt-fx:url-hash")&&t.push(i);let n=(r=i.ownerDocument)==null?void 0:r.body;if(n&&n!==i&&n.hasAttribute("lvt-fx:url-hash")&&!t.includes(n)&&t.push(n),i.querySelectorAll("[lvt-fx\\:url-hash]").forEach(s=>{t.includes(s)||t.push(s)}),t.length!==0)for(let s of t){let o=s.getAttribute("lvt-fx:url-hash");if(!o){console.warn(`lvt-fx:url-hash requires an action name, got: ${JSON.stringify(o)}`);continue}let a=s.getAttribute("data-lvt-url-hash")||"",c=J.get(s);if(c&&c.action===o){c.updateSend(e),ht(c,a);continue}c&&c.cleanup();let l=Xn(s,o,e);J.set(s,l);let d=window.location.hash.replace(/^#/,"");d&&d!==a&&we(d)?(l.currentDataHash=d,e({action:o,data:{hash:d}})):d&&!we(d)?l.currentDataHash=a:ht(l,a)}}function Dt(i){var t;let e=(t=i.ownerDocument)==null?void 0:t.body;for(let[n,r]of Array.from(J)){if(i.contains(n)){r.cleanup();continue}e&&n===e&&e.contains(i)&&r.cleanup()}}function ht(i,e){if(i.currentDataHash===e)return;let t=window.location.hash.replace(/^#/,"");if(t===e){i.currentDataHash=e;return}if(t!==""&&!we(t)){i.currentDataHash=e;return}Yn(e);let n=e?`#${e}`:window.location.pathname+window.location.search,r=t.split(":")[0],s=e.split(":")[0],o=window.history.state;t!==""&&r!==s?window.history.pushState(o,"",n):window.history.replaceState(o,"",n),i.currentDataHash=e}var mt=new Set;function Yn(i){!i||mt.has(i)||(/[ <>"`#\[\]]/.test(i)||/%(?![0-9A-Fa-f]{2})/.test(i))&&(mt.add(i),console.warn(`lvt-fx:url-hash: data-lvt-url-hash="${i}" contains characters that should be percent-encoded. The directive writes it verbatim into history.pushState/replaceState; malformed URLs result. Server-side FormatHash (or equivalent) should percent-escape path segments and target ids before serialization.`))}function we(i){return i?i.includes(":")||i.includes("/")||i.includes("."):!1}function Xn(i,e,t){let n={action:e,send:t,cleanup:()=>{J.delete(i),J.size===0&&te&&(window.removeEventListener("hashchange",te),te=null)},updateSend:r=>{n.send=r},currentDataHash:""};return te||(te=()=>{let r=window.location.hash.replace(/^#/,"");if(we(r))for(let s of Array.from(J.values()))s.currentDataHash=r,s.send({action:s.action,data:{hash:r}})},window.addEventListener("hashchange",te)),n}function Jn(i,e,t){let n=t,r=null,s=0,o=0,a=-1,c=null,l=null,d=()=>{r&&r.remove(),r=null},u=(f,E)=>{if(a===-1)return;let O=a,M=l;a=-1,c=null,l=null;try{i.releasePointerCapture(O)}catch(L){}if(i.removeEventListener("pointerleave",p),!E||!f||!M){d();return}if(M.width<=0||M.height<=0){d();return}let W=M.left+M.width,S=M.top+M.height,w=Ee(Math.min(s,f.clientX),M.left,W),F=Ee(Math.min(o,f.clientY),M.top,S),U=Ee(Math.max(s,f.clientX),M.left,W),T=Ee(Math.max(o,f.clientY),M.top,S),H=(w-M.left)/M.width,k=(F-M.top)/M.height,v=(U-w)/M.width,m=(T-F)/M.height;d(),!(v<=0||m<=0)&&(v<gt&&m<gt||n({action:e,data:{x:H,y:k,w:v,h:m}}))},p=f=>{f.pointerId===a&&u(null,!1)},g=f=>f.preventDefault(),h=f=>{if(!f.isPrimary||f.button!==0)return;a!==-1&&u(null,!1);let E=i.parentElement;if(!E)return;if(!ft.has(E)){let M=window.getComputedStyle(E).position;M!=="relative"&&M!=="absolute"&&M!=="fixed"&&M!=="sticky"&&(console.warn("lvt-fx:area-select: parentElement has no positioning context; the drag overlay will be mis-positioned. Add position:relative (or absolute/fixed/sticky) to the parent.",E),ft.add(E))}s=f.clientX,o=f.clientY,a=f.pointerId,c=E,l=i.getBoundingClientRect();let O=!1;try{i.setPointerCapture(a),O=!0}catch(M){}O||i.addEventListener("pointerleave",p,{once:!0}),r=document.createElement("div"),r.className="lvt-area-select-overlay",r.setAttribute("aria-hidden","true"),r.style.cssText="position:absolute;pointer-events:none;border:2px solid var(--lvt-area-select-color,#4cc2ff);background:var(--lvt-area-select-fill,rgba(76,194,255,0.18));box-sizing:border-box;z-index:var(--lvt-area-select-z-index,9999);",E.appendChild(r),R(f)},R=f=>{if(!r)return;let E=c;if(!E)return;let O=i.getBoundingClientRect(),M=E.getBoundingClientRect(),W=E.clientLeft,S=E.clientTop,w=E.scrollLeft,F=E.scrollTop,U=V=>V-M.left-W+w,T=V=>V-M.top-S+F,H=U(Math.min(s,f.clientX)),k=T(Math.min(o,f.clientY)),v=Math.abs(f.clientX-s),m=Math.abs(f.clientY-o),L=U(O.left),b=T(O.top),y=L+O.width,D=b+O.height,_=Math.max(L,Math.min(H,y)),K=Math.max(b,Math.min(k,D)),ee=Math.max(L,Math.min(H+v,y)),B=Math.max(b,Math.min(k+m,D));r.style.left=`${_}px`,r.style.top=`${K}px`,r.style.width=`${Math.max(0,ee-_)}px`,r.style.height=`${Math.max(0,B-K)}px`},I=f=>{if(f.pointerId===a){if(!i.isConnected){u(null,!1);return}R(f)}},C=f=>{if(f.pointerId===a){if(!i.isConnected){u(null,!1);return}u(f,!0)}},x=f=>{f.pointerId===a&&u(f,!1)},A=f=>{f.pointerId===a&&u(null,!1)};return i.addEventListener("pointerdown",h),i.addEventListener("pointermove",I),i.addEventListener("pointerup",C),i.addEventListener("pointercancel",x),i.addEventListener("lostpointercapture",A),i.addEventListener("dragstart",g),{action:e,cleanup:()=>{i.removeEventListener("pointerdown",h),i.removeEventListener("pointermove",I),i.removeEventListener("pointerup",C),i.removeEventListener("pointercancel",x),i.removeEventListener("lostpointercapture",A),i.removeEventListener("pointerleave",p),i.removeEventListener("dragstart",g),u(null,!1),ae.delete(i)},updateSend:f=>{n=f}}}function Ee(i,e,t){return!Number.isFinite(i)||i<e?e:i>t?t:i}function ce(i,e){let t=null;return function(...r){let s=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(s,r)},e)}}function qe(i,e){let t=!1;return function(...r){let s=this;t||(i.apply(s,r),t=!0,setTimeout(()=>{t=!1},e))}}var Qn="lvt-redact";function Ot(i,e){return`${Qn}:${i}:${e}`}function Ft(i){var n;let e=i!=null?i:typeof document!="undefined"?document:null,t=(n=e==null?void 0:e.querySelector)==null?void 0:n.call(e,"[data-lvt-id]");return(t==null?void 0:t.getAttribute("data-lvt-id"))||"lvt-unknown"}function _t(i){if(i!=null&&i.storage)return i.storage;try{return typeof localStorage!="undefined"?localStorage:null}catch(e){return null}}function Ut(i){return i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement||i instanceof HTMLSelectElement}function Nt(i){var t;let e=[];return i.hasAttribute("data-lvt-redact")&&e.push(i),(t=i.querySelectorAll)==null||t.call(i,"[data-lvt-redact]").forEach(n=>e.push(n)),e}function Pt(i,e,t){var s;let n=_t(e),r=n?(s=e==null?void 0:e.scope)!=null?s:Ft(i.ownerDocument):null;for(let o of Nt(i)){let a=o.getAttribute("data-lvt-redact");if(!a||!Ut(o))continue;if(n&&r)try{n.setItem(Ot(r,a),o.value)}catch(l){}let c=o.getAttribute("name")||a;t(c,{redacted:!0,field:a})}}function $t(i,e,t){Pt(i,t,(n,r)=>{e[n]=r})}function Wt(i,e,t){Pt(i,t,(n,r)=>{e.set(n,JSON.stringify(r))})}function Bt(i,e){var a,c,l;let t=_t(e);if(!t)return;let n=(a=e==null?void 0:e.scope)!=null?a:Ft(i.ownerDocument),r=new Map,s=d=>{if(r.has(d))return r.get(d);let u=null;try{u=t.getItem(Ot(n,d))}catch(p){u=null}return r.set(d,u),u},o=(l=(c=i.ownerDocument)==null?void 0:c.activeElement)!=null?l:null;for(let d of Nt(i)){if(d===o)continue;let u=d.getAttribute("data-lvt-redact");if(!u)continue;let p=s(u);p!==null&&(Ut(d)?d.value=p:d.textContent=p)}}function Ve(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var Kt=!1;function ne(i,e,t){return i.hasAttribute(e)?!0:i.hasAttribute("lvt-no-intercept")?(Kt||(Kt=!0,t.warn(`lvt-no-intercept is deprecated; use ${e}. The shim will be removed in v0.9.0.`)),!0):!1}var jt={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Zn=Object.keys(jt),er=new Set(["mouseenter","mouseleave","focus","blur"]),qt="application/x-lvt-key",tr=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]),Vt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"],Ae=class{constructor(e,t){this.context=e;this.logger=t;this.warnedEmitSubmitterGETForms=new WeakSet}teardownForWrapper(e){if(e)for(let t of Vt){let n=`__lvt_delegated_${t}_${e}`,r=document[n];r&&(document.removeEventListener(t,r,!1),delete document[n])}}extractButtonData(e,t){e.value&&(t.value=this.context.parseValue(e.value)),Array.from(e.attributes).forEach(n=>{if(n.name.startsWith("data-")&&n.name!=="data-key"){let r=n.name.slice(5);t[r]=this.context.parseValue(n.value)}})}setupEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=Vt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let o=`__lvt_delegated_${s}_${n}`,a=document[o];a&&document.removeEventListener(s,a,!1);let c=l=>{var R,I,C;let d=this.context.getWrapperElement();if(!d)return;let u=l.target;if(this.logger.debug("Event listener triggered:",s,l.target),!u)return;let p=u,g=!1;for(;p;){if(p===d){g=!0;break}p=p.parentElement}if(!g)return;let h=`lvt-on:${s}`;for(p=u;p&&p!==d.parentElement;){let x=p.getAttribute(h),A=p,P=!1;if(!x&&s==="submit"&&p instanceof HTMLFormElement){let f=p.getAttribute("lvt-persist");f&&(x=`persist:${f}`,A=p)}if(!x&&s==="click"){let f=p instanceof HTMLButtonElement?p:null;f&&f.name&&!f.disabled&&f.type!=="reset"&&f.form===null&&!f.hasAttribute("commandfor")&&(x=f.name,A=f,P=!0)}if(!x&&s==="submit"&&p instanceof HTMLFormElement)if(ne(p,"lvt-form:no-intercept",this.logger)){if(p.hasAttribute("lvt-form:emit-submitter")){let f=l.submitter;if(f!=null&&f.name){p.method==="get"&&!this.warnedEmitSubmitterGETForms.has(p)&&(this.logger.warn('lvt-form:emit-submitter on a GET form serializes lvt-submitter into the URL query string, polluting browser history and any shared/bookmarked URLs. Use method="POST" or remove the directive if URL pollution is unacceptable.',p),this.warnedEmitSubmitterGETForms.add(p));let E=p.querySelector('input[type="hidden"][name="lvt-submitter"]');E||(E=document.createElement("input"),E.type="hidden",E.name="lvt-submitter",p.appendChild(E)),E.value=f.name}else(I=p.querySelector('input[type="hidden"][name="lvt-submitter"]'))==null||I.remove()}}else{let f=p.getAttribute("lvt-form:action"),E=l.submitter;f?x=f:E instanceof HTMLButtonElement&&E.name?x=E.name:p.getAttribute("name")?x=p.getAttribute("name"):x="submit",A=p,E&&(p.__lvtSubmitter=E);let O=p.closest("dialog");O&&((R=p.getAttribute("method"))==null?void 0:R.toLowerCase())==="dialog"&&(p.__lvtCloseDialog=O)}if(x!=null&&A){if(s==="submit"&&l.preventDefault(),tr.has(s)){let S=l;if(s==="dragstart"&&S.dataTransfer){let w=A.closest("[data-key]"),F=(C=w==null?void 0:w.getAttribute("data-key"))!=null?C:"";S.dataTransfer.setData(qt,F),S.dataTransfer.effectAllowed="move"}else if(s==="dragover")S.preventDefault(),S.dataTransfer&&(S.dataTransfer.dropEffect="move");else if(s==="drop")S.preventDefault();else if(s==="dragenter"||s==="dragleave"){let w=S.relatedTarget;if(w&&A.contains(w))return}if(x==="")return}if((s==="keydown"||s==="keyup")&&A.hasAttribute("lvt-key")){let S=A.getAttribute("lvt-key");if(S&&l.key!==S){p=p.parentElement;continue}}let f=A,E=()=>{var F,U;this.logger.debug("handleAction called",{action:x,eventType:s,targetElement:f});let S={action:x,data:{}};if(f instanceof HTMLFormElement){this.logger.debug("Processing form element");let T=new FormData(f),H=Array.from(f.querySelectorAll('input[type="checkbox"][name]')),k=new Map;H.forEach(y=>{let D=k.get(y.name)||[];D.push(y),k.set(y.name,D)}),k.forEach((y,D)=>{y.length===1?S.data[D]=y[0].checked:S.data[D]=y.filter(_=>_.checked).map(_=>_.value)});let v=new Set(Array.from(f.querySelectorAll('input[type="password"][name]')).map(y=>y.name)),m=f.__lvtSubmitter,L=m==null?void 0:m.name;T.forEach((y,D)=>{y instanceof File||L&&D===L||k.has(D)||(v.has(D)?S.data[D]=y:S.data[D]=this.context.parseValue(y))});let b=f.__lvtSubmitter;b&&(this.extractButtonData(b,S.data),b.name&&(S.submitter=b.name),delete f.__lvtSubmitter),this.logger.debug("Form data collected:",S.data)}else if(s==="change"||s==="input"||s==="search"){if(f instanceof HTMLInputElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}else if(f instanceof HTMLSelectElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}else if(f instanceof HTMLTextAreaElement){let T=f.name||"value";S.data[T]=this.context.parseValue(f.value)}}if(P&&this.extractButtonData(A,S.data),!(f instanceof HTMLFormElement)&&!P&&Array.from(A.attributes).forEach(T=>{if(T.name.startsWith("data-")&&T.name!=="data-key"&&T.name!=="data-lvt-id"){let H=T.name.slice(5);S.data[H]=this.context.parseValue(T.value)}}),s==="drop"){let T=(F=l.dataTransfer)==null?void 0:F.getData(qt);T&&(S.data.dragSourceKey=T);let H=(U=A.closest("[data-key]"))==null?void 0:U.getAttribute("data-key");H&&(S.data.dragTargetKey=H)}let w=null;if(s==="submit"&&f instanceof HTMLFormElement){let T=f.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(T).some(k=>k.files&&k.files.length>0)){let k=l.submitter;w=new FormData(f),k!=null&&k.name&&w.set(k.name,k.value),w.set("lvt-action",x),k!=null&&k.name&&w.set("lvt-submitter",k.name)}}if(s==="submit"&&f instanceof HTMLFormElement){let H=l.submitter,k=null;H&&H.hasAttribute("lvt-form:disable-with")&&(k=H.textContent,H.disabled=!0,H.textContent=H.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(f,H||null,k),f.querySelectorAll('input[type="file"][lvt-upload]').forEach(m=>{let L=m.getAttribute("lvt-upload");L&&(this.logger.debug("Triggering pending uploads for:",L),this.context.triggerPendingUploads(L))}),f.dispatchEvent(new CustomEvent("lvt:pending",{detail:S})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",S),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),w!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),Wt(f,w),this.context.sendHTTPMultipart(f,x,w);return}if($t(f,S.data),this.context.send(S),this.logger.debug("send() called"),f instanceof HTMLFormElement){let T=f.__lvtCloseDialog;T&&(T.close(),delete f.__lvtCloseDialog)}},O=A.getAttribute("lvt-mod:throttle"),M=A.getAttribute("lvt-mod:debounce");if((O||M)&&s!=="search"){r.has(A)||r.set(A,new Map);let S=r.get(A),w=`${s}:${x}`,F=`__lvt_callback_${w}`,U=A;U[F]||(U[F]={current:E}),U[F].current=E;let T=S.get(w);if(!T){let H=()=>U[F].current();if(O){let k=parseInt(O,10);T=qe(H,k)}else if(M){let k=parseInt(M,10);T=ce(H,k)}T&&S.set(w,T)}T&&T()}else E();return}p=p.parentElement}};document[o]=c,document.addEventListener(s,c,!1),this.logger.debug("Registered event listener:",s,"with key:",o)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let o=`__lvt_window_${s}_${n}`,a=window[o];a&&window.removeEventListener(s,a);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let u=`lvt-on:window:${s}`;d.querySelectorAll(Ve(u)).forEach(g=>{let h=g.getAttribute(u);if(!h)return;if((s==="keydown"||s==="keyup")&&g.hasAttribute("lvt-key")){let A=g.getAttribute("lvt-key");if(A&&l.key!==A)return}let R={action:h,data:{}};Array.from(g.attributes).forEach(A=>{if(A.name.startsWith("data-")&&A.name!=="data-key"&&A.name!=="data-lvt-id"){let P=A.name.slice(5);R.data[P]=this.context.parseValue(A.value)}});let I=g.getAttribute("lvt-mod:throttle"),C=g.getAttribute("lvt-mod:debounce"),x=()=>this.context.send(R);if(I||C){r.has(g)||r.set(g,new Map);let A=r.get(g),P=`window-${s}:${h}`,f=A.get(P);if(!f){if(I){let E=parseInt(I,10);f=qe(x,E)}else if(C){let E=parseInt(C,10);f=ce(x,E)}f&&A.set(P,f)}f&&f()}else x()})};window[o]=c,window.addEventListener(s,c)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=o=>{let a=this.context.getWrapperElement();if(!a)return;let c=o.target,l=Zn.map(u=>Ve(`lvt-el:${u}:on:click-away`)).join(", ");a.querySelectorAll(l).forEach(u=>{u.contains(c)||Array.from(u.attributes).forEach(p=>{if(!p.name.includes(":on:click-away"))return;let g=p.name.match(/^lvt-el:(\w+):on:click-away$/);if(!g)return;let h=jt[g[1].toLowerCase()];h&&me(G(u),h,p.value)})})};document[n]=s,document.addEventListener("click",s)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,s=t[r]||new Set,o=`__lvt_el_listeners_${n}`,a=(t[o]||[]).filter(d=>d.el.isConnected),c=e||t,l=d=>{let u=new Set;for(let p of d.attributes){if(!p.name.startsWith("lvt-el:"))continue;let g=p.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!g)continue;let h=g[1].toLowerCase();ct(h)&&u.add(h)}for(let p of u)if(er.has(p)){let g=`__lvt_el_${p}`;if(d[g])continue;let h=()=>ve(d,p);d.addEventListener(p,h),d[g]=h,a.push({el:d,event:p,handler:h,guardKey:g})}else if(!s.has(p)){let g=p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),h=new RegExp(`^lvt-el:\\w+:on:${g}$`,"i"),R=I=>{let C=I.target;for(;C&&C!==t;){let x=!1;for(let A of C.attributes)if(h.test(A.name)){x=!0;break}if(x){ve(C,p);return}C=C.parentElement}C===t&&ve(t,p)};t.addEventListener(p,R),s.add(p),a.push({el:t,event:p,handler:R})}};l(c),c.querySelectorAll("*").forEach(l),t[o]=a,t[r]=s}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:o,event:a,handler:c,guardKey:l})=>{o.removeEventListener(a,c),l&&delete o[l]}),delete e[n]);let s=`__lvt_el_delegated_${t}`;delete e[s]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let s=a=>{let c=["a[href]:not([disabled])","button:not([disabled])","textarea:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])",'[tabindex]:not([tabindex="-1"]):not([disabled])','[contenteditable="true"]'].join(", ");return Array.from(a.querySelectorAll(c)).filter(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",g=u.visibility!=="hidden",h=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||typeof process!="undefined"&&!1;return p&&g&&h})},o=a=>{if(a.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(h=>{h.contains(document.activeElement)&&(!d||h.contains(d))&&(d=h)}),d||l.forEach(h=>{let R=h,I=window.getComputedStyle(R);I.display!=="none"&&I.visibility!=="hidden"&&(d=h)}),!d)return;let u=s(d);if(u.length===0)return;let p=u[0],g=u[u.length-1];a.shiftKey?document.activeElement===p&&(a.preventDefault(),g.focus()):document.activeElement===g&&(a.preventDefault(),p.focus())};document[n]=o,document.addEventListener("keydown",o),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let s=()=>{let a=this.context.getWrapperElement();if(!a)return;a.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",g=u.visibility!=="hidden",h=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,R=p&&g&&h,I=d.getAttribute("data-lvt-autofocused")==="true";R&&!I?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!R&&I&&d.removeAttribute("data-lvt-autofocused")})};s();let o=new MutationObserver(a=>{let c=!1;a.forEach(l=>{l.type==="childList"&&l.addedNodes.length>0&&l.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(c=!0)}),l.type==="attributes"&&(l.target.hasAttribute("lvt-autofocus")||l.attributeName==="hidden"||l.attributeName==="style"||l.attributeName==="class")&&(c=!0)}),c&&s()});o.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=o,this.logger.debug("Autofocus delegation set up")}};function je(i){try{return i.matches(":popover-open")}catch(e){return!1}}var nr=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>je(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function X(i){return nr.find(e=>e.matches(i))}var rr=new Set(["show-modal","show-popover"]);function zt(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let s=document.getElementById(r);if(!s)return;let o=X(s);if(o){if(rr.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!o.isOpen(s)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function Gt(i){let e=i.target;e instanceof Element&&e.id&&X(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function Yt(i){let e=i.target;if(!(e instanceof Element)||!e.id)return;let t=X(e);if(t)if(t.isOpen(e)){if(location.hash==="#"+e.id)return;history.pushState(null,"","#"+e.id)}else{if(location.hash!=="#"+e.id)return;history.replaceState(null,"",location.pathname+location.search)}}function Xt(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=X(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=X(e);t&&!t.isOpen(e)&&t.open(e)}}}function ze(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=X(e);t&&(t.isOpen(e)||t.open(e))}function Jt(i){let e=document.getElementById(i);return e?!!X(e):!1}function Qt(i){let e=document.getElementById(i);if(!e)return;let t=X(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var Se=!1;function Zt(){Se||(Se=!0,document.addEventListener("click",zt),document.addEventListener("close",Gt,!0),document.addEventListener("toggle",Yt,!0),window.addEventListener("popstate",Xt),ze())}function en(){Se&&(Se=!1,document.removeEventListener("click",zt),document.removeEventListener("close",Gt,!0),document.removeEventListener("toggle",Yt,!0),window.removeEventListener("popstate",Xt))}var Te=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null;this.currentHref=window.location.href}teardownForWrapper(e){var r;if((r=this.abortController)==null||r.abort(),this.abortController=null,!e)return;let t=`__lvt_link_intercept_${e}`,n=document[t];n&&(document.removeEventListener("click",n,!1),delete document[t])}setup(e){this.currentHref=window.location.href;let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=o=>{var l;let a=(l=o.target)==null?void 0:l.closest("a[href]");if(!a)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(a))&&!this.shouldSkip(a)){if(a.pathname===window.location.pathname&&a.search===window.location.search&&a.hash){let d=a.hash.slice(1);d&&Jt(d)&&(o.preventDefault(),Qt(d));return}o.preventDefault(),this.navigate(a.href)}};document.addEventListener("click",s),document[n]=s,this.popstateListener||(this.popstateListener=()=>{let o=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,o)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||ne(e,"lvt-nav:no-intercept",this.logger))return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){var a,c,l;let r=new URL(e,window.location.origin),s=new URL(n,window.location.origin);if(r.origin===s.origin&&r.pathname===s.pathname){if(r.search===s.search){(a=this.abortController)==null||a.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&((c=this.abortController)==null||c.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}(l=this.abortController)==null||l.abort(),this.abortController=new AbortController;try{let d=await fetch(e,{credentials:"include",headers:{Accept:"text/html"},signal:this.abortController.signal});if(!d.ok){window.location.href=e;return}let u=await d.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(u,e)}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;window.location.href=e}}};var de=class de{constructor(e,t){this.context=e;this.logger=t;this.infiniteScrollObserver=null;this.mutationObserver=null;this.observedSentinel=null;this.updatedListener=null;this.updatedListenerWrapper=null;this.loadMorePending=!1;this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=e.querySelector("[lvt-scroll-sentinel]");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{let n=t.detail;(n==null?void 0:n.action)==="load_more"&&(this.releaseLoadMore(),this.observedSentinel=null,this.setupInfiniteScrollObserver())},e.addEventListener("lvt:updated",this.updatedListener),this.updatedListenerWrapper=e)}armLoadMoreTimeout(){this.clearLoadMoreTimeout(),this.loadMoreTimeoutId=window.setTimeout(()=>{this.logger.warn(`load_more response not received within ${de.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},de.LOAD_MORE_TIMEOUT_MS)}releaseLoadMore(){this.loadMorePending=!1,this.clearLoadMoreTimeout()}clearLoadMoreTimeout(){this.loadMoreTimeoutId!==null&&(clearTimeout(this.loadMoreTimeoutId),this.loadMoreTimeoutId=null)}setupInfiniteScrollMutationObserver(){let e=this.context.getWrapperElement();e&&(this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver(()=>{this.setupInfiniteScrollObserver()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0}),this.logger.debug("MutationObserver set up successfully"))}teardown(){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=null,this.updatedListenerWrapper=null,this.observedSentinel=null,this.releaseLoadMore()}};de.LOAD_MORE_TIMEOUT_MS=3e4;var Le=de;var ke=class{constructor(){this.bar=null;this.actionTimer=null;this.pendingCount=0;this.pendingHandler=null;this.updatedHandler=null;this.currentDebounceMs=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.className="lvt-loading-bar",e.style.cssText=`
|
|
15
15
|
position: fixed;
|
|
16
16
|
top: 0;
|
|
17
17
|
left: 0;
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
0% { background-position: 200% 0; }
|
|
27
27
|
100% { background-position: -200% 0; }
|
|
28
28
|
}
|
|
29
|
-
`,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}enablePerActionIndicator(e){if(this.pendingHandler){if(this.currentDebounceMs===e)return;this.disablePerActionIndicator()}this.pendingCount=0,this.currentDebounceMs=e,this.pendingHandler=()=>{this.pendingCount++,this.pendingCount===1&&this.actionTimer===null&&this.bar===null&&(this.actionTimer=setTimeout(()=>{this.actionTimer=null,this.pendingCount>0&&this.show()},e))},this.updatedHandler=()=>{this.pendingCount=Math.max(0,this.pendingCount-1),this.pendingCount===0&&(this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.hide())},document.addEventListener("lvt:pending",this.pendingHandler,!0),document.addEventListener("lvt:updated",this.updatedHandler,!0)}disablePerActionIndicator(){this.pendingHandler&&(document.removeEventListener("lvt:pending",this.pendingHandler,!0),this.pendingHandler=null),this.updatedHandler&&(document.removeEventListener("lvt:updated",this.updatedHandler,!0),this.updatedHandler=null),this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.pendingCount=0,this.currentDebounceMs=null,this.hide()}};var Me=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!1})})}};var tn=!1;function ir(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),s=document.getElementById(n);s&&(s instanceof HTMLDialogElement?r==="show-modal"&&!s.open?s.showModal():r==="close"&&s.open&&s.close():s instanceof HTMLElement&&s.hasAttribute("popover")&&(r==="show-popover"&&typeof s.showPopover=="function"?s.showPopover():r==="hide-popover"&&typeof s.hidePopover=="function"?s.hidePopover():r==="toggle-popover"&&typeof s.togglePopover=="function"&&s.togglePopover()))}function nn(){"commandForElement"in HTMLButtonElement.prototype||tn||(tn=!0,document.addEventListener("click",ir))}var re="__lvt_scroll_away",q=[];function sr(){for(let i=q.length-1;i>=0;i--){let e=q[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[re],q.splice(i,1))}}function sn(i){sr();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"&&n!=="top"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=G(t);if(!r||r===t){let u=t[re];u&&(u.target.removeEventListener("scroll",u.handler),rn(u),delete t[re]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let s=t[re];if(s){if(s.target===r)return;s.target.removeEventListener("scroll",s.handler),rn(s)}let o=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),a=isNaN(o)?200:o,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>a?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[re]=d,q.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function rn(i){let e=q.indexOf(i);e!==-1&&q.splice(e,1)}function on(i){for(let e=q.length-1;e>=0;e--){let t=q[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[re],q.splice(e,1))}}var an="lvt-active",Ye="__lvt_spy",se="__lvt_spy_link_handler",$=[],ln=new WeakSet;function or(){for(let i=$.length-1;i>=0;i--){let e=$[i];e.container.isConnected||(Xe(e),$.splice(i,1))}if($.length===0){let i=document[se];i&&(document.removeEventListener("click",i),delete document[se])}}function Xe(i){ie(i,null),i.scrollTarget.removeEventListener("scroll",i.scrollHandler),window.removeEventListener("resize",i.resizeHandler),delete i.container[Ye]}function Ge(i){let e=getComputedStyle(i).getPropertyValue("--lvt-spy-margin").trim(),t=Math.round(window.innerHeight*.25);if(!e)return t;let n=parseFloat(e);return isNaN(n)?t:e.endsWith("vh")?Math.round(n/100*window.innerHeight):e.endsWith("px")||/^-?\d+(\.\d+)?$/.test(e)?n:(console.warn(`lvt-spy: unsupported --lvt-spy-margin unit ${JSON.stringify(e)}; supported units are vh and px (or unitless). Falling back to 25vh.`),t)}function un(i){let e=i.getAttribute("lvt-spy");if(e&&e.trim()!=="")try{return Array.from(i.querySelectorAll(e))}catch(t){return console.warn(`lvt-spy: invalid selector ${JSON.stringify(e)}:`,t),[]}return[i]}function ie(i,e){for(let t of i.links){let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";e!==null&&r===e?t.classList.add(an):t.classList.remove(an)}}function pn(i){let e=new Set;for(let n of i.targets)n.id&&e.add(n.id);let t=[];document.querySelectorAll("[lvt-spy-link]").forEach(n=>{let r=n.getAttribute("href")||"",s=r.startsWith("#")?r.slice(1):"";e.has(s)&&t.push(n)}),i.links=t}function ar(i){for(let e of $)for(let t of e.targets)if(t.id===i)return e;return null}function xe(i,e){let t=null;for(let n of i){if(!n.id)continue;n.getBoundingClientRect().top<=e&&(t=n.id)}return t}function lr(i){let e=i.parentElement;for(;e&&e!==document.documentElement;){let t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="overlay")return e;e=e.parentElement}return window}function cr(i,e){if(i.length!==e.length)return!1;for(let t=0;t<i.length;t++)if(i[t]!==e[t])return!1;return!0}function cn(i,e){let t=e!=null?e:un(i);if(t.length===0)return;let n=t.filter(o=>!o.id&&!ln.has(o));if(n.length>0){console.warn(`lvt-spy: ${n.length} target(s) without an id attribute; they cannot be linked from [lvt-spy-link]. Add id="..." or drop them from the selector. First offender:`,n[0]);for(let o of n)ln.add(o)}let r={container:i,targets:t,marginPx:Ge(i),links:[],scrollTarget:lr(i),scrollHandler:()=>{},resizeHandler:()=>{}};pn(r);let s=!1;r.scrollHandler=()=>{s||(s=!0,requestAnimationFrame(()=>{s=!1,ie(r,xe(r.targets,r.marginPx))}))},r.resizeHandler=()=>{r.marginPx=Ge(r.container),ie(r,xe(r.targets,r.marginPx))},r.scrollTarget.addEventListener("scroll",r.scrollHandler,{passive:!0}),window.addEventListener("resize",r.resizeHandler,{passive:!0}),i[Ye]=r,$.push(r),ie(r,xe(r.targets,r.marginPx))}function dn(i){let e=i[Ye];if(e){let t=un(i);if(cr(e.targets,t)){e.marginPx=Ge(i),pn(e),ie(e,xe(e.targets,e.marginPx));return}Xe(e);let n=$.indexOf(e);n!==-1&&$.splice(n,1),cn(i,t);return}cn(i)}function dr(){if(document[se])return;let i=e=>{var o;let t=(o=e.target)==null?void 0:o.closest("[lvt-spy-link]");if(!t)return;let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";if(!r)return;let s=ar(r);s&&ie(s,r)};document.addEventListener("click",i,{passive:!0}),document[se]=i}function fn(i){or(),dr(),i.hasAttribute("lvt-spy")&&dn(i),i.querySelectorAll("[lvt-spy]").forEach(dn)}function gn(i){for(let e=$.length-1;e>=0;e--){let t=$[e];i&&t.container.isConnected&&!i.contains(t.container)||(Xe(t),$.splice(e,1))}if($.length===0){let e=document[se];e&&(document.removeEventListener("click",e),delete document[se])}}function hn(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function ur(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function Je(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(ur(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Je(r,e+1))return!0}return!1}function pr(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(Je(i)&&!Je(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var He=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e,t){var c,l;let n=!1,r=[],s=new Set;for(let[d,u]of Object.entries(e))if(Array.isArray(u)&&u.length>0&&Array.isArray(u[0])&&typeof u[0][0]=="string"){let g=this.treeState[d];g&&typeof g=="object"&&!Array.isArray(g)&&Array.isArray(g.d)&&Array.isArray(g.s)?((c=t==null?void 0:t.canApplyTargeted)==null?void 0:c.call(t,g,d))===!0?(this.applyDifferentialOpsToRange(g,u,d),r.push({rangePath:d,ops:u,statics:g.s,idKey:(l=g.m)==null?void 0:l.idKey}),s.add(d)):(this.treeState[d]=hn(g),this.applyDifferentialOpsToRange(this.treeState[d],u,d)):this.treeState[d]=u,n=!0}else{let g=this.treeState[d],h=typeof u=="object"&&u!==null&&!Array.isArray(u)?this.deepMergeTreeNodes(g,u,d):u;JSON.stringify(g)!==JSON.stringify(h)&&(this.treeState[d]=h,n=!0)}let a={html:this.reconstructFromTree(this.treeState,"",s.size>0?s:void 0),changed:n};return r.length>0&&(a.targetedOps=r),a}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}renderState(){return this.reconstructFromTree(this.treeState,"")}deepMergeTreeNodes(e,t,n=""){var s;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(pr(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[o,a]of Object.entries(t)){let c=n?`${n}.${o}`:o,l=Array.isArray(a)&&a.length>0&&Array.isArray(a[0])&&typeof a[0][0]=="string",d=r[o]&&typeof r[o]=="object"&&!Array.isArray(r[o])&&Array.isArray(r[o].d)&&Array.isArray(r[o].s);l&&d?(r[o]=hn(r[o]),this.logger.debug(`[deepMerge] Applying diff ops at path ${c}`,{ops:a,rangeItems:(s=r[o].d)==null?void 0:s.length}),this.applyDifferentialOpsToRange(r[o],a,c)):typeof a=="object"&&a!==null&&!Array.isArray(a)&&typeof r[o]=="object"&&r[o]!==null&&!Array.isArray(r[o])?r[o]=this.deepMergeTreeNodes(r[o],a,c):r[o]=a}return r}applyDifferentialOpsToRange(e,t,n){if(!e||typeof e!="object"||!Array.isArray(e.d)||!Array.isArray(e.s)){this.logger.error(`[applyDiffOpsToRange] Invalid rangeStructure at path ${n}`,{rangeStructure:e});return}let r=e.d;this.rangeState[n]||(this.rangeState[n]={items:r,statics:e.s}),e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[n]=e.m.idKey),this.logger.debug(`[applyDiffOpsToRange] path=${n}, idKey=${this.rangeIdKeys[n]}, items=${r.length}, ops=${t.length}`);for(let s of t){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let a=s[1],c=this.findItemIndexByKey(r,a,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${a}, index=${c}, total=${r.length}`),c>=0?(r.splice(c,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${a} not found`);break}case"u":{let a=this.findItemIndexByKey(r,s[1],e.s,n),c=s[2];a>=0&&c&&(r[a]=this.mergeRangeItem(r[a],c,n));break}case"a":{let a=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.push(...a),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[n]=s[3].idKey);break}case"p":{let a=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.unshift(...a);break}case"i":{let a=this.findItemIndexByKey(r,s[1],e.s,n);if(a>=0){let c=Array.isArray(s[2])?s[2]:[s[2]];r.splice(a+1,0,...c)}break}case"o":{let a=s[1],c=[],l=new Map;for(let d of r){let u=this.getItemKey(d,e.s,n);u&&l.set(u,d)}for(let d of a){let u=l.get(d);u&&c.push(u)}r.length=0,r.push(...c);break}default:break}}this.rangeState[n]={items:r,statics:e.s}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let s=0;s<e.s.length;s++){let o=e.s[s];if(r+=o,s<e.s.length-1){let a=s.toString();if(e[a]!==void 0){let c=t?`${t}.${a}`:a;if(n&&n.has(c)){r+=`<!--lvt-targeted-skip:${c}-->`;continue}r+=this.renderValue(e[a],a,c)}}}return r=r.replace(/<root>/g,"").replace(/<\/root>/g,""),r}return this.renderValue(e,"",t)}renderValue(e,t,n){if(e==null||typeof e=="string"&&e.startsWith("{{")&&e.endsWith("}}"))return"";if(typeof e=="object"&&!Array.isArray(e)){if(e.d&&Array.isArray(e.d)&&e.s&&Array.isArray(e.s)){let o=n||t||"";return o&&(this.rangeState[o]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[o]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),s=r.filter(o=>/^\d+$/.test(o)).sort((o,a)=>parseInt(o)-parseInt(a));if(s.length>0&&s.length===r.length)return s.map(o=>{let a=n?`${n}.${o}`:o;return this.renderValue(e[o],o,a)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,s)=>{let o=s.toString(),a=n?`${n}.${o}`:o;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,a):this.renderValue(r,o,a)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let o="else",a=n?`${n}.else`:"else";return this.renderValue(e.else,o,a)}return""}return s&&Array.isArray(s)?r.map((o,a)=>this.renderRangeItem(o,a,s,n)).join(""):r.map((o,a)=>{let c=a.toString(),l=n?`${n}.${c}`:c;return this.renderValue(o,c,l)}).join("")}renderRangeItem(e,t,n,r){let s=n,o="";for(let a=0;a<s.length;a++)if(o+=s[a],a<s.length-1){let c=a.toString();if(e[c]!==void 0){let l=r?`${r}.${t}.${c}`:`${t}.${c}`;o+=this.renderValue(e[c],c,l)}}return o}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],s=n.statics;for(let a of e){if(!Array.isArray(a)||a.length<2)continue;switch(a[0]){case"r":{let l=this.findItemIndexByKey(r,a[1],s,t);l>=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,a[1],s,t),d=a[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,a[1],a[2],n,!1),a[3]&&typeof a[3]=="object"&&a[3].idKey&&(this.rangeIdKeys[t||""]=a[3].idKey);break}case"p":{this.addItemsToRange(r,a[1],a[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,a[1],s,t);if(l>=0){let d=Array.isArray(a[2])?a[2]:[a[2]];r.splice(l+1,0,...d)}break}case"o":{let l=a[1],d=[],u=new Map;for(let p of r){let g=this.getItemKey(p,s,t);g&&u.set(g,p)}for(let p of l){let g=u.get(p);g&&d.push(g)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics},this.treeState[t]={d:r,s:n.statics};let o=this.getCurrentRangeStructure(t);return o&&o.s?this.renderItemsWithStatics(r,o.s,t):r.map(a=>this.renderValue(a)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n){let r=e.map((s,o)=>this.renderRangeItem(s,o,t,n)).join("");return this.logger.isDebugEnabled()&&(this.logger.debug("[renderItemsWithStatics] statics:",t),this.logger.debug("[renderItemsWithStatics] items count:",e.length),this.logger.debug("[renderItemsWithStatics] result snippet:",r.substring(0,200))),r}addItemsToRange(e,t,n,r,s){if(n&&(r.statics=n),!t)return;let o=Array.isArray(t)?t:[t];s?e.unshift(...o):e.push(...o)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(s=>this.getItemKey(s,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var Qe=["data-key","data-lvt-key"],fr=Qe.map(i=>new RegExp(`(?:^|[\\s<])${i}\\s*=`)),Q="data-lvt-targeted-applied",Z="data-lvt-targeted-skip",Re=class{constructor(e){this.ctx=e;this.containerCache=new Map}invalidate(){this.containerCache.clear()}invalidatePath(e){this.containerCache.delete(e)}findContainer(e,t,n){let r=this.containerCache.get(t);if(r&&r.isConnected&&e.contains(r))return r;if(r&&this.containerCache.delete(t),n===void 0)return null;let s=this.findItemByKey(e,n);if(!s||!s.parentElement)return null;let o=s.parentElement;return this.containerCache.set(t,o),o}canApplyTargeted(e,t,n){if(!t||typeof t!="object")return{ok:!1,reason:"no range structure"};if(!Array.isArray(t.s)||t.s.length===0)return{ok:!1,reason:"no statics"};let r=[t.s];if(t.sm&&typeof t.sm=="object")for(let d of Object.values(t.sm))Array.isArray(d)&&r.push(d);if(!r.some(d=>this.staticsContainKeyAttribute(d)))return{ok:!1,reason:"no data-key attribute in statics"};let o=t.d;if(Array.isArray(o)){for(let d of o)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let a=this.extractItemKey(o==null?void 0:o[0],t),c=this.findContainer(e,n,a);if(!c)return{ok:!1,reason:"container not found in DOM"};let l=c;for(;l;){if(l.hasAttribute("lvt-ignore"))return{ok:!1,reason:"lvt-ignore ancestor"};if(l===e)break;l=l.parentElement}return{ok:!0,container:c,containerKey:a}}apply(e,t,n){let{rangePath:r,ops:s,statics:o}=t,a=this.firstKnownKey(s),c=this.findContainer(e,r,a);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of s){if(!Array.isArray(d)||d.length<1)continue;let u=d[0];try{let p=!0;switch(u){case"r":p=this.applyRemove(c,d[1]);break;case"u":p=this.applyUpdateRow(c,d[1],o,r,n);break;case"i":p=this.applyInsertAfter(c,d[1],d[2],o,r);break;case"a":p=this.applyAppend(c,d[1],o,r);break;case"p":p=this.applyPrepend(c,d[1],o,r);break;case"o":p=this.applyReorder(c,d[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${u}; falling back`),p=!1}p||(l=!1)}catch(p){return this.ctx.logger.error(`[RangeDomApplier] op ${u} failed for range ${r}`,p),null}}return l?(typeof window!="undefined"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,c):null}cleanupMarkers(e){e.querySelectorAll(`[${Q}]`).forEach(r=>r.removeAttribute(Q)),e.hasAttribute(Q)&&e.removeAttribute(Q),e.querySelectorAll(`[${Z}]`).forEach(r=>r.removeAttribute(Z)),e.hasAttribute(Z)&&e.removeAttribute(Z)}applyRemove(e,t){let n=this.findItemByKey(e,t);return n?(this.fireHookOnSubtree(n,"lvt-destroyed"),n.remove(),!0):(this.ctx.logger.debug(`[RangeDomApplier] r: row with key ${t} not found (idempotent no-op)`),!0)}applyUpdateRow(e,t,n,r,s){var u,p;let o=this.findItemByKey(e,t);if(!o)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let a=this.indexOfChild(e,o),c=this.lookupCurrentItem(r,t);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let l=this.ctx.renderItem(c,a,n,r),d=this.parseSingleRow(l);return d?(s?fe(o,d,{...s,childrenOnly:!1}):(this.fireHookOnSubtree(o,"lvt-destroyed"),o.replaceWith(d),(p=(u=this.ctx).onNodeAdded)==null||p.call(u,d),this.fireHookOnSubtree(d,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,s){let o=this.findItemByKey(e,t);return o?this.renderItemsAtomic(n,r,s,this.indexOfChild(e,o)+1,a=>e.insertBefore(a,o.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r){return this.renderItemsAtomic(t,n,r,e.children.length,s=>e.appendChild(s))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,s=>e.insertBefore(s,e.firstChild))}renderItemsAtomic(e,t,n,r,s){var l,d;let o=Array.isArray(e)?e:[e],a=document.createDocumentFragment(),c=[];for(let u=0;u<o.length;u++){let p=this.renderAndParse(o[u],r+u,t,n);if(!p)return!1;a.appendChild(p),c.push(p)}s(a);for(let u of c)(d=(l=this.ctx).onNodeAdded)==null||d.call(l,u),this.fireHookOnSubtree(u,"lvt-mounted");return!0}applyReorder(e,t){if(!Array.isArray(t))return!1;let n=new Map;Array.from(e.children).forEach(o=>{for(let a of Qe){let c=o.getAttribute(a);if(c!==null){n.set(c,o);break}}});let r=document.createDocumentFragment(),s=new Set(t);for(let o of t){let a=n.get(o);a&&r.appendChild(a)}if(s.size<n.size){this.ctx.logger.warn(`[RangeDomApplier] o: newKeyOrder (${s.size}) shorter than existing children (${n.size}); ${n.size-s.size} children will be dropped`);for(let[o,a]of n)s.has(o)||this.fireHookOnSubtree(a,"lvt-destroyed")}return e.replaceChildren(r),!0}renderAndParse(e,t,n,r){let s=this.ctx.renderItem(e,t,n,r);return this.parseSingleRow(s)}parseSingleRow(e){let t=document.createElement("template");t.innerHTML=e.trim();let n=t.content.firstElementChild;return n!=null?n:null}findItemByKey(e,t){let n;typeof CSS!="undefined"&&typeof CSS.escape=="function"?n=CSS.escape(t):(/[\[\]():.#>~+*=^$|! \t\n\r]/.test(t)&&this.ctx.logger.warn(`[RangeDomApplier] CSS.escape unavailable; key "${t}" contains characters that need escaping. Lookup may miss the row.`),n=t.replace(/(["\\])/g,"\\$1"));for(let r of Qe){let s=e.querySelector(`[${r}="${n}"]`);if(s)return s}return null}indexOfChild(e,t){let n=0,r=e.firstElementChild;for(;r;){if(r===t)return n;n++,r=r.nextElementSibling}return-1}firstKnownKey(e){for(let t of e){if(!Array.isArray(t)||t.length<2)continue;let n=t[0];if(n==="r"||n==="u"||n==="i")return typeof t[1]=="string"?t[1]:void 0;if(n==="o"&&Array.isArray(t[1])&&t[1].length>0)return typeof t[1][0]=="string"?t[1][0]:void 0;if(n==="a"||n==="p"){let r=Array.isArray(t[1])?t[1]:[t[1]];for(let s of r)if(s&&typeof s=="object"&&s._k!==void 0)return String(s._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of fr)if(n.test(t))return!0}return!1}itemHasNestedRange(e){if(!e||typeof e!="object")return!1;for(let[t,n]of Object.entries(e))if(!t.startsWith("_")&&n&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.d)&&Array.isArray(r.s)||this.itemHasNestedRange(r))return!0}return!1}extractItemKey(e,t){var r;if(!e||typeof e!="object")return;if(e._k!==void 0)return String(e._k);let n=(r=t==null?void 0:t.m)==null?void 0:r.idKey;if(n&&e[n]!==void 0)return String(e[n])}lookupCurrentItem(e,t){return this.ctx.itemLookup(e,t)}fireHookOnSubtree(e,t){e.hasAttribute(t)&&this.ctx.executeLifecycleHook(e,t),e.querySelectorAll(`[${t}]`).forEach(r=>this.ctx.executeLifecycleHook(r,t))}};var Ce=class{constructor(){this.activeForm=null;this.activeButton=null;this.originalButtonText=null}setActiveSubmission(e,t,n){if(this.activeForm=e,this.activeButton=t,this.originalButtonText=n,e){e.setAttribute("aria-busy","true");let r=e.querySelector("fieldset");r&&(r.disabled=!0)}}handleResponse(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:done",{detail:e})),e.success?this.handleSuccess(e):this.handleError(e),this.restoreFormState()}reset(){this.restoreFormState()}handleSuccess(e){if(!this.activeForm)return;this.activeForm.dispatchEvent(new CustomEvent("lvt:success",{detail:e}));let t=this.activeForm.closest("dialog");t&&t.open&&t.close(),this.activeForm.hasAttribute("lvt-form:preserve")||this.activeForm.reset()}handleError(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:error",{detail:e}))}restoreFormState(){if(this.activeForm){this.activeForm.removeAttribute("aria-busy");let e=this.activeForm.querySelector("fieldset");e&&(e.disabled=!1)}this.activeButton&&this.originalButtonText!==null&&(this.activeButton.disabled=!1,this.activeButton.textContent=this.originalButtonText),this.activeForm=null,this.activeButton=null,this.originalButtonText=null}};var De=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let s=this.escapeCSSSelector(n),o=e.querySelectorAll(`[name="${s}"]`);for(let a of o){if(this.wiredElements.has(a)||a.hasAttribute("lvt-input")||a.hasAttribute("lvt-change"))continue;let c=a.closest("form");c&&(c.hasAttribute("lvt-change")||ne(c,"lvt-form:no-intercept",this.logger))||a instanceof HTMLInputElement&&(a.type==="hidden"||a.type==="submit"||a.type==="button")||a instanceof HTMLButtonElement||(this.attachListener(a,n,r),this.wiredElements.add(a))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let s=n.getAttribute("name");s&&(this.attachListener(n,s,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],s=this.detectBinding(n,r);s&&!this.boundFields.has(s.fieldName)&&this.boundFields.set(s.fieldName,s.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let s=r[1].toLowerCase();return s!=="checkbox"&&s!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),s=r?parseInt(r,10):NaN,o=Number.isNaN(s)||s<0?300:s,c=ce(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},o),l=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(l,c),this.elementCleanups.set(e,()=>{e.removeEventListener(l,c)}),this.logger.debug(`Auto-wired ${l} listener on [name="${t}"] (debounce: ${o}ms)`)}};var Ze=class{constructor(e){this.options=e;this.socket=null;this.reconnectTimer=null;this.manuallyClosed=!1;this.reconnectAttempts=0}connect(){this.manuallyClosed=!1,this.clearReconnectTimer(),this.socket=new WebSocket(this.options.url);let e=this.socket;e.onopen=()=>{var t,n;this.reconnectAttempts=0,(n=(t=this.options).onOpen)==null||n.call(t,e)},e.onmessage=t=>{var n,r;(r=(n=this.options).onMessage)==null||r.call(n,t)},e.onclose=t=>{var n,r;(r=(n=this.options).onClose)==null||r.call(n,t),!this.manuallyClosed&&this.options.autoReconnect&&this.scheduleReconnect()},e.onerror=t=>{var n,r;(r=(n=this.options).onError)==null||r.call(n,t)}}send(e){this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}disconnect(){var e,t;this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.readyState!==WebSocket.CLOSED&&((t=(e=this.options).onClose)==null||t.call(e,new CloseEvent("close",{code:1e3,reason:"",wasClean:this.socket.readyState===WebSocket.OPEN}))),this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){var a,c,l,d,u;this.clearReconnectTimer();let e=(a=this.options.maxReconnectAttempts)!=null?a:10;if(e>0&&this.reconnectAttempts>=e){(l=(c=this.options).onReconnectFailed)==null||l.call(c);return}this.reconnectAttempts++;let t=(d=this.options.reconnectDelay)!=null?d:1e3,n=(u=this.options.maxReconnectDelay)!=null?u:16e3,r=t*Math.pow(2,this.reconnectAttempts-1),s=Math.random()*1e3,o=Math.min(r+s,n);this.reconnectTimer=window.setTimeout(()=>{var p,g;(g=(p=this.options).onReconnectAttempt)==null||g.call(p,this.reconnectAttempts,o),this.connect()},o)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},Ie=class{constructor(e){this.config=e;this.transport=null;this.liveUrlOverride=null}setLiveUrl(e){this.liveUrlOverride=e}async connect(){var d;let e=this.getLiveUrl();if(!await hr(e,this.config.logger))return{usingWebSocket:!1,initialState:await mn(e,this.config.logger)};let n,r,s=new Promise((u,p)=>{n=u,r=p}),o=!1,a=!1,c=null,l=u=>{o||(o=!0,c!==null&&(clearTimeout(c),c=null),u?r(u):n({usingWebSocket:!0}))};c=setTimeout(()=>{l(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Ze({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{a=!0,this.config.onConnected(),l()},onMessage:u=>{try{let p=JSON.parse(u.data);this.config.onMessage(p,u)}catch(p){this.config.logger.error("Failed to parse WebSocket message:",p)}},onClose:()=>{a?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(u,p)=>{var g,h;(h=(g=this.config).onReconnectAttempt)==null||h.call(g,u,p)},onReconnectFailed:()=>{var u,p;(p=(u=this.config).onReconnectFailed)==null||p.call(u)},onError:u=>{var p,g;(g=(p=this.config).onError)==null||g.call(p,u),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await s}catch(u){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",u),(d=this.transport)==null||d.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await mn(e,this.config.logger)}}}disconnect(){var e;(e=this.transport)==null||e.disconnect(),this.transport=null}send(e){var t;(t=this.transport)==null||t.send(e)}getReadyState(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())==null?void 0:t.readyState}getSocket(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())!=null?t:null}getWebSocketUrl(){let e=this.liveUrlOverride||this.config.options.liveUrl||"/live",t=this.config.options.wsUrl;return t||`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${e}`}getLiveUrl(){return this.liveUrlOverride||this.config.options.liveUrl||window.location.pathname+window.location.search}};async function hr(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e==null||e.warn("Failed to check WebSocket availability:",t),!0}}async function mn(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e==null||e.warn("Failed to fetch initial state:",t),null}}var Oe=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let s=new XMLHttpRequest;s.upload.addEventListener("progress",a=>{a.lengthComputable&&(e.bytesUploaded=a.loaded,e.progress=Math.round(a.loaded/a.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{s.abort()});let o=new Promise((a,c)=>{s.addEventListener("load",()=>{s.status>=200&&s.status<300?(e.done=!0,e.progress=100,a()):c(new Error(`S3 upload failed with status ${s.status}: ${s.statusText}`))}),s.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),s.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(s.open("PUT",t.url),t.headers)for(let[a,c]of Object.entries(t.headers))s.setRequestHeader(a,c);s.send(r),await o}catch(s){throw e.error=s instanceof Error?s.message:String(s),s}}};var _e=class{constructor(e,t={}){this.sendMessage=e;this.entries=new Map;this.pendingFiles=new Map;this.autoUploadConfig=new Map;this.uploaders=new Map;this.pendingHandshakes=new Set;this.pendingUploads=new Set;this.previewUrls=new Map;this.inputHandlers=new WeakMap;this.chunkSize=t.chunkSize||256*1024,this.onProgress=t.onProgress,this.onComplete=t.onComplete,this.onError=t.onError,this.postMultipartUpload=t.postMultipartUpload,this.isConnected=t.isConnected,this.postUploadStart=t.postUploadStart,this.uploaders.set("s3",new Oe)}dispatchUpload(e){switch(e.mode){case"preview":this.uploadPreview(e);return;case"proxied":this.uploadProxied(e);return;case"direct":if(e.external)this.uploadExternal(e,e.external);else{let t="direct upload mode requires presigned upload metadata";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName)}return;case"volume":default:this.uploadChunked(e)}}finishUpload(e){e.done=!0,e.progress=100,this.onProgress&&this.onProgress(e),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let s=this.inputHandlers.get(n);s&&n.removeEventListener("change",s);let o=a=>{let c=a.target.files;!c||c.length===0||this.startUpload(r,Array.from(c))};n.addEventListener("change",o),this.inputHandlers.set(n,o)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(o=>({name:o.name,type:o.type||"application/octet-stream",size:o.size})),r={action:"upload_start",upload_name:e,files:n};if(!(this.isConnected?this.isConnected():!0)){if(!this.postUploadStart){this.failStart(e,t,"upload unavailable: WebSocket is closed and no HTTP fallback is configured");return}let o=new AbortController;this.pendingHandshakes.add(o);try{let a=await this.postUploadStart(r,o.signal);o.signal.aborted||await this.handleUploadStartResponse(a)}catch(a){this.failStart(e,t,a instanceof Error?a.message:String(a))}finally{this.pendingHandshakes.delete(o)}return}this.sendMessage(r)}failStart(e,t,n){this.pendingFiles.delete(e);let r=this.onError;r&&t.forEach((s,o)=>{r({id:`pending-${e}-${o}`,file:s,uploadName:e,progress:0,bytesUploaded:0,valid:!1,done:!1},n)})}async handleUploadStartResponse(e){var a;let{upload_name:t,entries:n}=e;n.length>0&&this.autoUploadConfig.set(t,n[0].auto_upload);let r=this.pendingFiles.get(t);if(!r){console.error(`No pending files found for upload: ${t}`);return}this.pendingFiles.delete(t);let s=new Map;for(let c of r)s.set(c.name,c);let o=[];for(let c of n){let l=s.get(c.client_name);if(!l){console.warn(`No file found for entry ${c.entry_id} (client_name: ${c.client_name})`);continue}let d={id:c.entry_id,file:l,uploadName:t,progress:0,bytesUploaded:0,valid:c.valid,done:!1,error:c.error,mode:(a=c.mode)!=null?a:c.external?"direct":"volume",external:c.external};if(this.entries.set(d.id,d),o.push(d),!c.valid){this.onError&&c.error&&this.onError(d,c.error);continue}c.auto_upload&&this.dispatchUpload(d)}}async uploadExternal(e,t){try{let n=this.uploaders.get(t.uploader);if(!n)throw new Error(`Unknown uploader: ${t.uploader}`);await n.upload(e,t,this.onProgress);let r={action:"upload_complete",upload_name:e.uploadName,entry_ids:[e.id]};this.sendMessage(r),this.finishUpload(e)}catch(n){let r=n instanceof Error?n.message:String(n);e.error=r,this.onError&&this.onError(e,r),this.cleanupEntries(e.uploadName)}}async uploadProxied(e){if(!this.postMultipartUpload){let t="Proxied upload unavailable: no multipart transport configured";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName);return}e.abortController=new AbortController,this.pendingUploads.add(e.abortController),this.onProgress&&this.onProgress(e);try{let t=new FormData;t.set("lvt-action",`upload_${e.uploadName}_complete`),t.set(e.uploadName,e.file,e.file.name),await this.postMultipartUpload(t,e.abortController.signal),this.finishUpload(e)}catch(t){let n=t instanceof Error?t.message:String(t);e.error=n,this.onError&&this.onError(e,n),this.cleanupEntries(e.uploadName)}finally{e.abortController&&this.pendingUploads.delete(e.abortController)}}uploadPreview(e){let t=this.previewUrls.get(e.uploadName);t&&URL.revokeObjectURL(t);let n=URL.createObjectURL(e.file);this.previewUrls.set(e.uploadName,n),this.applyPreview(e.uploadName,n),this.finishUpload(e)}applyPreview(e,t){let n;if(typeof CSS!="undefined"&&CSS.escape)n=CSS.escape(e);else if(/^[\w-]+$/.test(e))n=e;else return;document.querySelectorAll(`[data-lvt-upload-preview="${n}"]`).forEach(s=>{s instanceof HTMLImageElement?s.src!==t&&(s.src=t):s.getAttribute("src")!==t&&s.setAttribute("src",t)})}hydratePreviews(e){let t=n=>{let r=n.getAttribute("data-lvt-upload-preview");if(!r)return;let s=this.previewUrls.get(r);s&&(n instanceof HTMLImageElement?n.src!==s&&(n.src=s):n.getAttribute("src")!==s&&n.setAttribute("src",s))};e.matches("[data-lvt-upload-preview]")&&t(e),e.querySelectorAll("[data-lvt-upload-preview]").forEach(t)}revokePreviews(){for(let e of this.pendingHandshakes)e.abort();this.pendingHandshakes.clear();for(let e of this.pendingUploads)e.abort();this.pendingUploads.clear();for(let e of this.previewUrls.values())URL.revokeObjectURL(e);this.previewUrls.clear()}async uploadChunked(e){let{file:t,id:n}=e,r=0;e.abortController=new AbortController;try{for(;r<t.size;){if(e.abortController.signal.aborted)throw new Error("Upload cancelled");let o=Math.min(r+this.chunkSize,t.size),a=t.slice(r,o),c=await this.fileToBase64(a),l={action:"upload_chunk",entry_id:n,chunk_base64:c,offset:r,total:t.size};this.sendMessage(l),r=o,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let s={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(s),this.finishUpload(e)}catch(s){let o=s instanceof Error?s.message:String(s);e.error=o,this.onError&&this.onError(e,o),this.cleanupEntries(e.uploadName)}}handleProgressMessage(e){let t=this.entries.get(e.entry_id);t&&(t.progress=e.progress,t.bytesUploaded=e.bytes_recv,this.onProgress&&this.onProgress(t))}cancelUpload(e){let t=this.entries.get(e);t&&(t.abortController&&t.abortController.abort(),this.sendMessage({action:"cancel_upload",entry_id:e}),this.entries.delete(e))}getEntries(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&t.push(n);return t}triggerPendingUploads(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&n.progress===0&&!n.done&&!n.error&&t.push(n);for(let n of t)this.dispatchUpload(n)}registerUploader(e,t){this.uploaders.set(e,t)}clearFileInput(e){document.querySelectorAll(`input[type="file"][lvt-upload="${e}"]`).forEach(n=>{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,s]of this.entries)e&&s.uploadName!==e||(s.done||s.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let o=r.result.split(",")[1];t(o)},r.onerror=n,r.readAsDataURL(e)})}};var vn={silent:0,error:1,warn:2,info:3,debug:4},yn="LiveTemplate",et=class i{constructor(e,t=[],n=console){this.state=e;this.scope=t;this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return vn[e]<=vn[this.state.level]}formatPrefix(){return this.scope.length===0?`[${yn}]`:`[${yn}:${this.scope.join(":")}]`}};function tt(i={}){var n,r;let e={level:(n=i.level)!=null?n:"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new et(e,t,(r=i.sink)!=null?r:console)}async function bn(i,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let s=t("fs"),o=JSON.parse(s.readFileSync(e,"utf8"));return i.applyUpdate(o)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function En(i,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(i),s=n(e);if(r===s)return{match:!0,differences:[]};let o=r.split(`
|
|
29
|
+
`,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}enablePerActionIndicator(e){if(this.pendingHandler){if(this.currentDebounceMs===e)return;this.disablePerActionIndicator()}this.pendingCount=0,this.currentDebounceMs=e,this.pendingHandler=()=>{this.pendingCount++,this.pendingCount===1&&this.actionTimer===null&&this.bar===null&&(this.actionTimer=setTimeout(()=>{this.actionTimer=null,this.pendingCount>0&&this.show()},e))},this.updatedHandler=()=>{this.pendingCount=Math.max(0,this.pendingCount-1),this.pendingCount===0&&(this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.hide())},document.addEventListener("lvt:pending",this.pendingHandler,!0),document.addEventListener("lvt:updated",this.updatedHandler,!0)}disablePerActionIndicator(){this.pendingHandler&&(document.removeEventListener("lvt:pending",this.pendingHandler,!0),this.pendingHandler=null),this.updatedHandler&&(document.removeEventListener("lvt:updated",this.updatedHandler,!0),this.updatedHandler=null),this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.pendingCount=0,this.currentDebounceMs=null,this.hide()}};var Me=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!1})})}};var tn=!1;function ir(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),s=document.getElementById(n);s&&(s instanceof HTMLDialogElement?r==="show-modal"&&!s.open?s.showModal():r==="close"&&s.open&&s.close():s instanceof HTMLElement&&s.hasAttribute("popover")&&(r==="show-popover"&&typeof s.showPopover=="function"?s.showPopover():r==="hide-popover"&&typeof s.hidePopover=="function"?s.hidePopover():r==="toggle-popover"&&typeof s.togglePopover=="function"&&s.togglePopover()))}function nn(){"commandForElement"in HTMLButtonElement.prototype||tn||(tn=!0,document.addEventListener("click",ir))}var re="__lvt_scroll_away",q=[];function sr(){for(let i=q.length-1;i>=0;i--){let e=q[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[re],q.splice(i,1))}}function sn(i){sr();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"&&n!=="top"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=G(t);if(!r||r===t){let u=t[re];u&&(u.target.removeEventListener("scroll",u.handler),rn(u),delete t[re]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let s=t[re];if(s){if(s.target===r)return;s.target.removeEventListener("scroll",s.handler),rn(s)}let o=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),a=isNaN(o)?200:o,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>a?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[re]=d,q.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function rn(i){let e=q.indexOf(i);e!==-1&&q.splice(e,1)}function on(i){for(let e=q.length-1;e>=0;e--){let t=q[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[re],q.splice(e,1))}}var an="lvt-active",Ye="__lvt_spy",se="__lvt_spy_link_handler",$=[],ln=new WeakSet;function or(){for(let i=$.length-1;i>=0;i--){let e=$[i];e.container.isConnected||(Xe(e),$.splice(i,1))}if($.length===0){let i=document[se];i&&(document.removeEventListener("click",i),delete document[se])}}function Xe(i){ie(i,null),i.scrollTarget.removeEventListener("scroll",i.scrollHandler),window.removeEventListener("resize",i.resizeHandler),delete i.container[Ye]}function Ge(i){let e=getComputedStyle(i).getPropertyValue("--lvt-spy-margin").trim(),t=Math.round(window.innerHeight*.25);if(!e)return t;let n=parseFloat(e);return isNaN(n)?t:e.endsWith("vh")?Math.round(n/100*window.innerHeight):e.endsWith("px")||/^-?\d+(\.\d+)?$/.test(e)?n:(console.warn(`lvt-spy: unsupported --lvt-spy-margin unit ${JSON.stringify(e)}; supported units are vh and px (or unitless). Falling back to 25vh.`),t)}function un(i){let e=i.getAttribute("lvt-spy");if(e&&e.trim()!=="")try{return Array.from(i.querySelectorAll(e))}catch(t){return console.warn(`lvt-spy: invalid selector ${JSON.stringify(e)}:`,t),[]}return[i]}function ie(i,e){for(let t of i.links){let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";e!==null&&r===e?t.classList.add(an):t.classList.remove(an)}}function pn(i){let e=new Set;for(let n of i.targets)n.id&&e.add(n.id);let t=[];document.querySelectorAll("[lvt-spy-link]").forEach(n=>{let r=n.getAttribute("href")||"",s=r.startsWith("#")?r.slice(1):"";e.has(s)&&t.push(n)}),i.links=t}function ar(i){for(let e of $)for(let t of e.targets)if(t.id===i)return e;return null}function xe(i,e){let t=null;for(let n of i){if(!n.id)continue;n.getBoundingClientRect().top<=e&&(t=n.id)}return t}function lr(i){let e=i.parentElement;for(;e&&e!==document.documentElement;){let t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="overlay")return e;e=e.parentElement}return window}function cr(i,e){if(i.length!==e.length)return!1;for(let t=0;t<i.length;t++)if(i[t]!==e[t])return!1;return!0}function cn(i,e){let t=e!=null?e:un(i);if(t.length===0)return;let n=t.filter(o=>!o.id&&!ln.has(o));if(n.length>0){console.warn(`lvt-spy: ${n.length} target(s) without an id attribute; they cannot be linked from [lvt-spy-link]. Add id="..." or drop them from the selector. First offender:`,n[0]);for(let o of n)ln.add(o)}let r={container:i,targets:t,marginPx:Ge(i),links:[],scrollTarget:lr(i),scrollHandler:()=>{},resizeHandler:()=>{}};pn(r);let s=!1;r.scrollHandler=()=>{s||(s=!0,requestAnimationFrame(()=>{s=!1,ie(r,xe(r.targets,r.marginPx))}))},r.resizeHandler=()=>{r.marginPx=Ge(r.container),ie(r,xe(r.targets,r.marginPx))},r.scrollTarget.addEventListener("scroll",r.scrollHandler,{passive:!0}),window.addEventListener("resize",r.resizeHandler,{passive:!0}),i[Ye]=r,$.push(r),ie(r,xe(r.targets,r.marginPx))}function dn(i){let e=i[Ye];if(e){let t=un(i);if(cr(e.targets,t)){e.marginPx=Ge(i),pn(e),ie(e,xe(e.targets,e.marginPx));return}Xe(e);let n=$.indexOf(e);n!==-1&&$.splice(n,1),cn(i,t);return}cn(i)}function dr(){if(document[se])return;let i=e=>{var o;let t=(o=e.target)==null?void 0:o.closest("[lvt-spy-link]");if(!t)return;let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";if(!r)return;let s=ar(r);s&&ie(s,r)};document.addEventListener("click",i,{passive:!0}),document[se]=i}function fn(i){or(),dr(),i.hasAttribute("lvt-spy")&&dn(i),i.querySelectorAll("[lvt-spy]").forEach(dn)}function gn(i){for(let e=$.length-1;e>=0;e--){let t=$[e];i&&t.container.isConnected&&!i.contains(t.container)||(Xe(t),$.splice(e,1))}if($.length===0){let e=document[se];e&&(document.removeEventListener("click",e),delete document[se])}}function hn(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function ur(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function Je(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(ur(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Je(r,e+1))return!0}return!1}function pr(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(Je(i)&&!Je(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var He=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e,t){var c,l;let n=!1,r=[],s=new Set;for(let[d,u]of Object.entries(e))if(Array.isArray(u)&&u.length>0&&Array.isArray(u[0])&&typeof u[0][0]=="string"){let g=this.treeState[d];g&&typeof g=="object"&&!Array.isArray(g)&&Array.isArray(g.d)&&Array.isArray(g.s)?((c=t==null?void 0:t.canApplyTargeted)==null?void 0:c.call(t,g,d))===!0?(this.applyDifferentialOpsToRange(g,u,d),r.push({rangePath:d,ops:u,statics:g.s,idKey:(l=g.m)==null?void 0:l.idKey}),s.add(d)):(this.treeState[d]=hn(g),this.applyDifferentialOpsToRange(this.treeState[d],u,d)):this.treeState[d]=u,n=!0}else{let g=this.treeState[d],h=typeof u=="object"&&u!==null&&!Array.isArray(u)?this.deepMergeTreeNodes(g,u,d):u;JSON.stringify(g)!==JSON.stringify(h)&&(this.treeState[d]=h,n=!0)}let a={html:this.reconstructFromTree(this.treeState,"",s.size>0?s:void 0),changed:n};return r.length>0&&(a.targetedOps=r),a}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}renderState(){return this.reconstructFromTree(this.treeState,"")}deepMergeTreeNodes(e,t,n=""){var s;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(pr(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[o,a]of Object.entries(t)){let c=n?`${n}.${o}`:o,l=Array.isArray(a)&&a.length>0&&Array.isArray(a[0])&&typeof a[0][0]=="string",d=r[o]&&typeof r[o]=="object"&&!Array.isArray(r[o])&&Array.isArray(r[o].d)&&Array.isArray(r[o].s);l&&d?(r[o]=hn(r[o]),this.logger.debug(`[deepMerge] Applying diff ops at path ${c}`,{ops:a,rangeItems:(s=r[o].d)==null?void 0:s.length}),this.applyDifferentialOpsToRange(r[o],a,c)):typeof a=="object"&&a!==null&&!Array.isArray(a)&&typeof r[o]=="object"&&r[o]!==null&&!Array.isArray(r[o])?r[o]=this.deepMergeTreeNodes(r[o],a,c):r[o]=a}return r}applyDifferentialOpsToRange(e,t,n){if(!e||typeof e!="object"||!Array.isArray(e.d)||!Array.isArray(e.s)){this.logger.error(`[applyDiffOpsToRange] Invalid rangeStructure at path ${n}`,{rangeStructure:e});return}let r=e.d;this.rangeState[n]||(this.rangeState[n]={items:r,statics:e.s}),e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[n]=e.m.idKey),this.logger.debug(`[applyDiffOpsToRange] path=${n}, idKey=${this.rangeIdKeys[n]}, items=${r.length}, ops=${t.length}`);for(let s of t){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let a=s[1],c=this.findItemIndexByKey(r,a,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${a}, index=${c}, total=${r.length}`),c>=0?(r.splice(c,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${a} not found`);break}case"u":{let a=this.findItemIndexByKey(r,s[1],e.s,n),c=s[2];a>=0&&c&&(r[a]=this.mergeRangeItem(r[a],c,n));break}case"a":{let a=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.push(...a),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[n]=s[3].idKey);break}case"p":{let a=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.unshift(...a);break}case"i":{let a=this.findItemIndexByKey(r,s[1],e.s,n);if(a>=0){let c=Array.isArray(s[2])?s[2]:[s[2]];r.splice(a+1,0,...c)}break}case"o":{let a=s[1],c=[],l=new Map;for(let d of r){let u=this.getItemKey(d,e.s,n);u&&l.set(u,d)}for(let d of a){let u=l.get(d);u&&c.push(u)}r.length=0,r.push(...c);break}default:break}}this.rangeState[n]={items:r,statics:e.s}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let s=0;s<e.s.length;s++){let o=e.s[s];if(r+=o,s<e.s.length-1){let a=s.toString();if(e[a]!==void 0){let c=t?`${t}.${a}`:a;if(n&&n.has(c)){r+=`<!--lvt-targeted-skip:${c}-->`;continue}r+=this.renderValue(e[a],a,c)}}}return r=r.replace(/<root>/g,"").replace(/<\/root>/g,""),r}return this.renderValue(e,"",t)}renderValue(e,t,n){if(e==null||typeof e=="string"&&e.startsWith("{{")&&e.endsWith("}}"))return"";if(typeof e=="object"&&!Array.isArray(e)){if(e.d&&Array.isArray(e.d)&&e.s&&Array.isArray(e.s)){let o=n||t||"";return o&&(this.rangeState[o]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[o]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),s=r.filter(o=>/^\d+$/.test(o)).sort((o,a)=>parseInt(o)-parseInt(a));if(s.length>0&&s.length===r.length)return s.map(o=>{let a=n?`${n}.${o}`:o;return this.renderValue(e[o],o,a)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,s)=>{let o=s.toString(),a=n?`${n}.${o}`:o;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,a):this.renderValue(r,o,a)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let o="else",a=n?`${n}.else`:"else";return this.renderValue(e.else,o,a)}return""}return s&&Array.isArray(s)?r.map((o,a)=>this.renderRangeItem(o,a,s,n)).join(""):r.map((o,a)=>{let c=a.toString(),l=n?`${n}.${c}`:c;return this.renderValue(o,c,l)}).join("")}renderRangeItem(e,t,n,r){let s=n,o="";for(let a=0;a<s.length;a++)if(o+=s[a],a<s.length-1){let c=a.toString();if(e[c]!==void 0){let l=r?`${r}.${t}.${c}`:`${t}.${c}`;o+=this.renderValue(e[c],c,l)}}return o}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],s=n.statics;for(let a of e){if(!Array.isArray(a)||a.length<2)continue;switch(a[0]){case"r":{let l=this.findItemIndexByKey(r,a[1],s,t);l>=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,a[1],s,t),d=a[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,a[1],a[2],n,!1),a[3]&&typeof a[3]=="object"&&a[3].idKey&&(this.rangeIdKeys[t||""]=a[3].idKey);break}case"p":{this.addItemsToRange(r,a[1],a[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,a[1],s,t);if(l>=0){let d=Array.isArray(a[2])?a[2]:[a[2]];r.splice(l+1,0,...d)}break}case"o":{let l=a[1],d=[],u=new Map;for(let p of r){let g=this.getItemKey(p,s,t);g&&u.set(g,p)}for(let p of l){let g=u.get(p);g&&d.push(g)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics},this.treeState[t]={d:r,s:n.statics};let o=this.getCurrentRangeStructure(t);return o&&o.s?this.renderItemsWithStatics(r,o.s,t):r.map(a=>this.renderValue(a)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n){let r=e.map((s,o)=>this.renderRangeItem(s,o,t,n)).join("");return this.logger.isDebugEnabled()&&(this.logger.debug("[renderItemsWithStatics] statics:",t),this.logger.debug("[renderItemsWithStatics] items count:",e.length),this.logger.debug("[renderItemsWithStatics] result snippet:",r.substring(0,200))),r}addItemsToRange(e,t,n,r,s){if(n&&(r.statics=n),!t)return;let o=Array.isArray(t)?t:[t];s?e.unshift(...o):e.push(...o)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(s=>this.getItemKey(s,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var Qe=["data-key","data-lvt-key"],fr=Qe.map(i=>new RegExp(`(?:^|[\\s<])${i}\\s*=`)),Q="data-lvt-targeted-applied",Z="data-lvt-targeted-skip",Re=class{constructor(e){this.ctx=e;this.containerCache=new Map}invalidate(){this.containerCache.clear()}invalidatePath(e){this.containerCache.delete(e)}findContainer(e,t,n){let r=this.containerCache.get(t);if(r&&r.isConnected&&e.contains(r))return r;if(r&&this.containerCache.delete(t),n===void 0)return null;let s=this.findItemByKey(e,n);if(!s||!s.parentElement)return null;let o=s.parentElement;return this.containerCache.set(t,o),o}canApplyTargeted(e,t,n){if(!t||typeof t!="object")return{ok:!1,reason:"no range structure"};if(!Array.isArray(t.s)||t.s.length===0)return{ok:!1,reason:"no statics"};let r=[t.s];if(t.sm&&typeof t.sm=="object")for(let d of Object.values(t.sm))Array.isArray(d)&&r.push(d);if(!r.some(d=>this.staticsContainKeyAttribute(d)))return{ok:!1,reason:"no data-key attribute in statics"};let o=t.d;if(Array.isArray(o)){for(let d of o)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let a=this.extractItemKey(o==null?void 0:o[0],t),c=this.findContainer(e,n,a);if(!c)return{ok:!1,reason:"container not found in DOM"};let l=c;for(;l;){if(l.hasAttribute("lvt-ignore"))return{ok:!1,reason:"lvt-ignore ancestor"};if(l===e)break;l=l.parentElement}return{ok:!0,container:c,containerKey:a}}apply(e,t,n){let{rangePath:r,ops:s,statics:o}=t,a=this.firstKnownKey(s),c=this.findContainer(e,r,a);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of s){if(!Array.isArray(d)||d.length<1)continue;let u=d[0];try{let p=!0;switch(u){case"r":p=this.applyRemove(c,d[1]);break;case"u":p=this.applyUpdateRow(c,d[1],o,r,n);break;case"i":p=this.applyInsertAfter(c,d[1],d[2],o,r);break;case"a":p=this.applyAppend(c,d[1],o,r);break;case"p":p=this.applyPrepend(c,d[1],o,r);break;case"o":p=this.applyReorder(c,d[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${u}; falling back`),p=!1}p||(l=!1)}catch(p){return this.ctx.logger.error(`[RangeDomApplier] op ${u} failed for range ${r}`,p),null}}return l?(typeof window!="undefined"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,c):null}cleanupMarkers(e){e.querySelectorAll(`[${Q}]`).forEach(r=>r.removeAttribute(Q)),e.hasAttribute(Q)&&e.removeAttribute(Q),e.querySelectorAll(`[${Z}]`).forEach(r=>r.removeAttribute(Z)),e.hasAttribute(Z)&&e.removeAttribute(Z)}applyRemove(e,t){let n=this.findItemByKey(e,t);return n?(this.fireHookOnSubtree(n,"lvt-destroyed"),n.remove(),!0):(this.ctx.logger.debug(`[RangeDomApplier] r: row with key ${t} not found (idempotent no-op)`),!0)}applyUpdateRow(e,t,n,r,s){var u,p;let o=this.findItemByKey(e,t);if(!o)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let a=this.indexOfChild(e,o),c=this.lookupCurrentItem(r,t);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let l=this.ctx.renderItem(c,a,n,r),d=this.parseSingleRow(l);return d?(s?fe(o,d,{...s,childrenOnly:!1}):(this.fireHookOnSubtree(o,"lvt-destroyed"),o.replaceWith(d),(p=(u=this.ctx).onNodeAdded)==null||p.call(u,d),this.fireHookOnSubtree(d,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,s){let o=this.findItemByKey(e,t);return o?this.renderItemsAtomic(n,r,s,this.indexOfChild(e,o)+1,a=>e.insertBefore(a,o.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r){return this.renderItemsAtomic(t,n,r,e.children.length,s=>e.appendChild(s))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,s=>e.insertBefore(s,e.firstChild))}renderItemsAtomic(e,t,n,r,s){var l,d;let o=Array.isArray(e)?e:[e],a=document.createDocumentFragment(),c=[];for(let u=0;u<o.length;u++){let p=this.renderAndParse(o[u],r+u,t,n);if(!p)return!1;a.appendChild(p),c.push(p)}s(a);for(let u of c)(d=(l=this.ctx).onNodeAdded)==null||d.call(l,u),this.fireHookOnSubtree(u,"lvt-mounted");return!0}applyReorder(e,t){if(!Array.isArray(t))return!1;let n=new Map;Array.from(e.children).forEach(o=>{for(let a of Qe){let c=o.getAttribute(a);if(c!==null){n.set(c,o);break}}});let r=document.createDocumentFragment(),s=new Set(t);for(let o of t){let a=n.get(o);a&&r.appendChild(a)}if(s.size<n.size){this.ctx.logger.warn(`[RangeDomApplier] o: newKeyOrder (${s.size}) shorter than existing children (${n.size}); ${n.size-s.size} children will be dropped`);for(let[o,a]of n)s.has(o)||this.fireHookOnSubtree(a,"lvt-destroyed")}return e.replaceChildren(r),!0}renderAndParse(e,t,n,r){let s=this.ctx.renderItem(e,t,n,r);return this.parseSingleRow(s)}parseSingleRow(e){let t=document.createElement("template");t.innerHTML=e.trim();let n=t.content.firstElementChild;return n!=null?n:null}findItemByKey(e,t){let n;typeof CSS!="undefined"&&typeof CSS.escape=="function"?n=CSS.escape(t):(/[\[\]():.#>~+*=^$|! \t\n\r]/.test(t)&&this.ctx.logger.warn(`[RangeDomApplier] CSS.escape unavailable; key "${t}" contains characters that need escaping. Lookup may miss the row.`),n=t.replace(/(["\\])/g,"\\$1"));for(let r of Qe){let s=e.querySelector(`[${r}="${n}"]`);if(s)return s}return null}indexOfChild(e,t){let n=0,r=e.firstElementChild;for(;r;){if(r===t)return n;n++,r=r.nextElementSibling}return-1}firstKnownKey(e){for(let t of e){if(!Array.isArray(t)||t.length<2)continue;let n=t[0];if(n==="r"||n==="u"||n==="i")return typeof t[1]=="string"?t[1]:void 0;if(n==="o"&&Array.isArray(t[1])&&t[1].length>0)return typeof t[1][0]=="string"?t[1][0]:void 0;if(n==="a"||n==="p"){let r=Array.isArray(t[1])?t[1]:[t[1]];for(let s of r)if(s&&typeof s=="object"&&s._k!==void 0)return String(s._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of fr)if(n.test(t))return!0}return!1}itemHasNestedRange(e){if(!e||typeof e!="object")return!1;for(let[t,n]of Object.entries(e))if(!t.startsWith("_")&&n&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.d)&&Array.isArray(r.s)||this.itemHasNestedRange(r))return!0}return!1}extractItemKey(e,t){var r;if(!e||typeof e!="object")return;if(e._k!==void 0)return String(e._k);let n=(r=t==null?void 0:t.m)==null?void 0:r.idKey;if(n&&e[n]!==void 0)return String(e[n])}lookupCurrentItem(e,t){return this.ctx.itemLookup(e,t)}fireHookOnSubtree(e,t){e.hasAttribute(t)&&this.ctx.executeLifecycleHook(e,t),e.querySelectorAll(`[${t}]`).forEach(r=>this.ctx.executeLifecycleHook(r,t))}};var Ce=class{constructor(){this.activeForm=null;this.activeButton=null;this.originalButtonText=null}setActiveSubmission(e,t,n){if(this.activeForm=e,this.activeButton=t,this.originalButtonText=n,e){e.setAttribute("aria-busy","true");let r=e.querySelector("fieldset");r&&(r.disabled=!0)}}handleResponse(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:done",{detail:e})),e.success?this.handleSuccess(e):this.handleError(e),this.restoreFormState()}reset(){this.restoreFormState()}handleSuccess(e){if(!this.activeForm)return;this.activeForm.dispatchEvent(new CustomEvent("lvt:success",{detail:e}));let t=this.activeForm.closest("dialog");t&&t.open&&t.close(),this.activeForm.hasAttribute("lvt-form:preserve")||this.activeForm.reset()}handleError(e){this.activeForm&&this.activeForm.dispatchEvent(new CustomEvent("lvt:error",{detail:e}))}restoreFormState(){if(this.activeForm){this.activeForm.removeAttribute("aria-busy");let e=this.activeForm.querySelector("fieldset");e&&(e.disabled=!1)}this.activeButton&&this.originalButtonText!==null&&(this.activeButton.disabled=!1,this.activeButton.textContent=this.originalButtonText),this.activeForm=null,this.activeButton=null,this.originalButtonText=null}};var Ie=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let s=this.escapeCSSSelector(n),o=e.querySelectorAll(`[name="${s}"]`);for(let a of o){if(this.wiredElements.has(a)||a.hasAttribute("lvt-input")||a.hasAttribute("lvt-change"))continue;let c=a.closest("form");c&&(c.hasAttribute("lvt-change")||ne(c,"lvt-form:no-intercept",this.logger))||a instanceof HTMLInputElement&&(a.type==="hidden"||a.type==="submit"||a.type==="button")||a instanceof HTMLButtonElement||(this.attachListener(a,n,r),this.wiredElements.add(a))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let s=n.getAttribute("name");s&&(this.attachListener(n,s,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],s=this.detectBinding(n,r);s&&!this.boundFields.has(s.fieldName)&&this.boundFields.set(s.fieldName,s.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let s=r[1].toLowerCase();return s!=="checkbox"&&s!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),s=r?parseInt(r,10):NaN,o=Number.isNaN(s)||s<0?300:s,c=ce(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},o),l=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(l,c),this.elementCleanups.set(e,()=>{e.removeEventListener(l,c)}),this.logger.debug(`Auto-wired ${l} listener on [name="${t}"] (debounce: ${o}ms)`)}};var Ze=class{constructor(e){this.options=e;this.socket=null;this.reconnectTimer=null;this.manuallyClosed=!1;this.reconnectAttempts=0}connect(){this.manuallyClosed=!1,this.clearReconnectTimer(),this.socket=new WebSocket(this.options.url);let e=this.socket;e.onopen=()=>{var t,n;this.reconnectAttempts=0,(n=(t=this.options).onOpen)==null||n.call(t,e)},e.onmessage=t=>{var n,r;(r=(n=this.options).onMessage)==null||r.call(n,t)},e.onclose=t=>{var n,r;(r=(n=this.options).onClose)==null||r.call(n,t),!this.manuallyClosed&&this.options.autoReconnect&&this.scheduleReconnect()},e.onerror=t=>{var n,r;(r=(n=this.options).onError)==null||r.call(n,t)}}send(e){this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}disconnect(){var e,t;this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.readyState!==WebSocket.CLOSED&&((t=(e=this.options).onClose)==null||t.call(e,new CloseEvent("close",{code:1e3,reason:"",wasClean:this.socket.readyState===WebSocket.OPEN}))),this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){var a,c,l,d,u;this.clearReconnectTimer();let e=(a=this.options.maxReconnectAttempts)!=null?a:10;if(e>0&&this.reconnectAttempts>=e){(l=(c=this.options).onReconnectFailed)==null||l.call(c);return}this.reconnectAttempts++;let t=(d=this.options.reconnectDelay)!=null?d:1e3,n=(u=this.options.maxReconnectDelay)!=null?u:16e3,r=t*Math.pow(2,this.reconnectAttempts-1),s=Math.random()*1e3,o=Math.min(r+s,n);this.reconnectTimer=window.setTimeout(()=>{var p,g;(g=(p=this.options).onReconnectAttempt)==null||g.call(p,this.reconnectAttempts,o),this.connect()},o)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},De=class{constructor(e){this.config=e;this.transport=null;this.liveUrlOverride=null}setLiveUrl(e){this.liveUrlOverride=e}async connect(){var d;let e=this.getLiveUrl();if(!await hr(e,this.config.logger))return{usingWebSocket:!1,initialState:await mn(e,this.config.logger)};let n,r,s=new Promise((u,p)=>{n=u,r=p}),o=!1,a=!1,c=null,l=u=>{o||(o=!0,c!==null&&(clearTimeout(c),c=null),u?r(u):n({usingWebSocket:!0}))};c=setTimeout(()=>{l(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Ze({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{a=!0,this.config.onConnected(),l()},onMessage:u=>{try{let p=JSON.parse(u.data);this.config.onMessage(p,u)}catch(p){this.config.logger.error("Failed to parse WebSocket message:",p)}},onClose:()=>{a?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(u,p)=>{var g,h;(h=(g=this.config).onReconnectAttempt)==null||h.call(g,u,p)},onReconnectFailed:()=>{var u,p;(p=(u=this.config).onReconnectFailed)==null||p.call(u)},onError:u=>{var p,g;(g=(p=this.config).onError)==null||g.call(p,u),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await s}catch(u){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",u),(d=this.transport)==null||d.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await mn(e,this.config.logger)}}}disconnect(){var e;(e=this.transport)==null||e.disconnect(),this.transport=null}send(e){var t;(t=this.transport)==null||t.send(e)}getReadyState(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())==null?void 0:t.readyState}getSocket(){var e,t;return(t=(e=this.transport)==null?void 0:e.getSocket())!=null?t:null}getWebSocketUrl(){let e=this.liveUrlOverride||this.config.options.liveUrl||"/live",t=this.config.options.wsUrl;return t||`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${e}`}getLiveUrl(){return this.liveUrlOverride||this.config.options.liveUrl||window.location.pathname+window.location.search}};async function hr(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e==null||e.warn("Failed to check WebSocket availability:",t),!0}}async function mn(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e==null||e.warn("Failed to fetch initial state:",t),null}}var Oe=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let s=new XMLHttpRequest;s.upload.addEventListener("progress",a=>{a.lengthComputable&&(e.bytesUploaded=a.loaded,e.progress=Math.round(a.loaded/a.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{s.abort()});let o=new Promise((a,c)=>{s.addEventListener("load",()=>{s.status>=200&&s.status<300?(e.done=!0,e.progress=100,a()):c(new Error(`S3 upload failed with status ${s.status}: ${s.statusText}`))}),s.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),s.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(s.open("PUT",t.url),t.headers)for(let[a,c]of Object.entries(t.headers))s.setRequestHeader(a,c);s.send(r),await o}catch(s){throw e.error=s instanceof Error?s.message:String(s),s}}};var Fe=class{constructor(e,t={}){this.sendMessage=e;this.entries=new Map;this.pendingFiles=new Map;this.pendingInputs=new Map;this.autoUploadConfig=new Map;this.uploaders=new Map;this.pendingHandshakes=new Set;this.pendingUploads=new Set;this.previewUrls=new Map;this.inputHandlers=new WeakMap;this.chunkSize=t.chunkSize||256*1024,this.onProgress=t.onProgress,this.onComplete=t.onComplete,this.onError=t.onError,this.postMultipartUpload=t.postMultipartUpload,this.isConnected=t.isConnected,this.postUploadStart=t.postUploadStart,this.uploaders.set("s3",new Oe)}dispatchUpload(e){switch(e.mode){case"preview":this.uploadPreview(e);return;case"proxied":this.uploadProxied(e);return;case"direct":if(e.external)this.uploadExternal(e,e.external);else{let t="direct upload mode requires presigned upload metadata";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName)}return;case"volume":default:this.uploadChunked(e)}}finishUpload(e){e.done=!0,e.progress=100,this.onProgress&&this.onProgress(e),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let s=this.inputHandlers.get(n);s&&n.removeEventListener("change",s);let o=a=>{let c=a.target.files;!c||c.length===0||this.startUpload(r,Array.from(c),n)};n.addEventListener("change",o),this.inputHandlers.set(n,o)})}async startUpload(e,t,n){this.pendingFiles.set(e,t),n?this.pendingInputs.set(e,n):this.pendingInputs.delete(e);let r=t.map(a=>({name:a.name,type:a.type||"application/octet-stream",size:a.size})),s={action:"upload_start",upload_name:e,files:r};if(!(this.isConnected?this.isConnected():!0)){if(!this.postUploadStart){this.failStart(e,t,"upload unavailable: WebSocket is closed and no HTTP fallback is configured");return}let a=new AbortController;this.pendingHandshakes.add(a);try{let c=await this.postUploadStart(s,a.signal);a.signal.aborted||await this.handleUploadStartResponse(c)}catch(c){this.failStart(e,t,c instanceof Error?c.message:String(c))}finally{this.pendingHandshakes.delete(a)}return}this.sendMessage(s)}failStart(e,t,n){this.pendingFiles.delete(e),this.pendingInputs.delete(e);let r=this.onError;r&&t.forEach((s,o)=>{r({id:`pending-${e}-${o}`,file:s,uploadName:e,progress:0,bytesUploaded:0,valid:!1,done:!1},n)})}async handleUploadStartResponse(e){var c;let{upload_name:t,entries:n}=e;n.length>0&&this.autoUploadConfig.set(t,n[0].auto_upload);let r=this.pendingFiles.get(t);if(!r){console.error(`No pending files found for upload: ${t}`);return}this.pendingFiles.delete(t);let s=this.pendingInputs.get(t);this.pendingInputs.delete(t);let o=new Map;for(let l of r)o.set(l.name,l);let a=[];for(let l of n){let d=o.get(l.client_name);if(!d){console.warn(`No file found for entry ${l.entry_id} (client_name: ${l.client_name})`);continue}let u={id:l.entry_id,file:d,uploadName:t,progress:0,bytesUploaded:0,valid:l.valid,done:!1,error:l.error,mode:(c=l.mode)!=null?c:l.external?"direct":"volume",external:l.external,sourceInput:s};if(this.entries.set(u.id,u),a.push(u),!l.valid){this.onError&&l.error&&this.onError(u,l.error);continue}l.auto_upload&&this.dispatchUpload(u)}}async uploadExternal(e,t){try{let n=this.uploaders.get(t.uploader);if(!n)throw new Error(`Unknown uploader: ${t.uploader}`);await n.upload(e,t,this.onProgress);let r={action:"upload_complete",upload_name:e.uploadName,entry_ids:[e.id]};this.sendMessage(r),this.finishUpload(e)}catch(n){let r=n instanceof Error?n.message:String(n);e.error=r,this.onError&&this.onError(e,r),this.cleanupEntries(e.uploadName)}}async uploadProxied(e){if(!this.postMultipartUpload){let t="Proxied upload unavailable: no multipart transport configured";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName);return}e.abortController=new AbortController,this.pendingUploads.add(e.abortController),this.onProgress&&this.onProgress(e);try{let t=new FormData;t.set("lvt-action",`upload_${e.uploadName}_complete`),this.appendFormFields(t,e),t.set(e.uploadName,e.file,e.file.name),await this.postMultipartUpload(t,e.abortController.signal),this.finishUpload(e)}catch(t){let n=t instanceof Error?t.message:String(t);e.error=n,this.onError&&this.onError(e,n),this.cleanupEntries(e.uploadName)}finally{e.abortController&&this.pendingUploads.delete(e.abortController),e.sourceInput=void 0}}appendFormFields(e,t){var s;let n=(s=t.sourceInput)==null?void 0:s.form;if(!n)return;let r=new Set;for(let o of Array.from(n.elements)){let a=o;a.type==="password"&&a.name&&r.add(a.name)}for(let[o,a]of new FormData(n).entries())o==="lvt-action"||a instanceof File||r.has(o)||e.append(o,a)}uploadPreview(e){let t=this.previewUrls.get(e.uploadName);t&&URL.revokeObjectURL(t);let n=URL.createObjectURL(e.file);this.previewUrls.set(e.uploadName,n),this.applyPreview(e.uploadName,n),this.finishUpload(e)}applyPreview(e,t){let n;if(typeof CSS!="undefined"&&CSS.escape)n=CSS.escape(e);else if(/^[\w-]+$/.test(e))n=e;else return;document.querySelectorAll(`[data-lvt-upload-preview="${n}"]`).forEach(s=>{s instanceof HTMLImageElement?s.src!==t&&(s.src=t):s.getAttribute("src")!==t&&s.setAttribute("src",t)})}hydratePreviews(e){let t=n=>{let r=n.getAttribute("data-lvt-upload-preview");if(!r)return;let s=this.previewUrls.get(r);s&&(n instanceof HTMLImageElement?n.src!==s&&(n.src=s):n.getAttribute("src")!==s&&n.setAttribute("src",s))};e.matches("[data-lvt-upload-preview]")&&t(e),e.querySelectorAll("[data-lvt-upload-preview]").forEach(t)}revokePreviews(){for(let e of this.pendingHandshakes)e.abort();this.pendingHandshakes.clear();for(let e of this.pendingUploads)e.abort();this.pendingUploads.clear();for(let e of this.previewUrls.values())URL.revokeObjectURL(e);this.previewUrls.clear()}async uploadChunked(e){let{file:t,id:n}=e,r=0;e.abortController=new AbortController;try{for(;r<t.size;){if(e.abortController.signal.aborted)throw new Error("Upload cancelled");let o=Math.min(r+this.chunkSize,t.size),a=t.slice(r,o),c=await this.fileToBase64(a),l={action:"upload_chunk",entry_id:n,chunk_base64:c,offset:r,total:t.size};this.sendMessage(l),r=o,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let s={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(s),this.finishUpload(e)}catch(s){let o=s instanceof Error?s.message:String(s);e.error=o,this.onError&&this.onError(e,o),this.cleanupEntries(e.uploadName)}}handleProgressMessage(e){let t=this.entries.get(e.entry_id);t&&(t.progress=e.progress,t.bytesUploaded=e.bytes_recv,this.onProgress&&this.onProgress(t))}cancelUpload(e){let t=this.entries.get(e);t&&(t.abortController&&t.abortController.abort(),this.sendMessage({action:"cancel_upload",entry_id:e}),this.entries.delete(e))}getEntries(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&t.push(n);return t}triggerPendingUploads(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&n.progress===0&&!n.done&&!n.error&&t.push(n);for(let n of t)this.dispatchUpload(n)}registerUploader(e,t){this.uploaders.set(e,t)}clearFileInput(e){document.querySelectorAll(`input[type="file"][lvt-upload="${e}"]`).forEach(n=>{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,s]of this.entries)e&&s.uploadName!==e||(s.done||s.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let o=r.result.split(",")[1];t(o)},r.onerror=n,r.readAsDataURL(e)})}};var vn={silent:0,error:1,warn:2,info:3,debug:4},yn="LiveTemplate",et=class i{constructor(e,t=[],n=console){this.state=e;this.scope=t;this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return vn[e]<=vn[this.state.level]}formatPrefix(){return this.scope.length===0?`[${yn}]`:`[${yn}:${this.scope.join(":")}]`}};function tt(i={}){var n,r;let e={level:(n=i.level)!=null?n:"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new et(e,t,(r=i.sink)!=null?r:console)}async function bn(i,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let s=t("fs"),o=JSON.parse(s.readFileSync(e,"utf8"));return i.applyUpdate(o)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function En(i,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(i),s=n(e);if(r===s)return{match:!0,differences:[]};let o=r.split(`
|
|
30
30
|
`),a=s.split(`
|
|
31
|
-
`),c=Math.max(o.length,a.length);for(let l=0;l<c;l++){let d=o[l]||"",u=a[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var Ue=class i{constructor(e={}){this.nodesAddedThisRender=0;this.directiveTouchedThisRender=!1;this.lvtId=null;this.ws=null;this.wrapperElement=null;this.useHTTP=!1;this.sessionCookie=null;this.rateLimitedHandlers=new WeakMap;this.isInitialized=!1;this.messageCount=0;this.navigationEpoch=0;this.liveUrlOverride=null;this.visibilityHandlerAttached=!1;this.hiddenAt=0;this.reconnecting=!1;this.visibilityHandler=null;this.pageshowHandler=null;this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...s}=e,o=n!=null?n:r?"debug":"info",a=t!=null?t:tt({level:o});t?n?t.setLevel(n):r&&t.setLevel("debug"):a.setLevel(o),this.logger=a.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new He(this.logger.child("TreeRenderer")),this.rangeDomApplier=new Re({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,u)=>this.treeRenderer.renderRangeItem(c,l,d,u),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{var p;let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let u=(p=d.m)==null?void 0:p.idKey;for(let g of d.d)if(!(!g||typeof g!="object")&&(g._k===l||u&&g[u]!==void 0&&String(g[u])===l))return g;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new ge(this.logger.child("FocusManager")),this.formLifecycleManager=new Ce,this.loadingIndicator=new ke,this.formDisabler=new Me,this.uploadHandler=new _e(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))},postMultipartUpload:(c,l)=>this.postUploadMultipart(c,l),isConnected:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1,postUploadStart:(c,l)=>this.postUploadStartHTTP(c,l)}),this.eventDelegator=new Ae({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new Te({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new Le({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new De({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Ie({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var c,l,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(l=(c=this.options).onConnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var c,l,d;this.ws=null,this.logger.info("WebSocket disconnected"),(l=(c=this.options).onDisconnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{var l,d;this.logger.error("WebSocket error:",c),(d=(l=this.options).onError)==null||d.call(l,c)}})}static autoInit(){let e=tt({scope:"Client:autoInit"}),t=()=>{var r,s,o;let n=document.querySelector("[data-lvt-id]");if(n){let a=new i;a.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(a.loadingIndicator.show(),a.formDisabler.disable(a.wrapperElement));let l=(o=(s=n.getAttribute("data-lvt-loading-debounce-ms"))!=null?s:(r=document.body)==null?void 0:r.getAttribute("data-lvt-loading-debounce-ms"))!=null?o:null;if(l!==null&&/^\d+$/.test(l)){let d=parseInt(l,10);Number.isFinite(d)&&d>=0&&n.addEventListener("lvt:updated",()=>{a.loadingIndicator.enablePerActionIndicator(d)},{once:!0,capture:!0})}a.connect().catch(d=>{e.error("Auto-initialization connect failed:",d)}),window.liveTemplateClient=a}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var s,o,a;let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let c=r;try{this.handleUploadStartResponse(c)}catch(l){this.logger.error("Error handling upload start response:",l)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,ze()),this.wrapperElement&&((s=e.meta)!=null&&s.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(o=e.meta)==null?void 0:o.action,success:(a=e.meta)==null?void 0:a.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ht(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ye(),nn(),Zt(),this.wrapperElement&&Ke(this.wrapperElement,s=>this.send(s)),wt(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.uploadHandler.revokePreviews(),this.eventDelegator.teardownDOMEventTriggerDelegation(),en(),Tt(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&(Et(this.wrapperElement),At(this.wrapperElement),on(this.wrapperElement),gn(this.wrapperElement),Dt(this.wrapperElement),It(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document=="undefined"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document=="undefined")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){var e;if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let t=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),(e=this.wrapperElement)==null||e.dispatchEvent(new Event("lvt:reconnected"))}catch(t){this.logger.error("Visibility reconnect failed:",t)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((o,a)=>{r.has(a)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:a,href:e}),r.add(a),n[a]=o});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let o=this.webSocketManager.getReadyState();return o===3?this.logger.error("sendNavigate: WebSocket is CLOSED and autoReconnect may be disabled; navigate message dropped. Reload or re-enable autoReconnect.",{href:e}):this.options.autoReconnect?this.logger.warn("sendNavigate: WS not open; browser URL is ahead of server state until reconnect",{href:e,readyState:o}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:o}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let o=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,o.tree,o.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}async postUploadMultipart(e,t){let n=this.getLiveUrl(),r=await fetch(n,{method:"POST",credentials:"include",headers:{Accept:"application/json","X-Lvt-Upload":"proxied"},body:e,signal:t});if(!r.ok){let o=(await r.text().catch(()=>"")).trim();throw new Error(`Proxied upload failed: ${r.status}${o?` \u2014 ${o}`:""}`)}let s=await r.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,s.tree,s.meta)}async postUploadStartHTTP(e,t){let n=await fetch(this.getLiveUrl(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json","X-Lvt-Upload":"start"},body:JSON.stringify(e),signal:t});if(!n.ok){let r=(await n.text().catch(()=>"")).trim();throw new Error(`upload_start handshake failed: ${n.status}${r?` \u2014 ${r}`:""}`)}return await n.json()}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let s=e.querySelectorAll('link[rel~="stylesheet"][href]'),o=new Set;if(s.forEach(c=>{let l=c.getAttribute("href");if(l)try{o.add(new URL(l,t).href)}catch(d){o.add(l)}}),r.size!==o.size)return!0;let a=!1;return r.forEach(c=>{o.has(c)||(a=!0)}),a}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){var l;if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),s=this.wrapperElement.getAttribute("data-lvt-id"),o=(l=r.querySelector("title"))==null?void 0:l.textContent;if(o&&(document.title=o),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different <link rel="stylesheet"> set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let a=r.querySelector("[data-lvt-id]");if(a){let d=a.getAttribute("data-lvt-id");if(!d){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s);let u=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(a.childNodes).map(g=>g.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let p=window.location.pathname+window.location.search;if(this.liveUrlOverride=p,this.webSocketManager.setLiveUrl(p),!this.useHTTP){let h=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(h).catch(R=>{u===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",R),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let c=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${c}</body>`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),s=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>s(d));if(!r.changed&&!s(t)){n&&this.formLifecycleManager.handleResponse(n);return}let o=document.createElement(e.tagName);if(this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] element.tagName:",e.tagName),this.logger.debug("[updateDOM] result.html (first 500 chars):",r.html.substring(0,500)),this.logger.debug("[updateDOM] Has <table> tag:",r.html.includes("<table>")),this.logger.debug("[updateDOM] Has <tbody> tag:",r.html.includes("<tbody>")),this.logger.debug("[updateDOM] Has <tr> tag:",r.html.includes("<tr"))),/<script[\s>]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,p=new DOMParser().parseFromString(`<${d}>${r.html}</${d}>`,"text/html"),g=p.body.firstElementChild;g?o.replaceChildren(...Array.from(g.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),o.replaceChildren(...Array.from(p.body.childNodes)))}else o.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",o.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",o.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",o.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",o.innerHTML.includes("<tr")));let a=document.activeElement;if(a instanceof HTMLInputElement&&a.list instanceof HTMLDataListElement&&!o.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}let c={childrenOnly:!0,getNodeKey:l=>{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(Z))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let g=0;g<u.length;g++){let h=u[g].name;if(h.length>4&&h.charCodeAt(0)===108&&h.charCodeAt(1)===118&&h.charCodeAt(2)===116&&h.charCodeAt(3)===45&&!p.hasAttribute(h)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let u=l.attributes,p=d;for(let g=0;g<u.length;g++){let h=u[g];p.hasAttributeNS(h.namespaceURI,h.localName)||p.setAttributeNS(h.namespaceURI,h.name,h.value)}}if(l instanceof HTMLDataListElement&&!d.hasAttribute("data-lvt-force-update")){let u=document.activeElement;if(u instanceof HTMLInputElement&&u.list===l)return!1}return l instanceof HTMLDialogElement&&l.hasAttribute("open")&&!d.hasAttribute("data-lvt-force-update")&&d.setAttribute("open",""),!d.hasAttribute("data-lvt-force-update")&&l instanceof HTMLElement&&l.hasAttribute("popover")&&je(l)||(l instanceof HTMLInputElement&&d instanceof HTMLInputElement&&(l.type==="checkbox"||l.type==="radio")&&(d.hasAttribute("data-lvt-force-update")?(l.checked=d.checked,l.type==="checkbox"&&(l.indeterminate=d.indeterminate),l.removeAttribute("data-lvt-force-update")):(d.checked=l.checked,l.checked?d.setAttribute("checked",""):d.removeAttribute("checked"),l.type==="checkbox"&&(d.indeterminate=l.indeterminate))),this.focusManager.shouldSkipUpdate(l))?!1:l.isEqualNode(d)?!(!d.hasAttribute("data-lvt-force-update")&&(d.children.length===0||d.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(l,"lvt-updated"),!0)},onElUpdated:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let u of r.targetedOps){let p=this.rangeDomApplier.apply(e,u,c);p?(p.setAttribute(Q,""),l.push(p)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let p of l)p.removeAttribute(Q);let u=this.treeRenderer.renderState();o.innerHTML=u}else this.replaceTargetedSkipPlaceholders(o)}try{fe(e,o,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}Bt(e),this.uploadHandler.hydratePreviews(e),this.focusManager.restoreFocusedElement(),St(e),kt(e),Mt(e),xt(e),Lt(e),Ct(e,l=>this.send(l)),Ke(e,l=>this.send(l)),Rt(e),sn(e),fn(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(bt(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let s=r;s.nodeValue&&/^lvt-targeted-skip:.+$/.test(s.nodeValue)&&n.push(s)}for(let s of n){let o=s.nodeValue.match(/^lvt-targeted-skip:(.+)$/),a=o?o[1]:"",c=s.parentElement;c&&c.setAttribute(Z,a),s.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};typeof window!="undefined"&&Ue.autoInit();return kn(mr);})();
|
|
31
|
+
`),c=Math.max(o.length,a.length);for(let l=0;l<c;l++){let d=o[l]||"",u=a[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var _e=class i{constructor(e={}){this.nodesAddedThisRender=0;this.directiveTouchedThisRender=!1;this.lvtId=null;this.ws=null;this.wrapperElement=null;this.useHTTP=!1;this.sessionCookie=null;this.rateLimitedHandlers=new WeakMap;this.isInitialized=!1;this.messageCount=0;this.navigationEpoch=0;this.liveUrlOverride=null;this.visibilityHandlerAttached=!1;this.hiddenAt=0;this.reconnecting=!1;this.visibilityHandler=null;this.pageshowHandler=null;this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...s}=e,o=n!=null?n:r?"debug":"info",a=t!=null?t:tt({level:o});t?n?t.setLevel(n):r&&t.setLevel("debug"):a.setLevel(o),this.logger=a.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new He(this.logger.child("TreeRenderer")),this.rangeDomApplier=new Re({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,u)=>this.treeRenderer.renderRangeItem(c,l,d,u),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{var p;let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let u=(p=d.m)==null?void 0:p.idKey;for(let g of d.d)if(!(!g||typeof g!="object")&&(g._k===l||u&&g[u]!==void 0&&String(g[u])===l))return g;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new ge(this.logger.child("FocusManager")),this.formLifecycleManager=new Ce,this.loadingIndicator=new ke,this.formDisabler=new Me,this.uploadHandler=new Fe(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))},postMultipartUpload:(c,l)=>this.postUploadMultipart(c,l),isConnected:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1,postUploadStart:(c,l)=>this.postUploadStartHTTP(c,l)}),this.eventDelegator=new Ae({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new Te({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new Le({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new Ie({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new De({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var c,l,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(l=(c=this.options).onConnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var c,l,d;this.ws=null,this.logger.info("WebSocket disconnected"),(l=(c=this.options).onDisconnect)==null||l.call(c),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{var l,d;this.logger.error("WebSocket error:",c),(d=(l=this.options).onError)==null||d.call(l,c)}})}static autoInit(){let e=tt({scope:"Client:autoInit"}),t=()=>{var r,s,o;let n=document.querySelector("[data-lvt-id]");if(n){let a=new i;a.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(a.loadingIndicator.show(),a.formDisabler.disable(a.wrapperElement));let l=(o=(s=n.getAttribute("data-lvt-loading-debounce-ms"))!=null?s:(r=document.body)==null?void 0:r.getAttribute("data-lvt-loading-debounce-ms"))!=null?o:null;if(l!==null&&/^\d+$/.test(l)){let d=parseInt(l,10);Number.isFinite(d)&&d>=0&&n.addEventListener("lvt:updated",()=>{a.loadingIndicator.enablePerActionIndicator(d)},{once:!0,capture:!0})}a.connect().catch(d=>{e.error("Auto-initialization connect failed:",d)}),window.liveTemplateClient=a}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var s,o,a;let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let c=r;try{this.handleUploadStartResponse(c)}catch(l){this.logger.error("Error handling upload start response:",l)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,ze()),this.wrapperElement&&((s=e.meta)!=null&&s.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(o=e.meta)==null?void 0:o.action,success:(a=e.meta)==null?void 0:a.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ht(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ye(),nn(),Zt(),this.wrapperElement&&Ke(this.wrapperElement,s=>this.send(s)),wt(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.uploadHandler.revokePreviews(),this.eventDelegator.teardownDOMEventTriggerDelegation(),en(),Tt(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&(Et(this.wrapperElement),At(this.wrapperElement),on(this.wrapperElement),gn(this.wrapperElement),It(this.wrapperElement),Dt(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document=="undefined"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document=="undefined")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){var e;if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let t=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),(e=this.wrapperElement)==null||e.dispatchEvent(new Event("lvt:reconnected"))}catch(t){this.logger.error("Visibility reconnect failed:",t)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((o,a)=>{r.has(a)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:a,href:e}),r.add(a),n[a]=o});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let o=this.webSocketManager.getReadyState();return o===3?this.logger.error("sendNavigate: WebSocket is CLOSED and autoReconnect may be disabled; navigate message dropped. Reload or re-enable autoReconnect.",{href:e}):this.options.autoReconnect?this.logger.warn("sendNavigate: WS not open; browser URL is ahead of server state until reconnect",{href:e,readyState:o}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:o}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let o=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,o.tree,o.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}async postUploadMultipart(e,t){let n=this.getLiveUrl(),r=await fetch(n,{method:"POST",credentials:"include",headers:{Accept:"application/json","X-Lvt-Upload":"proxied"},body:e,signal:t});if(!r.ok){let o=(await r.text().catch(()=>"")).trim();throw new Error(`Proxied upload failed: ${r.status}${o?` \u2014 ${o}`:""}`)}let s=await r.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,s.tree,s.meta)}async postUploadStartHTTP(e,t){let n=await fetch(this.getLiveUrl(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json","X-Lvt-Upload":"start"},body:JSON.stringify(e),signal:t});if(!n.ok){let r=(await n.text().catch(()=>"")).trim();throw new Error(`upload_start handshake failed: ${n.status}${r?` \u2014 ${r}`:""}`)}return await n.json()}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let s=e.querySelectorAll('link[rel~="stylesheet"][href]'),o=new Set;if(s.forEach(c=>{let l=c.getAttribute("href");if(l)try{o.add(new URL(l,t).href)}catch(d){o.add(l)}}),r.size!==o.size)return!0;let a=!1;return r.forEach(c=>{o.has(c)||(a=!0)}),a}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){var l;if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),s=this.wrapperElement.getAttribute("data-lvt-id"),o=(l=r.querySelector("title"))==null?void 0:l.textContent;if(o&&(document.title=o),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different <link rel="stylesheet"> set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let a=r.querySelector("[data-lvt-id]");if(a){let d=a.getAttribute("data-lvt-id");if(!d){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s);let u=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(a.childNodes).map(g=>g.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let p=window.location.pathname+window.location.search;if(this.liveUrlOverride=p,this.webSocketManager.setLiveUrl(p),!this.useHTTP){let h=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(h).catch(R=>{u===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",R),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(s),this.eventDelegator.teardownForWrapper(s),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let c=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${c}</body>`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),s=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>s(d));if(!r.changed&&!s(t)){n&&this.formLifecycleManager.handleResponse(n);return}let o=document.createElement(e.tagName);if(this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] element.tagName:",e.tagName),this.logger.debug("[updateDOM] result.html (first 500 chars):",r.html.substring(0,500)),this.logger.debug("[updateDOM] Has <table> tag:",r.html.includes("<table>")),this.logger.debug("[updateDOM] Has <tbody> tag:",r.html.includes("<tbody>")),this.logger.debug("[updateDOM] Has <tr> tag:",r.html.includes("<tr"))),/<script[\s>]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,p=new DOMParser().parseFromString(`<${d}>${r.html}</${d}>`,"text/html"),g=p.body.firstElementChild;g?o.replaceChildren(...Array.from(g.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),o.replaceChildren(...Array.from(p.body.childNodes)))}else o.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",o.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",o.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",o.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",o.innerHTML.includes("<tr")));let a=document.activeElement;if(a instanceof HTMLInputElement&&a.list instanceof HTMLDataListElement&&!o.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}let c={childrenOnly:!0,getNodeKey:l=>{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(Z))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let g=0;g<u.length;g++){let h=u[g].name;if(h.length>4&&h.charCodeAt(0)===108&&h.charCodeAt(1)===118&&h.charCodeAt(2)===116&&h.charCodeAt(3)===45&&!p.hasAttribute(h)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let u=l.attributes,p=d;for(let g=0;g<u.length;g++){let h=u[g];p.hasAttributeNS(h.namespaceURI,h.localName)||p.setAttributeNS(h.namespaceURI,h.name,h.value)}}if(l instanceof HTMLDataListElement&&!d.hasAttribute("data-lvt-force-update")){let u=document.activeElement;if(u instanceof HTMLInputElement&&u.list===l)return!1}return l instanceof HTMLDialogElement&&l.hasAttribute("open")&&!d.hasAttribute("data-lvt-force-update")&&d.setAttribute("open",""),!d.hasAttribute("data-lvt-force-update")&&l instanceof HTMLElement&&l.hasAttribute("popover")&&je(l)||(l instanceof HTMLInputElement&&d instanceof HTMLInputElement&&(l.type==="checkbox"||l.type==="radio")&&(d.hasAttribute("data-lvt-force-update")?(l.checked=d.checked,l.type==="checkbox"&&(l.indeterminate=d.indeterminate),l.removeAttribute("data-lvt-force-update")):(d.checked=l.checked,l.checked?d.setAttribute("checked",""):d.removeAttribute("checked"),l.type==="checkbox"&&(d.indeterminate=l.indeterminate))),this.focusManager.shouldSkipUpdate(l))?!1:l.isEqualNode(d)?!(!d.hasAttribute("data-lvt-force-update")&&(d.children.length===0||d.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(l,"lvt-updated"),!0)},onElUpdated:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{var d;l instanceof HTMLTextAreaElement&&(l.value=(d=l.textContent)!=null?d:""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let u of r.targetedOps){let p=this.rangeDomApplier.apply(e,u,c);p?(p.setAttribute(Q,""),l.push(p)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let p of l)p.removeAttribute(Q);let u=this.treeRenderer.renderState();o.innerHTML=u}else this.replaceTargetedSkipPlaceholders(o)}try{fe(e,o,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}Bt(e),this.uploadHandler.hydratePreviews(e),this.focusManager.restoreFocusedElement(),St(e),kt(e),Mt(e),xt(e),Lt(e),Ct(e,l=>this.send(l)),Ke(e,l=>this.send(l)),Rt(e),sn(e),fn(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(bt(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let s=r;s.nodeValue&&/^lvt-targeted-skip:.+$/.test(s.nodeValue)&&n.push(s)}for(let s of n){let o=s.nodeValue.match(/^lvt-targeted-skip:(.+)$/),a=o?o[1]:"",c=s.parentElement;c&&c.setAttribute(Z,a),s.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};typeof window!="undefined"&&_e.autoInit();return kn(mr);})();
|
|
32
32
|
//# sourceMappingURL=livetemplate-client.browser.js.map
|