@livetemplate/client 0.8.40 → 0.8.42

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.
Files changed (40) hide show
  1. package/README.md +2 -0
  2. package/dist/dom/event-delegation.d.ts.map +1 -1
  3. package/dist/dom/event-delegation.js +2 -1
  4. package/dist/dom/event-delegation.js.map +1 -1
  5. package/dist/dom/link-interceptor.d.ts +4 -2
  6. package/dist/dom/link-interceptor.d.ts.map +1 -1
  7. package/dist/dom/link-interceptor.js +9 -4
  8. package/dist/dom/link-interceptor.js.map +1 -1
  9. package/dist/livetemplate-client.browser.js +4 -4
  10. package/dist/livetemplate-client.browser.js.map +4 -4
  11. package/dist/livetemplate-client.d.ts +19 -0
  12. package/dist/livetemplate-client.d.ts.map +1 -1
  13. package/dist/livetemplate-client.js +71 -3
  14. package/dist/livetemplate-client.js.map +1 -1
  15. package/dist/state/change-auto-wirer.d.ts.map +1 -1
  16. package/dist/state/change-auto-wirer.js +2 -1
  17. package/dist/state/change-auto-wirer.js.map +1 -1
  18. package/dist/state/range-dom-applier.d.ts +1 -1
  19. package/dist/state/range-dom-applier.d.ts.map +1 -1
  20. package/dist/state/range-dom-applier.js +17 -17
  21. package/dist/state/range-dom-applier.js.map +1 -1
  22. package/dist/state/tree-renderer.d.ts +2 -3
  23. package/dist/state/tree-renderer.d.ts.map +1 -1
  24. package/dist/state/tree-renderer.js +8 -22
  25. package/dist/state/tree-renderer.js.map +1 -1
  26. package/dist/tests/change-auto-wirer.test.js +25 -0
  27. package/dist/tests/change-auto-wirer.test.js.map +1 -1
  28. package/dist/tests/navigate.test.js +112 -16
  29. package/dist/tests/navigate.test.js.map +1 -1
  30. package/dist/tests/navigation.test.js +103 -2
  31. package/dist/tests/navigation.test.js.map +1 -1
  32. package/dist/tests/range-dom-applier.test.js +1 -1
  33. package/dist/tests/range-dom-applier.test.js.map +1 -1
  34. package/dist/types.d.ts +0 -1
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/utils/legacy-attr.d.ts +20 -0
  37. package/dist/utils/legacy-attr.d.ts.map +1 -0
  38. package/dist/utils/legacy-attr.js +42 -0
  39. package/dist/utils/legacy-attr.js.map +1 -0
  40. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- "use strict";var LiveTemplateClient=(()=>{var Le=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var Ht=Object.prototype.hasOwnProperty;var _t=(s,e)=>{for(var t in e)Le(s,t,{get:e[t],enumerable:!0})},Dt=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ct(e))!Ht.call(s,r)&&r!==t&&Le(s,r,{get:()=>e[r],enumerable:!(n=Rt(e,r))||n.enumerable});return s};var It=s=>Dt(Le({},"__esModule",{value:!0}),s);var mn={};_t(mn,{LiveTemplateClient:()=>Te,compareHTML:()=>xt,loadAndApplyUpdate:()=>Mt,setupReactiveAttributeListeners:()=>ce});var Pe=11;function Ot(s,e){var t=e.attributes,n,r,i,a,o;if(!(e.nodeType===Pe||s.nodeType===Pe)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,i=n.namespaceURI,a=n.value,i?(r=n.localName||r,o=s.getAttributeNS(i,r),o!==a&&(n.prefix==="xmlns"&&(r=n.name),s.setAttributeNS(i,r,a))):(o=s.getAttribute(r),o!==a&&s.setAttribute(r,a));for(var l=s.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,i=n.namespaceURI,i?(r=n.localName||r,e.hasAttributeNS(i,r)||s.removeAttributeNS(i,r)):e.hasAttribute(r)||s.removeAttribute(r)}}var ne,Ft="http://www.w3.org/1999/xhtml",I=typeof document=="undefined"?void 0:document,Nt=!!I&&"content"in I.createElement("template"),Ut=!!I&&I.createRange&&"createContextualFragment"in I.createRange();function $t(s){var e=I.createElement("template");return e.innerHTML=s,e.content.childNodes[0]}function Wt(s){ne||(ne=I.createRange(),ne.selectNode(I.body));var e=ne.createContextualFragment(s);return e.childNodes[0]}function Pt(s){var e=I.createElement("body");return e.innerHTML=s,e.childNodes[0]}function Bt(s){return s=s.trim(),Nt?$t(s):Ut?Wt(s):Pt(s)}function re(s,e){var t=s.nodeName,n=e.nodeName,r,i;return t===n?!0:(r=t.charCodeAt(0),i=n.charCodeAt(0),r<=90&&i>=97?t===n.toUpperCase():i<=90&&r>=97?n===t.toUpperCase():!1)}function Kt(s,e){return!e||e===Ft?I.createElement(s):I.createElementNS(e,s)}function Vt(s,e){for(var t=s.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function ke(s,e,t){s[t]!==e[t]&&(s[t]=e[t],s[t]?s.setAttribute(t,""):s.removeAttribute(t))}var Be={OPTION:function(s,e){var t=s.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(s.hasAttribute("selected")&&!e.selected&&(s.setAttribute("selected","selected"),s.removeAttribute("selected")),t.selectedIndex=-1)}ke(s,e,"selected")},INPUT:function(s,e){ke(s,e,"checked"),ke(s,e,"disabled"),s.value!==e.value&&(s.value=e.value),e.hasAttribute("value")||s.removeAttribute("value")},TEXTAREA:function(s,e){var t=e.value;s.value!==t&&(s.value=t);var n=s.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==s.placeholder)return;n.nodeValue=t}},SELECT:function(s,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=s.firstChild,i,a;r;)if(a=r.nodeName&&r.nodeName.toUpperCase(),a==="OPTGROUP")i=r,r=i.firstChild,r||(r=i.nextSibling,i=null);else{if(a==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&i&&(r=i.nextSibling,i=null)}s.selectedIndex=t}}},X=1,Ke=11,Ve=3,je=8;function P(){}function jt(s){if(s)return s.getAttribute&&s.getAttribute("id")||s.id}function qt(s){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var i=n;n=I.createElement("html"),n.innerHTML=i}else n=Bt(n);else n.nodeType===Ke&&(n=n.firstElementChild);var a=r.getNodeKey||jt,o=r.onBeforeNodeAdded||P,c=r.onNodeAdded||P,l=r.onBeforeElUpdated||P,d=r.onElUpdated||P,u=r.onBeforeNodeDiscarded||P,p=r.onNodeDiscarded||P,f=r.onBeforeElChildrenUpdated||P,g=r.skipFromChildren||P,C=r.addChild||function(v,m){return v.appendChild(m)},_=r.childrenOnly===!0,w=Object.create(null),T=[];function k(v){T.push(v)}function h(v,m){if(v.nodeType===X)for(var L=v.firstChild;L;){var y=void 0;m&&(y=a(L))?k(y):(p(L),L.firstChild&&h(L,m)),L=L.nextSibling}}function M(v,m,L){u(v)!==!1&&(m&&m.removeChild(v),p(v),h(v,L))}function D(v){if(v.nodeType===X||v.nodeType===Ke)for(var m=v.firstChild;m;){var L=a(m);L&&(w[L]=m),D(m),m=m.nextSibling}}D(t);function V(v){c(v);for(var m=v.firstChild;m;){var L=m.nextSibling,y=a(m);if(y){var b=w[y];b&&re(m,b)?(m.parentNode.replaceChild(b,m),E(b,m)):V(m)}else V(m);m=L}}function $e(v,m,L){for(;m;){var y=m.nextSibling;(L=a(m))?k(L):M(m,v,!0),m=y}}function E(v,m,L){var y=a(m);if(y&&delete w[y],!L){var b=l(v,m);if(b===!1||(b instanceof HTMLElement&&(v=b,D(v)),s(v,m),d(v),f(v,m)===!1))return}v.nodeName!=="TEXTAREA"?H(v,m):Be.TEXTAREA(v,m)}function H(v,m){var L=g(v,m),y=m.firstChild,b=v.firstChild,F,N,G,ee,$;e:for(;y;){for(ee=y.nextSibling,F=a(y);!L&&b;){if(G=b.nextSibling,y.isSameNode&&y.isSameNode(b)){y=ee,b=G;continue e}N=a(b);var te=b.nodeType,W=void 0;if(te===y.nodeType&&(te===X?(F?F!==N&&(($=w[F])?G===$?W=!1:(v.insertBefore($,b),N?k(N):M(b,v,!0),b=$,N=a(b)):W=!1):N&&(W=!1),W=W!==!1&&re(b,y),W&&E(b,y)):(te===Ve||te==je)&&(W=!0,b.nodeValue!==y.nodeValue&&(b.nodeValue=y.nodeValue))),W){y=ee,b=G;continue e}N?k(N):M(b,v,!0),b=G}if(F&&($=w[F])&&re($,y))L||C(v,$),E($,y);else{var Se=o(y);Se!==!1&&(Se&&(y=Se),y.actualize&&(y=y.actualize(v.ownerDocument||I)),C(v,y),V(y))}y=ee,b=G}$e(v,b,N);var We=Be[v.nodeName];We&&We(v,m)}var S=t,O=S.nodeType,A=n.nodeType;if(!_){if(O===X)A===X?re(t,n)||(p(t),S=Vt(t,Kt(n.nodeName,n.namespaceURI))):S=n;else if(O===Ve||O===je){if(A===O)return S.nodeValue!==n.nodeValue&&(S.nodeValue=n.nodeValue),S;S=n}}if(S===n)p(t);else{if(n.isSameNode&&n.isSameNode(S))return;if(E(S,n,_),T)for(var x=0,R=T.length;x<R;x++){var z=w[T[x]];z&&M(z,z.parentNode,!1)}}return!_&&S!==t&&t.parentNode&&(S.actualize&&(S=S.actualize(t.ownerDocument||I)),t.parentNode.replaceChild(S,t)),S}}var zt=qt(Ot),ie=zt;var Me=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var se=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=`${Me.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=a=>{var c;let o=a.target;!o||!((c=this.wrapperElement)!=null&&c.contains(o))||(this.isTextualInput(o)||o instanceof HTMLSelectElement)&&(this.lastFocusedElement=o,this.logger.debug("[Focus] Tracked focus on:",o.tagName,o.id||o.getAttribute("name")),this.isTextualInput(o)&&(this.lastFocusedSelectionStart=o.selectionStart,this.lastFocusedSelectionEnd=o.selectionEnd))},i=a=>{var c;let o=a.target;!o||!((c=this.wrapperElement)!=null&&c.contains(o))||this.isTextualInput(o)&&o===this.lastFocusedElement&&(this.lastFocusedSelectionStart=o.selectionStart,this.lastFocusedSelectionEnd=o.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]=i,document.addEventListener("focus",r,!0),document.addEventListener("blur",i,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var a,o,c;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(a=this.lastFocusedElement)==null?void 0:a.tagName,((o=this.lastFocusedElement)==null?void 0:o.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,i=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&i!==null&&(t.setSelectionRange(r,i),this.logger.debug("[Focus] Restored cursor:",r,"-",i))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?Me.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 qe=["pending","success","error","done"],xe=new Set(qe),oe=new Set(["click-away"]),Re={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Gt(s,e){let n=s.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],i=Re[r];if(!i)return null;let a=n[2];if(oe.has(a)||!xe.has(a)&&!a.includes(":"))return null;let o=a.split(":"),c=o[o.length-1];if(!xe.has(c))return null;let l=c,d=o.length>1?o.slice(0,-1).join(":"):void 0;return{action:i,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function B(s){let e=s.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||s:e.startsWith("closest:")&&s.closest(e.slice(8))||s:s}function ae(s,e,t){switch(e){case"reset":s instanceof HTMLFormElement&&s.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);s.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);s.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>s.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),i=t.substring(n+1);s.setAttribute(r,i)}}break;case"toggleAttr":t&&s.toggleAttribute(t);break}}function Yt(s,e,t){return s.lifecycle!==e?!1:s.actionName?s.actionName===t:!0}function Xt(s,e){let t=Object.keys(Re),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let o of t)n.push(`[lvt-el\\:${o}\\:on\\:${s}]`),r&&n.push(`[lvt-el\\:${o}\\:on\\:${r}\\:${s}]`);let i=n.join(", "),a;try{a=document.querySelectorAll(i)}catch(o){let c=t.map(l=>`[lvt-el\\:${l}\\:on\\:${s}]`);try{a=document.querySelectorAll(c.join(", "))}catch(l){return}}a.forEach(o=>{Array.from(o.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=Gt(c.name,c.value);l&&Yt(l,s,e)&&ae(B(o),l.action,l.param)})})}function le(s,e){for(let t of s.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(),i=Re[r];i&&ae(B(s),i,t.value)}}function ze(s){return!xe.has(s)&&!oe.has(s)}function ce(){qe.forEach(s=>{document.addEventListener(`lvt:${s}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;Xt(s,n)},!0)})}var Xe=new Set(["pending","success","error","done"]),Ge=new WeakSet;function Je(s){let e=s.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 Qe(s,e){let t=e||s,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(a=>a.el.isConnected),i=a=>{var o;for(let c of a.attributes){if(!c.name.startsWith("lvt-fx:"))continue;let l=Je(c.name);if(!l.trigger||Xe.has(l.trigger)||oe.has(l.trigger))continue;let d=`__lvt_fx_${c.name}`;if(a[d])continue;let u=(o=c.name.match(/^lvt-fx:(\w+)/i))==null?void 0:o[1];if(!u)continue;let p=c.name,f=()=>{if(!a.hasAttribute(p))return;let g=a.getAttribute(p)||"",C=B(a);J(C,u,g)};a.addEventListener(l.trigger,f),a[d]=f,r.push({el:a,event:l.trigger,handler:f,guardKey:d})}};i(s),s.querySelectorAll("*").forEach(i),t[n]=r}function Ze(s){let e="__lvtFxDirectListeners",t=s[e];t&&(t.forEach(({el:n,event:r,handler:i,guardKey:a})=>{n.removeEventListener(r,i),delete n[a]}),delete s[e])}function Jt(s,e,t){let n=r=>{var i;for(let a of r.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let o=Je(a.name);if(!o.trigger||!Xe.has(o.trigger)||o.trigger!==e||o.actionName&&o.actionName!==t)continue;let c=(i=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:i[1];c&&J(r,c,a.value)}};n(s),s.querySelectorAll("*").forEach(n)}function J(s,e,t){let n=getComputedStyle(s);switch(e){case"highlight":{if(s.__lvtHighlighting)break;s.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),i=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",a=s.style.backgroundColor,o=s.style.transition;s.style.transition=`background-color ${r}ms ease-out`,s.style.backgroundColor=i,setTimeout(()=>{if(!s.isConnected){s.style.backgroundColor=a,s.style.transition=o,s.style.length===0&&s.removeAttribute("style"),s.__lvtHighlighting=!1;return}s.style.backgroundColor=a,setTimeout(()=>{s.isConnected&&(s.style.transition=o,s.style.length===0&&s.removeAttribute("style")),s.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ge.has(s))break;Ge.add(s);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),i=t||"fade",a="";switch(i){case"fade":a=`lvt-fade-in ${r}ms ease-out`;break;case"slide":a=`lvt-slide-in ${r}ms ease-out`;break;case"scale":a=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${i}`)}if(!a)break;s.style.animation=a,s.addEventListener("animationend",()=>{s.style.removeProperty("animation"),s.style.length===0&&s.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),i=Qt.has(r)?r:"auto",a=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),o=t||"bottom";switch(o){case"bottom":s.scrollTo({top:s.scrollHeight,behavior:i});break;case"bottom-sticky":{s.dataset.lvtScrollSticky==="1"?s.scrollHeight-s.scrollTop-s.clientHeight<=a&&s.scrollTo({top:s.scrollHeight,behavior:i}):(s.dataset.lvtScrollSticky="1",s.scrollTo({top:s.scrollHeight,behavior:"instant"}));break}case"top":s.scrollTo({top:0,behavior:i});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${o}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function et(s){let e="__lvtFxLifecycleSetup";if(s[e])return;s[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let i=a=>{var l;let c=(l=a.detail)==null?void 0:l.action;Jt(s,r,c)};document.addEventListener(`lvt:${r}`,i,!0),t.push({event:`lvt:${r}`,handler:i})}),s.__lvtFxLifecycleListeners=t}function tt(s){let e=s.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete s.__lvtFxLifecycleListeners),delete s.__lvtFxLifecycleSetup}var Qt=new Set(["auto","smooth","instant"]);function nt(s){s.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&J(e,"scroll",t)})}function rt(s){s.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&J(e,"highlight",t)})}function it(s){s.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&J(e,"animate",t)}),Zt()}function Zt(){if(!document.getElementById("lvt-animate-styles")){let s=document.createElement("style");s.id="lvt-animate-styles",s.textContent=`
1
+ "use strict";var LiveTemplateClient=(()=>{var ke=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Dt=Object.getOwnPropertyNames;var Ot=Object.prototype.hasOwnProperty;var _t=(s,e)=>{for(var t in e)ke(s,t,{get:e[t],enumerable:!0})},It=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Dt(e))!Ot.call(s,r)&&r!==t&&ke(s,r,{get:()=>e[r],enumerable:!(n=Rt(e,r))||n.enumerable});return s};var Ft=s=>It(ke({},"__esModule",{value:!0}),s);var yn={};_t(yn,{LiveTemplateClient:()=>Se,compareHTML:()=>Ht,loadAndApplyUpdate:()=>Ct,setupReactiveAttributeListeners:()=>de});var Be=11;function Nt(s,e){var t=e.attributes,n,r,i,a,o;if(!(e.nodeType===Be||s.nodeType===Be)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,i=n.namespaceURI,a=n.value,i?(r=n.localName||r,o=s.getAttributeNS(i,r),o!==a&&(n.prefix==="xmlns"&&(r=n.name),s.setAttributeNS(i,r,a))):(o=s.getAttribute(r),o!==a&&s.setAttribute(r,a));for(var l=s.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,i=n.namespaceURI,i?(r=n.localName||r,e.hasAttributeNS(i,r)||s.removeAttributeNS(i,r)):e.hasAttribute(r)||s.removeAttribute(r)}}var re,Ut="http://www.w3.org/1999/xhtml",_=typeof document=="undefined"?void 0:document,$t=!!_&&"content"in _.createElement("template"),Wt=!!_&&_.createRange&&"createContextualFragment"in _.createRange();function Pt(s){var e=_.createElement("template");return e.innerHTML=s,e.content.childNodes[0]}function Bt(s){re||(re=_.createRange(),re.selectNode(_.body));var e=re.createContextualFragment(s);return e.childNodes[0]}function Kt(s){var e=_.createElement("body");return e.innerHTML=s,e.childNodes[0]}function Vt(s){return s=s.trim(),$t?Pt(s):Wt?Bt(s):Kt(s)}function ie(s,e){var t=s.nodeName,n=e.nodeName,r,i;return t===n?!0:(r=t.charCodeAt(0),i=n.charCodeAt(0),r<=90&&i>=97?t===n.toUpperCase():i<=90&&r>=97?n===t.toUpperCase():!1)}function jt(s,e){return!e||e===Ut?_.createElement(s):_.createElementNS(e,s)}function qt(s,e){for(var t=s.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Me(s,e,t){s[t]!==e[t]&&(s[t]=e[t],s[t]?s.setAttribute(t,""):s.removeAttribute(t))}var Ke={OPTION:function(s,e){var t=s.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(s.hasAttribute("selected")&&!e.selected&&(s.setAttribute("selected","selected"),s.removeAttribute("selected")),t.selectedIndex=-1)}Me(s,e,"selected")},INPUT:function(s,e){Me(s,e,"checked"),Me(s,e,"disabled"),s.value!==e.value&&(s.value=e.value),e.hasAttribute("value")||s.removeAttribute("value")},TEXTAREA:function(s,e){var t=e.value;s.value!==t&&(s.value=t);var n=s.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==s.placeholder)return;n.nodeValue=t}},SELECT:function(s,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=s.firstChild,i,a;r;)if(a=r.nodeName&&r.nodeName.toUpperCase(),a==="OPTGROUP")i=r,r=i.firstChild,r||(r=i.nextSibling,i=null);else{if(a==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&i&&(r=i.nextSibling,i=null)}s.selectedIndex=t}}},J=1,Ve=11,je=3,qe=8;function P(){}function zt(s){if(s)return s.getAttribute&&s.getAttribute("id")||s.id}function Gt(s){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var i=n;n=_.createElement("html"),n.innerHTML=i}else n=Vt(n);else n.nodeType===Ve&&(n=n.firstElementChild);var a=r.getNodeKey||zt,o=r.onBeforeNodeAdded||P,c=r.onNodeAdded||P,l=r.onBeforeElUpdated||P,d=r.onElUpdated||P,u=r.onBeforeNodeDiscarded||P,p=r.onNodeDiscarded||P,f=r.onBeforeElChildrenUpdated||P,g=r.skipFromChildren||P,H=r.addChild||function(v,m){return v.appendChild(m)},D=r.childrenOnly===!0,w=Object.create(null),T=[];function k(v){T.push(v)}function h(v,m){if(v.nodeType===J)for(var L=v.firstChild;L;){var y=void 0;m&&(y=a(L))?k(y):(p(L),L.firstChild&&h(L,m)),L=L.nextSibling}}function M(v,m,L){u(v)!==!1&&(m&&m.removeChild(v),p(v),h(v,L))}function O(v){if(v.nodeType===J||v.nodeType===Ve)for(var m=v.firstChild;m;){var L=a(m);L&&(w[L]=m),O(m),m=m.nextSibling}}O(t);function V(v){c(v);for(var m=v.firstChild;m;){var L=m.nextSibling,y=a(m);if(y){var b=w[y];b&&ie(m,b)?(m.parentNode.replaceChild(b,m),E(b,m)):V(m)}else V(m);m=L}}function We(v,m,L){for(;m;){var y=m.nextSibling;(L=a(m))?k(L):M(m,v,!0),m=y}}function E(v,m,L){var y=a(m);if(y&&delete w[y],!L){var b=l(v,m);if(b===!1||(b instanceof HTMLElement&&(v=b,O(v)),s(v,m),d(v),f(v,m)===!1))return}v.nodeName!=="TEXTAREA"?R(v,m):Ke.TEXTAREA(v,m)}function R(v,m){var L=g(v,m),y=m.firstChild,b=v.firstChild,F,N,G,te,$;e:for(;y;){for(te=y.nextSibling,F=a(y);!L&&b;){if(G=b.nextSibling,y.isSameNode&&y.isSameNode(b)){y=te,b=G;continue e}N=a(b);var ne=b.nodeType,W=void 0;if(ne===y.nodeType&&(ne===J?(F?F!==N&&(($=w[F])?G===$?W=!1:(v.insertBefore($,b),N?k(N):M(b,v,!0),b=$,N=a(b)):W=!1):N&&(W=!1),W=W!==!1&&ie(b,y),W&&E(b,y)):(ne===je||ne==qe)&&(W=!0,b.nodeValue!==y.nodeValue&&(b.nodeValue=y.nodeValue))),W){y=te,b=G;continue e}N?k(N):M(b,v,!0),b=G}if(F&&($=w[F])&&ie($,y))L||H(v,$),E($,y);else{var Le=o(y);Le!==!1&&(Le&&(y=Le),y.actualize&&(y=y.actualize(v.ownerDocument||_)),H(v,y),V(y))}y=te,b=G}We(v,b,N);var Pe=Ke[v.nodeName];Pe&&Pe(v,m)}var S=t,I=S.nodeType,A=n.nodeType;if(!D){if(I===J)A===J?ie(t,n)||(p(t),S=qt(t,jt(n.nodeName,n.namespaceURI))):S=n;else if(I===je||I===qe){if(A===I)return S.nodeValue!==n.nodeValue&&(S.nodeValue=n.nodeValue),S;S=n}}if(S===n)p(t);else{if(n.isSameNode&&n.isSameNode(S))return;if(E(S,n,D),T)for(var x=0,C=T.length;x<C;x++){var z=w[T[x]];z&&M(z,z.parentNode,!1)}}return!D&&S!==t&&t.parentNode&&(S.actualize&&(S=S.actualize(t.ownerDocument||_)),t.parentNode.replaceChild(S,t)),S}}var Yt=Gt(Nt),se=Yt;var xe=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var oe=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=`${xe.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=a=>{var c;let o=a.target;!o||!((c=this.wrapperElement)!=null&&c.contains(o))||(this.isTextualInput(o)||o instanceof HTMLSelectElement)&&(this.lastFocusedElement=o,this.logger.debug("[Focus] Tracked focus on:",o.tagName,o.id||o.getAttribute("name")),this.isTextualInput(o)&&(this.lastFocusedSelectionStart=o.selectionStart,this.lastFocusedSelectionEnd=o.selectionEnd))},i=a=>{var c;let o=a.target;!o||!((c=this.wrapperElement)!=null&&c.contains(o))||this.isTextualInput(o)&&o===this.lastFocusedElement&&(this.lastFocusedSelectionStart=o.selectionStart,this.lastFocusedSelectionEnd=o.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]=i,document.addEventListener("focus",r,!0),document.addEventListener("blur",i,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var a,o,c;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(a=this.lastFocusedElement)==null?void 0:a.tagName,((o=this.lastFocusedElement)==null?void 0:o.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,i=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&i!==null&&(t.setSelectionRange(r,i),this.logger.debug("[Focus] Restored cursor:",r,"-",i))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?xe.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 ze=["pending","success","error","done"],Ce=new Set(ze),ae=new Set(["click-away"]),He={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Xt(s,e){let n=s.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],i=He[r];if(!i)return null;let a=n[2];if(ae.has(a)||!Ce.has(a)&&!a.includes(":"))return null;let o=a.split(":"),c=o[o.length-1];if(!Ce.has(c))return null;let l=c,d=o.length>1?o.slice(0,-1).join(":"):void 0;return{action:i,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function B(s){let e=s.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||s:e.startsWith("closest:")&&s.closest(e.slice(8))||s:s}function le(s,e,t){switch(e){case"reset":s instanceof HTMLFormElement&&s.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);s.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);s.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>s.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),i=t.substring(n+1);s.setAttribute(r,i)}}break;case"toggleAttr":t&&s.toggleAttribute(t);break}}function Jt(s,e,t){return s.lifecycle!==e?!1:s.actionName?s.actionName===t:!0}function Qt(s,e){let t=Object.keys(He),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let o of t)n.push(`[lvt-el\\:${o}\\:on\\:${s}]`),r&&n.push(`[lvt-el\\:${o}\\:on\\:${r}\\:${s}]`);let i=n.join(", "),a;try{a=document.querySelectorAll(i)}catch(o){let c=t.map(l=>`[lvt-el\\:${l}\\:on\\:${s}]`);try{a=document.querySelectorAll(c.join(", "))}catch(l){return}}a.forEach(o=>{Array.from(o.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=Xt(c.name,c.value);l&&Jt(l,s,e)&&le(B(o),l.action,l.param)})})}function ce(s,e){for(let t of s.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(),i=He[r];i&&le(B(s),i,t.value)}}function Ge(s){return!Ce.has(s)&&!ae.has(s)}function de(){ze.forEach(s=>{document.addEventListener(`lvt:${s}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;Qt(s,n)},!0)})}var Je=new Set(["pending","success","error","done"]),Ye=new WeakSet;function Qe(s){let e=s.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 Ze(s,e){let t=e||s,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(a=>a.el.isConnected),i=a=>{var o;for(let c of a.attributes){if(!c.name.startsWith("lvt-fx:"))continue;let l=Qe(c.name);if(!l.trigger||Je.has(l.trigger)||ae.has(l.trigger))continue;let d=`__lvt_fx_${c.name}`;if(a[d])continue;let u=(o=c.name.match(/^lvt-fx:(\w+)/i))==null?void 0:o[1];if(!u)continue;let p=c.name,f=()=>{if(!a.hasAttribute(p))return;let g=a.getAttribute(p)||"",H=B(a);Q(H,u,g)};a.addEventListener(l.trigger,f),a[d]=f,r.push({el:a,event:l.trigger,handler:f,guardKey:d})}};i(s),s.querySelectorAll("*").forEach(i),t[n]=r}function et(s){let e="__lvtFxDirectListeners",t=s[e];t&&(t.forEach(({el:n,event:r,handler:i,guardKey:a})=>{n.removeEventListener(r,i),delete n[a]}),delete s[e])}function Zt(s,e,t){let n=r=>{var i;for(let a of r.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let o=Qe(a.name);if(!o.trigger||!Je.has(o.trigger)||o.trigger!==e||o.actionName&&o.actionName!==t)continue;let c=(i=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:i[1];c&&Q(r,c,a.value)}};n(s),s.querySelectorAll("*").forEach(n)}function Q(s,e,t){let n=getComputedStyle(s);switch(e){case"highlight":{if(s.__lvtHighlighting)break;s.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),i=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",a=s.style.backgroundColor,o=s.style.transition;s.style.transition=`background-color ${r}ms ease-out`,s.style.backgroundColor=i,setTimeout(()=>{if(!s.isConnected){s.style.backgroundColor=a,s.style.transition=o,s.style.length===0&&s.removeAttribute("style"),s.__lvtHighlighting=!1;return}s.style.backgroundColor=a,setTimeout(()=>{s.isConnected&&(s.style.transition=o,s.style.length===0&&s.removeAttribute("style")),s.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ye.has(s))break;Ye.add(s);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),i=t||"fade",a="";switch(i){case"fade":a=`lvt-fade-in ${r}ms ease-out`;break;case"slide":a=`lvt-slide-in ${r}ms ease-out`;break;case"scale":a=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${i}`)}if(!a)break;s.style.animation=a,s.addEventListener("animationend",()=>{s.style.removeProperty("animation"),s.style.length===0&&s.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),i=en.has(r)?r:"auto",a=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),o=t||"bottom";switch(o){case"bottom":s.scrollTo({top:s.scrollHeight,behavior:i});break;case"bottom-sticky":{s.dataset.lvtScrollSticky==="1"?s.scrollHeight-s.scrollTop-s.clientHeight<=a&&s.scrollTo({top:s.scrollHeight,behavior:i}):(s.dataset.lvtScrollSticky="1",s.scrollTo({top:s.scrollHeight,behavior:"instant"}));break}case"top":s.scrollTo({top:0,behavior:i});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${o}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function tt(s){let e="__lvtFxLifecycleSetup";if(s[e])return;s[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let i=a=>{var l;let c=(l=a.detail)==null?void 0:l.action;Zt(s,r,c)};document.addEventListener(`lvt:${r}`,i,!0),t.push({event:`lvt:${r}`,handler:i})}),s.__lvtFxLifecycleListeners=t}function nt(s){let e=s.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete s.__lvtFxLifecycleListeners),delete s.__lvtFxLifecycleSetup}var en=new Set(["auto","smooth","instant"]);function rt(s){s.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&Q(e,"scroll",t)})}function it(s){s.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&Q(e,"highlight",t)})}function st(s){s.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&Q(e,"animate",t)}),tn()}function tn(){if(!document.getElementById("lvt-animate-styles")){let s=document.createElement("style");s.id="lvt-animate-styles",s.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(s)}}var Ye="__lvtPendingProcessed";function st(s){s.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[Ye]===t)return;e[Ye]=t;let n;try{n=JSON.parse(t)}catch(a){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",i=en(r);n.forEach(a=>{let o=nn(a);i.appendChild(o),typeof a.dismissMS=="number"&&a.dismissMS>0&&setTimeout(()=>o.remove(),a.dismissMS)})})}function ot(){let s="__lvt_toast_click_outside",e=document[s];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(i=>i.remove())};document[s]=t,document.addEventListener("click",t)}function en(s){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"),tn(e,s),document.body.appendChild(e)),e}function tn(s,e){let t=s.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 nn(s){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",s.id),s.type&&e.setAttribute("data-type",s.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),s.title){let n=document.createElement("strong");n.textContent=s.title,t.appendChild(n)}if(s.body){let n=document.createElement("p");n.textContent=s.body,t.appendChild(n)}if(e.appendChild(t),s.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}function Q(s,e){let t=null;return function(...r){let i=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{s.apply(i,r)},e)}}function Ce(s,e){let t=!1;return function(...r){let i=this;t||(s.apply(i,r),t=!0,setTimeout(()=>{t=!1},e))}}function He(s,e){let t=s.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var ct={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},rn=Object.keys(ct),sn=new Set(["mouseenter","mouseleave","focus","blur"]),at="application/x-lvt-key",on=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]),lt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"],de=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of lt){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=lt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_delegated_${i}_${n}`,o=document[a];o&&document.removeEventListener(i,o,!1);let c=l=>{var C,_;let d=this.context.getWrapperElement();if(!d)return;let u=l.target;if(this.logger.debug("Event listener triggered:",i,l.target),!u)return;let p=u,f=!1;for(;p;){if(p===d){f=!0;break}p=p.parentElement}if(!f)return;let g=`lvt-on:${i}`;for(p=u;p&&p!==d.parentElement;){let w=p.getAttribute(g),T=p,k=!1;if(!w&&i==="submit"&&p instanceof HTMLFormElement){let h=p.getAttribute("lvt-persist");h&&(w=`persist:${h}`,T=p)}if(!w&&i==="click"){let h=p instanceof HTMLButtonElement?p:null;h&&h.name&&!h.disabled&&h.type!=="reset"&&h.form===null&&!h.hasAttribute("commandfor")&&(w=h.name,T=h,k=!0)}if(!w&&i==="submit"&&p instanceof HTMLFormElement&&!p.hasAttribute("lvt-form:no-intercept")){let h=p.getAttribute("lvt-form:action"),M=l.submitter;h?w=h:M instanceof HTMLButtonElement&&M.name?w=M.name:p.getAttribute("name")?w=p.getAttribute("name"):w="submit",T=p,M&&(p.__lvtSubmitter=M);let D=p.closest("dialog");D&&((C=p.getAttribute("method"))==null?void 0:C.toLowerCase())==="dialog"&&(p.__lvtCloseDialog=D)}if(w!=null&&T){if(i==="submit"&&l.preventDefault(),on.has(i)){let E=l;if(i==="dragstart"&&E.dataTransfer){let H=T.closest("[data-key]"),S=(_=H==null?void 0:H.getAttribute("data-key"))!=null?_:"";E.dataTransfer.setData(at,S),E.dataTransfer.effectAllowed="move"}else if(i==="dragover")E.preventDefault(),E.dataTransfer&&(E.dataTransfer.dropEffect="move");else if(i==="drop")E.preventDefault();else if(i==="dragenter"||i==="dragleave"){let H=E.relatedTarget;if(H&&T.contains(H))return}if(w==="")return}if((i==="keydown"||i==="keyup")&&T.hasAttribute("lvt-key")){let E=T.getAttribute("lvt-key");if(E&&l.key!==E){p=p.parentElement;continue}}let h=T,M=()=>{var S,O;this.logger.debug("handleAction called",{action:w,eventType:i,targetElement:h});let E={action:w,data:{}};if(h instanceof HTMLFormElement){this.logger.debug("Processing form element");let A=new FormData(h),x=Array.from(h.querySelectorAll('input[type="checkbox"][name]')),R=new Map;x.forEach(y=>{let b=R.get(y.name)||[];b.push(y),R.set(y.name,b)}),R.forEach((y,b)=>{y.length===1?E.data[b]=y[0].checked:E.data[b]=y.filter(F=>F.checked).map(F=>F.value)});let z=new Set(Array.from(h.querySelectorAll('input[type="password"][name]')).map(y=>y.name)),v=h.__lvtSubmitter,m=v==null?void 0:v.name;A.forEach((y,b)=>{y instanceof File||m&&b===m||R.has(b)||(z.has(b)?E.data[b]=y:E.data[b]=this.context.parseValue(y))});let L=h.__lvtSubmitter;L&&(this.extractButtonData(L,E.data),delete h.__lvtSubmitter),this.logger.debug("Form data collected:",E.data)}else if(i==="change"||i==="input"||i==="search"){if(h instanceof HTMLInputElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}else if(h instanceof HTMLSelectElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}else if(h instanceof HTMLTextAreaElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}}if(k&&this.extractButtonData(T,E.data),!(h instanceof HTMLFormElement)&&!k&&Array.from(T.attributes).forEach(A=>{if(A.name.startsWith("data-")&&A.name!=="data-key"&&A.name!=="data-lvt-id"){let x=A.name.slice(5);E.data[x]=this.context.parseValue(A.value)}}),i==="drop"){let A=(S=l.dataTransfer)==null?void 0:S.getData(at);A&&(E.data.dragSourceKey=A);let x=(O=T.closest("[data-key]"))==null?void 0:O.getAttribute("data-key");x&&(E.data.dragTargetKey=x)}let H=null;if(i==="submit"&&h instanceof HTMLFormElement){let A=h.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(A).some(R=>R.files&&R.files.length>0)){let R=l.submitter;H=new FormData(h),R!=null&&R.name&&H.set(R.name,R.value),H.set("lvt-action",w)}}if(i==="submit"&&h instanceof HTMLFormElement){let x=l.submitter,R=null;x&&x.hasAttribute("lvt-form:disable-with")&&(R=x.textContent,x.disabled=!0,x.textContent=x.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(h,x||null,R),h.querySelectorAll('input[type="file"][lvt-upload]').forEach(v=>{let m=v.getAttribute("lvt-upload");m&&(this.logger.debug("Triggering pending uploads for:",m),this.context.triggerPendingUploads(m))}),h.dispatchEvent(new CustomEvent("lvt:pending",{detail:E})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",E),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),H!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(h,w,H);return}if(this.context.send(E),this.logger.debug("send() called"),h instanceof HTMLFormElement){let A=h.__lvtCloseDialog;A&&(A.close(),delete h.__lvtCloseDialog)}},D=T.getAttribute("lvt-mod:throttle"),V=T.getAttribute("lvt-mod:debounce");if((D||V)&&i!=="search"){r.has(T)||r.set(T,new Map);let E=r.get(T),H=`${i}:${w}`,S=`__lvt_callback_${H}`,O=T;O[S]||(O[S]={current:M}),O[S].current=M;let A=E.get(H);if(!A){let x=()=>O[S].current();if(D){let R=parseInt(D,10);A=Ce(x,R)}else if(V){let R=parseInt(V,10);A=Q(x,R)}A&&E.set(H,A)}A&&A()}else M();return}p=p.parentElement}};document[a]=c,document.addEventListener(i,c,!1),this.logger.debug("Registered event listener:",i,"with key:",a)})}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(i=>{let a=`__lvt_window_${i}_${n}`,o=window[a];o&&window.removeEventListener(i,o);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let u=`lvt-on:window:${i}`;d.querySelectorAll(He(u)).forEach(f=>{let g=f.getAttribute(u);if(!g)return;if((i==="keydown"||i==="keyup")&&f.hasAttribute("lvt-key")){let k=f.getAttribute("lvt-key");if(k&&l.key!==k)return}let C={action:g,data:{}};Array.from(f.attributes).forEach(k=>{if(k.name.startsWith("data-")&&k.name!=="data-key"&&k.name!=="data-lvt-id"){let h=k.name.slice(5);C.data[h]=this.context.parseValue(k.value)}});let _=f.getAttribute("lvt-mod:throttle"),w=f.getAttribute("lvt-mod:debounce"),T=()=>this.context.send(C);if(_||w){r.has(f)||r.set(f,new Map);let k=r.get(f),h=`window-${i}:${g}`,M=k.get(h);if(!M){if(_){let D=parseInt(_,10);M=Ce(T,D)}else if(w){let D=parseInt(w,10);M=Q(T,D)}M&&k.set(h,M)}M&&M()}else T()})};window[a]=c,window.addEventListener(i,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 i=a=>{let o=this.context.getWrapperElement();if(!o)return;let c=a.target,l=rn.map(u=>He(`lvt-el:${u}:on:click-away`)).join(", ");o.querySelectorAll(l).forEach(u=>{u.contains(c)||Array.from(u.attributes).forEach(p=>{if(!p.name.includes(":on:click-away"))return;let f=p.name.match(/^lvt-el:(\w+):on:click-away$/);if(!f)return;let g=ct[f[1].toLowerCase()];g&&ae(B(u),g,p.value)})})};document[n]=i,document.addEventListener("click",i)}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}`,i=t[r]||new Set,a=`__lvt_el_listeners_${n}`,o=(t[a]||[]).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 f=p.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!f)continue;let g=f[1].toLowerCase();ze(g)&&u.add(g)}for(let p of u)if(sn.has(p)){let f=`__lvt_el_${p}`;if(d[f])continue;let g=()=>le(d,p);d.addEventListener(p,g),d[f]=g,o.push({el:d,event:p,handler:g,guardKey:f})}else if(!i.has(p)){let f=p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`^lvt-el:\\w+:on:${f}$`,"i"),C=_=>{let w=_.target;for(;w&&w!==t;){let T=!1;for(let k of w.attributes)if(g.test(k.name)){T=!0;break}if(T){le(w,p);return}w=w.parentElement}w===t&&le(t,p)};t.addEventListener(p,C),i.add(p),o.push({el:t,event:p,handler:C})}};l(c),c.querySelectorAll("*").forEach(l),t[a]=o,t[r]=i}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:a,event:o,handler:c,guardKey:l})=>{a.removeEventListener(o,c),l&&delete a[l]}),delete e[n]);let i=`__lvt_el_delegated_${t}`;delete e[i]}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 i=o=>{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(o.querySelectorAll(c)).filter(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",f=u.visibility!=="hidden",g=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||typeof process!="undefined"&&!1;return p&&f&&g})},a=o=>{if(o.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(g=>{g.contains(document.activeElement)&&(!d||g.contains(d))&&(d=g)}),d||l.forEach(g=>{let C=g,_=window.getComputedStyle(C);_.display!=="none"&&_.visibility!=="hidden"&&(d=g)}),!d)return;let u=i(d);if(u.length===0)return;let p=u[0],f=u[u.length-1];o.shiftKey?document.activeElement===p&&(o.preventDefault(),f.focus()):document.activeElement===f&&(o.preventDefault(),p.focus())};document[n]=a,document.addEventListener("keydown",a),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 i=()=>{let o=this.context.getWrapperElement();if(!o)return;o.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",f=u.visibility!=="hidden",g=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,C=p&&f&&g,_=d.getAttribute("data-lvt-autofocused")==="true";C&&!_?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!C&&_&&d.removeAttribute("data-lvt-autofocused")})};i();let a=new MutationObserver(o=>{let c=!1;o.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&&i()});a.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=a,this.logger.debug("Autofocus delegation set up")}};function _e(s){try{return s.matches(":popover-open")}catch(e){return!1}}var an=[{matches:s=>s instanceof HTMLDialogElement,isOpen:s=>s.open,open:s=>s.showModal(),close:s=>s.close()},{matches:s=>s instanceof HTMLElement&&s.hasAttribute("popover"),isOpen:s=>_e(s),open:s=>{typeof s.showPopover=="function"&&s.showPopover()},close:s=>{typeof s.hidePopover=="function"&&s.hidePopover()}},{matches:s=>s instanceof HTMLDetailsElement,isOpen:s=>s.open,open:s=>{s.open=!0},close:s=>{s.open=!1}}];function K(s){return an.find(e=>e.matches(s))}var ln=new Set(["show-modal","show-popover"]);function dt(s){let e=s.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 i=document.getElementById(r);if(!i)return;let a=K(i);if(a){if(ln.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!a.isOpen(i)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function ut(s){let e=s.target;e instanceof Element&&e.id&&K(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function pt(s){let e=s.target;if(!(e instanceof Element)||!e.id)return;let t=K(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 ft(){let s=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=K(e);t&&t.isOpen(e)&&e.id!==s&&t.close(e)}),s){let e=document.getElementById(s);if(e){let t=K(e);t&&!t.isOpen(e)&&t.open(e)}}}function De(){let s=location.hash.slice(1);if(!s)return;let e=document.getElementById(s);if(!e)return;let t=K(e);t&&(t.isOpen(e)||t.open(e))}function gt(s){let e=document.getElementById(s);return e?!!K(e):!1}function ht(s){let e=document.getElementById(s);if(!e)return;let t=K(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+s),t.open(e))}var ue=!1;function mt(){ue||(ue=!0,document.addEventListener("click",dt),document.addEventListener("close",ut,!0),document.addEventListener("toggle",pt,!0),window.addEventListener("popstate",ft),De())}function vt(){ue&&(ue=!1,document.removeEventListener("click",dt),document.removeEventListener("close",ut,!0),document.removeEventListener("toggle",pt,!0),window.removeEventListener("popstate",ft))}var pe=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 i=a=>{var l;let o=(l=a.target)==null?void 0:l.closest("a[href]");if(!o)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(o))&&!this.shouldSkip(o)){if(o.pathname===window.location.pathname&&o.search===window.location.search&&o.hash){let d=o.hash.slice(1);d&&gt(d)&&(a.preventDefault(),ht(d));return}a.preventDefault(),this.navigate(o.href)}};document.addEventListener("click",i),document[n]=i,this.popstateListener||(this.popstateListener=()=>{let a=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,a)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||e.hasAttribute("lvt-nav:no-intercept"))return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){var o,c,l;let r=new URL(e,window.location.origin),i=new URL(n,window.location.origin);if(r.origin===i.origin&&r.pathname===i.pathname){if(r.search===i.search){(o=this.abortController)==null||o.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)}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;window.location.href=e}}};var Z=class Z{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 ${Z.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},Z.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()}};Z.LOAD_MORE_TIMEOUT_MS=3e4;var fe=Z;var ge=class{constructor(){this.bar=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.style.cssText=`
14
+ `,document.head.appendChild(s)}}var Xe="__lvtPendingProcessed";function ot(s){s.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[Xe]===t)return;e[Xe]=t;let n;try{n=JSON.parse(t)}catch(a){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",i=nn(r);n.forEach(a=>{let o=sn(a);i.appendChild(o),typeof a.dismissMS=="number"&&a.dismissMS>0&&setTimeout(()=>o.remove(),a.dismissMS)})})}function at(){let s="__lvt_toast_click_outside",e=document[s];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(i=>i.remove())};document[s]=t,document.addEventListener("click",t)}function nn(s){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"),rn(e,s),document.body.appendChild(e)),e}function rn(s,e){let t=s.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 sn(s){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",s.id),s.type&&e.setAttribute("data-type",s.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),s.title){let n=document.createElement("strong");n.textContent=s.title,t.appendChild(n)}if(s.body){let n=document.createElement("p");n.textContent=s.body,t.appendChild(n)}if(e.appendChild(t),s.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}function Z(s,e){let t=null;return function(...r){let i=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{s.apply(i,r)},e)}}function Re(s,e){let t=!1;return function(...r){let i=this;t||(s.apply(i,r),t=!0,setTimeout(()=>{t=!1},e))}}function De(s,e){let t=s.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var lt=!1;function Y(s,e,t){return s.hasAttribute(e)?!0:s.hasAttribute("lvt-no-intercept")?(lt||(lt=!0,t.warn(`lvt-no-intercept is deprecated; use ${e}. The shim will be removed in v0.9.0.`)),!0):!1}var ut={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},on=Object.keys(ut),an=new Set(["mouseenter","mouseleave","focus","blur"]),ct="application/x-lvt-key",ln=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]),dt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"],ue=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of dt){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=dt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_delegated_${i}_${n}`,o=document[a];o&&document.removeEventListener(i,o,!1);let c=l=>{var H,D;let d=this.context.getWrapperElement();if(!d)return;let u=l.target;if(this.logger.debug("Event listener triggered:",i,l.target),!u)return;let p=u,f=!1;for(;p;){if(p===d){f=!0;break}p=p.parentElement}if(!f)return;let g=`lvt-on:${i}`;for(p=u;p&&p!==d.parentElement;){let w=p.getAttribute(g),T=p,k=!1;if(!w&&i==="submit"&&p instanceof HTMLFormElement){let h=p.getAttribute("lvt-persist");h&&(w=`persist:${h}`,T=p)}if(!w&&i==="click"){let h=p instanceof HTMLButtonElement?p:null;h&&h.name&&!h.disabled&&h.type!=="reset"&&h.form===null&&!h.hasAttribute("commandfor")&&(w=h.name,T=h,k=!0)}if(!w&&i==="submit"&&p instanceof HTMLFormElement&&!Y(p,"lvt-form:no-intercept",this.logger)){let h=p.getAttribute("lvt-form:action"),M=l.submitter;h?w=h:M instanceof HTMLButtonElement&&M.name?w=M.name:p.getAttribute("name")?w=p.getAttribute("name"):w="submit",T=p,M&&(p.__lvtSubmitter=M);let O=p.closest("dialog");O&&((H=p.getAttribute("method"))==null?void 0:H.toLowerCase())==="dialog"&&(p.__lvtCloseDialog=O)}if(w!=null&&T){if(i==="submit"&&l.preventDefault(),ln.has(i)){let E=l;if(i==="dragstart"&&E.dataTransfer){let R=T.closest("[data-key]"),S=(D=R==null?void 0:R.getAttribute("data-key"))!=null?D:"";E.dataTransfer.setData(ct,S),E.dataTransfer.effectAllowed="move"}else if(i==="dragover")E.preventDefault(),E.dataTransfer&&(E.dataTransfer.dropEffect="move");else if(i==="drop")E.preventDefault();else if(i==="dragenter"||i==="dragleave"){let R=E.relatedTarget;if(R&&T.contains(R))return}if(w==="")return}if((i==="keydown"||i==="keyup")&&T.hasAttribute("lvt-key")){let E=T.getAttribute("lvt-key");if(E&&l.key!==E){p=p.parentElement;continue}}let h=T,M=()=>{var S,I;this.logger.debug("handleAction called",{action:w,eventType:i,targetElement:h});let E={action:w,data:{}};if(h instanceof HTMLFormElement){this.logger.debug("Processing form element");let A=new FormData(h),x=Array.from(h.querySelectorAll('input[type="checkbox"][name]')),C=new Map;x.forEach(y=>{let b=C.get(y.name)||[];b.push(y),C.set(y.name,b)}),C.forEach((y,b)=>{y.length===1?E.data[b]=y[0].checked:E.data[b]=y.filter(F=>F.checked).map(F=>F.value)});let z=new Set(Array.from(h.querySelectorAll('input[type="password"][name]')).map(y=>y.name)),v=h.__lvtSubmitter,m=v==null?void 0:v.name;A.forEach((y,b)=>{y instanceof File||m&&b===m||C.has(b)||(z.has(b)?E.data[b]=y:E.data[b]=this.context.parseValue(y))});let L=h.__lvtSubmitter;L&&(this.extractButtonData(L,E.data),delete h.__lvtSubmitter),this.logger.debug("Form data collected:",E.data)}else if(i==="change"||i==="input"||i==="search"){if(h instanceof HTMLInputElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}else if(h instanceof HTMLSelectElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}else if(h instanceof HTMLTextAreaElement){let A=h.name||"value";E.data[A]=this.context.parseValue(h.value)}}if(k&&this.extractButtonData(T,E.data),!(h instanceof HTMLFormElement)&&!k&&Array.from(T.attributes).forEach(A=>{if(A.name.startsWith("data-")&&A.name!=="data-key"&&A.name!=="data-lvt-id"){let x=A.name.slice(5);E.data[x]=this.context.parseValue(A.value)}}),i==="drop"){let A=(S=l.dataTransfer)==null?void 0:S.getData(ct);A&&(E.data.dragSourceKey=A);let x=(I=T.closest("[data-key]"))==null?void 0:I.getAttribute("data-key");x&&(E.data.dragTargetKey=x)}let R=null;if(i==="submit"&&h instanceof HTMLFormElement){let A=h.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(A).some(C=>C.files&&C.files.length>0)){let C=l.submitter;R=new FormData(h),C!=null&&C.name&&R.set(C.name,C.value),R.set("lvt-action",w)}}if(i==="submit"&&h instanceof HTMLFormElement){let x=l.submitter,C=null;x&&x.hasAttribute("lvt-form:disable-with")&&(C=x.textContent,x.disabled=!0,x.textContent=x.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(h,x||null,C),h.querySelectorAll('input[type="file"][lvt-upload]').forEach(v=>{let m=v.getAttribute("lvt-upload");m&&(this.logger.debug("Triggering pending uploads for:",m),this.context.triggerPendingUploads(m))}),h.dispatchEvent(new CustomEvent("lvt:pending",{detail:E})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",E),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),R!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(h,w,R);return}if(this.context.send(E),this.logger.debug("send() called"),h instanceof HTMLFormElement){let A=h.__lvtCloseDialog;A&&(A.close(),delete h.__lvtCloseDialog)}},O=T.getAttribute("lvt-mod:throttle"),V=T.getAttribute("lvt-mod:debounce");if((O||V)&&i!=="search"){r.has(T)||r.set(T,new Map);let E=r.get(T),R=`${i}:${w}`,S=`__lvt_callback_${R}`,I=T;I[S]||(I[S]={current:M}),I[S].current=M;let A=E.get(R);if(!A){let x=()=>I[S].current();if(O){let C=parseInt(O,10);A=Re(x,C)}else if(V){let C=parseInt(V,10);A=Z(x,C)}A&&E.set(R,A)}A&&A()}else M();return}p=p.parentElement}};document[a]=c,document.addEventListener(i,c,!1),this.logger.debug("Registered event listener:",i,"with key:",a)})}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(i=>{let a=`__lvt_window_${i}_${n}`,o=window[a];o&&window.removeEventListener(i,o);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let u=`lvt-on:window:${i}`;d.querySelectorAll(De(u)).forEach(f=>{let g=f.getAttribute(u);if(!g)return;if((i==="keydown"||i==="keyup")&&f.hasAttribute("lvt-key")){let k=f.getAttribute("lvt-key");if(k&&l.key!==k)return}let H={action:g,data:{}};Array.from(f.attributes).forEach(k=>{if(k.name.startsWith("data-")&&k.name!=="data-key"&&k.name!=="data-lvt-id"){let h=k.name.slice(5);H.data[h]=this.context.parseValue(k.value)}});let D=f.getAttribute("lvt-mod:throttle"),w=f.getAttribute("lvt-mod:debounce"),T=()=>this.context.send(H);if(D||w){r.has(f)||r.set(f,new Map);let k=r.get(f),h=`window-${i}:${g}`,M=k.get(h);if(!M){if(D){let O=parseInt(D,10);M=Re(T,O)}else if(w){let O=parseInt(w,10);M=Z(T,O)}M&&k.set(h,M)}M&&M()}else T()})};window[a]=c,window.addEventListener(i,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 i=a=>{let o=this.context.getWrapperElement();if(!o)return;let c=a.target,l=on.map(u=>De(`lvt-el:${u}:on:click-away`)).join(", ");o.querySelectorAll(l).forEach(u=>{u.contains(c)||Array.from(u.attributes).forEach(p=>{if(!p.name.includes(":on:click-away"))return;let f=p.name.match(/^lvt-el:(\w+):on:click-away$/);if(!f)return;let g=ut[f[1].toLowerCase()];g&&le(B(u),g,p.value)})})};document[n]=i,document.addEventListener("click",i)}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}`,i=t[r]||new Set,a=`__lvt_el_listeners_${n}`,o=(t[a]||[]).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 f=p.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!f)continue;let g=f[1].toLowerCase();Ge(g)&&u.add(g)}for(let p of u)if(an.has(p)){let f=`__lvt_el_${p}`;if(d[f])continue;let g=()=>ce(d,p);d.addEventListener(p,g),d[f]=g,o.push({el:d,event:p,handler:g,guardKey:f})}else if(!i.has(p)){let f=p.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),g=new RegExp(`^lvt-el:\\w+:on:${f}$`,"i"),H=D=>{let w=D.target;for(;w&&w!==t;){let T=!1;for(let k of w.attributes)if(g.test(k.name)){T=!0;break}if(T){ce(w,p);return}w=w.parentElement}w===t&&ce(t,p)};t.addEventListener(p,H),i.add(p),o.push({el:t,event:p,handler:H})}};l(c),c.querySelectorAll("*").forEach(l),t[a]=o,t[r]=i}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:a,event:o,handler:c,guardKey:l})=>{a.removeEventListener(o,c),l&&delete a[l]}),delete e[n]);let i=`__lvt_el_delegated_${t}`;delete e[i]}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 i=o=>{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(o.querySelectorAll(c)).filter(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",f=u.visibility!=="hidden",g=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||typeof process!="undefined"&&!1;return p&&f&&g})},a=o=>{if(o.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(g=>{g.contains(document.activeElement)&&(!d||g.contains(d))&&(d=g)}),d||l.forEach(g=>{let H=g,D=window.getComputedStyle(H);D.display!=="none"&&D.visibility!=="hidden"&&(d=g)}),!d)return;let u=i(d);if(u.length===0)return;let p=u[0],f=u[u.length-1];o.shiftKey?document.activeElement===p&&(o.preventDefault(),f.focus()):document.activeElement===f&&(o.preventDefault(),p.focus())};document[n]=a,document.addEventListener("keydown",a),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 i=()=>{let o=this.context.getWrapperElement();if(!o)return;o.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,u=window.getComputedStyle(d),p=u.display!=="none",f=u.visibility!=="hidden",g=d.offsetParent!==null||u.position==="fixed"||u.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,H=p&&f&&g,D=d.getAttribute("data-lvt-autofocused")==="true";H&&!D?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!H&&D&&d.removeAttribute("data-lvt-autofocused")})};i();let a=new MutationObserver(o=>{let c=!1;o.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&&i()});a.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=a,this.logger.debug("Autofocus delegation set up")}};function Oe(s){try{return s.matches(":popover-open")}catch(e){return!1}}var cn=[{matches:s=>s instanceof HTMLDialogElement,isOpen:s=>s.open,open:s=>s.showModal(),close:s=>s.close()},{matches:s=>s instanceof HTMLElement&&s.hasAttribute("popover"),isOpen:s=>Oe(s),open:s=>{typeof s.showPopover=="function"&&s.showPopover()},close:s=>{typeof s.hidePopover=="function"&&s.hidePopover()}},{matches:s=>s instanceof HTMLDetailsElement,isOpen:s=>s.open,open:s=>{s.open=!0},close:s=>{s.open=!1}}];function K(s){return cn.find(e=>e.matches(s))}var dn=new Set(["show-modal","show-popover"]);function pt(s){let e=s.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 i=document.getElementById(r);if(!i)return;let a=K(i);if(a){if(dn.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!a.isOpen(i)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function ft(s){let e=s.target;e instanceof Element&&e.id&&K(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function gt(s){let e=s.target;if(!(e instanceof Element)||!e.id)return;let t=K(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 ht(){let s=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=K(e);t&&t.isOpen(e)&&e.id!==s&&t.close(e)}),s){let e=document.getElementById(s);if(e){let t=K(e);t&&!t.isOpen(e)&&t.open(e)}}}function _e(){let s=location.hash.slice(1);if(!s)return;let e=document.getElementById(s);if(!e)return;let t=K(e);t&&(t.isOpen(e)||t.open(e))}function mt(s){let e=document.getElementById(s);return e?!!K(e):!1}function vt(s){let e=document.getElementById(s);if(!e)return;let t=K(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+s),t.open(e))}var pe=!1;function yt(){pe||(pe=!0,document.addEventListener("click",pt),document.addEventListener("close",ft,!0),document.addEventListener("toggle",gt,!0),window.addEventListener("popstate",ht),_e())}function bt(){pe&&(pe=!1,document.removeEventListener("click",pt),document.removeEventListener("close",ft,!0),document.removeEventListener("toggle",gt,!0),window.removeEventListener("popstate",ht))}var fe=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 i=a=>{var l;let o=(l=a.target)==null?void 0:l.closest("a[href]");if(!o)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(o))&&!this.shouldSkip(o)){if(o.pathname===window.location.pathname&&o.search===window.location.search&&o.hash){let d=o.hash.slice(1);d&&mt(d)&&(a.preventDefault(),vt(d));return}a.preventDefault(),this.navigate(o.href)}};document.addEventListener("click",i),document[n]=i,this.popstateListener||(this.popstateListener=()=>{let a=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,a)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||Y(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 o,c,l;let r=new URL(e,window.location.origin),i=new URL(n,window.location.origin);if(r.origin===i.origin&&r.pathname===i.pathname){if(r.search===i.search){(o=this.abortController)==null||o.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 ee=class ee{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 ${ee.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},ee.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()}};ee.LOAD_MORE_TIMEOUT_MS=3e4;var ge=ee;var he=class{constructor(){this.bar=null}show(){if(this.bar)return;let e=document.createElement("div");if(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)}};var he=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!1})})}};var yt=!1;function cn(s){let e=s.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"),i=document.getElementById(n);i&&(i instanceof HTMLDialogElement?r==="show-modal"&&!i.open?i.showModal():r==="close"&&i.open&&i.close():i instanceof HTMLElement&&i.hasAttribute("popover")&&(r==="show-popover"&&typeof i.showPopover=="function"?i.showPopover():r==="hide-popover"&&typeof i.hidePopover=="function"?i.hidePopover():r==="toggle-popover"&&typeof i.togglePopover=="function"&&i.togglePopover()))}function bt(){"commandForElement"in HTMLButtonElement.prototype||yt||(yt=!0,document.addEventListener("click",cn))}var Y="__lvt_scroll_away",U=[];function dn(){for(let s=U.length-1;s>=0;s--){let e=U[s];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[Y],U.splice(s,1))}}function wt(s){dn();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=B(t);if(!r||r===t){let u=t[Y];u&&(u.target.removeEventListener("scroll",u.handler),Et(u),delete t[Y]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let i=t[Y];if(i){if(i.target===r)return;i.target.removeEventListener("scroll",i.handler),Et(i)}let a=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),o=isNaN(a)?200:a,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>o?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[Y]=d,U.push(d)};e(s),s.querySelectorAll("[lvt-scroll-away]").forEach(e)}function Et(s){let e=U.indexOf(s);e!==-1&&U.splice(e,1)}function At(s){for(let e=U.length-1;e>=0;e--){let t=U[e];s&&t.trigger.isConnected&&!s.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[Y],U.splice(e,1))}}function Tt(s){return typeof structuredClone=="function"?structuredClone(s):JSON.parse(JSON.stringify(s))}function un(s){return s!=null&&typeof s=="object"&&Array.isArray(s.d)&&Array.isArray(s.s)}function Ie(s,e=0){if(e>50||s==null||typeof s!="object"||Array.isArray(s))return!1;if(un(s))return!0;for(let n of Object.keys(s))if(/^\d+$/.test(n)){let r=s[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Ie(r,e+1))return!0}return!1}function pn(s,e){if(!e.s||!Array.isArray(e.s))return!1;if(Ie(s)&&!Ie(e))return!0;for(let t of Object.keys(s))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var me=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e,t){var c,l;let n=!1,r=[],i=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 f=this.treeState[d];f&&typeof f=="object"&&!Array.isArray(f)&&Array.isArray(f.d)&&Array.isArray(f.s)?((c=t==null?void 0:t.canApplyTargeted)==null?void 0:c.call(t,f,d))===!0?(this.applyDifferentialOpsToRange(f,u,d),r.push({rangePath:d,ops:u,statics:f.s,staticsMap:f.sm,idKey:(l=f.m)==null?void 0:l.idKey}),i.add(d)):(this.treeState[d]=Tt(f),this.applyDifferentialOpsToRange(this.treeState[d],u,d)):this.treeState[d]=u,n=!0}else{let f=this.treeState[d],g=typeof u=="object"&&u!==null&&!Array.isArray(u)?this.deepMergeTreeNodes(f,u,d):u;JSON.stringify(f)!==JSON.stringify(g)&&(this.treeState[d]=g,n=!0)}let o={html:this.reconstructFromTree(this.treeState,"",i.size>0?i:void 0),changed:n};return r.length>0&&(o.targetedOps=r),o}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 i;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(pn(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[a,o]of Object.entries(t)){let c=n?`${n}.${a}`:a,l=Array.isArray(o)&&o.length>0&&Array.isArray(o[0])&&typeof o[0][0]=="string",d=r[a]&&typeof r[a]=="object"&&!Array.isArray(r[a])&&Array.isArray(r[a].d)&&Array.isArray(r[a].s);l&&d?(r[a]=Tt(r[a]),this.logger.debug(`[deepMerge] Applying diff ops at path ${c}`,{ops:o,rangeItems:(i=r[a].d)==null?void 0:i.length}),this.applyDifferentialOpsToRange(r[a],o,c)):typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof r[a]=="object"&&r[a]!==null&&!Array.isArray(r[a])?r[a]=this.deepMergeTreeNodes(r[a],o,c):r[a]=o}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,staticsMap:e.sm}),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 i of t){if(!Array.isArray(i)||i.length<2)continue;switch(i[0]){case"r":{let o=i[1],c=this.findItemIndexByKey(r,o,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${o}, 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 ${o} not found`);break}case"u":{let o=this.findItemIndexByKey(r,i[1],e.s,n),c=i[2];o>=0&&c&&(r[o]=this.mergeRangeItem(r[o],c,n));break}case"a":{let o=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.push(...o),i[3]&&typeof i[3]=="object"&&i[3].idKey&&(this.rangeIdKeys[n]=i[3].idKey);break}case"p":{let o=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.unshift(...o);break}case"i":{let o=this.findItemIndexByKey(r,i[1],e.s,n);if(o>=0){let c=Array.isArray(i[2])?i[2]:[i[2]];r.splice(o+1,0,...c)}break}case"o":{let o=i[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 o){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,staticsMap:e.sm}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let i=0;i<e.s.length;i++){let a=e.s[i];if(r+=a,i<e.s.length-1){let o=i.toString();if(e[o]!==void 0){let c=t?`${t}.${o}`:o;if(n&&n.has(c)){r+=`<!--lvt-targeted-skip:${c}-->`;continue}r+=this.renderValue(e[o],o,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 a=n||t||"";return a&&(this.rangeState[a]={items:e.d,statics:e.s,staticsMap:e.sm},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[a]=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),i=r.filter(a=>/^\d+$/.test(a)).sort((a,o)=>parseInt(a)-parseInt(o));if(i.length>0&&i.length===r.length)return i.map(a=>{let o=n?`${n}.${a}`:a;return this.renderValue(e[a],a,o)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,i)=>{let a=i.toString(),o=n?`${n}.${a}`:a;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,o):this.renderValue(r,a,o)}).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:i,sm:a}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let o="else",c=n?`${n}.else`:"else";return this.renderValue(e.else,o,c)}return""}return i&&Array.isArray(i)?r.map((o,c)=>this.renderRangeItem(o,c,i,a,n)).join(""):r.map((o,c)=>{let l=c.toString(),d=n?`${n}.${l}`:l;return this.renderValue(o,l,d)}).join("")}renderRangeItem(e,t,n,r,i){let a=n;r&&typeof r=="object"&&e._sk&&r[e._sk]&&(a=r[e._sk]);let o="";for(let c=0;c<a.length;c++)if(o+=a[c],c<a.length-1){let l=c.toString();if(e[l]!==void 0){let d=i?`${i}.${t}.${l}`:`${t}.${l}`;o+=this.renderValue(e[l],l,d)}}return o}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],i=n.statics;for(let o of e){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let l=this.findItemIndexByKey(r,o[1],i,t);l>=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,o[1],i,t),d=o[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,o[1],o[2],n,!1),o[3]&&typeof o[3]=="object"&&o[3].idKey&&(this.rangeIdKeys[t||""]=o[3].idKey);break}case"p":{this.addItemsToRange(r,o[1],o[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,o[1],i,t);if(l>=0){let d=Array.isArray(o[2])?o[2]:[o[2]];r.splice(l+1,0,...d)}break}case"o":{let l=o[1],d=[],u=new Map;for(let p of r){let f=this.getItemKey(p,i,t);f&&u.set(f,p)}for(let p of l){let f=u.get(p);f&&d.push(f)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics,staticsMap:n.staticsMap},this.treeState[t]={d:r,s:n.statics,sm:n.staticsMap};let a=this.getCurrentRangeStructure(t);return a&&a.s?this.renderItemsWithStatics(r,a.s,a.sm,t):r.map(o=>this.renderValue(o)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics,sm:this.rangeState[e].staticsMap};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n,r){let i=e.map((a,o)=>this.renderRangeItem(a,o,t,n,r)).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:",i.substring(0,200))),i}addItemsToRange(e,t,n,r,i){if(n&&(r.statics=n),!t)return;let a=Array.isArray(t)?t:[t];i?e.unshift(...a):e.push(...a)}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(i=>this.getItemKey(i,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var Oe=["data-key","data-lvt-key"],fn=Oe.map(s=>new RegExp(`(?:^|[\\s<])${s}\\s*=`)),j="data-lvt-targeted-applied",q="data-lvt-targeted-skip",ve=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 i=this.findItemByKey(e,n);if(!i||!i.parentElement)return null;let a=i.parentElement;return this.containerCache.set(t,a),a}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 a=t.d;if(Array.isArray(a)){for(let d of a)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let o=this.extractItemKey(a==null?void 0:a[0],t),c=this.findContainer(e,n,o);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:o}}apply(e,t,n){let{rangePath:r,ops:i,statics:a,staticsMap:o}=t,c=this.firstKnownKey(i),l=this.findContainer(e,r,c);if(!l)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let d=!0;for(let u of i){if(!Array.isArray(u)||u.length<1)continue;let p=u[0];try{let f=!0;switch(p){case"r":f=this.applyRemove(l,u[1]);break;case"u":f=this.applyUpdateRow(l,u[1],a,o,r,n);break;case"i":f=this.applyInsertAfter(l,u[1],u[2],a,o,r);break;case"a":f=this.applyAppend(l,u[1],a,o,r);break;case"p":f=this.applyPrepend(l,u[1],a,o,r);break;case"o":f=this.applyReorder(l,u[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${p}; falling back`),f=!1}f||(d=!1)}catch(f){return this.ctx.logger.error(`[RangeDomApplier] op ${p} failed for range ${r}`,f),null}}return d?(typeof window!="undefined"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,l):null}cleanupMarkers(e){e.querySelectorAll(`[${j}]`).forEach(r=>r.removeAttribute(j)),e.hasAttribute(j)&&e.removeAttribute(j),e.querySelectorAll(`[${q}]`).forEach(r=>r.removeAttribute(q)),e.hasAttribute(q)&&e.removeAttribute(q)}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,i,a){var p,f;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 c=this.indexOfChild(e,o),l=this.lookupCurrentItem(i,t);if(!l)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let d=this.ctx.renderItem(l,c,n,r,i),u=this.parseSingleRow(d);return u?(a?ie(o,u,{...a,childrenOnly:!1}):(this.fireHookOnSubtree(o,"lvt-destroyed"),o.replaceWith(u),(f=(p=this.ctx).onNodeAdded)==null||f.call(p,u),this.fireHookOnSubtree(u,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,i,a){let o=this.findItemByKey(e,t);return o?this.renderItemsAtomic(n,r,i,a,this.indexOfChild(e,o)+1,c=>e.insertBefore(c,o.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r,i){return this.renderItemsAtomic(t,n,r,i,e.children.length,a=>e.appendChild(a))}applyPrepend(e,t,n,r,i){return this.renderItemsAtomic(t,n,r,i,0,a=>e.insertBefore(a,e.firstChild))}renderItemsAtomic(e,t,n,r,i,a){var d,u;let o=Array.isArray(e)?e:[e],c=document.createDocumentFragment(),l=[];for(let p=0;p<o.length;p++){let f=this.renderAndParse(o[p],i+p,t,n,r);if(!f)return!1;c.appendChild(f),l.push(f)}a(c);for(let p of l)(u=(d=this.ctx).onNodeAdded)==null||u.call(d,p),this.fireHookOnSubtree(p,"lvt-mounted");return!0}applyReorder(e,t){if(!Array.isArray(t))return!1;let n=new Map;Array.from(e.children).forEach(a=>{for(let o of Oe){let c=a.getAttribute(o);if(c!==null){n.set(c,a);break}}});let r=document.createDocumentFragment(),i=new Set(t);for(let a of t){let o=n.get(a);o&&r.appendChild(o)}if(i.size<n.size){this.ctx.logger.warn(`[RangeDomApplier] o: newKeyOrder (${i.size}) shorter than existing children (${n.size}); ${n.size-i.size} children will be dropped`);for(let[a,o]of n)i.has(a)||this.fireHookOnSubtree(o,"lvt-destroyed")}return e.replaceChildren(r),!0}renderAndParse(e,t,n,r,i){let a=this.ctx.renderItem(e,t,n,r,i);return this.parseSingleRow(a)}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 Oe){let i=e.querySelector(`[${r}="${n}"]`);if(i)return i}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 i of r)if(i&&typeof i=="object"&&i._k!==void 0)return String(i._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of fn)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 ye=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 be=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 i=this.escapeCSSSelector(n),a=e.querySelectorAll(`[name="${i}"]`);for(let o of a){if(this.wiredElements.has(o)||o.hasAttribute("lvt-input")||o.hasAttribute("lvt-change"))continue;let c=o.closest("form");c&&(c.hasAttribute("lvt-change")||c.hasAttribute("lvt-form:no-intercept"))||o instanceof HTMLInputElement&&(o.type==="hidden"||o.type==="submit"||o.type==="button")||o instanceof HTMLButtonElement||(this.attachListener(o,n,r),this.wiredElements.add(o))}}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 i=n.getAttribute("name");i&&(this.attachListener(n,i,"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],i=this.detectBinding(n,r);i&&!this.boundFields.has(i.fieldName)&&this.boundFields.set(i.fieldName,i.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 i=r[1].toLowerCase();return i!=="checkbox"&&i!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),i=r?parseInt(r,10):NaN,a=Number.isNaN(i)||i<0?300:i,c=Q(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},a),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: ${a}ms)`)}};var Fe=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 o,c,l,d,u;this.clearReconnectTimer();let e=(o=this.options.maxReconnectAttempts)!=null?o: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),i=Math.random()*1e3,a=Math.min(r+i,n);this.reconnectTimer=window.setTimeout(()=>{var p,f;(f=(p=this.options).onReconnectAttempt)==null||f.call(p,this.reconnectAttempts,a),this.connect()},a)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},Ee=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 hn(e,this.config.logger))return{usingWebSocket:!1,initialState:await St(e,this.config.logger)};let n,r,i=new Promise((u,p)=>{n=u,r=p}),a=!1,o=!1,c=null,l=u=>{a||(a=!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 Fe({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{o=!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:()=>{o?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(u,p)=>{var f,g;(g=(f=this.config).onReconnectAttempt)==null||g.call(f,u,p)},onReconnectFailed:()=>{var u,p;(p=(u=this.config).onReconnectFailed)==null||p.call(u)},onError:u=>{var p,f;(f=(p=this.config).onError)==null||f.call(p,u),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await i}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 St(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 hn(s,e){try{let n=(await fetch(s,{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 St(s,e){try{let t=await fetch(s,{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 we=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let i=new XMLHttpRequest;i.upload.addEventListener("progress",o=>{o.lengthComputable&&(e.bytesUploaded=o.loaded,e.progress=Math.round(o.loaded/o.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{i.abort()});let a=new Promise((o,c)=>{i.addEventListener("load",()=>{i.status>=200&&i.status<300?(e.done=!0,e.progress=100,o()):c(new Error(`S3 upload failed with status ${i.status}: ${i.statusText}`))}),i.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),i.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(i.open("PUT",t.url),t.headers)for(let[o,c]of Object.entries(t.headers))i.setRequestHeader(o,c);i.send(r),await a}catch(i){throw e.error=i instanceof Error?i.message:String(i),i}}};var Ae=class{constructor(e,t={}){this.sendMessage=e;this.entries=new Map;this.pendingFiles=new Map;this.autoUploadConfig=new Map;this.uploaders=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.uploaders.set("s3",new we)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let i=this.inputHandlers.get(n);i&&n.removeEventListener("change",i);let a=o=>{let c=o.target.files;!c||c.length===0||this.startUpload(r,Array.from(c))};n.addEventListener("change",a),this.inputHandlers.set(n,a)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(i=>({name:i.name,type:i.type||"application/octet-stream",size:i.size})),r={action:"upload_start",upload_name:e,files:n};this.sendMessage(r)}async handleUploadStartResponse(e){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 i=new Map;for(let o of r)i.set(o.name,o);let a=[];for(let o of n){let c=i.get(o.client_name);if(!c){console.warn(`No file found for entry ${o.entry_id} (client_name: ${o.client_name})`);continue}let l={id:o.entry_id,file:c,uploadName:t,progress:0,bytesUploaded:0,valid:o.valid,done:!1,error:o.error,external:o.external};if(this.entries.set(l.id,l),a.push(l),!o.valid){this.onError&&o.error&&this.onError(l,o.error);continue}o.auto_upload&&(o.external?this.uploadExternal(l,o.external):this.uploadChunked(l))}}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.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}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 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 a=Math.min(r+this.chunkSize,t.size),o=t.slice(r,a),c=await this.fileToBase64(o),l={action:"upload_chunk",entry_id:n,chunk_base64:c,offset:r,total:t.size};this.sendMessage(l),r=a,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let i={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(i),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(i){let a=i instanceof Error?i.message:String(i);e.error=a,this.onError&&this.onError(e,a),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)n.external?this.uploadExternal(n,n.external):this.uploadChunked(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,i]of this.entries)e&&i.uploadName!==e||(i.done||i.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 a=r.result.split(",")[1];t(a)},r.onerror=n,r.readAsDataURL(e)})}};var Lt={silent:0,error:1,warn:2,info:3,debug:4},kt="LiveTemplate",Ne=class s{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 s(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 Lt[e]<=Lt[this.state.level]}formatPrefix(){return this.scope.length===0?`[${kt}]`:`[${kt}:${this.scope.join(":")}]`}};function Ue(s={}){var n,r;let e={level:(n=s.level)!=null?n:"info"},t=Array.isArray(s.scope)?s.scope:s.scope?[s.scope]:[];return new Ne(e,t,(r=s.sink)!=null?r:console)}async function Mt(s,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let i=t("fs"),a=JSON.parse(i.readFileSync(e,"utf8"));return s.applyUpdate(a)}let r=await(await fetch(e)).json();return s.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function xt(s,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(s),i=n(e);if(r===i)return{match:!0,differences:[]};let a=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)}};var me=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!1})})}};var Et=!1;function un(s){let e=s.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"),i=document.getElementById(n);i&&(i instanceof HTMLDialogElement?r==="show-modal"&&!i.open?i.showModal():r==="close"&&i.open&&i.close():i instanceof HTMLElement&&i.hasAttribute("popover")&&(r==="show-popover"&&typeof i.showPopover=="function"?i.showPopover():r==="hide-popover"&&typeof i.hidePopover=="function"?i.hidePopover():r==="toggle-popover"&&typeof i.togglePopover=="function"&&i.togglePopover()))}function wt(){"commandForElement"in HTMLButtonElement.prototype||Et||(Et=!0,document.addEventListener("click",un))}var X="__lvt_scroll_away",U=[];function pn(){for(let s=U.length-1;s>=0;s--){let e=U[s];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[X],U.splice(s,1))}}function Tt(s){pn();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=B(t);if(!r||r===t){let u=t[X];u&&(u.target.removeEventListener("scroll",u.handler),At(u),delete t[X]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let i=t[X];if(i){if(i.target===r)return;i.target.removeEventListener("scroll",i.handler),At(i)}let a=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),o=isNaN(a)?200:a,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>o?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[X]=d,U.push(d)};e(s),s.querySelectorAll("[lvt-scroll-away]").forEach(e)}function At(s){let e=U.indexOf(s);e!==-1&&U.splice(e,1)}function St(s){for(let e=U.length-1;e>=0;e--){let t=U[e];s&&t.trigger.isConnected&&!s.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[X],U.splice(e,1))}}function Lt(s){return typeof structuredClone=="function"?structuredClone(s):JSON.parse(JSON.stringify(s))}function fn(s){return s!=null&&typeof s=="object"&&Array.isArray(s.d)&&Array.isArray(s.s)}function Ie(s,e=0){if(e>50||s==null||typeof s!="object"||Array.isArray(s))return!1;if(fn(s))return!0;for(let n of Object.keys(s))if(/^\d+$/.test(n)){let r=s[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Ie(r,e+1))return!0}return!1}function gn(s,e){if(!e.s||!Array.isArray(e.s))return!1;if(Ie(s)&&!Ie(e))return!0;for(let t of Object.keys(s))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var ve=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e,t){var c,l;let n=!1,r=[],i=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 f=this.treeState[d];f&&typeof f=="object"&&!Array.isArray(f)&&Array.isArray(f.d)&&Array.isArray(f.s)?((c=t==null?void 0:t.canApplyTargeted)==null?void 0:c.call(t,f,d))===!0?(this.applyDifferentialOpsToRange(f,u,d),r.push({rangePath:d,ops:u,statics:f.s,idKey:(l=f.m)==null?void 0:l.idKey}),i.add(d)):(this.treeState[d]=Lt(f),this.applyDifferentialOpsToRange(this.treeState[d],u,d)):this.treeState[d]=u,n=!0}else{let f=this.treeState[d],g=typeof u=="object"&&u!==null&&!Array.isArray(u)?this.deepMergeTreeNodes(f,u,d):u;JSON.stringify(f)!==JSON.stringify(g)&&(this.treeState[d]=g,n=!0)}let o={html:this.reconstructFromTree(this.treeState,"",i.size>0?i:void 0),changed:n};return r.length>0&&(o.targetedOps=r),o}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 i;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(gn(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[a,o]of Object.entries(t)){let c=n?`${n}.${a}`:a,l=Array.isArray(o)&&o.length>0&&Array.isArray(o[0])&&typeof o[0][0]=="string",d=r[a]&&typeof r[a]=="object"&&!Array.isArray(r[a])&&Array.isArray(r[a].d)&&Array.isArray(r[a].s);l&&d?(r[a]=Lt(r[a]),this.logger.debug(`[deepMerge] Applying diff ops at path ${c}`,{ops:o,rangeItems:(i=r[a].d)==null?void 0:i.length}),this.applyDifferentialOpsToRange(r[a],o,c)):typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof r[a]=="object"&&r[a]!==null&&!Array.isArray(r[a])?r[a]=this.deepMergeTreeNodes(r[a],o,c):r[a]=o}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 i of t){if(!Array.isArray(i)||i.length<2)continue;switch(i[0]){case"r":{let o=i[1],c=this.findItemIndexByKey(r,o,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${o}, 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 ${o} not found`);break}case"u":{let o=this.findItemIndexByKey(r,i[1],e.s,n),c=i[2];o>=0&&c&&(r[o]=this.mergeRangeItem(r[o],c,n));break}case"a":{let o=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.push(...o),i[3]&&typeof i[3]=="object"&&i[3].idKey&&(this.rangeIdKeys[n]=i[3].idKey);break}case"p":{let o=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.unshift(...o);break}case"i":{let o=this.findItemIndexByKey(r,i[1],e.s,n);if(o>=0){let c=Array.isArray(i[2])?i[2]:[i[2]];r.splice(o+1,0,...c)}break}case"o":{let o=i[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 o){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 i=0;i<e.s.length;i++){let a=e.s[i];if(r+=a,i<e.s.length-1){let o=i.toString();if(e[o]!==void 0){let c=t?`${t}.${o}`:o;if(n&&n.has(c)){r+=`<!--lvt-targeted-skip:${c}-->`;continue}r+=this.renderValue(e[o],o,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 a=n||t||"";return a&&(this.rangeState[a]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[a]=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),i=r.filter(a=>/^\d+$/.test(a)).sort((a,o)=>parseInt(a)-parseInt(o));if(i.length>0&&i.length===r.length)return i.map(a=>{let o=n?`${n}.${a}`:a;return this.renderValue(e[a],a,o)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,i)=>{let a=i.toString(),o=n?`${n}.${a}`:a;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,o):this.renderValue(r,a,o)}).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:i}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let a="else",o=n?`${n}.else`:"else";return this.renderValue(e.else,a,o)}return""}return i&&Array.isArray(i)?r.map((a,o)=>this.renderRangeItem(a,o,i,n)).join(""):r.map((a,o)=>{let c=o.toString(),l=n?`${n}.${c}`:c;return this.renderValue(a,c,l)}).join("")}renderRangeItem(e,t,n,r){let i=n,a="";for(let o=0;o<i.length;o++)if(a+=i[o],o<i.length-1){let c=o.toString();if(e[c]!==void 0){let l=r?`${r}.${t}.${c}`:`${t}.${c}`;a+=this.renderValue(e[c],c,l)}}return a}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],i=n.statics;for(let o of e){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let l=this.findItemIndexByKey(r,o[1],i,t);l>=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,o[1],i,t),d=o[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,o[1],o[2],n,!1),o[3]&&typeof o[3]=="object"&&o[3].idKey&&(this.rangeIdKeys[t||""]=o[3].idKey);break}case"p":{this.addItemsToRange(r,o[1],o[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,o[1],i,t);if(l>=0){let d=Array.isArray(o[2])?o[2]:[o[2]];r.splice(l+1,0,...d)}break}case"o":{let l=o[1],d=[],u=new Map;for(let p of r){let f=this.getItemKey(p,i,t);f&&u.set(f,p)}for(let p of l){let f=u.get(p);f&&d.push(f)}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 a=this.getCurrentRangeStructure(t);return a&&a.s?this.renderItemsWithStatics(r,a.s,t):r.map(o=>this.renderValue(o)).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((i,a)=>this.renderRangeItem(i,a,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,i){if(n&&(r.statics=n),!t)return;let a=Array.isArray(t)?t:[t];i?e.unshift(...a):e.push(...a)}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(i=>this.getItemKey(i,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var Fe=["data-key","data-lvt-key"],hn=Fe.map(s=>new RegExp(`(?:^|[\\s<])${s}\\s*=`)),j="data-lvt-targeted-applied",q="data-lvt-targeted-skip",ye=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 i=this.findItemByKey(e,n);if(!i||!i.parentElement)return null;let a=i.parentElement;return this.containerCache.set(t,a),a}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 a=t.d;if(Array.isArray(a)){for(let d of a)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let o=this.extractItemKey(a==null?void 0:a[0],t),c=this.findContainer(e,n,o);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:o}}apply(e,t,n){let{rangePath:r,ops:i,statics:a}=t,o=this.firstKnownKey(i),c=this.findContainer(e,r,o);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of i){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],a,r,n);break;case"i":p=this.applyInsertAfter(c,d[1],d[2],a,r);break;case"a":p=this.applyAppend(c,d[1],a,r);break;case"p":p=this.applyPrepend(c,d[1],a,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(`[${j}]`).forEach(r=>r.removeAttribute(j)),e.hasAttribute(j)&&e.removeAttribute(j),e.querySelectorAll(`[${q}]`).forEach(r=>r.removeAttribute(q)),e.hasAttribute(q)&&e.removeAttribute(q)}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,i){var u,p;let a=this.findItemByKey(e,t);if(!a)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let o=this.indexOfChild(e,a),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,o,n,r),d=this.parseSingleRow(l);return d?(i?se(a,d,{...i,childrenOnly:!1}):(this.fireHookOnSubtree(a,"lvt-destroyed"),a.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,i){let a=this.findItemByKey(e,t);return a?this.renderItemsAtomic(n,r,i,this.indexOfChild(e,a)+1,o=>e.insertBefore(o,a.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,i=>e.appendChild(i))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,i=>e.insertBefore(i,e.firstChild))}renderItemsAtomic(e,t,n,r,i){var l,d;let a=Array.isArray(e)?e:[e],o=document.createDocumentFragment(),c=[];for(let u=0;u<a.length;u++){let p=this.renderAndParse(a[u],r+u,t,n);if(!p)return!1;o.appendChild(p),c.push(p)}i(o);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(a=>{for(let o of Fe){let c=a.getAttribute(o);if(c!==null){n.set(c,a);break}}});let r=document.createDocumentFragment(),i=new Set(t);for(let a of t){let o=n.get(a);o&&r.appendChild(o)}if(i.size<n.size){this.ctx.logger.warn(`[RangeDomApplier] o: newKeyOrder (${i.size}) shorter than existing children (${n.size}); ${n.size-i.size} children will be dropped`);for(let[a,o]of n)i.has(a)||this.fireHookOnSubtree(o,"lvt-destroyed")}return e.replaceChildren(r),!0}renderAndParse(e,t,n,r){let i=this.ctx.renderItem(e,t,n,r);return this.parseSingleRow(i)}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 Fe){let i=e.querySelector(`[${r}="${n}"]`);if(i)return i}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 i of r)if(i&&typeof i=="object"&&i._k!==void 0)return String(i._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of hn)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 be=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 Ee=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 i=this.escapeCSSSelector(n),a=e.querySelectorAll(`[name="${i}"]`);for(let o of a){if(this.wiredElements.has(o)||o.hasAttribute("lvt-input")||o.hasAttribute("lvt-change"))continue;let c=o.closest("form");c&&(c.hasAttribute("lvt-change")||Y(c,"lvt-form:no-intercept",this.logger))||o instanceof HTMLInputElement&&(o.type==="hidden"||o.type==="submit"||o.type==="button")||o instanceof HTMLButtonElement||(this.attachListener(o,n,r),this.wiredElements.add(o))}}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 i=n.getAttribute("name");i&&(this.attachListener(n,i,"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],i=this.detectBinding(n,r);i&&!this.boundFields.has(i.fieldName)&&this.boundFields.set(i.fieldName,i.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 i=r[1].toLowerCase();return i!=="checkbox"&&i!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),i=r?parseInt(r,10):NaN,a=Number.isNaN(i)||i<0?300:i,c=Z(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},a),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: ${a}ms)`)}};var Ne=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 o,c,l,d,u;this.clearReconnectTimer();let e=(o=this.options.maxReconnectAttempts)!=null?o: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),i=Math.random()*1e3,a=Math.min(r+i,n);this.reconnectTimer=window.setTimeout(()=>{var p,f;(f=(p=this.options).onReconnectAttempt)==null||f.call(p,this.reconnectAttempts,a),this.connect()},a)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},we=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 vn(e,this.config.logger))return{usingWebSocket:!1,initialState:await kt(e,this.config.logger)};let n,r,i=new Promise((u,p)=>{n=u,r=p}),a=!1,o=!1,c=null,l=u=>{a||(a=!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 Ne({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{o=!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:()=>{o?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(u,p)=>{var f,g;(g=(f=this.config).onReconnectAttempt)==null||g.call(f,u,p)},onReconnectFailed:()=>{var u,p;(p=(u=this.config).onReconnectFailed)==null||p.call(u)},onError:u=>{var p,f;(f=(p=this.config).onError)==null||f.call(p,u),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await i}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 kt(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 vn(s,e){try{let n=(await fetch(s,{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 kt(s,e){try{let t=await fetch(s,{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 Ae=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let i=new XMLHttpRequest;i.upload.addEventListener("progress",o=>{o.lengthComputable&&(e.bytesUploaded=o.loaded,e.progress=Math.round(o.loaded/o.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{i.abort()});let a=new Promise((o,c)=>{i.addEventListener("load",()=>{i.status>=200&&i.status<300?(e.done=!0,e.progress=100,o()):c(new Error(`S3 upload failed with status ${i.status}: ${i.statusText}`))}),i.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),i.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(i.open("PUT",t.url),t.headers)for(let[o,c]of Object.entries(t.headers))i.setRequestHeader(o,c);i.send(r),await a}catch(i){throw e.error=i instanceof Error?i.message:String(i),i}}};var Te=class{constructor(e,t={}){this.sendMessage=e;this.entries=new Map;this.pendingFiles=new Map;this.autoUploadConfig=new Map;this.uploaders=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.uploaders.set("s3",new Ae)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let i=this.inputHandlers.get(n);i&&n.removeEventListener("change",i);let a=o=>{let c=o.target.files;!c||c.length===0||this.startUpload(r,Array.from(c))};n.addEventListener("change",a),this.inputHandlers.set(n,a)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(i=>({name:i.name,type:i.type||"application/octet-stream",size:i.size})),r={action:"upload_start",upload_name:e,files:n};this.sendMessage(r)}async handleUploadStartResponse(e){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 i=new Map;for(let o of r)i.set(o.name,o);let a=[];for(let o of n){let c=i.get(o.client_name);if(!c){console.warn(`No file found for entry ${o.entry_id} (client_name: ${o.client_name})`);continue}let l={id:o.entry_id,file:c,uploadName:t,progress:0,bytesUploaded:0,valid:o.valid,done:!1,error:o.error,external:o.external};if(this.entries.set(l.id,l),a.push(l),!o.valid){this.onError&&o.error&&this.onError(l,o.error);continue}o.auto_upload&&(o.external?this.uploadExternal(l,o.external):this.uploadChunked(l))}}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.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}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 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 a=Math.min(r+this.chunkSize,t.size),o=t.slice(r,a),c=await this.fileToBase64(o),l={action:"upload_chunk",entry_id:n,chunk_base64:c,offset:r,total:t.size};this.sendMessage(l),r=a,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let i={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(i),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(i){let a=i instanceof Error?i.message:String(i);e.error=a,this.onError&&this.onError(e,a),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)n.external?this.uploadExternal(n,n.external):this.uploadChunked(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,i]of this.entries)e&&i.uploadName!==e||(i.done||i.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 a=r.result.split(",")[1];t(a)},r.onerror=n,r.readAsDataURL(e)})}};var Mt={silent:0,error:1,warn:2,info:3,debug:4},xt="LiveTemplate",Ue=class s{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 s(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 Mt[e]<=Mt[this.state.level]}formatPrefix(){return this.scope.length===0?`[${xt}]`:`[${xt}:${this.scope.join(":")}]`}};function $e(s={}){var n,r;let e={level:(n=s.level)!=null?n:"info"},t=Array.isArray(s.scope)?s.scope:s.scope?[s.scope]:[];return new Ue(e,t,(r=s.sink)!=null?r:console)}async function Ct(s,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let i=t("fs"),a=JSON.parse(i.readFileSync(e,"utf8"));return s.applyUpdate(a)}let r=await(await fetch(e)).json();return s.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function Ht(s,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(s),i=n(e);if(r===i)return{match:!0,differences:[]};let a=r.split(`
30
30
  `),o=i.split(`
31
- `),c=Math.max(a.length,o.length);for(let l=0;l<c;l++){let d=a[l]||"",u=o[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var Te=class s{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,...i}=e,a=n!=null?n:r?"debug":"info",o=t!=null?t:Ue({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(a),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...i},this.treeRenderer=new me(this.logger.child("TreeRenderer")),this.rangeDomApplier=new ve({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,u,p)=>this.treeRenderer.renderRangeItem(c,l,d,u,p),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 f of d.d)if(!(!f||typeof f!="object")&&(f._k===l||u&&f[u]!==void 0&&String(f[u])===l))return f;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new se(this.logger.child("FocusManager")),this.formLifecycleManager=new ye,this.loadingIndicator=new ge,this.formDisabler=new he,this.uploadHandler=new Ae(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}}))}}),this.eventDelegator=new de({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 pe({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:c=>this.handleNavigationResponse(c),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new fe({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new be({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Ee({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=Ue({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new s;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(a=>{e.error("Auto-initialization connect failed:",a)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,i,a;let n=e;if(n.type==="upload_progress"){this.uploadHandler.handleProgressMessage(n);return}if(n.upload_name&&n.entries){let o=n;try{this.handleUploadStartResponse(o)}catch(c){this.logger.error("Error handling upload start response:",c)}return}if(n.upload_name&&n.hasOwnProperty("success")){n.success?this.logger.info(`Upload complete: ${n.upload_name}`):this.logger.error(`Upload failed: ${n.upload_name}`,n.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,De()),this.wrapperElement&&((r=e.meta)!=null&&r.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:(i=e.meta)==null?void 0:i.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(),ot(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ce(),bt(),mt(),et(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.eventDelegator.teardownDOMEventTriggerDelegation(),vt(),this.wrapperElement&&(Ze(this.wrapperElement),tt(this.wrapperElement),At(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((a,o)=>{r.has(o)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:o,href:e}),r.add(o),n[o]=a});let i=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let a=this.webSocketManager.getReadyState();return a===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:a}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:a}),!1}return this.liveUrlOverride=i,this.webSocketManager.setLiveUrl(i),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(),i=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!i.ok)throw new Error(`HTTP multipart request failed: ${i.status}`);let a=await i.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}handleNavigationResponse(e){var c;if(!this.wrapperElement)return;let n=new DOMParser().parseFromString(e,"text/html"),r=this.wrapperElement.getAttribute("data-lvt-id"),i=(c=n.querySelector("title"))==null?void 0:c.textContent;i&&(document.title=i);let a=n.querySelector("[data-lvt-id]");if(a){let l=a.getAttribute("data-lvt-id");if(!l){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(r),this.eventDelegator.teardownForWrapper(r);let d=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",l),this.wrapperElement.replaceChildren(...Array.from(a.childNodes).map(p=>p.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let u=window.location.pathname+window.location.search;if(this.liveUrlOverride=u,this.webSocketManager.setLiveUrl(u),!this.useHTTP){let f=`[data-lvt-id="${l.replace(/[\\"]/g,"\\$&")}"]`;this.connect(f).catch(g=>{d===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",g),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(r),this.eventDelegator.teardownForWrapper(r),this.disconnect();let o=n.querySelector("body");o&&this.wrapperElement.replaceChildren(...Array.from(o.childNodes).map(l=>l.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}),i=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>i(d));if(!r.changed&&!i(t))return;let a=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"),f=p.body.firstElementChild;f?a.replaceChildren(...Array.from(f.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),a.replaceChildren(...Array.from(p.body.childNodes)))}else a.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!a.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(q))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let f=0;f<u.length;f++){let g=u[f].name;if(g.length>4&&g.charCodeAt(0)===108&&g.charCodeAt(1)===118&&g.charCodeAt(2)===116&&g.charCodeAt(3)===45&&!p.hasAttribute(g)){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 f=0;f<u.length;f++){let g=u[f];p.hasAttributeNS(g.namespaceURI,g.localName)||p.setAttributeNS(g.namespaceURI,g.name,g.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")&&_e(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(j,""),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(j);let u=this.treeRenderer.renderState();a.innerHTML=u}else this.replaceTargetedSkipPlaceholders(a)}try{ie(e,a,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}this.focusManager.restoreFocusedElement(),nt(e),rt(e),it(e),st(e),wt(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(Qe(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 i=r;i.nodeValue&&/^lvt-targeted-skip:.+$/.test(i.nodeValue)&&n.push(i)}for(let i of n){let a=i.nodeValue.match(/^lvt-targeted-skip:(.+)$/),o=a?a[1]:"",c=i.parentElement;c&&c.setAttribute(q,o),i.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"&&Te.autoInit();return It(mn);})();
31
+ `),c=Math.max(a.length,o.length);for(let l=0;l<c;l++){let d=a[l]||"",u=o[l]||"";d!==u&&(t.push(`Line ${l+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${u}`))}return{match:!1,differences:t}}var Se=class s{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,...i}=e,a=n!=null?n:r?"debug":"info",o=t!=null?t:$e({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(a),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...i},this.treeRenderer=new ve(this.logger.child("TreeRenderer")),this.rangeDomApplier=new ye({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 f of d.d)if(!(!f||typeof f!="object")&&(f._k===l||u&&f[u]!==void 0&&String(f[u])===l))return f;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new oe(this.logger.child("FocusManager")),this.formLifecycleManager=new be,this.loadingIndicator=new he,this.formDisabler=new me,this.uploadHandler=new Te(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}}))}}),this.eventDelegator=new ue({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 fe({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 ge({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new Ee({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new we({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=$e({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new s;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(a=>{e.error("Auto-initialization connect failed:",a)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,i,a;let n=e;if(n.type==="upload_progress"){this.uploadHandler.handleProgressMessage(n);return}if(n.upload_name&&n.entries){let o=n;try{this.handleUploadStartResponse(o)}catch(c){this.logger.error("Error handling upload start response:",c)}return}if(n.upload_name&&n.hasOwnProperty("success")){n.success?this.logger.info(`Upload complete: ${n.upload_name}`):this.logger.error(`Upload failed: ${n.upload_name}`,n.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,_e()),this.wrapperElement&&((r=e.meta)!=null&&r.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:(i=e.meta)==null?void 0:i.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(),at(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),de(),wt(),yt(),tt(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.eventDelegator.teardownDOMEventTriggerDelegation(),bt(),this.wrapperElement&&(et(this.wrapperElement),nt(this.wrapperElement),St(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((a,o)=>{r.has(o)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:o,href:e}),r.add(o),n[o]=a});let i=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let a=this.webSocketManager.getReadyState();return a===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:a}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:a}),!1}return this.liveUrlOverride=i,this.webSocketManager.setLiveUrl(i),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(),i=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!i.ok)throw new Error(`HTTP multipart request failed: ${i.status}`);let a=await i.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}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 i=e.querySelectorAll('link[rel~="stylesheet"][href]'),a=new Set;if(i.forEach(c=>{let l=c.getAttribute("href");if(l)try{a.add(new URL(l,t).href)}catch(d){a.add(l)}}),r.size!==a.size)return!0;let o=!1;return r.forEach(c=>{a.has(c)||(o=!0)}),o}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){var l;if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),i=this.wrapperElement.getAttribute("data-lvt-id"),a=(l=r.querySelector("title"))==null?void 0:l.textContent;if(a&&(document.title=a),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 o=r.querySelector("[data-lvt-id]");if(o){let d=o.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(i),this.eventDelegator.teardownForWrapper(i);let u=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(o.childNodes).map(f=>f.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 g=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(g).catch(H=>{u===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",H),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(i),this.eventDelegator.teardownForWrapper(i),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}),i=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>i(d));if(!r.changed&&!i(t))return;let a=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"),f=p.body.firstElementChild;f?a.replaceChildren(...Array.from(f.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),a.replaceChildren(...Array.from(p.body.childNodes)))}else a.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!a.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(q))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let u=d.attributes,p=l;for(let f=0;f<u.length;f++){let g=u[f].name;if(g.length>4&&g.charCodeAt(0)===108&&g.charCodeAt(1)===118&&g.charCodeAt(2)===116&&g.charCodeAt(3)===45&&!p.hasAttribute(g)){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 f=0;f<u.length;f++){let g=u[f];p.hasAttributeNS(g.namespaceURI,g.localName)||p.setAttributeNS(g.namespaceURI,g.name,g.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")&&Oe(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(j,""),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(j);let u=this.treeRenderer.renderState();a.innerHTML=u}else this.replaceTargetedSkipPlaceholders(a)}try{se(e,a,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}this.focusManager.restoreFocusedElement(),rt(e),it(e),st(e),ot(e),Tt(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&(Ze(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 i=r;i.nodeValue&&/^lvt-targeted-skip:.+$/.test(i.nodeValue)&&n.push(i)}for(let i of n){let a=i.nodeValue.match(/^lvt-targeted-skip:(.+)$/),o=a?a[1]:"",c=i.parentElement;c&&c.setAttribute(q,o),i.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"&&Se.autoInit();return Ft(yn);})();
32
32
  //# sourceMappingURL=livetemplate-client.browser.js.map